影像底图与坐标偏移
给 Cesium 接上国内影像底图后,矢量数据常常整体偏出几百米。 这不是加载写得不对,是两套坐标系的问题。
三套坐标系
| 坐标系 | 使用者 | 与 WGS84 的关系 |
|---|---|---|
| WGS84 | GPS、北斗、国际标准(EPSG:4326) | 基准本身 |
| GCJ-02 | 高德、腾讯、天地图 | 非线性加密,偏移数百米 |
| BD-09 | 百度地图 | 在 GCJ-02 上再偏移一次 |
| CGCS2000 | 国家测绘成果(EPSG:4490) | 与 WGS84 差厘米级,工程上常等同 |
偏移量实测
网上常说「偏移几百米」,实际值随经纬度变化。下表由下面的工具逐点算出, 单位是米,按椭球面大圆距离计算:
| 城市 | WGS84 | GCJ-02 | 偏移 |
|---|---|---|---|
| 乌鲁木齐 | 87.616848, 43.825592 | 87.619698, 43.826797 | 265.3 |
| 拉萨 | 91.140856, 29.645554 | 91.142385, 29.642818 | 338.6 |
| 成都 | 104.066541, 30.572269 | 104.069046, 30.569815 | 363.7 |
| 西安 | 108.940174, 34.341568 | 108.944831, 34.340013 | 461.7 |
| 上海 | 121.473701, 31.230416 | 121.478224, 31.228474 | 481.8 |
| 哈尔滨 | 126.642464, 45.756967 | 126.648434, 45.758918 | 512.0 |
| 北京 | 116.397428, 39.909230 | 116.403672, 39.910634 | 555.6 |
| 深圳 | 114.057868, 22.543099 | 114.062982, 22.540382 | 606.6 |
| 广州 | 113.264385, 23.129112 | 113.276136, 23.132723 | 621.7 |
| 东京(境外) | 139.691710, 35.689500 | 139.691710, 35.689500 | 0.0 |
境外不偏移。GCJ-02 算法内部有中国境内范围判断,境外坐标原样返回。 这也是海外项目「看起来没问题」、一进国境就开始偏的原因。
在 Cesium 里怎么处理
Cartesian3.fromDegrees(lng, lat) 接受的是 WGS84 经纬度。
如果底图瓦片是 GCJ-02,两种数据就在同一个球上错位了。处理方式有两条:
- 把 WGS84 业务数据转成 GCJ-02,再传给 Cesium,和底图对齐。
- 把 GCJ-02 的底图瓦片整体平移回 WGS84,再显示业务数据。
第一种更常见,因为只改动自己的数据,不动底图。 下面这个工具可以做换算,也可以直接在项目里复用其中的函数。
坐标换算工具
四个容易写错的地方
一、只做正向,不做反向
GCJ-02 是加密算法,没有解析解,反算只能迭代逼近。一次近似法的残差可达数米, 迭代五次能压到毫米级。
二、把 BD-09 当成独立坐标系
BD-09 是在 GCJ-02 基础上再叠一层偏移。正确路径是两步: WGS84 → GCJ-02 → BD-09。直接从 WGS84 套百度公式,会再多偏几十米。
三、用固定偏移量纠偏
传言里的「经度加 0.0065、纬度加 0.006」只是 BD-09 那一步的近似。 GCJ-02 的偏移在 265 到 622 米之间浮动,任何固定值只在一个极小范围内有效。
四、底图和数据各自都「对」,合起来错位
排查顺序应该是:先确认业务数据源是什么坐标系,再确认底图瓦片是什么坐标系, 最后才动代码。两边都正确但一个是 GCJ-02 一个是 WGS84, 结果依然是整体偏移,这种错最难靠肉眼发现。
经纬志(2026)。《影像底图与坐标偏移》。https://www.jingweizhi.com/cesium/tutorial/imagery-offset.html(访问日期 2026-11-03)。