地理位置

地理定位

一、定位基础与原理

IP定位

运营商基站定位

GPS卫星定位

二、地理定位的实现

HTML5提供了地理定位API,允许用户将自己的位置暴露给web应用程序(前提允许web应用拥有该权限)。获取位置相关代码:

let geoloc = window.navigator.geolocation;
let success = function(data){} // 定位成功后回调
let error = function(msg){}  // 定位失败后回调
let options = {}  // 定位选项
geoloc.getCurrentPosition(success, [error, options]);

google chrome从50版本开始,地理定位API只允许提供给https的网站。所以普通网站拿不到定位信息。但是google提供了模拟器用于定位测试。

如果定位成功,getCurrentLocation将会返回定位信息,格式如下:

coords: GeolocationCoordinates
    accuracy: 150       精准度
    altitude: null      海拔高度
    altitudeAccuracy: null   海拔高度的精准度
    heading: null      
    latitude: 39.917406    纬度
    longitude: 116.397074  经度
    speed: null   当前客户端的瞬时速度
timestamp: 1625820505615   时间戳  毫秒值

案例:点击按钮,获取当前的位置信息

<body>
    <button id="btn">点我获取定位</button>
    <script>
        btn.onclick = function() {
            let geoloc = window.navigator.geolocation;
            // 参数:成功回调,失败回调,定位选项配置
            geoloc.getCurrentPosition((successmsg) => {
                console.log(successmsg);
            }, (errormsg) => {
                console.warn(errormsg);
            }, {
                timeout: 5000 // timeout: 5秒超时
            })
        }
    </script>
</body>

1. 接入第三方位置服务平台 - 百度地图、高德地图、腾讯地图

一旦接入了这些第三方平台,就可以方便的在自已网页中嵌入地图控件。引入这些第三方位置服务的js库后,还可以操作这些地图,访问他们提供的位置服务:查询公交线路、查询步行线路、驾车线路、地址查询、查询周边场所等等。

百度地图接入流程

进入百度地图开放平台: https://lbsyun.baidu.com/

选择开发文档 ---- JavascriptAPI ---- JavaScript API v3.0

2. 调用百度地图JS API修改地图显示效果

利用navigator.geolocation得到当前位置,创建一个point对象作为中心点参数

    geoloc.getCurrentPosition(
      (res)=>{
        let lat = res.coords.latitude; // 纬度
        let long = res.coords.longitude;  // 经度
        console.log(`lat: ${lat}  long: ${long}`)
        // 创建点坐标  
        let point = new BMap.Point(long, lat);
        // 设置中心点与缩放级别
        map.centerAndZoom(point, 15);
      },
      (err)=>{ console.log(err); });

地图对象(Map)除了centerAndZoom之外还有什么属性及方法?

面向对象API提供了什么功能就可以使用什么功能。

常用功能:

显示地图

设置地图的属性样式

为地图添加控件

为地图添加覆盖物

第三方位置服务

  1. 逆地址解析(通过经纬度返回地址详情字符串)
  2. 周边检索(通过经纬度,查询周边设施场所)
  3. 等等

demo:

<head>
  <!-- 1. 引入baidu jsAPI -->
    <script src="https://api.map.baidu.com/api?v=3.0&ak=ImUxp08DxBOdWifsi9WvqY3GkqV4eRHB"></script>
    <style>
        #container {
            position: absolute;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
        }
    </style>
</head>

<body>
  <!-- 2. 提供容器 -->
  <div id="container"></div> 

  <!-- 3. 编写js初始化地图 -->
  <script type="text/javascript"> 
    // 创建地图实例  
    var map = new BMap.Map("container");
    // 获取当前位置的经纬度 然后设置地图
    let geoloc = window.navigator.geolocation;
    geoloc.getCurrentPosition(
      (res)=>{
        let lat = res.coords.latitude; // 纬度
        let long = res.coords.longitude;  // 经度
        console.log(`lat: ${lat}  long: ${long}`)
        // 创建点坐标  
        var point = new BMap.Point(long, lat);
        // 设置中心点与缩放级别
        map.centerAndZoom(point, 15);

        // 调用map的方法,设置地图的能力
        map.enableDragging();
        // 启用滚轮缩放 
        map.enableScrollWheelZoom();
        // 添加平移缩放控件
        let navCtrl = new BMap.NavigationControl();
        map.addControl(navCtrl);
        // 添加比例尺控件
        let scaleCtrl = new BMap.ScaleControl();
        map.addControl(scaleCtrl);
        // 添加定位控件
        let glCtrl = new BMap.GeolocationControl();
        map.addControl(glCtrl);

        // 添加覆盖物  Marker对象
        // let point = new BMap.Point(long, lat);
        let marker = new BMap.Marker(point);
        map.addOverlay(marker);
        // 添加事件
        marker.addEventListener('click', (e)=>{
          alert('marker被点击');
        });

        // LBS服务  逆地址解析
        let geoc = new BMap.Geocoder();
        geoc.getLocation(point, (res)=>{
          console.log(res);
          console.log(res.addressComponents.city);
        });
        // LBS服务  查询周边
        let localSearch = new BMap.LocalSearch(
          point,   // 当前位置点
          {        // options对象,指定搜索结束后的回调
            onSearchComplete: (res)=>{
              console.log(res);
            }
          }
        );
        localSearch.search('影院');


      },
      (err)=>{ console.log(err); });
  </script>
</body>
上一篇:百度地图api实现轨迹运动效果


下一篇:百度地图根据类别不同做不同的标注