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