1

我想在 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))

在此处输入图像描述

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

4

1 回答 1

2

terra1.5-6 版(目前是开发版)中,该focal方法有一个新参数na.policy,可以设置为“all”、“only”或“omit”之一。

使用该版本,您可以

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))

在此处输入图像描述

这与您可以使用旧版本执行的操作等效,但可能更有效:

f2 <- focal(r, 7, "mean", na.rm=TRUE) |> mask(r)
于 2021-12-21T20:00:54.157 回答