经纬志
首页 / Cesium / 教程

影像底图与坐标偏移

先看结论

给 Cesium 接上国内影像底图后,矢量数据常常整体偏出几百米。 这不是加载写得不对,是两套坐标系的问题。

最后验证 2026-11-03 · CesiumJS 1.121 · 更新 2026-10-27 · 引用本文

三套坐标系

坐标系使用者与 WGS84 的关系
WGS84GPS、北斗、国际标准(EPSG:4326)基准本身
GCJ-02高德、腾讯、天地图非线性加密,偏移数百米
BD-09百度地图在 GCJ-02 上再偏移一次
CGCS2000国家测绘成果(EPSG:4490)与 WGS84 差厘米级,工程上常等同

偏移量实测

网上常说「偏移几百米」,实际值随经纬度变化。下表由下面的工具逐点算出, 单位是米,按椭球面大圆距离计算:

城市WGS84GCJ-02偏移
乌鲁木齐87.616848, 43.82559287.619698, 43.826797265.3
拉萨91.140856, 29.64555491.142385, 29.642818338.6
成都104.066541, 30.572269104.069046, 30.569815363.7
西安108.940174, 34.341568108.944831, 34.340013461.7
上海121.473701, 31.230416121.478224, 31.228474481.8
哈尔滨126.642464, 45.756967126.648434, 45.758918512.0
北京116.397428, 39.909230116.403672, 39.910634555.6
深圳114.057868, 22.543099114.062982, 22.540382606.6
广州113.264385, 23.129112113.276136, 23.132723621.7
东京(境外)139.691710, 35.689500139.691710, 35.6895000.0

境外不偏移。GCJ-02 算法内部有中国境内范围判断,境外坐标原样返回。 这也是海外项目「看起来没问题」、一进国境就开始偏的原因。

在 Cesium 里怎么处理

Cartesian3.fromDegrees(lng, lat) 接受的是 WGS84 经纬度。 如果底图瓦片是 GCJ-02,两种数据就在同一个球上错位了。处理方式有两条:

  1. 把 WGS84 业务数据转成 GCJ-02,再传给 Cesium,和底图对齐。
  2. 把 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)。