4. DEM预处理:数据格式转换、投影变换、空洞填充与滤波

各位同学,咱们今天聊DEM预处理。说实话,很多人拿到DEM数据就直接往软件里一扔,开始做三维建模。我当年也这么干过,结果模型出来全是锯齿,地形分析根本没法看。后来才明白——预处理这一步,决定了你后面所有工作的质量。

DEM预处理说白了就四件事:格式转换、投影变换、空洞填充、滤波去噪。咱们一个一个来拆解。

4.1 数据格式转换——别让格式卡住你

DEM数据的格式五花八门。我见过最头疼的是有人拿了个.asc文件,愣是不知道怎么打开。其实常见的格式就那么几种:

格式 特点 适用场景
GeoTIFF 自带地理信息,通用性强 绝大多数GIS软件
ASCII Grid (.asc) 纯文本,可读性好 小范围数据交换
IMG ERDAS格式,支持多波段 遥感专业软件
DTED 军事标准格式 国防、航空领域

我个人习惯,所有DEM数据统一转成GeoTIFF。为什么?因为它把坐标信息、投影信息都嵌在文件里,不会丢。我曾经接手过一个项目,对方给了几十个.asc文件,结果投影信息全写在单独的文本里,对不上号,折腾了两天才对齐。

核心原则:格式转换不是简单的改后缀名。一定要确保转换过程中不丢失高程精度,不改变数据范围。

用GDAL做格式转换,一行命令搞定:

gdal_translate -of GTiff input.asc output.tif

嗯,就这么简单。但要注意,如果源数据是浮点型,转成整型会损失精度。我建议始终保留浮点型输出。

4.2 投影变换——坐标系不对,一切白费

投影变换是DEM预处理里最容易出问题的地方。你想想看,两个不同投影的数据叠在一起,位置差了几百米,那地形分析还有什么意义?

我遇到过最离谱的事:有人把WGS84经纬度的DEM直接当成平面坐标用,算出来的坡度全是错的。后来查了半天才发现是投影没转。

常见的投影坐标系:

  • UTM投影——适合中小范围,变形小
  • 高斯-克吕格投影——国内常用,按3度带或6度带分
  • Albers等面积投影——适合面积计算

我的建议:如果做地形分析,优先用UTM投影。因为它保持角度和形状,坡度、坡向计算最准确。

用GDAL做投影变换:

gdalwarp -t_srs EPSG:32650 input.tif output_utm.tif

EPSG:32650是UTM 50N的编码。你查一下你所在区域的UTM带号,别搞错了。我曾经帮一个学生调试,他用了32649,结果数据偏了半个中国。

注意:投影变换时,重采样方法会影响高程值。我一般用三次卷积(cubic),精度高。如果追求速度,可以用双线性(bilinear)。千万别用最近邻(nearest),那会让地形出现台阶状。

4.3 空洞填充——数据缺失怎么办?

DEM数据经常有空洞。原因很多:云遮挡、雷达阴影、传感器故障。空洞不补,后面做水文分析、可视域分析都会出问题。

空洞填充的方法,我按推荐程度排个序:

  1. 插值法——用周围像素推算空洞值。最常用的是反距离权重法(IDW)和克里金法。
  2. 填补法——用其他数据源填补。比如SRTM的空洞用ASTER GDEM补。
  3. 平滑法——对空洞边缘做平滑过渡,适合小空洞。

我个人习惯,小空洞(小于10个像素)用插值法,大空洞用填补法。为什么?因为插值法在大空洞区域会产生不自然的平坦区域,你想想看,一个山谷突然变成平地,那地形分析就失真了。

用ArcGIS做空洞填充:

# 使用焦点统计工具
Focal Statistics (Con, 3x3矩形窗口, 平均值)

或者用GDAL的fillnodata工具:

gdal_fillnodata.py input.tif output_filled.tif -md 10

-md 10表示最大搜索距离为10个像素。这个值要根据空洞大小调整。我曾经处理过一个LiDAR数据,空洞直径有50个像素,md设成10根本填不上,后来改成30才搞定。

避坑指南:空洞填充后一定要检查。我曾经填完没检查,结果在河流区域填出了一个小山包,水文分析全错了。后来我养成了习惯——填充后做一次坡度分析,看看有没有异常突变。

4.4 滤波去噪——让地形更平滑

DEM数据里总有噪声。可能是传感器误差,也可能是地物干扰(比如树木、建筑物)。滤波的目的就是去掉这些噪声,保留真实地形。

常用的滤波方法:

滤波方法 原理 适用场景
均值滤波 取窗口内平均值 去除随机噪声
中值滤波 取窗口内中位数 去除椒盐噪声,保留边缘
高斯滤波 加权平均,中心权重高 平滑效果好,但会模糊边缘
双边滤波 同时考虑距离和灰度差异 保留边缘的同时去噪

嗯,这里要注意。均值滤波虽然简单,但会把地形细节也抹掉。我做过对比实验,3x3的均值滤波,山脊线会变模糊,坡度值平均降低5%-10%。

我个人推荐中值滤波。为什么?因为它能有效去除孤立噪声点,同时保留地形边缘。你想想看,一个突然的尖峰(可能是树冠),中值滤波直接把它当成异常值去掉,而均值滤波会把它扩散到周围。

用GDAL做中值滤波:

gdal_filter.py input.tif output_filtered.tif -filter median -radius 3

半径3表示3x3窗口。如果噪声严重,可以试试5x5,但要注意地形细节也会损失更多。

我的经验:滤波窗口大小要根据DEM分辨率来定。30米分辨率的DEM,3x3窗口覆盖90米范围,足够了。如果是5米分辨率的高精度DEM,可以试试5x5甚至7x7。

4.5 预处理流程总结

说了这么多,咱们把整个流程串起来。我画了一张图,你看一眼就明白了:

DEM预处理流程 原始DEM数据 格式转换 → GeoTIFF 投影变换 → UTM 空洞填充 滤波去噪 → 中值滤波 关键要点 • 格式转换:保持浮点精度 • 投影变换:选UTM投影 • 重采样:用三次卷积 • 空洞填充:小空洞插值 • 大空洞用填补法 • 滤波:推荐中值滤波 • 窗口大小:3x3起步 • 填充后检查坡度异常 • 滤波后对比原始数据 • 保留原始数据备份 • 记录每一步参数

你看,整个流程是线性的。但要注意,每一步都可能需要回头调整。比如滤波后发现空洞没填好,就得回去重新填。我做过一个项目,来回迭代了三次才满意。

最后说一句:预处理不是走过场。你花在预处理上的每一分钟,都会在后面的地形分析中加倍回报。我见过太多人跳过预处理直接建模,结果模型精度差、分析结果不可靠,最后还得回头重做。嗯,别走弯路。


公众号:蓝海资料掘金营,微信deep3321