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 一个矢量,因此不能再用于焦点。
我想知道是否有办法为 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 一个矢量,因此不能再用于焦点。