境外坐标也被加密,深圳河两岸出现 600 米断崖
一条连续的边界线,转了坐标之后在河中间断开,两侧相差 600 米。
现象
深圳与香港交界处的边界线,原始 WGS84 数据是连续的。
转成 GCJ-02 后,深圳一侧(114.057868, 22.543099)向东偏了 606.6 米,
香港一侧(114.12, 22.54)几乎没有变化,接缝处出现约 600 米的断崖。
更远的地方同样有问题:东京 139.767125, 35.681236 转换前后差 400 多米,
而日本根本不在 GCJ-02 的适用范围里,本应原样返回。
原因
GCJ-02 的加密算法本身没有地理边界,它对任意经纬度都会算出一组增量。
标准实现里有一个 outOfChina 判断,范围是
lon 72.004 ~ 137.8347、lat 0.8293 ~ 55.8271,
超出范围直接返回原值。
很多从博客抄来的版本把这段判断删了,或者判断条件写成了
if (lon > 137.8347 || lat > 55.8271) return,
漏了西边和南边的边界,于是境外数据也被加了偏移。
排查过程
- 取一个明确在境外的点(东京、首尔、新加坡),跑一次转换,看结果是否与输入完全一致。
- 检查转换函数开头有没有
if (outOfChina(lng, lat)) return [lng, lat];。 - 检查判断用的是
&&还是||。四边条件必须用||连接,因为任一越界即境外。 - 跨境数据看接缝:把边界线加密成每 100 米一个点,转换后若出现跳变,就是边界判断问题。
// 缺少境外判断时:东京也被偏移
const before = [139.767125, 35.681236];
const after = wgs84ToGcj02(before[0], before[1]);
console.log(after); // [139.7718, 35.6809] 左右,偏了 400+ 米
解决方案
把 outOfChina 补回函数最前面,并且四边都用 ||。
function outOfChina(lng, lat) {
return lng < 72.004 || lng > 137.8347 ||
lat < 0.8293 || lat > 55.8271;
}
function wgs84ToGcj02(lng, lat) {
if (outOfChina(lng, lat)) return [lng, lat]; // 原样返回
const dLat = transformLat(lng - 105.0, lat - 35.0);
const dLng = transformLng(lng - 105.0, lat - 35.0);
const radLat = lat / 180.0 * Math.PI;
let magic = Math.sin(radLat);
magic = 1 - 0.00669342162296594323 * magic * magic;
const sqrtMagic = Math.sqrt(magic);
const dLatFinal = (dLat * 180.0) / ((6335552.717000426 / (magic * sqrtMagic)) * Math.PI);
const dLngFinal = (dLng * 180.0) / ((6378245.0 / sqrtMagic * Math.cos(radLat)) * Math.PI);
return [lng + dLngFinal, lat + dLatFinal];
}
边界处仍有不连续。即使补了判断,界线内侧依然偏移、外侧不偏移, 600 米的接缝仍然存在,这是 GCJ-02 本身的特性。 跨境项目应统一使用 WGS84 底图,或对整幅数据做同一套转换后再渲染。
验证
东京点转换前后应完全相同,差值为 0;深圳点仍应偏移 606.6 米,说明境内逻辑没被改坏。
const t = wgs84ToGcj02(139.767125, 35.681236);
console.assert(t[0] === 139.767125 && t[1] === 35.681236, '境外仍被偏移');
const s = wgs84ToGcj02(114.057868, 22.543099);
console.assert(Math.abs(s[0] - 114.062982) < 1e-5, '境内偏移量不对');
适用版本
| 库 | 版本 | 境外处理 |
|---|---|---|
| gcoord | 1.0.0 及以上 | 内置境外判断,无需自写 |
| 高德 JS API | 2.0 | 只处理国内数据,境外需自行保留 WGS84 |
| 自研转换函数 | — | 需显式补 outOfChina |
经纬志(2026)。《境外坐标也被加密,深圳河两岸出现 600 米断崖》。https://www.jingweizhi.com/cookbook/gcj02-out-of-china.html(访问日期 2026-11-03)。