You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用{raster}包自动化实现按文件夹栅格求和与累积求和?

自动化处理逐日物种分布栅格方案

一、批量生成每日物种分布求和栅格

通过循环遍历所有日期文件夹,替代重复编写单日期处理代码,实现自动化批量生成:

library(raster)

# 配置路径
input_root <- "D:/Fantasy Birding/Ranges/Rasters/Observados"
daily_output_dir <- "D:/Fantasy Birding/Ranges/Rasters/Observados por dia"

# 创建输出目录(不存在则自动生成)
if (!dir.exists(daily_output_dir)) {
  dir.create(daily_output_dir, recursive = TRUE)
}

# 获取所有日期格式的子文件夹(筛选8位数字结尾的路径)
date_folders <- list.dirs(input_root, full.names = TRUE, recursive = FALSE)
date_folders <- date_folders[grepl("\\d{8}$", date_folders)]

# 存储生成的每日栅格路径,用于后续累积求和
daily_raster_paths <- character(0)

# 遍历每个日期文件夹处理
for (folder in date_folders) {
  date_str <- basename(folder)
  # 读取当前文件夹内所有tif栅格文件
  tif_files <- list.files(folder, pattern = "\\.tif$", full.names = TRUE)
  
  # 跳过空文件夹
  if (length(tif_files) == 0) {
    warning(paste("跳过空文件夹:", date_str))
    next
  }
  
  # 堆叠栅格并计算当日求和
  rs_stack <- stack(tif_files)
  daily_sum <- calc(rs_stack, sum)
  
  # 写入输出文件
  output_path <- file.path(daily_output_dir, paste0("diario", date_str, ".tif"))
  writeRaster(daily_sum, output_path, overwrite = TRUE)
  
  # 记录路径
  daily_raster_paths <- c(daily_raster_paths, output_path)
}

代码说明

  • 自动识别所有符合%Y%m%d格式的日期文件夹,无需手动逐个指定
  • 跳过无tif文件的空文件夹,避免报错
  • 自动创建输出目录,无需手动提前建立
  • 记录每日求和栅格的路径,为后续累积求和做准备

二、生成累积求和栅格

基于第一步生成的每日栅格,按日期顺序计算累积求和(第n层栅格为前n天的物种分布总和):

# 按日期顺序排序每日栅格路径(确保时间序列正确)
daily_raster_paths <- daily_raster_paths[order(basename(daily_raster_paths))]

# 堆叠所有每日求和栅格
daily_stack <- stack(daily_raster_paths)

# 逐像元计算累积求和
cumulative_stack <- calc(daily_stack, fun = function(x) cumsum(x))

# 创建累积求和输出目录
cumulative_output_dir <- file.path(daily_output_dir, "Cumulative_Sum")
if (!dir.exists(cumulative_output_dir)) {
  dir.create(cumulative_output_dir)
}

# 逐个写入累积求和栅格
for (i in seq_along(cumulative_stack)) {
  # 提取日期字符串
  date_str <- substr(basename(daily_raster_paths[i]), 6, 13)
  output_path <- file.path(cumulative_output_dir, paste0("cumulative_", date_str, ".tif"))
  writeRaster(cumulative_stack[[i]], output_path, overwrite = TRUE)
}

代码说明

  • 先对每日栅格路径按日期排序,保证累积顺序正确
  • 利用cumsum函数实现逐像元的累积求和,高效简洁
  • 单独创建累积求和的输出目录,方便管理结果

可选优化建议

如果处理的栅格数据量极大,stack可能占用过多内存,可考虑:

  • 使用brick替代stack,减少内存占用
  • 改用terra包(raster包的升级版本),处理大栅格数据效率更高

内容的提问来源于stack exchange,提问作者Spectron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:59:59