使用 GDAL 在正高和椭球高之间转换
在处理高程数据时,有时你会发现来自不同提供商的 2 个数据集在同一位置具有非常不同的高程值。造成这种情况的一个常见原因是每个数据集都参考了不同的表面。
正高(Orthometric elevation,或大地水准面高) 测量的是从平均海平面 (MSL) 到某点的高度。基于地面的测量通常产生正高。
椭球高(Ellipsoidal elevation) 测量的是从参考椭球体(如 WGS84)到某点的高度。源自星载平台的高程通常是椭球高。
椭球体(Ellipsoids) 是地球表面的简单模型,使用半长轴 (a) 和半短轴 (b) 定义。大地水准面(Geoid) 是一个更复杂的模型,因为它试图模拟不均匀的地球引力。有几种模型定义了整个地球表面的大地水准面形状。
由于这两者都是数学模型,因此可以将高程从一个参考转换到另一个参考。GDAL 命令行工具是进行这些转换的一种免费且简便的方法。
在这里,我将展示一个在 2 个高程数据集之间进行转换的实际示例。
Cartosat-1 数字高程模型 (CartoDEM) 是由印度空间研究组织 (ISRO) 开发的国家级 DEM。它源自 2005 年 5 月发射的 Cartosat-1 立体载荷。Cartosat DEM 参考的是 WGS84 椭球体模型(因此具有椭球高)。可以从 BHUVAN 下载 30米分辨率的源数据。
航天飞机雷达地形测绘任务 (SRTM) 是由美国国家地理空间情报局 (NGA) 和美国国家航空航天局 (NASA) 牵头的一个国际项目。在其 11 天的任务中,奋进号航天飞机绕地球轨道运行了 16 次,并以 1 角秒(30 米)的分辨率获取了地球 80% 以上表面的地形。下载 SRTM 30m 数据的一个简单接口是 30-Meter SRTM Tile Downloader。SRTM 数据参考的是 EGM96 大地水准面模型(因此具有正高)。
转换数据集所需的 GDAL 命令是 gdalwarp。我们需要为它提供源空间参考系统 (s_srs) 和目标空间参考系统 (t_srs) 值。
注意:
本文的旧版本使用 EPSG 代码来指定复合 CRS,例如 EPSG:4326+5773。自 GDAL3/PROJ6 发布以来,不再支持此语法。本文已更新为新语法。
如何运行这些命令?
请按照 这些说明 为你的平台安装 GDAL 实用程序。
安装完成后,打开 shell,然后 cd 到包含文件的目录。例如,如果你的文件在 C:\Users\ujaval\Downloads\ 中,请先运行以下命令:
cd c:\Users\ujaval\Downloads
以下部分中的命令假设你的文件名为 cartosat.tif。在运行命令之前,请将其替换为你自己的文件名。
在垂直 CRS 之间转换
这两个数据集具有相同的水平 SRS,但具有不同的垂直 SRS。因此,我们可以使用 proj 字符串如下引用它们:
SRTM = 具有 EGM96 高程的 WGS84 椭球体
+proj=longlat +datum=WGS84 +no_defs +geoidgrids=egm96_15.gtx
Cartosat-1 = 具有 WGS84 高程的 WGS84 椭球体
+proj=longlat +datum=WGS84 +no_def
所以现在两者之间的转换就是指定源 SRS 和目标 SRS 的问题。
下面是用于将 Cartosat-1 DEM 转换为正高的命令。
gdalwarp -s_srs "+proj=longlat +datum=WGS84 +no_def" -t_srs "+proj=longlat +datum=WGS84 +no_defs +geoidgrids=egm96_15.gtx" cartosat.tif cartosat_orthometric.tif
如果你在 QGIS 中加载原始的 cartosat.tif、cartosat_orthometric.tif 和 srtm.tif,并检查高程值,你会看到 cartosat_orthometric 和 srtm 的高程现在几乎完全匹配,因为它们参考了同一个大地水准面。

上图包含由印度海得拉巴印度政府 ISRO 国家遥感中心提供的 CartoDEM Version-3 R1 的可视化。
PROJ 网格 (PROJ Grids)
GDAL 使用 PROJ 库 来执行 CRS 变换。PROJ 使用预定义的网格进行基准面变换。垂直基准面变换使用 GTX 文件 定义。在上面的示例中,当我们转换到 EGM96 垂直 CRS 时,它使用了 egm96_15.gtx 文件中提供的参数。许多此类网格文件在你下载和安装 GDAL 时已包含在内。但也有些非常大的网格默认不包含。如果你想转换到一个默认未包含网格文件的垂直基准面,你需要单独下载它们并将它们复制到系统上的相应目录中。了解更多关于 PROJ 资源文件 的信息。
其中一个垂直 CRS 是 EGM2008 (EPSG:3855)。假设你想将 WGS84 高度转换为这个新的、更精确的大地水准面模型。你可以运行如下命令:
gdalwarp -s_srs "+proj=longlat +datum=WGS84 +no_def" -t_srs "+proj=longlat +datum=WGS84 +no_defs +geoidgrids=egm08_25.gtx" cartosat.tif cartosat_orthometric.tif
但如果你运行它,你可能会得到如下错误:
ERROR 1: Cannot open egm08_25.gtx.
这是因为 EGM2008 网格非常大,许多 GDAL 安装中未包含它。要解决此问题,你可以从 http://download.osgeo.org/proj/vdatum/egm08_25/ 下载网格文件。
将 egm08_25.gtx 文件复制到你计算机上的 PROJ 资源目录。此目录的位置取决于你的平台和安装方法。一些常见的路径如下:
Windows: C:\OsGeo4W64\share\proj\
Mac: /Library/Frameworks/PROJ.framework/Resources/proj/
Linux: /usr/share/proj/
复制文件后,gdalwarp 应该能够正确执行变换。
如果这不起作用,或者 GDAL 无法定位网格文件,你也可以指定网格文件的完整路径。网格文件可以是 gtx 或 tif 格式。例如,如果你有一个位于 C:\ 驱动器的德国网格 (GCG2016) 变换文件,请将 +geoidgrids=egm08_25.gtx 替换为 +geoidgrids=C:\GCG2016.tif(感谢 Christian Loeser 提供此提示)。