原理
调用浏览器原生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性能影响,还会受到用户某些浏览器的限制。