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

标签 r r-raster terra

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

enter image description here

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

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

# plot
plot(c(r, neigh))

enter image description here

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

最佳答案

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

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

enter image description here

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

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

关于r - 如何在地形或栅格中执行邻域分析并保持输入的相同 NA 像元?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70429190/

相关文章:

r - 按行计算平均日期

r - 如何选择具有特定值的光栅像素?

r - 在 R 中识别传单中光栅的点击位置

r - 将 shapefile 分成大小相等的网格

r - 如何访问属性[例如R 中 terra 栅格的时间]?

r - 根据 78*2 其他变量 dplyr 的列输入计算新的 (78) 个变量

r - R中向量和向量列表之间的角度

r - 如何省略矩阵中仅包含 NA 的列?

r - 尝试写入或绘制光栅时 .local(object, ...) 出错

r - 分解栅格导致磁盘空间不足