【问题标题】:How to remove raster pixels based on proportional coverage of other raster, R如何根据其他栅格的比例覆盖范围去除栅格像素,R
【发布时间】:2025-12-21 07:15:05
【问题描述】:

我有两个不同分辨率的光栅,我想要的是根据光栅 B 的比例覆盖来屏蔽光栅 A 的区域。例如,我想屏蔽光栅 A 的像素,如果至少 1/3其中被光栅 B 覆盖。
我不知道如何做到这一点,所以任何帮助将不胜感激。

library(raster)

A <- raster(matrix(1:60,3,4))
B <- raster(matrix(1:20,5,6))

【问题讨论】:

  • 嗨,你能添加你使用的包吗?
  • 嗨@JohannesStötzer,我用于此的主要包是光栅包。由于我从未做过这样的计算,我不知道有任何其他软件包可以帮助我解决这个问题。
  • 由于您没有为两个栅格对象指定坐标系,因此两者的范围都是 0-1。因此,A 完全被 B 覆盖。你到底想要什么? “被光栅 B 覆盖”到底是什么意思
  • @geo_dd 您能否详细说明 A)如何定义“光栅的比例覆盖”和 B)给出预期的输出?

标签: r raster masking cover


【解决方案1】:

您的栅格是 x 和 y 上 0 和 1 之间相同范围内的不同分辨率。 A 是 4x3,B 是 6x5。

par(mfrow=c(1,2)) 
plot(A)
plot(B)

第一步可能是将两者对齐以具有相同的分辨率,以便我们可以应用遮罩功能。 raster::disaggregate 函数将每个单元格拆分为整数列和行。在这种情况下,分辨率较低,我可以将每个单元格拆分为另一个矩阵的列数和行数,因此A的四列可以分别拆分为6,B的六列可以拆分为4,这样两者都是24宽。 (感谢this answer 的帮助。)

A_resize <- disaggregate(A, fact = c(dim(B)[2], dim(B)[1]), method = "bilinear") 
B_resize <- disaggregate(B, fact = c(dim(A)[2], dim(A)[1]), method = "bilinear")
par(mfrow=c(1,2)) 
plot(A_resize)
plot(B_resize)

我将您的问题解释为,当同一位置的 B 值

我们可以制作B_resize 的修改版本,它将小于最大值的 1/3 的所有内容重新分类为 NA。 (感谢this answer 的帮助。)

B_mask <- reclassify(B_resize, 
                     rbind(c(0, B@data@max * 1/3, NA), 
                           c(B@data@max * 1/3,  B@data@max, 1)))
plot(B_mask)

然后我们可以用它来掩盖 A:

par(mfrow = c(1,1))
plot(mask(A_resize,B_mask))

【讨论】: