2026/10/12 3:38:36

GDAL SRTMHGT 驱动完全指南:SRTM HGT 数字高程文件的读取、压缩访问与写入实践

GDAL SRTMHGT 驱动完全指南:SRTM HGT 数字高程文件的读取、压缩访问与写入实践 GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载SRTMHGT 是 GDAL 中专门面向 NASA SRTMShuttle Radar Topography Mission发布的标准 HGT 数字高程数据格式的栅格驱动。本文以 GDAL 官方驱动文档为主体结合当前仓库中 srtmhgtdataset.cpp 的源码实现与 srtmhgt.py 自动化测试系统讲解 HGT 文件的命名识别规则、所支持的 SRTM-1/SRTM-3 及 0.5 度分辨率单元、.hgt.zip压缩包直读、坐标推导、NoData 约定以及 CreateCopy 写入时的严格约束让读者既能直接用gdalinfo/gdal_translate/gdalwarp处理 HGT 数据也能理解驱动底层的工作原理与边界条件。SRTMHGT 驱动与 SRTM HGT 格式的对应关系SRTM 任务采集了覆盖全球大部分陆地区域的雷达干涉数字高程数据USGS 与 NASA/JPL 将其发布为一种名为 HGT 的简单二进制格网格式。每个 HGT 文件对应一个固定大小的地理单元cell单元内的高程样本以规则网格排列数值为相对 EGM96 大地水准面的海拔高度。GDAL 的 SRTMHGT 驱动驱动短名SRTMHGT正是用来直接读写这类文件的翻译器官方文档明确说明其核心实现位于 frmts/srtmhgt/srtmhgtdataset.cpp并标注为默认内置驱动built_in_by_default。从构建脚本看frmts/CMakeLists.txt 通过gdal_optional_format(srtmhgt SRTM HGT File Read Support)注册该格式且 frmts/srtmhgt/CMakeLists.txt 中标记了PLUGIN_CAPABLE意味着它既可默认编译进 GDAL也可作为独立插件构建。该驱动当前支持读取两类标准 SRTM 产品与一类高分辨率产品SRTM-33 弧秒采样经典 1°×1° 单元网格 3601×3601用于全球覆盖SRTM-11 弧秒采样1°×1° 单元网格 1201×12010.5 度分辨率 HGT自 GDAL 3.10 起新增见 NEWS.md 中 add support for reading/writing 0.5 deg resolution datasets 的记录源码中以 7201×7201 的网格尺寸对应实现。也就是说一个 SRTM-3 文件就是一块 1 度见方的地形切片驱动按文件名解析其地理位置按文件大小推断其采样密度与数据类型。文件名命名规则与驱动识别逻辑HGT 文件必须遵循 SRTM 官方的命名约定才能被驱动识别NXXEYYY.hgt 或 NXXEYYY[.something].hgt命名拆解如下片段含义示例N/S纬度半球北纬 North / 南纬 SouthNXX单元西南角的纬度绝对值2 位整数范围 00–5937E/W经度半球东经 East / 西经 WestWYYY单元西南角的经度绝对值3 位整数122例如N37W122.hgt表示覆盖北纬 37°–38°、西经 122°–121° 的单元。文件名前 7 个字符如N37W122构成单元标识第 8 个字符必须是点号.之后是扩展名。源码 Identify() 中依次做了下列校验文件名长度不小于 11且第 8 个字符为.第 1 个字符必须是N/n或S/s第 4 个字符必须是E/e或W/w大小写均接受扩展名必须属于受支持集合.hgt、.hgts、.err、.img、.num含.img.num、.raw、.swb、.hgt.gz或形如NXXEYYY.hgt.zip/NXXEYYY.srtmswbd.raw.zip的压缩包文件名最后再以文件字节大小判定是否为合法 HGT 单元。值得注意的是驱动对扩展名相当宽容——识别阶段并不要求扩展名必须为.hgt而是接受了一整套 SRTM 系列衍生产品格式这一点与下文 NASADEM 辅助文件的支持密切相关。支持读取的文件类型与尺寸/数据类型映射驱动通过文件大小精确推断单元尺寸与数据类型这是 HGT 格式无文件头、纯二进制结构所决定的。源码 OpenPAM() 中的 switch 分支完整定义了映射表文件大小字节栅格尺寸数据类型对应产品1201×1201×21201 × 1201Int16SRTM-11 弧秒1801×3601×21801 × 3601Int16SRTM-3 高纬度单元2°×1°3601×3601×13601 × 3601UInt8NASADEM 水体掩膜.swb / .raw3601×3601×23601 × 3601Int16SRTM-33 弧秒1°×1°3601×3601×43601 × 3601Float32NASADEM SHHP.hgts文件7201×7201×27201 × 7201Int160.5 度分辨率 HGTGDAL 3.10实测中驱动为 1 字节数据返回GDT_UInt8、2 字节返回GDT_Int16、4 字节返回GDT_Float32这一点在 test_srtmhgt_all_supported_sizes 的参数化测试中得到逐一验证。而驱动注册时声明的创建数据类型为Byte Int16 UInt16见 GDALRegister_SRTMHGT()读取与创建能力大体一致。由于 HGT 数据以大端big-endian字节序存储源码在读取与写入路径中均通过GDALSwapWords()处理字节序转换IReadBlock 与 IWriteBlock这保证了跨平台一致性。每个波段以整行一个块的方式组织nBlockXSize nRasterXSize, nBlockYSize 1因此按行寻址非常直接VSIFSeekL到行号 × 行宽 × 字节数后VSIFReadL一整行即可。坐标系统与地理变换的推导HGT 文件本身不含任何坐标元数据驱动完全依赖文件名推导地理参考。在 OpenPAM() 中从文件名第 2–3 个字符解析纬度、第 5–7 个字符解析经度并根据半球字符取正负号得到单元西南角的经纬度southWestLat/southWestLon。地理变换GeoTransform的构造代码位于 srtmhgtdataset.cpp#L482-L487其核心逻辑是像素中心对齐poDS-m_gt.xorig southWestLon - 0.5 / (numPixels_x - 1); poDS-m_gt.xscale 1.0 / (numPixels_x - 1); poDS-m_gt.yorig southWestLat 1 0.5 / (numPixels_y - 1); poDS-m_gt.yscale -1.0 / (numPixels_y - 1);即每个像素代表以整度经纬度格点为中心、间隔为1/(N-1)度的采样值——例如 3601×3601 的 SRTM-3 单元采样间隔为 1/3600 度1 弧秒的 3 倍。驱动同时设置元数据AREA_OR_POINTPointsrtmhgtdataset.cpp#L489明确告诉下游工具这些高程值是点采样而非面元聚合。空间参考默认返回WGS 84地理坐标系若设置配置选项REPORT_COMPD_CSYES驱动则会返回一个COMPD_CS复合坐标系WGS 84地理坐标叠加EGM96 geoid height垂直基准源码见 SRTMHGTDataset 构造函数从而如实反映 HGT 高程相对于 EGM96 大地水准面的语义。高程单位、NoData 与 NASADEM 辅助产品SRTM 高程值的物理单位是米。波段类 GetUnitType() 默认返回m但当扩展名为.err、.img、.num、.swb时返回空单位串——因为这些文件并非高程产品.err是 NASADEM 的误差文件.img/.img.num是坡度反演数据.swb是水体掩膜。这类文件之所以能由 SRTMHGT 驱动打开是因为 NEWS.md 记录了驱动曾扩展支持 NASADEM SHHP .hgts 文件以及 .err、.img、.num、.img.num、.swb 等 NASADEM 产品辅助文件。NoData 约定方面源码定义了常量SRTMHG_NODATA_VALUE -32768srtmhgtdataset.cpp#L29即 Int16 的最小值用于标记无效/缺测高程如水体、数据空洞。GetNoDataValue() 对非 UInt8 数据类型统一返回 -32768对 UInt8 类型如水体掩膜则回落到 PAM 侧的无值定义。压缩包.hgt.zip与虚拟文件系统的直读官方发布的 SRTM 数据常以压缩包形式分发驱动对此做了专门支持。文档规定了两种访问方式直接打开.hgt.zip只要文件命名为NXXEYYY[.something].hgt.zip且压缩包内包含一个NXXEYYY.hgt文件驱动即可直接打开该 zip 文件本身。例如N37W122.SRTMGL1.hgt.zip。识别逻辑见 Identify()它会自动改写为/vsizip/内部路径并递归识别。旧式显式路径使用/vsizip/前缀的完整语法形如/vsizip//path/to/NXXEYYY[.something].hgt.zip/NXXEYYY.hgt。此外驱动同样支持 NASADEM 的NXXEYYY.SRTMSWBD.raw.zip压缩包内含NXXEYYY.raw水体数据处理方式与.hgt.zip一致srtmhgtdataset.cpp#L299-L309。在 OpenPAM() 中驱动会透明地将数据集描述Description保持为原始 zip 文件名同时实际读取内部解压后的 HGT 内容。配合驱动声明的GDAL_DCAP_VIRTUALIOYES虚拟 I/O 能力SRTMHGT 可以与 GDAL 的全部 VSI 虚拟文件系统协同工作。自动化测试 test_srtmhgt_3 正是用/vsimem/内存文件系统创建N43W080.SRTMGL1.hgt.zip后直接以gdal.Open(/vsimem/N43W080.SRTMGL1.hgt.zip)完成读取验证的。写入支持CreateCopy 的严格约束与实现细节驱动支持创建新文件但只支持 CreateCopy从已有数据集复制创建不支持空数据集 Create且输入数据必须恰好匹配一个 SRTM 单元。这是 HGT 无头格式的必然要求——驱动需要从文件名与尺寸反推全部元数据。源码 CreateCopy() 依次施加如下约束波段数零波段直接报错多波段时仅使用第一个波段严格模式bStrict下报错否则仅警告投影源必须为 WGS 84 地理坐标IsSameGeogCS校验不满足时警告并按 WGS 84 写入地理变换源必须具有 GeoTransform否则失败且单元角点必须对齐整度经纬度边界尺寸必须为 1201×1201、1801×3601、3601×3601 或 7201×7201 之一否则报错文件名驱动会根据单元西南角经纬度计算期望文件名格式如N37W122.HGT若不匹配会给出 Expected output filename is ... 的警告——因此写入时必须使用符合命名规范的文件名NoData 转换若源波段的 NoData 值不同于 -32768写入时会将其替换为标准值 -32768srtmhgtdataset.cpp#L645-L652。写入按行流式进行每行以GDT_Int16读取源数据、字节序调整后VSIFWriteL落盘并支持进度回调与用户中断。写入完成后驱动会重新打开文件并CloneInfo拷贝 PAM 元数据。测试 test_srtmhgt_1 演示了完整流程将 DTED 数据栅格重采样为 1201×1201 的 GeoTIFF 后用driver.CreateCopy(n43w080.hgt, ds)生成 HGT再验证波段校验和与原始一致test_srtmhgt_2 进一步验证了以GA_Update更新模式打开并回写数据的可行性。驱动能力一览按官方文档的驱动能力标记SRTMHGT 支持能力说明依据地理参考Georeferencing从文件名推导 WGS 84 坐标与像素中心对齐的 GeoTransformOpenPAM()CreateCopy支持从符合 SRTM 单元约束的数据集复制创建新 HGTCreateCopy()虚拟 I/OVirtualIO支持 /vsimem、/vsizip、/vsigzip 等 VSI 路径注册表项GDAL_DCAP_VIRTUALIOYESsrtmhgtdataset.cpp#L710默认内置默认随 GDAL 构建同时允许插件化frmts/srtmhgt/CMakeLists.txt在 GDAL 全驱动自检中SRTMHGT 使用的典型测试文件名为N48E002.HGT见 autotest/gcore/misc.py可以作为手工验证驱动是否可用的参考样例。常见使用场景与命令行操作掌握了命名与尺寸规则后HGT 数据在命令行下的使用非常直接。以下命令均假设文件遵循NXXEYYY.hgt命名规范# 查看 HGT 单元信息尺寸、数据类型、GeoTransform、NoData、单位 gdalinfo N37W122.hgt # 直接读取压缩包 gdalinfo N37W122.SRTMGL1.hgt.zip # 转为 GeoTIFF 并重投影到 UTM gdal_translate -of GTiff -ot Float32 N37W122.hgt N37W122.tif gdalwarp -t_srs EPSG:32611 -r bilinear N37W122.hgt N37W122_utm.tif # 将一个符合约束的栅格写入为 HGT输出文件名必须形如 NXXEYYY.hgt gdal_translate -of SRTMHGT N37W122_utm.tif N37W122.hgt执行gdalinfo时驱动会报告一个 Int16 波段、WGS 84 空间参考、像素中心对齐的地理变换、NoData 值 -32768 与单位 m。对于 gzip 压缩的.hgt.gz文件扩展名也在识别集合内可配合 VSI 的 gzip 透明解压能力使用。源码结构导览frmts/srtmhgt/srtmhgtdataset.cpp驱动全部实现核心构件为SRTMHGTDataset数据集类负责 Identify/Open/CreateCopy与SRTMHGTRasterBand波段类负责按行读写、NoData 与单位frmts/srtmhgt/CMakeLists.txt构建配置PLUGIN_CAPABLE支持插件化编译无外部依赖NO_DEPSfrmts/CMakeLists.txt在栅格驱动总表中以gdal_optional_format(srtmhgt ...)登记frmts/gdalallregister.cppGDALRegister_SRTMHGT()在驱动注册流程中被调用autotest/gdrivers/srtmhgt.py覆盖读取校验和、内存写入与更新、zip 压缩包直读、SWBD raw zip、NASADEM.hgts、全部尺寸映射等场景的自动化测试。小结SRTMHGT 驱动用约 700 行源码完整承接了 SRTM 生态中从 1 弧秒到 3 弧秒再到 0.5 度分辨率、从纯 HGT 到 NASADEM 辅助产品、从裸文件到 zip 压缩包的读写需求。其以文件名为坐标、以文件大小为结构的设计使它成为一个轻量而严谨的格式翻译器。理解命名规则与尺寸约束是在 GDAL 生态中正确消费 SRTM 高程数据的先决条件本文给出的映射表、坐标推导公式与 CreateCopy 约束清单可直接作为实际项目中的速查手册。赞分享GIS遥感数据工程【免费下载链接】gdalGDAL is an open source MIT licensed translator library for raster and vector geospatial data formats.项目地址https://gitcode.com/gh_mirrors/gd/gdal点击查看免费下载相关推荐GDAL ECW 驱动完全指南Enhanced Compressed Wavelets 格式的读取、压缩写入与 ECWP 流式访问GDAL ECW 驱动完全指南Enhanced Compressed Wavelets 格式的读取、压缩写入与 ECWP 流式访问 ECWEnhancedGIS遥感数据工程GDAL GTiff 驱动完全指南GeoTIFF 读写、压缩编码与高级特性深度解析GDAL GTiff 驱动完全指南GeoTIFF 读写、压缩编码与高级特性深度解析 GTiff 是 GDAL 中对 TIFF/GeoTIFF 格式的读写驱动GIS遥感数据工程ag-ui-spring-server-core 详解AG-UI Spring 服务端的框架无关序列化内核ag ui spring server core 详解AG UI Spring 服务端的框架无关序列化内核 ag ui spring server coreGIS遥感数据工程上一篇Perseus修改器实战指南3步解锁碧蓝航线全皮肤无偏移补丁告别更新适配烦恼下一篇不花一分钱自建翻译 APIDLX 部署与接入完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考