GPS 模块吐出 39.9087,116.3975,直接丢到高德地图上打点,位置偏到了马路对面,实测差了三百多米。换成手机定位拿到的坐标,又准了。

问题不在设备,在坐标系。高德坐标用的是 GCJ-02,GPS 原始输出是 WGS-84,中间差了一层偏移。

三套坐标别混着用

  • WGS-84:GPS 和国际标准坐标,设备原始数据、海外地图多用它。
  • GCJ-02:国测局加密坐标,高德、腾讯在国内用的都是这套。
  • BD-09:百度在 GCJ-02 基础上又偏了一次,只给百度自己用。

把 WGS-84 当 GCJ-02 用,国内多数地区会偏几百米;把 BD-09 直接给高德,同样对不上。

国内互联网地图里,只有少数境外服务商直接使用 WGS-84。坐标系标注错了,比转换算法那点误差常见得多。

前端转换走官方 SDK

高德 JS API 提供坐标转换方法,把 GPS 坐标和来源类型一起传进去,回调里拿转换后的经纬度再打点。地图本身默认按 GCJ-02 渲染,传错坐标系,标记就会飘。

AMap.convertFrom([116.3975, 39.9087], 'gps', function (status, result) {})

服务端批量转换注意配额

高德开放平台的坐标转换接口按天算配额,key 要单独申请,别拿前端 key 去调服务端接口,权限和域名白名单都对不上。批量数据先落库再转,转换失败的重试一次,别在循环里硬刷。

转换算法本身是近似偏移,不同实现之间差一两米很正常。转过的坐标别反复转,转两次误差会累积。

高德开放平台还有个坐标拾取器,网页上点地图就能读到经纬度,适合手工核对几个点。注意它给的是 GCJ-02,别拿去和 GPS 原始数据直接比。

境外和边界情况

高德坐标的偏移只在中国大陆范围内生效,境外坐标一般直接用 WGS-84,高德海外地图也按 WGS-84 处理。边界附近的数据最好抽几个点实测,别整批套用同一个规则。

结论:先问清数据从哪来、是什么坐标系,再决定转不转;拿不准就抽三个点在高德地图上人工核对,比看文档快。