底图和数据各自都对,合起来却错位
底图是自己接的,数据是业务方给的,两边单看都没问题,叠在一起整体偏出去一段。
现象
在不带底图的空白画布上看数据,位置完全正确;单独打开底图,也完全正常。 两者一叠加,所有要素统一朝某个方向偏了一段距离,偏移量在同一片区域内基本一致。
成因一:两边坐标系不同
这是最常见的情况。业务数据来自 GPS 采集或政府开放数据,是 WGS84; 底图接的是高德或腾讯瓦片,是 GCJ-02。两个都「对」,但不是一个坐标系。
判断方法:看偏移的方向和距离。国家级数据源配国内商业瓦片时, 偏移通常在几百米量级且方向一致,基本可以确定是这个问题。
成因二:转错了方向或转了两次
GCJ-02 转换是单向可逆的两套公式。如果数据本来就是 GCJ-02,
又做了一次 wgs84ToGcj02,偏移会变成原来的两倍左右。
如果是 GCJ-02 数据用了反算公式,偏移也会放大。
// 正确:确认数据是 WGS84 才做这一步
var gcj = wgs84ToGcj02(lng, lat);
// 错误:数据已经是 GCJ-02 了,又转一次
var gcj2 = wgs84ToGcj02(lng, lat); // 偏移变成两倍
// 错误:用反算公式处理 GCJ-02 数据
var wrong = gcj02ToWgs84(lng, lat); // 方向相反,越修越偏
成因三:瓦片本身不是标准墨卡托
百度瓦片用的是自己的一套瓦片编号规则,和 Web 墨卡托的 {z}/{x}/{y}
并不通用。直接把百度瓦片地址填进 Leaflet,即使坐标系处理对了,瓦片行列号也会错位,
表现为地图被切成拼错的块,或者缩放层级对不上。
成因四:Cesium 里的加载顺序
三维场景中,底图瓦片和矢量数据如果不在同一基准面上,会出现浮空或陷入地面的现象。
Cesium 的 Cartesian3.fromDegrees 接受 WGS84 经纬度,
而国内瓦片是 GCJ-02,两者在地球表面相差几百米,视觉上就是贴片飘在模型上方。
排查顺序
- 关掉底图,只看数据。数据位置对不对?
- 关掉数据,只看底图。底图是不是常见城市范围?
- 两者都正常 → 一定是坐标系不一致,查数据源和瓦片源各自的坐标系
- 偏移量大约是单次偏移的两倍 → 转换被重复执行了
- 不是整体平移而是拼接错乱 → 瓦片编号规则不兼容,不是坐标系问题
解决
统一到同一套坐标系再叠加。国内项目通常统一到 GCJ-02, 因为商业瓦片大多是这套,转换只需要处理自己的数据。 如果底图是天地图(CGCS2000,与 WGS84 近似),则反过来,业务数据不需要转。
| 底图 | 数据应该转成 |
|---|---|
| 天地图 | 不用转,CGCS2000 与 WGS84 差厘米级 |
| 高德 / 腾讯 | WGS84 → GCJ-02 |
| 百度 | WGS84 → GCJ-02 → BD-09,且瓦片编号走百度规则 |
| OpenStreetMap | 不用转,标准 WGS84 墨卡托 |
相关
经纬志(2026)。《底图和数据各自都对,合起来却错位》。https://www.jingweizhi.com/cookbook/basemap-misalign.html(访问日期 2026-11-03)。