加快栅格循环

时间:2018-11-28 12:53:08

标签: r r-raster

我有一个拥有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小时来完成计算。有谁知道如何加快这个过程?

3 个答案:

答案 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)

感谢您的帮助!无论采用哪种方法,我都尝试了所有建议的解决方案,并且计算时间通常相同。因此,我想根本不可能大大加快计算过程。

相关问题