按文件夹对栅格进行求和

问题描述 投票:0回答:1

我有一系列物种分布栅格,根据观测日期分隔在不同的文件夹中。我有 2024 年的每一天 1 个文件夹,名称如

%Y%m%d
,例如20240101.

我想做2个简单的操作,使用

{raster}
:

  1. 合并给定文件夹中的所有文件,生成给定日期观察到的所有物种分布总和的栅格。

  2. 获得“每日总和”栅格后,我想对它们进行累积求和。例如:第一个栅格 = 第 1 天;第二个栅格 = 第 1 天 + 第 2 天,...

我知道我可以通过创建与此类似的长脚本来完成第一个操作:

       library(raster)
        files <- list.files("D:/Fantasy Birding/Ranges/Rasters/Observados/20240101", pattern="*.tif$", full.names=TRUE)
        rs <- stack(files)
        soma <- calc(rs, sum)
        writeRaster(soma, "D:/Fantasy Birding/Ranges/Rasters/Observados por dia/diario20240101.tif")
    
    
     files <- list.files("D:/Fantasy Birding/Ranges/Rasters/Observados/20240102", pattern="*.tif$", full.names=TRUE)
        rs <- stack(files)
        soma <- calc(rs, sum)
        writeRaster(soma, "D:/Fantasy Birding/Ranges/Rasters/Observados por dia/diario20240102.tif")

但是,准备这样的脚本是相当耗时的。自动化此过程的最佳方法是什么?

r raster r-raster
1个回答
0
投票

要实现此目的而无需逐步执行,请使用:

  1. 带有
    lapply()
    的辅助函数,可对每天的栅格求和并将其写入“Observados por dia”目录
  2. “for()”循环对日记栅格进行累积求和

一些正则表达式(regex)魔法将有助于文件命名。您没有指定将累积结果写入何处,也没有指定它们的名称。在此表示中,它们被写入一个名为“cumulative”的新文件夹,并且每个文件都将最近日期的 mmdd 附加到开始日期,例如cumu20240101_0102.tif、cumu20240101_0103.tif 等

第 1 步:按天对栅格求和

library(raster)

# Create list of tif files from every subdirectory in Observados
files <- list.files("D:/Fantasy Birding/Ranges/Rasters/Observados/",
                    pattern="*.tif$", 
                    full.names = TRUE,
                    recursive = TRUE)

# Create a list of tif files grouped by subdirectory
sub_files <- split(files, sub(".*/([^/]+)/.*", "\\1", files))

# Helper function to process each group in sub_files
r_sum <- function(files) {
  
  output_path <- paste0("D:/Fantasy Birding/Ranges/Rasters/Observados por dia/diario", 
                        sub(".*/([^/]+)/.*", "\\1", files[1]), ".tif")
  
  writeRaster(calc(stack(files), sum), output_path, overwrite = TRUE)
  
}

# Sum each sub_files group and write result to Observados por dia directory
invisible(do.call(c, lapply(sub_files, r_sum)))

第 2 步:对栅格进行累积求和

# Create list of summed tif files from previous step
files <- list.files("D:/Fantasy Birding/Ranges/Rasters/Observados por dia/",
                    pattern="*.tif$", 
                    full.names = TRUE)

# Create directory for cumulative sum results
dir.create(file.path("D:/Fantasy Birding/Ranges/Rasters/cumulative/"), showWarnings = FALSE)

# Create raster object for start of loop (if you run the loop again,
# be sure to run this every time also)
x <- raster(files[1])

# Cumulatively sum diario rasters
for(i in 2:length(files)) {
  
  output_path <- paste0("D:/Fantasy Birding/Ranges/Rasters/cumulative/cumu20240101_", 
                        sub(".*([0-9]{4})\\.tif$", "\\1", files[i]), ".tif")
  
  x <- calc(stack(x, files[i]), sum)
  writeRaster(x, output_path, overwrite = TRUE)
  
}
© www.soinside.com 2019 - 2024. All rights reserved.