各大 WEB 地图 JS API 坐标小结

在移动互联网的当下, WEB 地图的使用无疑是极为广泛的. 那么各大地图厂商提供的 JS API 在坐标上又有哪些玄机 (坑) 呢?

时效提醒

本文主要内容形成于2018年4月, 并于2019年2月进行了部分修改. 目前部分 API 行为可能已发生变更.

在没有接触 WEB GIS 之前, 你很可能会认为仅仅传个坐标 (从定位得到的经纬度值) 就能把某个地点正确显示在地图上了. 你如果这么去做了, 那么大概率会发现地图上显示的位置和你预期的位置之间总是存在偏移. 放心, 这并不是你或者 API 的 bug, 而是你遇到了坐标加密 (又称"坐标偏移") 问题.

让我们先来看看 "法理依据": 《导航电子地图安全处理技术基本要求》 (GB 20263-2006)

4.1 导航电子地图在公开出版、销售、传播、展示和使用前,必须进行空间位置技术处理。

这里的 "空间位置技术处理" 就是指 GCJ-02. 当然, GCJ-02只是理论上必须使用的, 实际上接下来你可以看到, 某些地图会在额外使用一套单独的加密系统 (百度), 而 "国家队" 天地图则不使用任何加密系统.

释义

Lng: 经度 (longitude)
Lat: 纬度 (latitude)
Center 栏中这两项的顺序表示在实际调用该 API 初始化坐标点时传入经纬度的次序.

TypeCenter坐标加密/偏移
AMap (高德地图)Lng, Latgcj02 (火星坐标系)
BMap (百度地图)Lng, Latbd09 (本质是在 gcj02 偏移之上再偏移)
BingMaps (必应地图)Lat, Lng国内数据 gcj02 加密
Google (谷歌地图)Lat, Lnggoole.com 无偏移
google.cn gcj02 加密
QQMaps (腾讯地图)Lat, Lnggcj02 加密
TMap (天地图)Lng, Lat不加密 (orz)
OpenStreetMap (开放街道地图)Lng, Lat不加密

关于以上所述数种地图的实时加载, 反向校准及动态编辑, 我曾写过一版代码, 感兴趣的可以参见GitHub项目地址.

致谢

关于这版代码, 要特别感谢当时的 WEB GIS 课程导师 pcwang, 可以说, 这些知识点及代码主要应当归功于他.