Skip to content

坐标 ​

相关概念 ​

中文术语英文翻译核心定义典型场景
坐标转换 (不同基准面/椭球间)Coordinate Transformation在不同的基准面(Datum) 或椭球体之间进行转换。坐标值发生了物理空间位置的变化。WGS84 转 CGCS2000、 北京54 转 西安80。 (需要用到7参数)
坐标换算 (同一基准面内)Coordinate Conversion在同一个基准面下,改变坐标的表现形式(如经纬度转平面坐标)。坐标代表的地球上那个点没动,只是表达方式变了。经纬度(B,L,H)转 高斯投影平面坐标(x,y); 大地坐标 转 空间直角坐标(X,Y,Z)

Transformation 是“换尺子”(改了原点和椭球);Conversion 是“换刻度单位”(尺子没换,只是把米换成了厘米)

中文英文翻译备注
七参数坐标转换7-parameter Transformation (或 Helmert Transformation)布尔莎模型,用于不同基准面间的三维转换。
四参数坐标转换4-parameter Transformation用于小范围平面坐标系间的转换(两个平移+1个旋转+1个尺度)。
投影转换Projection Conversion严格来说属于 Conversion(如高斯投影换带计算)。
坐标转换参数Transformation Parameters指求解出的平移、旋转、缩放参数。
坐标转换模型Coordinate Transformation Model如布尔莎模型、莫洛金斯基模型。

大地测量基准面(Geodetic Datum),简单来说,就是为测量和定位地球表面上的任何位置,所建立的一个统一、标准的空间参考框架。

你可以把它想象成一把用来丈量地球的“标准尺”或一个“坐标系的原点”。它是所有地图、导航和定位数据的根基。

为什么需要它? ​

地球表面是凹凸不平的,像一个“马铃薯”。为了能用数学方式进行计算和定位,我们需要用一个光滑的、规则的“鸭蛋”(即参考椭球体)来模拟它。

  • 参考椭球体:是一个光滑的数学模型,用于近似地球的整体或局部形状。

而大地基准面要做的,就是决定这个“鸭蛋”如何摆放,才能最贴合“马铃薯”的某一特定区域。

基准面如何“摆放”鸭蛋? ​

一个基准面通常由以下两部分定义:

  1. 选择“鸭蛋”:指定使用哪个参考椭球体(因其大小、形状各异)。
  2. 确定“位置”:定义这个椭球体相对于地球的位置和方向。这通常通过确定一个大地原点(椭球体与地球表面最贴合的点)来完成。

一个椭球体可以用于定义多个不同的基准面。关键在于“如何定位”。

基准面的两种类型 ​

根据其“原点”位置的不同,基准面主要分为两类:

  • 地心基准面 (Earth-Centered Datum):原点位于地球的质心(质量中心),适用于全球范围的测量。
    • 代表:WGS 84(全球定位系统GPS使用的基准面)、CGCS2000(中国2000国家大地坐标系)。
  • 局部/区域基准面 (Local/Regional Datum):原点与特定区域的地球表面最为贴合,适用于该区域内的精确测量。
    • 代表:北京54坐标系、西安80坐标系。

生活中的例子 ​

假设你要在墙上挂一幅世界地图。

  • 参考椭球体:就是你手里的那张地图,它是对地球的简化描绘。
  • 大地基准面:就是决定你如何挂这幅地图。
    • 地心基准面:把地图的中心对准墙的中心(地球质心),适用于看全球。
    • 局部基准面:为了让中国区域看得最清楚,把地图中心对准北京附近(大地原点),这样中国区域的变形最小。这就是北京54或西安80坐标系要做的事。

基准面与坐标系的关系 ​

两者关系紧密但不同:

  • 大地基准面是基础和骨架,定义了空间位置的参考原点、方向和尺度。
  • 坐标系是在这个骨架上建立的刻度尺。它使用经纬度等具体数值来表示地面上的每一个点。

在GIS软件中,通常是通过选择一个 “地理坐标系” (如GCS_WGS_1984),而这个坐标系内部就定义好了它所使用的基准面(如D_WGS_1984)。

基准面的重要性 ​

  • 数据统一:不同基准面的数据不能直接叠加,否则位置会偏移(可能相差几十到几百米)。例如,WGS 84 和北京54 的坐标对于同一地点就有差异。
  • 精确导航:手机定位、车载导航必须依赖统一的基准面才能正常工作。
  • 工程建设:高铁、桥梁等大型工程必须采用与国家测绘成果一致的基准面,才能保证设计和施工的精确对接。

希望这个从“马铃薯”到“鸭蛋”的比喻,能帮你更好地理解大地测量基准面。

一个完整的大地测量基准面,需要通过4个核心要素的精密组合,才能将这个椭球体“固定”在地球上,成为一个可用的坐标框架。

你可以把这4个要素理解为:选一个标准模具(椭球体),然后决定这个模具在地球内部怎么摆放、转不转、以及标尺准不准。


要素一:椭球体参数(几何与物理定义) ​

这是基准面的“骨架”,定义了模拟地球的数学球体的大小和形状。

  • 几何参数:通常用 长半轴(a) 和 扁率(f) 来表示。
    • 例如:WGS 84 椭球体的 a = 6378137.0 米,f = 1/298.257223563。
  • 物理参数(可选):现代地心基准面(如 WGS 84、CGCS2000)还会包含 地球引力常数(GM) 和 自转角速度(ω)。这决定了椭球体的“质量”和“旋转惯性”,方便卫星导航做轨道推算。

要素二:椭球体的定位(原点与方向) ​

这是基准面最核心的“灵魂”所在。仅仅选好椭球体是不够的,必须告诉计算机这个椭球体的中心点在哪里,以及它的旋转轴指向哪里。

  • 地心基准面:原点位于地球质心(质量中心),Z轴指向协议地极(CTP),X轴指向格林尼治子午线与赤道的交点。
    • 代表:WGS 84、CGCS2000。
  • 区域/局部基准面:原点位于特定大地原点(例如中国某地的地面点)。这是为了让椭球体在该国领土范围内与大地水准面(平均海平面)达到最佳贴合。
    • 代表:北京54(原点位于前苏联普尔科沃)、西安80(原点位于陕西泾阳)。

要素三:椭球体的定向(坐标轴指向) ​

基准面必须定义 X、Y、Z 三个坐标轴在空间中的初始指向。

  • 通常要求坐标轴的指向与地球自转轴和本初子午线保持某种平行或固连关系。
  • 对于局部基准面(如西安80),在数学上要确保椭球的短轴(旋转轴)与地轴平行,起始子午面与格林尼治子午面平行(在定位时通过特定数学约束实现)。

要素四:尺度参数(单位与比例) ​

定义坐标时,必须明确长度的单位标准。

  • 现代基准面(如 CGCS2000)采用 国际单位制(SI)米,并与国际地球参考系统(ITRS)保持一致。
  • 对于历史遗留的局部基准面,由于当年测量技术限制,其“米”的定义可能与标准国际米存在微小的尺度偏差(Scale Factor)。

综合实例:以“西安80”与“CGCS2000”对比 ​

为了让你更直观地理解这些要素的作用,看下面的对比:

要素西安80(局部基准面)CGCS2000(地心基准面)
椭球体参数IAG 1975 椭球(a=6378140m, f=1/298.257)CGCS2000 椭球(a=6378137m, f=1/298.257222101)
原点定位椭球中心与陕西泾阳地面点的大地水准面高度=0处重合椭球中心与地球质心重合(误差<0.1米)
坐标轴指向短轴平行于地轴,起始子午面平行于格林尼治子午面定向与 ITRS(国际地球参考系统)在 2000.0 历元一致
尺度采用经典的国际米定义,但受限于观测精度采用 SI 国际米,并利用 GPS/VLBI 技术严格校准

为什么要拆得这么细? ​

因为在实际工程中(比如坐标转换),你不是去改椭球大小,而是通过 7参数(布尔莎模型) 来修正这些要素。

当你在 GIS 软件中把北京54坐标转换成 WGS84 时,计算机实际上在做三件事:

  1. 调整 原点(平移 3 个参数);
  2. 旋转 坐标轴(旋转 3 个参数,因为当年椭球轴指向有微小偏差);
  3. 微调 尺度(缩放 1 个参数,修正早期尺度的微小误差)。

这 7 个参数,本质上就是对基准面定义中“定位、定向、尺度”这三个要素的数学补偿。


总结一句口诀帮你记忆:“椭球大小算形状,质心原点定位置,地极指向转角度,统一尺度量长短。”

坐标转换的主要过程解析——以proj4j源码为例 ​

proj4j的坐标转换主要过程在BasicCoordinateTransform类中。可参考其源码,版本差异应该不大。

代码注释中给出了符号化表达:

text
SrcProjCRS —[逆投影]→ SrcGeoCRS —[基准转换]→ TgtGeoCRS —[正投影]→ TgtProjCRS

用图表示:

text
┌──────────┐        ┌──────────┐        ┌──────────┐
│ 源投影坐标 │ ──①──→ │ 源地理坐标 │ ──②──→ │ 源地理坐标 │
│ (x, y)   │  逆投影  │ (λ, φ)   │ 经度归算 │ (λ, φ)   │
│ 源基准    │        │ 源基准    │ 至格林尼治│ 源基准    │
└──────────┘        └──────────┘        └──────────┘
                                                │
                                            ③ 基准转换
                                                ↓
┌──────────┐        ┌──────────┐        ┌──────────┐
│ 目标投影坐标│ ←──⑤─ │ 目标地理坐标│ ←──④─ │ 目标地理坐标│
│ (x', y') │  正投影  │ (λ', φ') │ 经度归算 │ (λ', φ') │
│ 目标基准   │        │ 目标基准   │ 至目标   │ 目标基准   │
└──────────┘        └──────────┘        └──────────┘

构造时预计算策略 ​

BasicCoordinateTransform 的一个重要设计是在构造时预计算转换策略,避免每次 transform() 调用时重复判断:

预计算字段含义
doInverseProjection源坐标是否需要逆投影
doForwardProjection目标是否需要正投影
doDatumTransform是否需要基准转换
transformViaGeocentric基准转换是否需要经过地心坐标
srcGeoConv / tgtGeoConv源/目标椭球的地理↔地心转换器

其中 transformViaGeocentric 的判断逻辑尤为精妙:只有当椭球不同或任一基准有 towgs84 参数时才需要走地心坐标路径;若两个基准都无转换参数且椭球相同,则直接跳过地心转换。


步骤详解 ​

① 逆投影:投影坐标 → 地理坐标 ​

java
if (doInverseProjection) {
    srcCRS.getProjection().inverseProjectRadians(tgt, tgt);
}

原理: 如果源坐标系是投影坐标系(如高斯-克吕格、UTM、墨卡托等),需要将平面坐标 (x, y) 反算为椭球面上的地理坐标 (λ, φ),单位为弧度。

  • 若源坐标系本身就是地理坐标系(如 +proj=longlat),此步跳过
  • doInverseProjection 在构造时预计算,避免每次转换都判断

② 经度基准调整至格林尼治 ​

java
srcCRS.getProjection().getPrimeMeridian().toGreenwich(tgt);

原理: 某些坐标系不以格林尼治为本初子午线(如巴黎、马德里),需将经度统一归算到以格林尼治为0度起算。


③ 基准转换(核心步骤) ​

java
if (doDatumTransform) {
    datumTransform(tgt);
}

这是整个转换中最复杂的一步,datumTransform() 方法实现了基准间的坐标转换。其内部流程如下:

③-a 短路判断 ​
java
if (srcCRS.getDatum().isEqual(tgtCRS.getDatum()) || ...) return;

源基准与目标基准相同,或任一基准转换类型未知,直接跳过。

③-b 源基准网格改正(如需要) ​
java
if (srcCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) {
    srcCRS.getDatum().shift(pt);
}

对于 NAD27 等使用网格改正的基准,先基于格网数据对地理坐标进行偏移调整。

③-c 通过地心坐标进行基准转换 ​

这是基准转换的核心路径,分为三小步:

text
源地理坐标(λ,φ) ─[地理→地心]→ 源地心坐标(X,Y,Z) ─[→WGS84]→ WGS84地心坐标 ─[→目标基准]→ 目标地心坐标 ─[地心→地理]→ 目标地理坐标(λ',φ')

Step 1:地理坐标 → 地心坐标

java
srcGeoConv.convertGeodeticToGeocentric(pt);

使用源椭球参数,将 (λ, φ, h) 转为地心直角坐标 (X, Y, Z)。公式为:

text
N = a / √(1 - e²·sin²φ)
X = (N + h) · cosφ · cosλ
Y = (N + h) · cosφ · sinλ
Z = (N·(1 - e²) + h) · sinφ

逻辑见org.locationtech.proj4j.datum.GeocentricConverter#convertGeodeticToGeocentric

Step 2:源地心坐标 → WGS84 地心坐标

java
if (srcCRS.getDatum().hasTransformToWGS84()) {
    srcCRS.getDatum().transformFromGeocentricToWgs84(pt);
}

使用源基准的 towgs84 参数(3参数或7参数),将地心坐标转换到 WGS84 下:

  • 3参数:简单平移 X' = X + ΔX
  • 7参数:平移 + 旋转 + 缩放

若源基准没有 towgs84 参数,则假定其地心坐标已在 WGS84 下。

Step 3:WGS84 地心坐标 → 目标基准地心坐标

java
if (tgtCRS.getDatum().hasTransformToWGS84()) {
    tgtCRS.getDatum().transformToGeocentricFromWgs84(pt);
}

使用目标基准的 towgs84 参数的逆变换,从 WGS84 转到目标基准。

Step 4:地心坐标 → 地理坐标

java
tgtGeoConv.convertGeocentricToGeodetic(pt);

使用目标椭球参数,将 (X, Y, Z) 迭代反算为 (λ, φ, h)。对应org.locationtech.proj4j.datum.GeocentricConverter#convertGeocentricToGeodetic中的迭代算法。

③-d 目标基准逆网格改正(如需要) ​
java
if (tgtCRS.getDatum().getTransformType() == Datum.TYPE_GRIDSHIFT) {
    tgtCRS.getDatum().inverseShift(pt);
}

④ 经度基准调整至目标本初子午线 ​

java
tgtCRS.getProjection().getPrimeMeridian().fromGreenwich(tgt);

将经度从格林尼治起算转为目标坐标系定义的本初子午线起算。


⑤ 正投影:地理坐标 → 投影坐标 ​

java
if (doForwardProjection) {
    tgtCRS.getProjection().projectRadians(tgt, tgt);
}

将目标基准下的地理坐标 (λ', φ') 投影为平面坐标 (x', y')。


完整流程图 ​

text
输入: 源投影坐标 (x, y)
  │
  ├─① 轴定向调整 (toENU)
  ├─② 逆投影: (x,y) → (λ,φ)  [源椭球]
  ├─③ 本初子午线归算至格林尼治
  ├─④ 基准转换:
  │    ├─ 源网格改正 (如NAD27)
  │    ├─ 地理→地心 (源椭球参数)
  │    ├─ 源地心→WGS84地心 (towgs84参数)
  │    ├─ WGS84地心→目标地心 (towgs84逆变换)
  │    ├─ 地心→地理 (目标椭球参数)
  │    └─ 目标逆网格改正
  ├─⑤ 本初子午线归算至目标
  ├─⑥ 正投影: (λ',φ') → (x',y')  [目标椭球]
  └─⑦ 轴定向调整 (fromENU)
  │
输出: 目标投影坐标 (x', y')

此流程图序号与上文中的序号不对应。