前端开发

使用腾讯位置服务进行 Web 前端定位

03 月 16 日 2021 年

正在开发的 Web 项目需要获取使用者的位置信息,而使用者主要通过移动端访问此 Web 服务。位置信息需要精确到区。在腾讯位置服务的定位解决方案里想要搜索可用的 JavaScript 库,只看到了服务端的 IP 定位和移动端的几个 SDK 包,甚异之。

终于在不起眼的地方找到了前端定位组件,适用于浏览器进行定位操作。

本文基于 Nuxt.js 实现前端定位功能。

它能做什么

组件旨在优化纯 HTML5 Geolocation 定位能力弱,定位成功率不高的问题,提供简单、易用的接口帮助业务层获取用户当前的位置信息(需用户授权),以降低开发成本,提升定位精准度。

除了常规的经纬度坐标以外,它返回的结果里还包含了 citydistrict 项,非常方面。

{
  "module": "geolocation",
  "type": "h5_watch",
  "adcode": "", //行政区 ID,六位数字, 前两位是省,中间是市,后面两位是区,比如深圳市 ID 为 440300
  "nation": "美国",
  "province": "",
  "city": "加利福尼亚州",
  "district": "洛杉矶县",
  "addr": "",
  "lat": 34.035244, //火星坐标 (gcj02),腾讯、Google、高德等地图通用
  "lng": -118.252207,
  "accuracy": 1441 //误差范围,以米为单位
}

可惜相关页面的最后一次更新最近可能是在 2016-02-23,文档撰写简陋不堪,只能在项目中慢慢试错使用。

引入前端定位组件库

首先需要在腾讯位置服务的控制台添加应用,获得应用的 key

这里选择使用前端定位组件的调用方式三

在 HTML 文件的中引入脚本,对应 Nuxt.js 应用中的 nuxt.config.js

// nuxt.config.js
export default {
  head: {
    script: [
      {
        type: "text/javascript",
        // 引入腾讯地图前端定位组件
        // YOUR-APP-KEY 即腾讯位置服务应用的 key
        // YOUR-APP-NAME 即腾讯位置服务应用的名称
        src: "https://apis.map.qq.com/tools/geolocation/min?key=YOUR-APP-KEY&referer=YOUR-APP-NAME",
      },
    ],
  },
};

如果获取脚本失败,请关闭浏览器中拦截广告的插件等。

此外,由于用户的位置信息属于敏感信息,因此需要使用 HTTPS 的网页发送请求;如果在本机开发,请使用 localhost:port 的形式开发和访问。

实现 Web 前端定位

编写代码如下:

const geolocation = new qq.maps.Geolocation();

geolocation.getLocation(
  (position) => {
    // 成功获取位置信息
    console.log(position);
    // 将位置信息序列化存储在 localStorage 中
    const currentLocation = {
      city: position.city,
      district: position.district,
    };
    localStorage.currentLocation = JSON.stringify(currentLocation);
  },
  (error) => {
    // 获取位置信息失败
    console.log(error);
  },
);

执行代码,得到结果如下(其中 * 为我手动打码):

{
  "module": "geolocation",
  "type": "h5",
  "adcode": "510117",
  "nation": "中国",
  "province": "四川省",
  "city": "成都市",
  "district": "郫都区",
  "addr": "***",
  "lat": 30.75****,
  "lng": 103.92****,
  "accuracy": 113
}

定位成功精确到当前我所处的区和地址,满足项目开发要求。

其它相关方法和说明敬请参考官方文档的“暗示”。