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

R4.2.0循环读取嵌套文件夹TIFF 按场景年份匹配合并方法

R 4.2.0 批量配对合并嵌套文件夹TIF栅格实现方案

整体思路

不需要手动为每个场景、每个文件夹单独写遍历循环,先递归扫描根目录下所有符合规则的TIF文件,从文件名和路径中提取「场景编号、栅格类型、年份」三个匹配维度,自动完成同场景同年份的nested/highlevel文件配对,再批量调用你已经编写完成的单组合并函数即可。该逻辑支持自动识别新增场景,后续添加scenario3、scenario4时无需修改核心代码。

步骤1:加载依赖

首先安装、加载栅格处理所需的依赖包,terra是R4.2版本处理栅格的稳定兼容包:

# 首次运行时执行安装,已安装可注释掉
if (!require("terra")) install.packages("terra", version = "1.7-71")
if (!require("dplyr")) install.packages("dplyr")

# 加载包
library(terra)
library(dplyr)

注:以下代码默认你已编写完成的单组合并函数名为merge_tif_pair,支持传入两个TIF路径(或读取后的栅格对象)返回合并结果,你可以根据自己实际的函数名、参数形式调整对应代码。

步骤2:扫描文件建立匹配索引

将工作路径设置为存放scenario 1、scenario 2文件夹的根目录,递归扫描所有子文件夹下的TIF文件,生成带匹配标签的索引表:

# 替换为你本地的实际根目录路径
setwd("C:/your_project/raster_root/")

# 递归遍历所有嵌套子文件夹,筛选全部TIF文件
all_tif <- list.files(
  pattern = "\\.tif$",
  recursive = TRUE,
  full.names = TRUE
)

# 从路径中提取匹配字段,生成索引表
tif_index <- data.frame(
  full_path = all_tif,
  scenario = gsub(".*scenario\\s*(\\d+).*", "\\1", all_tif), # 提取场景编号
  type = ifelse(grepl("highlevel", all_tif), "highlevel", "nested"), # 提取栅格类型
  year = gsub(".*_(\\d{4})\\.tif$", "\\1", all_tif) # 提取年份
)

# 运行后可查看索引表确认字段提取是否正确
head(tif_index)

步骤3:批量配对执行合并

基于索引表自动匹配同场景、同年份的文件对,循环调用合并函数,支持自动保存结果、缺文件跳过提示:

# 提取所有需要处理的场景+年份组合
all_groups <- unique(tif_index[,c("scenario", "year")])

# 遍历所有组合执行合并
for(i in 1:nrow(all_groups)){
  cur_scene <- all_groups$scenario[i]
  cur_year <- all_groups$year[i]

  # 匹配当前组合对应的两个文件路径
  nested_p <- tif_index$full_path[tif_index$scenario == cur_scene &
                                    tif_index$year == cur_year &
                                    tif_index$type == "nested"]
  highlevel_p <- tif_index$full_path[tif_index$scenario == cur_scene &
                                       tif_index$year == cur_year &
                                       tif_index$type == "highlevel"]

  # 缺文件校验,避免循环中断
  if(length(nested_p) != 1 | length(highlevel_p) !=1){
    warning(paste0("场景", cur_scene, " 年份", cur_year, " 存在文件缺失,已跳过"))
    next
  }

  # 调用自定义合并函数
  # 如果你的函数输入是文件路径,直接传参即可
  merged_res <- merge_tif_pair(nested_path = nested_p, highlevel_path = highlevel_p)
  # 如果你的函数输入是读取后的栅格对象,替换为以下三行:
  # nested_rast <- rast(nested_p)
  # highlevel_rast <- rast(highlevel_p)
  # merged_res <- merge_tif_pair(nested_rast, highlevel_rast)

  # 自动保存合并结果,可自行调整输出路径规则
  out_dir <- "merged_output"
  if(!dir.exists(out_dir)) dir.create(out_dir)
  out_path <- paste0(out_dir, "/scenario", cur_scene, "_merged_", cur_year, ".tif")
  writeRaster(merged_res, filename = out_path, overwrite = TRUE)

  print(paste0("已完成:场景", cur_scene, " 年份", cur_year))
}

注意事项

  • R中路径不要使用单反斜杠\,需替换为正斜杠/或双反斜杠\\,否则会报路径错误
  • 如果你的文件命名规则有调整,只需要修改gsub()部分的正则匹配规则即可,核心循环逻辑不需要改动
  • 合并大体积TIF时建议适当分配内存,可在代码开头加terraOptions(memfrac = 0.6)设置terra可用内存占比,避免内存不足报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:45:42