我有一个拥有30000个栅格的大型数据集。我的目标是使用位于栅格内的多边形来提取平均值,并创建一个具有从栅格文件名中提取的栅格值和日期的文件。
我通过执行以下循环成功做到了这一点:
for (i in 1:length(rasters2014)){
a <- raster(rasters2014[i])
ext[i] <- as.vector(extract(a, poligon2, fun=mean, na.rm=TRUE, df=F))
}
output2 = data.frame(ext, filename=filename2014)
问题是上述循环需要大约2.5小时来完成计算。有谁知道如何加快这个过程?
答案 0 :(得分:2)
如果栅格都正确对齐(相同的ncol,nrow,范围,原点,分辨率),则可以尝试通过查找第一个文件来确定要提取的“像元编号”,然后 基于这些进行提取。由于栅格不需要计算要提取的像元,因此可以加快处理速度。像这样:
rast1 <- raster(rasters2014[1])
cells <- extract(rast1, poligon2, cellnumbers = TRUE, df = TRUE)[,"cells"]
ext <- list()
for (i in 1:length(rasters2014)){
a <- raster(rasters2014[i])
ext[[i]] <- as.vector(extract(a, cells, fun=mean, na.rm=TRUE, df=F))
}
请注意,我还使用list
存储结果,以避免“增长”向量,这通常是浪费的。
或者,按照@qdread的建议,您可以使用raster::stack(rasters2014, quick = TRUE)
构建rasterStack并在堆栈上调用extract
以避免for循环。不知道哪个会更快。
HTH
答案 1 :(得分:1)
如果您的多边形不重叠(在大多数情况下不重叠)
library(raster)
x <- rasterize(poligon2, rasters2014[1])
s <- raster::stack(rasters2014, quick = TRUE)
z <- zonal(s, x, "mean")
PS :越快越好,但是我建议在运行时吃午饭。
答案 2 :(得分:0)
感谢您的帮助!无论采用哪种方法,我都尝试了所有建议的解决方案,并且计算时间通常相同。因此,我想根本不可能大大加快计算过程。