正在开发的 Web 项目需要获取使用者的位置信息,而使用者主要通过移动端访问此 Web 服务。位置信息需要精确到区。在腾讯位置服务的定位解决方案里想要搜索可用的 JavaScript 库,只看到了服务端的 IP 定位和移动端的几个 SDK 包,甚异之。
终于在不起眼的地方找到了前端定位组件,适用于浏览器进行定位操作。
本文基于 Nuxt.js 实现前端定位功能。
它能做什么
组件旨在优化纯 HTML5 Geolocation 定位能力弱,定位成功率不高的问题,提供简单、易用的接口帮助业务层获取用户当前的位置信息(需用户授权),以降低开发成本,提升定位精准度。
除了常规的经纬度坐标以外,它返回的结果里还包含了 city
和 district
项,非常方面。
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "module": "geolocation", "type": "h5_watch", "adcode": "", "nation": "美国", "province": "", "city": "加利福尼亚州", "district": "洛杉矶县", "addr": "", "lat": 34.035244, "lng": -118.252207, "accuracy": 1441 }
|
可惜相关页面的最后一次更新最近可能是在 2016-02-23
,文档撰写简陋不堪,只能在项目中慢慢试错使用。
引入前端定位组件库
首先需要在腾讯位置服务的控制台添加应用,获得应用的 key
。
这里选择使用前端定位组件的调用方式三。
在 HTML 文件的中引入脚本,对应 Nuxt.js 应用中的 nuxt.config.js
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| export default { head: { script: [ { type: "text/javascript", src: "https://apis.map.qq.com/tools/geolocation/min?key=YOUR-APP-KEY&referer=YOUR-APP-NAME", }, ], }, };
|
如果获取脚本失败,请关闭浏览器中拦截广告的插件等。
此外,由于用户的位置信息属于敏感信息,因此需要使用 HTTPS
的网页发送请求;如果在本机开发,请使用 localhost:port
的形式开发和访问。
实现 Web 前端定位
编写代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const geolocation = new qq.maps.Geolocation();
geolocation.getLocation( (position) => { console.log(position); const currentLocation = { city: position.city, district: position.district, }; localStorage.currentLocation = JSON.stringify(currentLocation); }, (error) => { console.log(error); }, );
|
执行代码,得到结果如下(其中 *
为我手动打码):
1 2 3 4 5 6 7 8 9 10 11 12 13
| { "module": "geolocation", "type": "h5", "adcode": "510117", "nation": "中国", "province": "四川省", "city": "成都市", "district": "郫都区", "addr": "***", "lat": 30.75****, "lng": 103.92****, "accuracy": 113 }
|
定位成功精确到当前我所处的区和地址,满足项目开发要求。
其它相关方法和说明敬请参考官方文档的“暗示”。