火星坐标 GCJ-02

  • 火星坐标系 GCJ-02 一点总结

  • 资料来源:

    https://zhuanlan.zhihu.com/p/62243160
    https://zhuanlan.zhihu.com/p/79027966

  • 更新

    1
    2021.12.18 初始

导语

最近项目涉及到了位置坐标,需要一些地图可视化,就此接触到了 GCJ-02,此文是一些总结.

WGS-84 & GCJ-02

要唯一标识地球上任意一个点,该如何做?

  • 要唯一定位一个点,需要一个参照物,标明这个点相对周围的位置.
  • 同时地球又不是一个标准球体,还需要一个量标明三维空间的 Z 轴.
  • 上面这一套组合起来就是大地测量系统.
  • 最常见的: 经纬度坐标 + 海拔高度,唯一标识就出来了.

经纬度的含义异常的好理解,但是海拔高度不然,地球不是标准的椭球体,不同的海拔参考下,同一点的海拔高度是完全不同的.

WGS-84 (World Geodetic System 1984),是 GPS 使用的参考坐标系,也是如今最通用的标准.

GCJ-02 全称是 地形图非线性保密处理算法,是中国国家测绘局制定的一套大地测量系统,基于 WGS-84 添加了随机偏移,使得同样经纬度在 WGS-84 和 GCJ-02 下有 100-700 米的偏差.因此 GCJ-02 又俗称 火星坐标系.

目前法律规定,中国地区的地理信息系统,必须使用 GCJ-02 坐标系,因此可以这样认为,大陆地区合规的地图都是偏的,必须再对 GPS 直出坐标加偏,才能对到地图上.

做地图可视化大概率还会遇到另一种坐标系 BD-09,百度地图使用的坐标系,是基于 GCJ-02 再次加偏…

不同坐标系转换

GCJ-02 成为事实标准后,反解困难重重,精度很低,最开始是回归办法尝试逼近.但是 GCJ-02 是授权使用的,总会有资料流出,2010 年 GCJ-02 原始代码流出,因此反解有了确实的进步,几乎到了厘米级别 ≈ GCJ-02 破解.

还有个更加离谱的 BD-09,参考 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法,似乎是 coolypf 从百度地图逆向得到了 GCJ-02 和 BD-09 的转换算法.

因此现状是

  • WGS84 <-> GCJ-02 应该能到厘米级互转,但是精度高的反解需要一点计算,不那么精确的米级别那就很快很快了.
  • WGS84/GCJ-02 <-> BD-09 没有找到反解的精度资料,不过从实际测试看,米级别是有了的.

PRCoords 项目提供了以上转换的各种编程语言实现,python 和 js 都有对应库,使用非常方便.

GCJdemoPRCoords 的在线版本,仅供测试.

尾巴

一点建议

  • 尽量统一坐标系 WGS84 或 GCJ02,数据坐标系混淆,纠偏成本很高.
  • 尽量避免使用 BD09 反解的精度暂时比不上 GCJ02 -> WGS84.