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

R语言批量匹配同名CSV与栅格文件提取值并导出新CSV

R批量实现同名CSV点与TIFF栅格值匹配追加方案

直接按以下步骤配置即可全量自动处理,无需手动修改文件名:

1. 前置准备

  • 提前安装所需依赖包:raster、sp、dplyr
  • 提前梳理三类路径:TIFF栅格存储目录、原始CSV点存储目录、结果输出目录,代码会自动创建不存在的输出目录
  • 代码会自动匹配两边同名(儒略日一致)的文件对,自动跳过缺对应文件的条目,不会因为单个文件报错中断全部处理流程

2. 完整可运行代码

# 加载依赖
library(raster)
library(sp)
library(dplyr)

# --------------------------
# 路径配置,按实际情况修改
# --------------------------
tiff_root <- "c:/temp/TIFF/2001/"
csv_root <- "c:/temp/csv/2001/"
output_root <- "c:/temp/2001/chloro/"

# 自动创建输出目录
if (!dir.exists(output_root)) dir.create(output_root, recursive = TRUE)

# --------------------------
# 文件匹配校验
# --------------------------
# 获取所有tif和csv文件路径
tif_list <- list.files(tiff_root, pattern = "\\.tif$", full.names = FALSE)
csv_list <- list.files(csv_root, pattern = "\\.csv$", full.names = FALSE)

# 提取儒略日作为匹配键
tif_jd <- gsub("\\.tif$", "", tif_list)
csv_jd <- gsub("\\.csv$", "", csv_list)
valid_jd <- intersect(tif_jd, csv_jd)

# 打印匹配结果,方便核对缺失文件
cat("=== 文件匹配结果 ===\n")
cat("可正常处理的文件对共", length(valid_jd), "组\n")
if (length(setdiff(tif_jd, csv_jd)) > 0) {
  cat("以下TIFF无对应CSV:", paste(setdiff(tif_jd, csv_jd), collapse = "、"), "\n")
}
if (length(setdiff(csv_jd, tif_jd)) > 0) {
  cat("以下CSV无对应TIFF:", paste(setdiff(csv_jd, tif_jd), collapse = "、"), "\n")
}

# --------------------------
# 批量处理
# --------------------------
for (jd in valid_jd) {
  tryCatch({
    # 读取当前儒略日对应的栅格和点文件
    current_ras <- raster(file.path(tiff_root, paste0(jd, ".tif")))
    current_pts <- read.csv(file.path(csv_root, paste0(jd, ".csv")))
    
    # 转换为空间点对象
    coordinates(current_pts) <- ~long+lat
    
    # 提取栅格值
    extract_val <- extract(current_ras, current_pts)
    
    # 合并属性表与提取值,重命名栅格列
    # 这里直接取最后一列重命名,适配任意列数的CSV,无需手动写死列号
    result_df <- cbind(current_pts@data, extract_val) %>% 
      rename(chloro = last_col())
    
    # 写出结果
    write.csv(
      result_df,
      file = file.path(output_root, paste0(jd, "_chloro.csv")),
      row.names = FALSE
    )
    
    cat("已完成儒略日", jd, "处理\n")
  }, error = function(e) {
    cat("儒略日", jd, "处理失败,原因:", e$message, "\n")
  })
}

3. 适配说明

  • 如果你的CSV列数固定,提取的栅格列确实是第10列,也可以把rename(chloro = last_col())改回原来的rename(chloro = 10)
  • 如果是多年份数据分文件夹存储,只要在现有逻辑外嵌套一层年份循环即可,核心处理代码无需修改
  • 如果数据量极大,可替换为exactextractr包的栅格提取函数,处理速度比raster::extract快5~10倍
  • 代码默认坐标参考系一致,如果你的CSV点和TIFF栅格坐标系不同,需要在提取前加一步空间投影转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:24:15