如何编写函数基于栅格移动窗口中心单元格值统计邻域单元格
解决栅格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
相关产品推荐
相关产品推荐

