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

如何编写函数基于栅格移动窗口中心单元格值统计邻域单元格

解决栅格focal函数自定义统计邻域目标值数量的问题

自定义函数实现逻辑

针对你的需求,我们可以编写一个自定义函数传入focal,处理每个3x3窗口的统计逻辑:

  • 提取窗口中心单元格的值,若为NA则直接返回NA
  • 根据中心值确定目标统计值:中心为1则统计邻域中的2,中心为2则统计邻域中的1
  • 过滤窗口中的NA并排除中心单元格,统计剩余单元格中目标值的数量

完整代码示例

# 加载raster包
library(raster)

# 创建测试栅格(模拟含1、2、NA的栅格数据)
test_raster <- raster(nrow=5, ncol=5)
values(test_raster) <- c(1,2,NA,1,2,
                         2,1,2,NA,1,
                         NA,2,1,2,NA,
                         1,NA,2,1,2,
                         2,1,NA,2,1)

# 定义3x3分析窗口
window_3x3 <- matrix(1, nrow=3, ncol=3)

# 编写自定义统计函数
count_target_neighbors <- function(window_vec) {
  # 获取3x3窗口的中心值(向量第5位为中心,R为1-based索引)
  center_val <- window_vec[5]
  
  # 中心为NA时直接返回NA
  if (is.na(center_val)) {
    return(NA)
  }
  
  # 根据中心值确定需要统计的目标值
  target_val <- ifelse(center_val == 1, 2, 1)
  
  # 提取邻域:去掉中心元素,过滤NA值
  neighbors <- window_vec[-5]
  neighbors <- neighbors[!is.na(neighbors)]
  
  # 统计邻域中目标值的数量
  sum(neighbors == target_val)
}

# 调用focal函数计算结果
result_raster <- focal(test_raster, w=window_3x3, fun=count_target_neighbors)

# 查看结果
print(result_raster)
plot(result_raster)

代码关键点说明

  • window_vec是focal自动传入的每个窗口的扁平化向量,3x3窗口对应长度为9的向量,中心位置为索引5
  • 先判断中心值是否为NA,避免后续统计出错
  • 通过ifelse动态切换目标统计值,同时适配中心为1或2的情况
  • 用window_vec[-5]排除中心单元格,再通过!is.na()过滤邻域中的缺失值,最后用sum()统计目标值的出现次数

内容的提问来源于stack exchange,提问作者Hannah P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:26:59