1

我在一个文件夹中有一组多波段栅格,我想使用单个 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循环的任何潜在缺陷。

4

1 回答 1

2

这对我来说看起来不错。我要做的一个改变是实际使用代表路径的变量。也就是说,只对它们进行一次硬编码,如下所示。但是在您的实际实现中似乎存在一些错误。它可以帮助使用print(outf[i])循环中的语句,首先尝试几个文件,然后更多地查看错误首先出现的位置。

library(terra)

ras_dir <- "rasters"
mask_dir <- "masks"
dir.create(ras_dir, FALSE, FALSE)
dir.create(mask_dir, FALSE, FALSE)

#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. 
r <- rast(system.file("ex/elev.tif", package="terra"))
r <- rep(r, 5) * 1:5
names(r) <- paste0("band", 1:5)
for (i in 1:5) {
    writeRaster(r * i, file.path(ras_dir, paste0("ras", i, ".tif")), overwrite=TRUE)
}

inf <- list.files(ras_dir, pattern="tif$", full.names=TRUE)
outf <- gsub(ras_dir, mask_dir, inf)
    
for (i in 1:length(inf)) {
  r <- rast(inf[i])
  c <- crop(r, v) 
  m <- mask(c, v, filename = outf[i], overwrite = TRUE)
}
于 2021-09-13T07:48:05.113 回答