JS: 调用硬件GPS实现米级定位

原理

调用浏览器原生API:Geolocation,获取地球坐标 (WGS84)。为追求精准度不建议直接用,而是选择成熟的地图产品接口,比如接下来我们直接调百度地图JS API。

注意部署域名前缀需要https,开发环境可以用phpstudy一键申请开发者测试证书从443端口访问。访问页面后,浏览器将会弹出提权窗口提示获取地理位置权限,也就是说大部分台式机基本是不行的。MDN相关文档

使用方法

1.复制下方HTML代码,粘贴保存为index.html,可以直接把单文件扔到服务器做个反代给个泛解析SSL证书直接在线访问,没有服务器的话就用phpstudy申请本地SSL证书再访问https://localhost,下一步我们准备申请百度地图的JS接口密钥。

2.密钥申请地址:https://lbsyun.baidu.com/apiconsole/key?application=key#/home

3.正常进行注册实名认证后,再次粘贴回到网址,进入左侧菜单应用管理我的应用创建应用应用名称随便,应用类型选择浏览器端,划动页面到底直接点提交,可以看到页面中已经可以复制访问应用(AK)了,我们直接粘贴ak秘钥到HTML文件中所注释的位置,直接访问页面即可。

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <title></title>
  <!--引入百度JS API,在"ak="后衔接刚申请到的密钥-->
  <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=密钥"></script>
</head>

<body>
  <div id="position"></div>
  <script type="text/javascript">
    var x = document.getElementById("position");
    // 创建百度地理位置实例,代替 navigator.geolocation
    var geolocation = new BMap.Geolocation();
    geolocation.getCurrentPosition(function (e) {
      if (this.getStatus() == BMAP_STATUS_SUCCESS) {
        // 百度 geolocation 的经纬度属性不同,此处是 point.lat 而不是 coords.latitude
        x.innerHTML = e.point.lng + "," + e.point.lat;
      } else {
        x.innerHTML = "failed" + this.getStatus();
      }
    });
  </script>
</body>

</html>

後日談

实际测试中,谷歌浏览器返回的经纬度小数点后差不多只能到8位,而微信内置浏览器却能够返回12位,故获取到的经纬度精准度不只是和用户设备GPS性能影响,还会受到用户某些浏览器的限制。

暂无评论

发送评论 编辑评论


				
上一篇
下一篇