我有大量的光栅文件和一个在光栅文件范围内的多边形。我想获取多边形内每个栅格文件的像素数(计数)。此外,我想创建一个表格,其中包含每个光栅文件的光栅文件名称和像素数(列出)。我尝试过堆叠,但我无法跟踪名称。有没有其他方法可以在 R 中执行此任务?
问问题
9616 次
1 回答
5
请始终包含示例数据
library(raster)
fn <-system.file("external/rlogo.grd", package="raster")
s <- stack(fn)
s[[1]][1:5000] <- NA
s[[2]][5001:ncell(s)] <- NA
names(s)
#[1] "red" "green" "blue"
p <- rbind(c(5,20), c(25,55), c(50, 20), c(20,6), c(5,20))
pol <- spPolygons(p)
plot(s, addfun=function() lines(pol, lwd=2))
我不太确定你在追求什么。如果您可以堆叠它们(您说可以),那么所有栅格的像元数(像素)将是相同的。我假设您想要不是的单元格的总和NA
。如果您实际上有具有不同原点/分辨率的栅格,您可以重复这些步骤,但无需将它们堆叠成 a RasterStack
,但您需要调整方法以计算NA
单元格。
较小对象的简单方法:
m <- mask(s, pol)
cellStats(m, function(i, ...) sum(!is.na(i)))
# red green blue
# 600 506 1106
如果内存不足,您可以执行以下操作:
m <- mask(s, pol)
x <- reclassify(m, cbind(-Inf, Inf, 1))
names(x) <- names(m)
cellStats(x, 'sum')
#red green blue
#600 506 1106
你也可以试试:
extract(s, pol, fun=function(x,...)length(na.omit(x)))
# red green blue
#[1,] 600 506 1106
如果您想计算所有单元格(无论是否NA
),您可以执行类似的操作
# example RasterLayer
r <- s[[1]]
# this step may help in speed if your polygon is small relative to the raster
r <- crop(r, pol)
x <- rasterize(pol, r, 1)
cellStats(x, 'sum')
#[1] 1106
于 2018-06-04T18:01:53.817 回答