【问题标题】:How to debug this for loop that masks multiple rasters using a single shapefile?如何调试这个使用单个shapefile屏蔽多个栅格的for循环?
【发布时间】:2021-11-07 06:26:17
【问题描述】:

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

【问题讨论】:

    标签: for-loop debugging raster mask terra


    【解决方案1】:

    这对我来说看起来不错。我要做的一项更改是实际使用代表路径的变量。也就是说,只需对它们进行一次硬编码,如下所示。但是在您的实际实现中似乎存在一些错误。在循环中使用 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)
    }
    

    【讨论】:

    • 感谢您的宝贵时间和帮助 cmets。更新所有软件包并重新启动 R 后问题似乎已经消失
    猜你喜欢
    • 2021-07-05
    • 2020-05-10
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多