中国法规要求地图提供商使用一种称为 GCJ-02 的坐标系统。百度地图另外使用一种 BD-09 坐标系,似乎也是基于 GCJ-02。
GCJ-02 (官方称地形图非线性保密处理算法,俗称火星坐标系、国测局坐标)是一种基于 WGS-84 制定的大地测量系统 ,由中国国家测绘地理信息局制定,此坐标系所采用的混淆算法会在经纬度中加入看似随机的偏移,号称可以促进国家安全。
使用 GCJ-02 记录下的地点在 GCJ-02 的地图中会显示在正确的位置,然而换成 WGS-84 的地图或地点记录就可能造成 100 - 700 米不等的偏移。据测量,
Google.com 的地图与真实坐标相差约 50 - 500 米
虽然 GCJ-02 坐标系统本身保密,但是目前已有 C#、C、Go、Java、等多种语言的开源转换实现。这些实现似乎都基于某份泄露出的 WGS 到 GCJ 加偏代码实现。根据泄露代码注释,GCJ-02 在加偏时使用的是 SK-42 参考系统的椭球体参数。这些参数用于计算一根经 /纬线上一度的弧长,由此将之前算出的偏移从米数转换为度数,与输入值相加。
BD-09 是百度地图使用的地理坐标系,其在 GCJ-02 上多增加了一次变换,号称“有助保护用户隐私”。百度提供从 WGS 和 GCJ 坐标系转换到 BD-09 坐标系的 API。和 GCJ-02 的情况类似,虽然没有反向转换的官方 API,但却存在 R 等多种语言写成的开源版本。
数学上,BD-09 变换将 GCJ 坐标当作直角坐标转成极坐标后加噪音,在变回直角坐标之后再加入一个度数恒定的偏移量。
由于 GCJ-02 大量使用正弦函数制造高频噪音,形成了一个超越方程,导致基本不可能获得解析解。不过由于 GCJ 加偏前后的坐标相差并不太大,且其单调性和局部线性特性也较好,大部分开源实现都通过类似这样的算法实现反向纠偏: