ARTICLE · 1184678
月球 DEM 从下载到可用:全流程实操 + 整理好的 4 GB 数据包

NASA 的月球全球 DEM(LOLA 数据)是公开的,但真要用起来,中间有好几道坎:文件是裸二进制、没有头文件、定标参数藏在另一个文本里、2 GB 的体积下载和读取都是问题。
我最近把这套数据完整走了一遍:下载 → 解码 → 转 GeoTIFF / 高度图 → 切片 → 写说明文档,整理成了一个 4.13 GB 的数据包。这篇把全流程和踩过的坑讲清楚,数据包在文末。

一、数据源
数据集是 LRO-L-LOLA-4-GDR,NASA 月球勘测轨道器上 LOLA 激光测高仪的全球地形产品。2009–2016 年间累计约 70 亿个测点,径向精度 0.5 米。
官方提供 4 / 16 / 128 三档分辨率(像素每度),128 是最高档,没有 256:
| 分辨率 | 网格 | 地面分辨率 | 原始文件体积 |
|---|---|---|---|
| 4 ppi | 1440 × 720 | 7 581 米 | 2 MB |
| 16 ppi | 5760 × 2880 | 1 895 米 | 32 MB |
| 128 ppi | 46080 × 23040 | 237 米 | 2 GB |
选型建议:出全月小图用 4 ppi 就够;做全国范围分析用 16 ppi;做局部地形、三维渲染、地貌解译,直接上 128 ppi。
两个官方镜像:
https://imbrium.mit.edu/DATA/LOLA_GDR/CYLINDRICAL/IMG/https://pds-geosciences.wustl.edu/lro/lro-l-lola-3-rdr-v1/
第一个坑:别用 JP2 版。 官网同时提供 JPEG2000 压缩版,体积只有 IMG 的三分之一。我把 LDEM_16 的 JP2 和 IMG 逐像素比对过,它是有损的,误差约 50 米。要做分析、做三维,只下 .IMG。
二、下载
直接下 LDEM_128,单线程速度只有 1.5 MB/s 左右,要 20 多分钟。
我测了一下,这个镜像支持 HTTP Range 请求(返回 206)。那就好办了——分段并行:
# 核心逻辑:把文件切成 N 段,每段一个线程按 Range 下载headers = {"Range": f"bytes={start}-{end}"}# N=8 时实测 31.7 MB/s,2 GB 约 90 秒
8 线程实测 31.7 MB/s,2 GB 文件 90 秒下完,比单线程快 20 倍。下载完按偏移拼接,用文件总长校验(2 123 366 400 字节)。

三、解码:裸二进制怎么变成高程
IMG 文件没有任何文件头,就是一段连续的 int16 数组。定标参数在同名的 .LBL 文本里(PDS3 标签格式,记事本就能打开),关键就三行:
数据类型:有符号 16 位整数,小端序
尺寸:46080 列 × 23040 行
定标:高程(米) = DN × 0.5,DN 是像素值
读取用 memmap,不要整块载入(2 GB 数据,8 GB 内存的机器会直接卡死):
importnumpyasnpdem = np.memmap("ldem_128.img", dtype="<i2", mode="r",shape=(23040, 46080)) *0.5# 单位:米
坐标约定(这个容易搞错):
等距圆柱投影,简单说就是经纬度直接铺成矩形
第 0 行 = 北极 90°N,第 0 列 = 0° 经线,经度 0–360° 向东(不是 −180~180)
反算:纬度 = 90 − 行号/128,经度 = 列号/128
高程基准:相对 1737.4 km 参考球面的起伏,不是"海拔"
实测这版数据的高程范围:−9 127.0 ~ +10 778.5 米,均值 −519.5 米。
顺带一个交叉验证:我从数据里独立扫描出的最高点坐标(5.410°N, 158.629°W),与 NASA 2010 年公布的官方坐标(5.4125°N, 158.6335°W)只差约 100 米——所以这份数据是靠谱的。
四、转换:三种产物,对应三种用法
1. 转 GeoTIFF(QGIS / ArcGIS 用)
转成 GeoTIFF 后坐标内嵌,QGIS 直接拖进去就能用,不用再配 tfw/prj。
第二个坑:GeoTIFF 里存的不是原始 DN。 为了让 GIS 软件和看图软件都能正常显示,我把它归一化到了 0–65535 的 uint16。还原公式和 IMG 完全不同,而且三档参数各不相同,混用会算出错误高程:
| 分辨率 | DN_MIN | SPAN | VMIN (米) | VMAX (米) |
|---|---|---|---|---|
| 4 ppi | −17757 | 38765 | −8878.5 | 10504.0 |
| 16 ppi | −17963 | 39334 | −8981.5 | 10685.5 |
| 128 ppi | −18254 | 39811 | −9127.0 | 10778.5 |
128 ppi 的还原:高程 = −9127.0 + (像素值/65535) × 19905.5
这个归一化是可逆的(每档 DN 取值数都小于 65536),不丢信息。但要绝对原始值,还是用 IMG 按第三节的方法读。
第三个坑(我自己犯的): 转换时输出尺寸要按 宽度 = 目标分辨率 × 360 反算。我最早为了省体积把 128 ppi 的 GeoTIFF 压到了 4096 宽,实际精度变成 11 px/度,比文件名标的 128 低了一个数量级。已重做为 46080 × 23040 全分辨率,并与原始 IMG 逐点校验零差异。
2. 转 16 位 PNG 高度图(三维引擎用)
做 Three.js / Cesium 位移贴图的话,导出 16 位灰度 PNG,还原公式同上。
第四个坑: LOLA 数据第 0 列是 0° 经线,而三维引擎的球体贴图 UV 原点通常在 −180°。直接贴会歪 180°,记得加 texture.offset.x = 0.5。
3. 切片(局部研究用)
全分辨率下按经纬度窗口裁切,1:1 不重采样。我切了 4 个地标各 4096 × 4096(约 970 km 见方):第谷坑、雨海、南极-艾特肯盆地、静海(阿波罗 11 号着陆区所在的月海)。

五、数据包里有什么
整理好的包共 35 个文件、4.13 GB:
月球DEM数据包/├── 说明.txt ← 12 节完整文档,还原公式/坐标/示例代码都在里面├── moon_3d_preview.html ← 浏览器双击可转的 3D 预览├── 技术细节_生成过程.md├── 01_原始数据/ ← 三档 IMG + LBL,官方原样├── 02_渲染图与地标切片/ ← 128 ppi 渲染图 4 张 + 地标切片└── 03_GeoTIFF/ ← 三档 GeoTIFF + tfw/prj,QGIS 直读
所有换算参数、读取示例、注意事项都写在 说明.txt 里,拿到手不需要再查任何资料。

六、最后提醒几条
128 ppi 的 IMG 和 GeoTIFF 各 2 GB,读取务必用 memmap / 按需加载,别整块进内存
等距圆柱投影在极区有严重拉伸,做面积统计时要换算
数据基于 2016 年 11 月前的观测,LDEM_4 是 V3.0,另两档是 V3.1
引用出处:Smith et al. (2010), Space Sci. Rev., 150, 209–241;LRO-L-LOLA-4-GDR-V1.0, NASA PDS

数据包获取: 后台回复「月球dem」,这边直接发您百度网盘链接~
这个号会持续把公开的地理数据整理成"开箱即用"的包——下一期在做 SRTM / ASTER GDEM 对比。做 GIS 的同行可以关注,省得每次都自己从头踩坑。
觉得有用的话,转给需要的同学。















































































