You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中结合DEM判断海拔条件后对温度数据应用焦点滤波?

解决方案:基于DEM海拔差约束的温度栅格焦点滤波

核心思路

通过自定义焦点函数,在5×5窗口内先利用DEM筛选出与中心像元海拔差≤100米的像素,再仅对这些符合条件的温度像素执行滤波操作。需要将温度栅格与DEM合并为栅格栈,让焦点函数同时访问两个图层的窗口数据。

步骤与代码示例

假设你已加载raster包,且温度栅格(temp_raster)和DEM栅格(dem_raster)的空间属性(分辨率、投影、范围)完全匹配。

  1. 对齐并合并栅格栈
    若DEM与温度栅格未对齐,先通过重采样统一空间属性,再合并为栈:

    library(raster)
    # 重采样DEM以匹配温度栅格的空间参数
    dem_raster <- resample(dem_raster, temp_raster, method = "bilinear")
    # 合并温度和DEM为栅格栈
    raster_stack <- stack(temp_raster, dem_raster)
    
  2. 编写自定义焦点函数
    实现海拔差筛选+温度滤波逻辑,这里以均值滤波为例,可按需替换为中位数、最大值等统计量:

    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)
      }
    }
    
  3. 执行焦点滤波
    调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:00:17