作过地图相关开发的同窗确定会遇到这样一个问题:一样的经纬度坐标,在百度地图和高德地图上位置不同。javascript
咱们一般用经纬度来表示一个地理位置,可是因为一些缘由,咱们从不一样渠道获得的经纬度信息可能并非在同一个坐标系下。java
不一样的坐标系之间可能有几十到几百米的偏移,因此在开发基于地图的产品,或者作地理数据可视化时,咱们须要修正不一样坐标系之间的误差。ios
WGS-84(World Geodetic System, WGS)是使用最普遍的坐标系,也是世界通用的坐标系,GPS设备获得的经纬度就是在WGS84坐标系下的经纬度。一般经过底层接口获得的定位信息都是WGS84坐标系。git
GCJ-02(G-Guojia国家,C-Cehui测绘,J-Ju局),又被称为火星坐标系,是一种基于WGS-84制定的大地测量系统,由中国国测局制定。此坐标系所采用的混淆算法会在经纬度中加入随机的偏移。github
国家规定,中国大陆全部公开地理数据都须要至少用GCJ-02进行加密,也就是说咱们从国内公司的产品中获得的数据,必定是通过了加密的。绝大部分国内互联网地图提供商都是使用GCJ-02坐标系,包括高德地图,谷歌地图中国区等。算法
导航电子地图在公开出版、销售、传播、展现和使用前,必须进行空间位置技术处理。— GB 20263―2006《导航电子地图安全处理技术基本要求》,4.1
BD-09(Baidu, BD)是百度地图使用的地理坐标系,其在GCJ-02上多增长了一次变换,用来保护用户隐私。从百度产品中获得的坐标都是BD-09坐标系。安全
百度地图以及高德地图都提供了一些方法来转换不一样坐标系下的坐标,可是它们都须要进行网络请求,性能不好。
在春节假期时,我作了一个库gcoord来作这些事。网络
gcoord主要解决了两个问题性能
GeoJSON是地理行业一种通用的数据格式,它本质上就是JSON,不过对字段有一些约定。ui
gcoord使用起来很是简单
例如从手机的GPS获得一个经纬度坐标,须要将其展现在百度地图上,则能够经过gcoord将当前坐标从WGS-84坐标系转换为BD-09坐标系
var result = gcoord.transform( [ 116.403988, 39.914266 ], // 经纬度坐标 gcoord.WGS84, // 当前坐标系 gcoord.BD09 // 目标坐标系 ); console.log( result ); // [ 116.41661560068297, 39.92196580126834 ]
详细的使用方式请查看 gcoord的文档
欢迎你们star