R 中的栅格:无需重新分类即可创建特定像元值的区域计数

Raster in R: Create Zonal Count of specific cell values without reclassification

我想知道是否有办法为 RasterLayerObjects 创建 zonal statistics,特别是给定单元格值的 count(例如土地利用 class) 在 R 中,而不必重新 class 化整个栅格。该解决方案应该是内存高效的,以便处理大型光栅文件,即不需要将值提取到 R 中的矩阵中。

下面是我迄今为止如何处理它的示例。在这种情况下,我重新 class 化原始栅格以仅保留 1 个感兴趣的值和所有其他值的缺失值。

我提出的解决方案创建了冗余数据和额外的处理步骤,以帮助我实现最初的目标。我认为 zonal(r1[r1==6],r2,"count") 之类的东西会起作用,但显然它不起作用(见下文)。

# generate reproducible Raster 
library("raster")

## RASTER 1 (e.g. land-use classes)
r1 <- raster( crs="+proj=utm +zone=31")
extent(r1) <- extent(0, 100, 0, 100)
res(r1) <- c(5, 5)
values(r1) <- sample(10, ncell(r1), replace=TRUE)
plot(r1)

## RASTER 2 (containing zones of interest)
r2 <- raster( crs="+proj=utm +zone=31")
extent(r2) <- extent(0, 100, 0, 100)
res(r2) <- c(5, 5)
values(r2) <- c(rep(1,100),rep(2,100),rep(3,100),rep(4,100))
plot(r2)

# (1) ZONAL STATISTICS
# a. how many cells per zone (independent of specific cell value)
zonal(r1,r2,"count")

# b. how many cells per zone of specific value 6
zonal(r1[r1==6],r2,"count")
# -> fails

# with reclassification
r1.reclass<-
  reclassify(r1,
             matrix(c(1,5,NA,
                    5.5,6.5,1, #class of interest 
                    6.5,10,NA),
                    ncol=3,
                    byrow = T),
             include.lowest=T # include the lowest value from the table.
           )
zonal(r1.reclass,r2,"count")

您可以使用 raster::match

zonal(match(r1, 6),r2, "count")

正如您从 plot(match(r1, 6)) 中看到的那样,它只有 returns 个包含所需值的栅格单元格。所有其他单元格都是 NA

不幸的是,

r1==6 在您的尝试中使用 returns 一个矢量,因此不能再用于焦点。