如何在 terra 或栅格中执行邻域分析并保持输入的相同 NA 像元?

How can I perform neighborhood analysis in terra or raster and keep the same NA cells of the input?

我想在 R 中执行邻域分析以平滑我拥有的图层,但保持输入栅格的所有 NA 完好无损。

但是,例如,当我执行以下操作时,计算会“传播”到 NA 值 - 在我的例子中,这是一种不受欢迎的行为。

library(terra)
library(dplyr)

# load example raster in metric system
f <- system.file("ex/elev.tif", package="terra")
r <- rast(f) %>% 
  terra::project("EPSG:32631")

# focal
neigh <- terra::focal(r, w = 7, fun = "mean")

# plot
plot(c(r, neigh))

更新: 按照下面@dww 提出的建议,我可以使用 terra::mask。那么,解决这个问题的方法是:

# focal
neigh <- terra::focal(r, w = 7, fun = "mean") %>% 
  terra::mask(mask = r)

# plot
plot(c(r, neigh))

是否有另一种方法可以避免将值传播到 focal 内的 NA 单元格?
(这里是一个计算均值的方形滤波器的简单示例,但我正在搜索对所有类型的滤波器都有用的东西,例如 terra::focalMat() 定义的任何矩阵)
我应该在定义权重矩阵时处理它吗?

对于 terrafocal 方法有一个参数 na.policy,可以设置为“全部”、“仅”或“省略”之一。

library(terra)
#terra 1.5.6
v <- vect(system.file("ex/lux.shp", package="terra"))
r <- rast(system.file("ex/elev.tif", package="terra"))
r[45:50, 45:50] <- NA

f1 <- focal(r, 7, "mean", na.policy="omit", na.rm=TRUE)   
plot(f1, fun=lines(v))

这与使用 focalmask 等效,但可能更有效:

f2 <- focal(r, 7, "mean", na.rm=TRUE) |> mask(r)