如何使用for循环从多个PRISM .bil栅格创建栅格堆栈?

时间:2021-03-25 17:33:46

标签: r prism raster

我在一个文件夹中有 37 个用于年度 PRISM 气候数据的栅格,但除了一次手动加载一个栅格之外,还没有找到一种更简单的方法将栅格加载到 R 中。

我尝试使用这个 for 循环来加载栅格并将它们组合成一个数据框:

创建堆栈

mystack <- pd_stack(prism_archive_subset("ppt","annual", years = 1982:2019))

为循环创建数据框以将所有栅格堆叠在一起。

filenames <- list.files(path = "./ppt rasters", pattern= '.bil', all.files=TRUE)
filenames

ncols <- dim(precip1982)[1]
nrows <- dim(precip1982)[2]

rasters <- stack(list(filenames))

初始化大对象

final.df <- as.data.frame(matrix(NA,nrow = nrows, ncol = ncols)) 
counter=1

for 遍历所有文件

for (file in filenames){
r <- raster(filenames)
test <- as.data.frame(r, na.rm=TRUE, row.names=TRUE, col.names=FALSE)
names(test)<- c(substring(file, 24, 29))
final.df <- cbind(z, test)
}

final.df[counter-1:nrow(final.df),]<-NULL

我收到错误说 .local(.object...) : 有其他错误。

有没有更好的方法来设置循环以使其运行?谢谢!

1 个答案:

答案 0 :(得分:0)

prism::pd_stack() 返回一个 raster::RasterStack 对象,因此您需要在每一层上使用 raster 的 as.data.frame() 方法。

您可能想先裁剪/修剪数据。在我对仅 2 年的棱镜数据的测试中,从 RasterStack 创建一个 1.3GB 的数据帧需要大约 3 分钟。

library(prism)

# get 2 years of precip data as example
get_prism_annual("ppt", 2018:2019)

# get all the precip data from the prism archive as a RasterStack
# note that prism_archive_subset() will only return the 2018 and 2019 data
# if that is all that exists
mystack <- pd_stack(prism_archive_subset("ppt","annual", years = 1982:2019))

# now convert to data frame (each layer in the RasterStack is a Raster)
df <- lapply(mystack, as.data.frame)