今天收到产品反馈,有客户发现在微信小程序中使用百度地图导航,导航位置并不准确。 这就奇怪了,相同的经纬度坐标在不同地图上为什么显示会有偏差,到底有哪些坐标体系呢?
1. 常见坐标系
1.1 GPS 坐标系(wgs84)
wgs84: WorldGeodetic System 1984
,全世界最流行的基准标准系统,是由美国国防部制图局建立。
通常通过底层接口得到的定位信息都是 wgs84
坐标系。
1.2 火星坐标系(GCJ02)
GCJ-02
是国内最广泛使用的坐标体系,是由中国国家测绘局制订的地理信息系统的坐标系统。
它是一种对经纬度数据的加密算法,即加入随机的偏差,就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。转换完成后,地图上的点会发生几十到几百米的偏移。加密后的坐标也常被人称为火星坐标系统(才不是我们生活在火星上呢)。
谷歌中国,腾讯地图,高德地图都在用这个坐标体系。
那么问题来了,地图是偏移的,为什么使用手机地图的时候没感觉到呢?
因为除了对手机地图加偏外,用户的定位也被加偏处理后再显示在地图上。相关坐标都被同一算法给加偏后,两者完全匹配, GPS 也就可以正常工作,所谓的负负得正 😆 。
所以在国内出版的各种地图系统、导航设备等,都需要加入国家保密插件。
1.3 其他坐标体系
一般都是由 GCJ-02
再次经过偏移算法得到。
比如说百度地图(BD-09
坐标系)、搜狗地图。
2. 坐标转换
既然有好几种不同的坐标系,自然一个坐标不能同时应用于所有情形,使用前要进行适当转换。 常见的有下面几种方式。
2.1 算法转换
github
上有很多语言提供的转换库,这里列举了一个 Js
库。可以在 NodeJs
或 浏览器中使用:
coordtransform 坐标转换
优点:直接使用,方便快捷
缺点:看了相关的 issue
发现,在某些坐标系转换时,还是会有一定的误差。
2.2 Web API 转换
通过各类地图的 Web API
对坐标进行相互转换。
优点:因为是官方提供的坐标转换,转换的准确度应该较高
缺点:得在官方申请相应账号和权限,请求时要传入 key, id
等加密信息。而且得需要额外的网络请求。
2.3 SDK API 转换
通过嵌入相应的 sdk
后进行转换:
所以综合考虑后,小程序项目的解决方案就是后端通过相关算法对坐标进行了统一转换。 大家可以在遇到类似问题时选择适合自己的解决方案。