SRTM数据高程基准疑问及elevation库输出格式技术咨询
关于SRTM高程基准与Python elevation库的问题解答
疑问1:WGS84为何被指南称为“大地水准面”?
SRTM指南里的表述是简化写法,实际指WGS84参考椭球/EGM96大地水准面,并非说WGS84是大地水准面。WGS84确实是近似大地水准面的参考椭球,而EGM96是正式的大地水准面模型。指南这么写是因为SRTM数据存在两种基准版本:原始数据基于EGM96大地水准面,部分分发版本被转换为WGS84椭球高,用“/”涵盖这两种基准情况。
疑问2:elevation库仅输出WGS84基准TIFF,如何生成EGM96基准文件?
首先纠正笔误:你提到的EPSG4236应为EPSG:4326(WGS84地理坐标系)。elevation库默认拉取的是已转换为WGS84椭球高的SRTM分发版本,所以输出TIFF采用该基准。要得到EGM96基准的TIFF,有两种可行方式:
- 直接从USGS原始数据源下载基于EGM96的SRTM原始数据,再用GDAL、rasterio等工具自行裁剪,跳过elevation库;
- 若已有elevation库输出的WGS84椭球高TIFF,可通过基准转换得到EGM96大地水准面高:利用EGM96大地水准面差距模型,通过公式
大地水准面高 = 椭球高 - 大地水准面差距计算转换。Python实现示例如下:
import rasterio from pyproj import Transformer, CRS import numpy as np # 加载WGS84椭球高影像 with rasterio.open("wgs84_elevation.tif") as src: elev_data = src.read(1) profile = src.profile # 获取影像的地理坐标网格 x_coords, y_coords = np.meshgrid(np.linspace(src.bounds.left, src.bounds.right, src.width), np.linspace(src.bounds.top, src.bounds.bottom, src.height)) # 定义基准转换:WGS84椭球高 -> EGM96大地水准面高 transformer = Transformer.from_crs( CRS.from_epsg(4326, ellps="WGS84"), CRS.from_epsg(4326, geoidgrids="egm96_15.gtx"), always_xy=True ) # 计算大地水准面差距,再转换为EGM96高程 _, _, geoid_offset = transformer.transform(x_coords, y_coords) egm96_data = elev_data - geoid_offset # 保存EGM96基准影像 with rasterio.open("egm96_elevation.tif", "w", **profile) as dst: dst.write(egm96_data.astype(elev_data.dtype), 1)
注:需提前下载EGM96大地水准面格网文件(如egm96_15.gtx),pyproj会自动识别加载。
关于SRTM是否提供两种基准的数据?
并非两套独立数据,而是同一原始数据的不同基准转换版本:SRTM原始采集数据的高程基准是EGM96大地水准面,后续部分机构将其转换为WGS84椭球高进行分发,elevation库默认获取的就是这个转换后的版本。
内容的提问来源于stack exchange,提问作者Sagi Mann
相关产品推荐
相关产品推荐

