如何在R中结合DEM判断海拔条件后对温度数据应用焦点滤波?
解决方案:基于DEM海拔差约束的温度栅格焦点滤波
核心思路
通过自定义焦点函数,在5×5窗口内先利用DEM筛选出与中心像元海拔差≤100米的像素,再仅对这些符合条件的温度像素执行滤波操作。需要将温度栅格与DEM合并为栅格栈,让焦点函数同时访问两个图层的窗口数据。
步骤与代码示例
假设你已加载raster包,且温度栅格(temp_raster)和DEM栅格(dem_raster)的空间属性(分辨率、投影、范围)完全匹配。
对齐并合并栅格栈
若DEM与温度栅格未对齐,先通过重采样统一空间属性,再合并为栈:library(raster) # 重采样DEM以匹配温度栅格的空间参数 dem_raster <- resample(dem_raster, temp_raster, method = "bilinear") # 合并温度和DEM为栅格栈 raster_stack <- stack(temp_raster, dem_raster)编写自定义焦点函数
实现海拔差筛选+温度滤波逻辑,这里以均值滤波为例,可按需替换为中位数、最大值等统计量:constrained_focal <- function(window) { # 拆分窗口中的温度(第1层)和DEM(第2层)数据 temp_vals <- window[1:25] # 5×5窗口共25个像素 dem_vals <- window[26:50] # 获取中心像元的DEM值(5×5窗口的中心位置为第13位) center_dem <- dem_vals[13] if (is.na(center_dem)) return(NA) # 筛选海拔差≤100米的有效温度像素 valid_temp <- temp_vals[abs(dem_vals - center_dem) <= 100] valid_temp <- valid_temp[!is.na(valid_temp)] # 根据有效像素数量返回结果:有有效值则计算均值,否则返回中心温度(或NA) if (length(valid_temp) >= 1) { return(mean(valid_temp)) } else { return(temp_vals[13]) # 若需无有效值时返回NA,替换为return(NA) } }执行焦点滤波
调用focal()函数,指定5×5窗口和自定义约束函数:filtered_temp <- focal(raster_stack, w = matrix(1, 5, 5), fun = constrained_focal)
关键说明
- 空间对齐:必须保证温度栅格与DEM的空间参数完全一致,否则窗口内像素对应关系会出错,
resample()是常用的对齐工具。 - 逻辑灵活性:可修改自定义函数内的统计逻辑,比如调整有效像素的最低数量要求,或替换滤波统计量。
- NA值处理:函数已考虑NA值场景,若中心DEM为NA直接返回NA;无符合条件的温度像素时,可选择返回中心温度或NA,根据业务需求调整。
内容的提问来源于stack exchange,提问作者Rhino
相关产品推荐
相关产品推荐

