地图坐标系转换

同一栋楼在三种坐标系里能差出几百米。这里把 WGS84、GCJ02、BD09 两两互转,并给出偏移距离,方便对齐 GPS 原始点和地图底图。

为什么会有偏移

WGS84 是 GPS 卫星定位得到的原始坐标,也是国际通用标准。GCJ02 是在 WGS84 基础上按一套非线性公式加偏得到的「火星坐标」,国内的高德、腾讯以及 Google 中国版地图都使用它。BD09 则是在 GCJ02 之上再做一次非线性变换,只有百度地图用。三层套下来,同一个位置在三套坐标里的数值都不同,混用就会偏移几百米,在市区可能是隔了一条马路甚至一个街区。

偏移量不是固定值,它随经纬度按三角函数级数变化,国内大部分地区在 300 到 700 米之间,同一个城市不同位置的偏移方向和大小都不一样。所以不能简单地对经纬度加减一个常数来「纠偏」,必须用完整的公式计算,本页用的就是业界通行的 GCJ02 偏移算法(克拉索夫斯基椭球参数加上那组正弦级数)。

转换公式里有一个境内判定:落在境外(以及港澳台和周边海域)的坐标不加偏,GCJ02 与 WGS84 完全相同,页面会给出提示。这也是为什么用国内地图看国外地点时不会偏移,而把国外的 GPS 坐标拿去和高德底图对齐时,如果地点在国内边缘地带,要特别注意这个边界判定。

GPS 原始数据入库前先想清楚这一列是什么坐标系,并把它写进字段名或注释里,比如 wgs84_lat 和 gcj02_lng。日常最容易出错的是三件事:手机定位拿到 WGS84 直接显示在高德地图上、从百度地图复制坐标存进只用高德的业务库、以及把转换过的坐标又转了一次。建议在入库前统一转成业务系统使用的那一套坐标,并在页面上展示前再做一次方向检查。

需要注意精度边界:GCJ02 与 BD09 的转换公式是公开的拟合公式,各家地图的私有实现存在米级差异,百度那对公式正反变换的残差在 0.1 米量级。日常展示、周边搜索足够用,但涉及测绘出图、精确面积计算或执法取证时,必须使用具备资质的坐标系统与工具,不能依赖这类离线换算。