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

Posted

技术标签:

【中文标题】如何在 terra 或 raster 中执行邻域分析并保持输入的相同 NA 单元格?【英文标题】:How can I perform neighborhood analysis in terra or raster and keep the same NA cells of the input? 【发布时间】:2022-01-22 12:07:57 【问题描述】:

我想在 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() 定义的任何矩阵) 在定义权重矩阵时我应该处理吗?

【问题讨论】:

你可以使用mask,而不是crop 好的,这很好。但是如果 focal 中有 where 选项就好了... 但是谢谢,我根据您的评论更新了我的问题。 【参考方案1】:

terra 1.5-6 版(当前为development version)中,focal 方法有一个新参数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))

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

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

【讨论】:

哇,太棒了,罗伯特。谢谢!

以上是关于如何在 terra 或 raster 中执行邻域分析并保持输入的相同 NA 单元格?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 terra::rast 中添加日期作为标题?

terra 包在尝试运行并行操作时返回错误

使用 Terra 绘图时,alpha 参数无法按预期工作

在 terra 包中读取多个栅格

调用 library(raster) 或 require(raster) 导致 Rstudio 中止会话

CCF202104-2 邻域均值(100分)前缀和