离线获取任意经纬度海拔高度?一个100行代码的跨平台方案
在地图开发中,有一个看似简单却常常令人头疼的需求:如何获取指定经纬度位置的海拔高度(即绝对高程)?
我们知道,绝对高程(又称海拔)是指地面某点沿重力方向到大地水准面(通常以平均海平面为基准)的垂直距离。我国采用的是“1985国家高程基准”,以青岛验潮站1952–1979年的黄海平均海水面为基准,并在青岛观象山设立了国家水准原点,其高程为 72.260 米。
然而,尽管这个需求很常见,主流地图厂商(如高德、百度、腾讯地图等)并未开放获取海拔高度的 API 接口。原因可能是出于数据安全或政策限制。虽然 Google Maps 的 Elevation API 能提供高程数据,但在国内基本不可用——开发者或许能FQ调试,但用户几乎 100% 无法访问,且必须依赖在线网络,离线场景完全无解。
于是,我们不得不另辟蹊径。
曾经的尝试:GDAL 太重,TinyTIFF 不够
最初想到的是使用开源地理空间库 GDAL。它确实支持读取 .tif 格式的数字高程模型(DEM)文件,并从中提取高程值。实测可行,但问题也很明显:
- 源码庞大(2000+ 文件),编译极其复杂;
- 依赖众多(如 libtiff、zlib、SQLite 等);
- 集成到移动端或嵌入式项目中成本过高。
后来又尝试了 TinyTIFF 等轻量级 TIFF 解析库,却发现它们仅支持普通图像 TIFF,不支持地理编码信息(GeoTIFF),更无法直接解析高程数据。
几经折腾,几乎要放弃。
转机:原来高程数据可以这么简单!
就在快要放弃时,一次深入 GDAL 使用过程中的观察带来了关键突破:
高程 TIFF 文件中的每个像素灰度值,其实就对应着该位置的海拔高度!
更重要的是,这类 DEM 数据通常还会附带一个 .txt 或 .hdr 的元数据文件。打开一看,内容清晰明了:
ncols 3601
nrows 3601
xllcorner 116.0
yllcorner 39.0
cellsize 0.00027777777777778
NODATA_value -9999
其中:
xllcorner/yllcorner是左下角(或左上角,视格式而定)的经纬度;cellsize是每个像素代表的经纬度跨度;- 后续数据就是按行排列的高程值(单位:米)。
这意味着:根本不需要复杂的图像解析库!
只要读取这个文本格式的高程数据(或将其转为二进制/内存数组),再根据目标经纬度计算出对应的行列索引,就能在 纳秒级时间 内查到海拔值。
最终方案:100 行代码,全平台通用
基于上述发现,我写了一个极简的高程查询类:
- 仅需加载一次高程数据文件(可为文本或二进制);
- 支持任意经纬度快速定位;
- 纯 C++ / Java / Python 实现,无任何第三方依赖;
- 完全离线,适用于 Android、iOS、嵌入式设备甚至 Web(通过 WASM);
- 代码不到 100 行,维护成本极低。
从此,再也不用为“杀鸡用牛刀”而烦恼。一个轻量、高效、跨平台的离线高程查询方案就此诞生。

小结
有时候,最复杂的不是问题本身,而是我们一开始选错了工具。
当你发现高程数据本质就是“带坐标的二维数组”时,一切就变得异常简单。
如果你也在做地图、无人机、户外导航或 AR 应用,不妨试试这种轻量级方案——离线、快速、自由可控,何乐而不为?
注:公开的 DEM 数据源包括 NASA 的 SRTM、ASTER GDEM,以及国内部分测绘部门发布的栅格高程数据(需注意合规使用)。
如需示例代码或数据格式解析细节,欢迎留言交流!
四、相关地址
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- 文件地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip

浙公网安备 33010602011771号