数字高程模型(DEM)是地理信息系统中最基础也最重要的数据之一。在实际项目中,我们经常会遇到DEM数据存在空缺值的情况,就像衣服上出现了破洞,需要找到合适的"补丁"来修复。这些空缺值可能来源于传感器故障、云层遮挡、数据拼接缝隙等多种原因。
我处理过不少DEM数据修复的项目,发现空缺值主要分为两种典型场景:第一种是大范围的整片缺失,比如HMA数据中常见的连续空白区域;第二种是小范围的细碎缺失,就像数据表面散布的"芝麻点"。不同的缺失类型需要采用不同的修复策略,否则很容易出现"补丁比破洞还难看"的情况。
除了缺失范围的大小,修复方案的选择还需要考虑项目对数据精度的要求。有些项目强调地形的连续性,比如水文分析或视线分析;而有些项目则更看重数据的真实性,比如地质建模或工程量计算。这就好比修补衣服,日常穿着更注重美观,而工作服则更看重实用性。
栅格镶嵌法就像是用另一块布料来修补衣服上的破洞。具体来说,就是使用其他来源的完整DEM数据来填补当前数据的空缺区域。这种方法特别适合处理大范围的整片缺失,尤其是当你能获取到同区域其他分辨率的DEM数据时。
我在一个山区地形分析项目中就成功运用了这个方法。当时使用的12米分辨率DEM有大片云层遮挡造成的缺失,而项目对地形连续性要求很高。我们采用了30米的SRTM数据作为补充,虽然分辨率有所下降,但保证了地形的整体连贯性。
栅格镶嵌法的优势在于:
但要注意的是,这种方法存在明显的分辨率匹配问题。就像用粗布补细布,小范围的修补会显得特别突兀。
在ArcGIS Pro中实施栅格镶嵌的完整流程如下:
python复制# 示例:使用ArcPy实现栅格镶嵌
import arcpy
from arcpy.sa import *
# 设置工作空间
arcpy.env.workspace = "C:/DEM_Data"
# 执行镶嵌
arcpy.MosaicToNewRaster_management(
input_rasters=["HMA_8m.tif", "SRTM_30m.tif"],
output_location="C:/Output",
raster_dataset_name_with_extension="Mosaic_DEM.tif",
coordinate_system_for_the_raster="PROJCS['WGS_1984_UTM_Zone_50N']",
pixel_type="32_BIT_FLOAT",
cellsize=8,
number_of_bands=1,
mosaic_method="FIRST",
mosaic_colormap_mode="MATCH"
)
通过对比原始DEM和镶嵌结果的hillshade图,可以清晰评估修复效果。在我的经验中,大范围修复的效果通常不错,但小范围修复会出现明显的"台阶效应"。
常见问题及解决方案:
高程空填充函数法更像是用绣花的方式来修补衣物。它基于现有数据,通过空间插值算法来估算空缺位置的高程值。ArcGIS中采用的是改进的反距离加权(IDW)算法,会考虑周边多个有效像素的影响。
这种方法特别适合处理:
我在城市微地形分析中就经常使用这个方法。比如处理LiDAR数据时,建筑物造成的微小数据缺口用这种方法修复后,地表连续性非常好。
在ArcGIS Pro中使用高程空填充函数的完整流程:
python复制# 使用ArcPy应用高程空填充函数
dem_raster = arcpy.Raster("HMA_8m.tif")
filled_dem = arcpy.sa.FillMissingValues(
in_raster=dem_raster,
filter_size=5,
smooth_factor=0.5,
fill_method="NATURAL_NEIGHBOR"
)
filled_dem.save("C:/Output/Filled_DEM.tif")
通过对比实验可以发现,对于小范围缺失,高程空填充的效果明显优于栅格镶嵌。修复区域的过渡更自然,不会出现明显的边界效应。
但这种方法有三个主要局限:
我曾在一个峡谷地区项目中就遇到过这种情况,插值结果完全抹平了重要的微地形特征,导致水文分析结果失真。
基于大量项目经验,我总结出以下选择标准:
首先评估缺失范围:
其次考虑精度要求:
最后评估数据可获得性:
在某些复杂场景下,可以组合使用两种方法:
python复制# 混合处理方案示例
# 第一步:栅格镶嵌
mosaic_dem = arcpy.MosaicToNewRaster_management(...)
# 第二步:高程空填充
temp_filled = arcpy.sa.FillMissingValues(mosaic_dem,...)
# 第三步:边缘平滑
final_dem = arcpy.sa.FocalStatistics(
temp_filled,
neighborhood="Circle 3 CELL",
statistics_type="MEAN"
)
无论采用哪种方法,修复后都应该进行严格检查:
视觉检查:
统计检查:
应用验证:
我在项目中通常会保存多个修复版本,在实际分析中比较它们的结果差异,选择影响最小的方案。