经纬志
首页 / 实战手册 / 坐标与投影

境外坐标也被加密,深圳河两岸出现 600 米断崖

先看结论

一条连续的边界线,转了坐标之后在河中间断开,两侧相差 600 米。

最后验证 2026-11-03 · 多技术栈 · 更新 2026-10-29 · 引用本文

现象

深圳与香港交界处的边界线,原始 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, 漏了西边和南边的边界,于是境外数据也被加了偏移。

排查过程

  1. 取一个明确在境外的点(东京、首尔、新加坡),跑一次转换,看结果是否与输入完全一致。
  2. 检查转换函数开头有没有 if (outOfChina(lng, lat)) return [lng, lat];。
  3. 检查判断用的是 && 还是 ||。四边条件必须用 || 连接,因为任一越界即境外。
  4. 跨境数据看接缝:把边界线加密成每 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, '境内偏移量不对');

适用版本

库版本境外处理
gcoord1.0.0 及以上内置境外判断,无需自写
高德 JS API2.0只处理国内数据,境外需自行保留 WGS84
自研转换函数—需显式补 outOfChina
引用本文

经纬志(2026)。《境外坐标也被加密,深圳河两岸出现 600 米断崖》。https://www.jingweizhi.com/cookbook/gcj02-out-of-china.html(访问日期 2026-11-03)。