我在一个文件夹中有一组多波段栅格,我想使用单个 shapefile 进行遮罩。我希望屏蔽的输出(光栅)进入一个单独的文件夹。不久前,我在这里获得了帮助,以for
循环完成此操作。它工作得很好,但是当我放大它(增加 shapefile 中的多边形数量,并添加更多栅格)时,它就不再工作了。具体来说,它有时会正确掩盖栅格,有时则不会。我无法辨别任何模式,因为我已经多次运行此代码,并且每次没有被屏蔽的栅格集都是不同的。
到目前为止的代码:
library(terra)
#Creating directory to store inputs
ras_dir <- "/Users/USERID/rasters"
if (!file.exists(ras_dir)) {
ras_dir <- dir.create("/Users/USERID/rasters")
}
#Creating directory to store outputs
mask_dir <- "/Users/USERID/masks"
if (!file.exists(mask_dir)) {
mask_dir <- dir.create("/Users/USERID/masks")
}
#Twelve polygons in a shapefile
v <- vect(system.file("ex/lux.shp", package="terra"))
v <- v[c(1,4,5,7,9,12)]
#10 rasters with 5 layers each. I'm not a good enough coder to programmatically write #these rasters to a directory and have them be different.
f <- system.file("ex/elev.tif", package="terra")
r <- rast(f)
r <- rep(r, 5) * 1:5
names(r) <- paste0("band", 1:5)
writeRaster(r, "/Users/USERID/ras1.tif")
writeRaster(r, "/Users/USERID/ras2.tif")
writeRaster(r, "/Users/USERID/ras3.tif")
writeRaster(r, "/Users/USERID/ras4.tif")
writeRaster(r, "/Users/USERID/ras5.tif")
inf <- list.files("/Users/USERID/rasters", pattern="tif$", full.names=TRUE)
outf <- gsub("/Users/USERID/rasters", "/Users/USERID/masks", inf)
for (i in 1:length(inf)) {
r <- rast(inf[i])
c <- crop(r, v) #Here I crop first as it saves lots of time
m <- mask(c, v, filename = outf[i], overwrite = TRUE)
}
需要明确的是,我知道上面的代码运行正确。出于某种原因,它不能与我较长的数据集一起运行,我想知道是否有人可以阐明这种for
循环的任何潜在缺陷。