如何在 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 单元格?的主要内容,如果未能解决你的问题,请参考以下文章