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
相关产品推荐
相关产品推荐

