做地形分析这些年,DEM选型一直是个容易让人纠结的问题。全球公开DEM里,ASTER、SRTM、ALOS、哥白尼都被不少人推荐过,可真落到中国区域的高精度地形应用上,我这两年固定用的还是哥白尼全球30米DEM(Copernicus DEM GLO-30),并且会在原始数据之上做一遍系统性优化。今天这篇就把优化后的中国30米高精度DEM数据分享出来,完整交代我为什么要这么选、优化链路怎么设计的、精度验证靠不靠谱,以及拿到数据后最容易被忽略的使用细节。无论是做水文分析、山地灾害评估,还是选址规划、户外三维可视化的同学,都建议耐心看完。
很多人选DEM只看"米数",觉得30米一定比90米强,其实真正的差距在垂直精度。哥白尼DEM基于雷达干涉测量任务生成,两套天线同时观测地表,提取出的高程信息整体噪声更低、连续性好。在中国区域的中低起伏地形上,标称垂直精度基本能到10米以内(按LE90统计),换算成RMSE大约4~6米,这和早期SRTM、ASTER的数据相比,已经有代差优势。更关键的是,它的全球一致性明显更好,做跨区域拼接时不必担心相邻数据源之间的系统偏差。
这次分享的"优化版",并不是我重新造了一套高程模型,而是以哥白尼GLO-30为底图,重点解决原始切片在中国区域的空洞、条带噪声、水体高程异常和接缝跳变问题。处理完的数据在可视化和工程分析里都更省心,打开就能直接参与计算,不用再做繁琐的预处理。
1. 为什么哥白尼GLO-30在我的选型表里排第一
1.1 垂直精度带来的优势不是玄学
地形分析的源头数据只要误差稍大,后面所有衍生结果都会被放大。比如提取坡度时,高程误差每增大1米,坡度计算误差可能增大到好几度;而汇水积累、径流路径对地形起伏方向又格外敏感,一个几十米的高程异常就可能让河道改道。
SRTM数据虽然经典,但它的采集时间是2000年,山区存在雷达阴影和空洞后在回填时用了较粗的插值,局部地区垂直误差明显偏大。ASTER GDEM由多时相光学立体影像拼接而成,最大的问题是云、雪和阴影导致的噪声和异常值,在东南丘陵、西南山区这种植被茂密区域,经常会出现成片的伪坑和土包。ALOS AW3D30精度表现很好,波段覆盖广,但在印度、东南亚等区域拼接缝明显,中国西部地区的条带问题也不可忽视。哥白尼GLO-30在整体平衡性上最好,雷达数据不受云层干扰,可以穿透一定植被冠层,得到更接近地表的高度。
1.2 一张表看懂几个主流DEM的实际差距
| 数据源 | 标称分辨率 | 常见垂直精度(LE90) | 覆盖范围 | 观测时段 | 获取成本 |
|---|---|---|---|---|---|
| 哥白尼GLO-30 | 30米 | 约10米 | 全球 | 2011—2015年 | 免费 |
| SRTM 1弧秒 | 30米 | 约16米 | 北纬60°至南纬56° | 2000年 | 免费 |
| ASTER GDEM | 30米 | 约17—20米 | 全球 | 多时相拼接 | 免费 |
| ALOS AW3D30 | 30米 | 约5米(区域差异大) | 全球 | 2006—2011年 | 免费 |
注意ALOS的标称精度确实高,但它的全球一致性稍弱,在中国西部高山区和部分低纬度地区,拼接缝附近的高程差值可以达到十几米。哥白尼GLO-30在极端地形下的表现更稳定,这也是它适合作为全国范围统一高程底座的根本原因。
1.3 既然全球数据已经可用,为什么还要单独做中国区域优化
先说明一个朋友经常问的问题:原始哥白尼GLO-30已经全球覆盖,直接下载用不行吗?答案是可以,但很折腾。
首先,GLO-30按经纬度分幅分发,中国区域要跨几十个图幅。每个图幅虽然来自同一套产品,但相邻瓦片之间仍有细微的高差跳变,直接拼接后会在边界形成线性台阶。这种台阶在整体渲染时不太起眼,一旦提取坡度坡向或做流域切割,就会变成密集的假山脊。
其次,原始数据在中国高山区和太湖水系周边存在局部空洞、异常负值和锯齿状纹理。整幅看比例不大,放到局部工程里,可能正好卡在坝址、道路或房屋选址点上。做优化处理,本质上是把这些"高级数据里的低级问题"清理干净,让使用者把精力放在业务模型上,而不是死磕数据预处理。
2. 原始哥白尼DEM在中国区域最容易踩的四个坑
2.1 空值不是"没有数据",而是雷达没有拿到有效回波
这是很常见的坑。雷达干涉测量在陡崖、深切河谷、水面和强反射区,会发生相位失相干,最终会留下大块空值区。很多软件在读取DEM时会把空值当成0米、-9999米甚至某个小数,导致后续计算完全不收敛。
我见过有人直接用原始DEM做淹没分析,结果河道中心戳出一圈负三万米的深坑,计算范围直接崩了。更隐蔽的是,一些软件默认把空值设为0米,在西部高山区直接把高程整体拉低了几千米,坡度坡向全盘失真。所以拿到原始数据后,第一件事必须检查NoData掩膜,并且要在填洞前做一次边缘膨胀,因为空洞边界常常有一圈"半可靠"的高程,直接插值会把这些半污染值一并带进结果。
2.2 水体区域的高程混乱不是小概率事件
雷达信号在水面上反射很弱,且受风浪影响严重,导致水体的高程经常出现异常。哥白尼产品虽然有水体掩膜辅助,但实际水面仍然存在两种情况:一是水面被抬高了几米,呈凸起状;二是湖岸边出现一道"环状高坎",看起来像堤坝,实际上是水面高程与陆地参考面不匹配造成的。
这种问题对防洪、淹没分析是致命的。如果DEM中水面本身凹凸不平,计算出的淹没边界会呈锯齿状,甚至出现"湖水漫到一边、另一边干旱"的假象。我的处理流程里会专门做水面修复:找出水体区域,统计邻域水面高度,把异常像元压平到参考水面,再对岸线周边做过渡平滑。
2.3 轨道条带噪声让地形纹理看起来像"拉丝"
雷达数据由多个轨道拼接而成,不同轨道虽然做过匹配校正,但在高山峡谷、坡度突变区域仍然会留下方向性纹理。放大看就像一块金属表面被拉出细密的丝,肉眼还能凑合接受,等提取坡度图或者山体阴影图时,规律性的亮暗条纹就藏不住了。
这种条带不能用普通低通滤波硬压。低通滤波会把山脊线和河谷的真实形态一起磨平。正确做法是先做低频地形提取,得到残差,再只针对残差里方向性明显的条纹分量做削减,最后把削减后的残差加回去。这样能在压制条纹的同时保住地形细节。
2.4 海岸线附近的高程错位一样要管
虽然标题是陆地DEM,但中国有很长的海岸线和大量海岛区域。雷达参考面与潮汐参考面存在系统性差异,导致海陆交界处经常出现负高程或错位台阶。有的地方陆地高程突然变成-5米,有的地方海面上却冒出几个"人工岛"。
做海岸带分析、海岛三维可视化和近岸淹没模拟的人,如果直接拿原始DEM来用,基本会在海岸线上翻车。我的处理方法是引入海岸线掩膜,对陆地一侧做高程修正,同时对海面区域统一压到0米或按需保留负值,再把岸线周边做一圈低强度平滑。
四个坑看起来不大,但任何一个都可能让下游计算崩盘。它们不像数据下载失败那样容易被发现,而是潜藏在结果里,等业务模型给出一个看似合理但其实方向错误的答案。
3. 我的优化链路:从空洞检测到条带噪声压制
这一节是全文最核心的部分,整个处理流程我拆成五步,每一步都有明确的输出物和校验方式。
3.1 第一步:把NoData和粗差统一标记出来
先用栅格工具读取出整个区域的DEM数组,把空值、异常负值、极低质量值统一标记为"待处理区"。需要注意的是,不要只标记NoData本身,还要把极端高程值也纳入异常检测。比如某个像元高程比周围邻域均值低几百米,或者高出几百米,即使它本身不是NoData,也应该视为粗差。
实践中,我会对原始NoData掩膜做一次向外膨胀,通常膨胀3至5个像元。这样做的好处是,空洞边缘那圈"半可靠"数据也会被纳入待处理区,插值时就不会被这些劣质边缘值带偏。这里基于常见实践做一个补充说明:如果你使用的工具不支持膨胀操作,也可以用邻域统计方法,把邻域内有效像元占比低于90%的点全部标记为可疑点。
3.2 第二步:按地形类型选择插值策略,而不是一把梭
填洞最怕的就是"一刀切"。把平原和山地用同一种插值方法处理,结果一定是平原出现鼓包、山地出现阶梯。
我的方案是把待处理区按坡度分成三类:
- 平缓区(坡度小于3度):使用邻域均值加中值滤波,优先保证高程过渡自然。
- 中起伏区(坡度3度到15度):使用反距离加权插值,同时参考周围多个方向的高程趋势。
- 陡峭区(坡度大于15度):使用带坡度趋势约束的插值器,确保填补后的高程与周边山体走向一致,不会在悬崖边上造出反向斜坡。
这样做的好处很明显:填补后的地形不会出现"平台上突然冒尖"或者"山谷里多了一段反向坡"的反常形态。以我处理过的西部高山峡谷样区为例,优化前陡坡区空洞周边的高程跳变经常超过30米,优化后控制在5米以内,而且视觉上完全看不出插值痕迹。
3.3 第三步:用残差法压制条带噪声,而不是直接模糊
条带噪声和真实地形叠加在一起,直接去掉很难。我常用的方法是残差分解:
- 对DEM做一次窗口较大的局部低频提取,比如使用25×25窗口的中值滤波或高斯低通,得到低频地形。
- 用原始DEM减去低频地形,得到残差图。残差图里包含高频地形细节,也包含条带噪声和随机噪声。
- 在残差图上检测方向性纹理。具体做法是沿着多个角度计算灰度共现或梯度统计,找到主导纹理方向。
- 只削减主导方向上的残差分量子,保留其他方向的细节。
- 把处理后的残差加回低频地形,得到最终降噪结果。
这种方法比直接做整体滤波科学得多。直接低通滤波会把山脊、河谷的细节全部磨掉,而残差法只动"噪声方向",真实的地形高频信息能保留九成以上。优化完成后的坡度图,几乎看不到原来的木纹状条纹,但等高线的弯曲形态依然清晰。
3.4 第四步:水体修复和跨瓦片接缝匀色
水体修复分为两个动作:
- 水面压平。结合水体掩膜,统计水体覆盖范围内高程的众数或中位数,把明显高于这个基准的像元压低,再用小窗口平滑让水边线自然过渡。
- 岸线修正。对紧贴水面的一圈陆地像元做高程检查,若高差超过设定阈值,则按过渡带处理,避免出现"环状高坎"。
跨瓦片拼接匀色相对简单:相邻瓦片重叠区做渐入渐出的加权融合,融合范围建议设定为重叠区内的若干像元,这样能保证边界位置没有台阶感。需要提醒的是,匀色不是把两张图平均一下完事,而是在拼接前先把两个瓦片的高程统计量(均值、标准差)对齐,再做融合,否则会出现"阴一半晴一半"的双重纹理。
3.5 第五步:输出格式、坐标系和分片命名
优化后的数据我统一输出为GeoTIFF格式,坐标系保持WGS84经纬度,高程单位是米,NoData值显式设置为-9999。每个分片同时生成金字塔概览,这样在桌面GIS里缩放不会卡顿。
分片命名逻辑建议带上区域和生产日期,比如cop30m_chn_区域代号_v202406.tif。在实际项目里,我不建议一次性打包一个超大全国文件,因为桌面软件加载会非常吃力。按区域分片,使用者按需下载,才是更合理的分享方式。
4. 优化后数据是否可信:我用的三重校验
数据优化完不能直接宣称"精度很高"。不管处理链路设计得多漂亮,都必须有可量化的验证过程。我这套数据校验分成三个层次,缺一不可。
4.1 第一重:内部一致性检查
把优化前后的DEM做差值统计,生成一张差异栅格图。检查目标很简单:
- 差值分布是否集中在某个合理区间内?
- 是否存在异常的大范围偏移?
- 优化后的坡度、坡向图是否还残留条带?
通常优化后差异栅格的标准差会明显小于原始数据噪声水平。比如某片区域原始局部高程抖动达到8米,优化后应降到3米以内。同时要看差异栅格的空间分布,不能出现某条轨道覆盖范围内全部被大幅修改的情况,那说明条带处理过头了。
内部一致性检查还会统计空洞回填率。比如原始数据某区域空洞面积占5%,优化后应降为0%。同时记录填补区域的面积占比,方便后续使用者评估这些区域的不确定性。
4.2 第二重:与高精度参考点对比
内部看起来顺滑,不意味着数值接近真实地形。还需要外部参考数据。在可获得的区域里,我整理了一批高精度实测点、已知的固定站数据和多条GNSS轨迹数据,从中提取优化前后的高程值,计算差值。
对比时按地形类型分组:
- 平原区:高程差均值应接近0米,标准差控制在2米以内。
- 丘陵区:高程差标准差控制在5米以内。
- 高山区:高程差标准差可以放宽到8米左右。
这里要注意一个原则:修复区域的统计结果不能与原数据区域内统计结果差太多。如果修复区域误差明显偏大,说明插值策略有问题;如果修复区域和原始区域误差接近,说明优化没有引入新的系统性偏差。我在部分样区测下来的结果是,优化后整体LE90依然在10米内,修复区域和未修复区域没有统计上的显著差异。
4.3 第三重:面向应用的反向验证
数字指标达标了,最终还要看真实业务能不能用。
我会用优化后的DEM做三类典型应用测试:
- 水文分析:提取河流网络,检查河道是否连续,有没有因为空值或异常高程导致河道莫名其妙断裂。
- 坡度坡向提取:生成坡度图,肉眼检查是否存在规律性方向的条纹,再对比原始数据,确认山脊线没有位移。
- 可视域分析:选取若干高点做视域计算,看山顶点、谷底点、鞍部的相对关系是否符合基本地学常识。
这类验证的好处是,它抓住了"数据用于业务后是否合理"这一层,而不是只盯着单点误差。实际测下来,优化后的河道连续性明显好过原始数据,那些原本被空洞截断的水流都能自然汇入主干河道,说明空洞填补的质量是可靠的。
5. 拿到数据后的一些使用建议与避坑经验
5.1 坐标系和投影别用错,否则坡度直接失真
不少朋友拿到DEM后,习惯在Web墨卡托投影下直接计算坡度坡向,结果高纬度地区坡度被夸张放大,山体变得极其险峻。这不是DEM的问题,而是投影变形导致的。
我的建议是:做全国或大区域范围概览时,可以用WGS84经纬度坐标直接渲染;但如果做坡度、坡向、流域分析这类对方向和距离敏感的计算,务必先转到当地最合适的平面投影坐标系。通常在中国区域可以选择高斯-克吕格投影或合适的UTM分带,中央子午线要和目标区域经度对应起来。跨度大的区域建议按带拆分处理,不要强行用一个投影覆盖全国。
5.2 重采样分辨率要克制,别指望插值变出细节
优化数据原始分辨率是30米。有人为了视觉好看,在ArcGIS里直接重采样到5米,然后渲染出非常"高清"的地形图。这种图看着舒服,但那些细腻变化都是插值算出来的,不是真实地形,做工程分析时没有任何增益。
我的习惯是:区域尺度分析直接用30米;若模型需要更细网格,可以重采样到15米或20米,算法选择双线性内插或立方卷积;极端追求平滑效果可以用中值重采样,但注意它会改变地形细节。千万不要为了"更细"而无脑加密,那样只会增加计算负担,不会提升精度。
5.3 坡度算法别默认一把梭,Horn算法通常更稳
很多GIS软件的坡度计算默认是基于简单差分,在平原地区容易生成大量伪坡度,比如水田地区出现3度到5度的"假斜坡"。针对这种情况,推荐使用Horn算法(八邻域加权)来计算坡度,它在起伏地形的表现更接近真实情况。
同时,在坡度图拉伸显示时,建议把0到2度的范围单独设色,不要和2度以上的区域混在一起,否则平地区域的地形噪声会被明显放大。很多人做完坡度图觉得"怎么到处都是坡",其实不一定是数据问题,而是渲染方案问题。
5.4 应用场景扩展:水文、灾害、选址都能用
优化后的DEM最直接的应用就是水文分析。之前用原始数据跑水文模型,经常出现小支流中断、主河道偏移的问题;换成优化数据后,流向连续,子流域边界稳定,模型参数调试效率高了很多。山地灾害评估方面,坡度、坡向、地形起伏度这些基础因子都可以直接提取,不需要再额外修数据。选址规划也能用,比如建筑选址、光伏选址,前期用DEM看坡度分级和坡向分布,能省掉大量现场踏勘的试错成本。
5.5 最后再分享一个小技巧
很多人在拿到DEM后习惯直接加载到三维场景里看效果,但如果发现山体出现"搓衣板"纹理,可以先查看是否是显示分辨率设置太低,或者渲染时采样的像素间距太大。排除了这两个因素,才需要考虑数据本身是否有条带问题。这套优化数据在常规三维场景下不需要额外滤波,但每个软件的重采样方式不同,极偶尔还是会出现轻微锯齿。遇到这种情况,把显示采样改为双线性,通常就能解决。
我现在的主要工作流基本固定了:原始哥白尼GLO-30作为基础输入,先做空洞与粗差修复,再做条带压制和水体处理,最后拼接匀色。整个流程跑下来,不仅图面干净,后续的计算结果也更稳定。这套优化后的中国区域30米DEM,不管自己用还是分享给同行,都能明显缩短从"拿到数据"到"产出结论"之间的路径。希望这篇梳理对你也有参考价值。