如何用{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
相关产品推荐
相关产品推荐

