在R中基于CSV文件名读取栅路子集并导出至目标文件夹
解决方案:基于CSV筛选TIFF栅格并计算物种丰富度
针对你需要从大量TIFF栅格中筛选CSV指定物种、导出子集并制作丰富度图的需求,以下是基于R语言的高效实现方案(适配4000+文件的大数据场景):
步骤1:环境准备与路径设置
先加载处理栅格和文件的工具包,设置好文件夹路径:
# 加载依赖包(未安装先运行 install.packages(c("terra", "fs")) ) library(terra) library(fs) # 替换为你的实际路径 tiff_source_dir <- "/path/to/your/tiff/folder" tiff_target_dir <- "/path/to/output/subset/folder" csv_file_path <- "/path/to/your/species_list.csv" # 创建输出文件夹(不存在则自动生成) dir_create(tiff_target_dir)
步骤2:读取CSV并匹配文件名
读取CSV中的物种名,生成对应的TIFF文件名,再与文件夹中的实际文件匹配:
# 读取CSV数据 species_list <- read.csv(csv_file_path) # 生成对应的TIFF文件名(匹配你的文件命名规则) species_list$tiff_name <- paste0(species_list$BINOMIAL, ".tif") # 获取源文件夹中所有TIFF文件 all_tiff_files <- dir_ls(tiff_source_dir, regexp = "\\.tif$") %>% basename() # 筛选出CSV中存在的TIFF文件 selected_tiffs <- intersect(species_list$tiff_name, all_tiff_files) # 提示未匹配到的物种(可选) missing_species <- setdiff(species_list$tiff_name, all_tiff_files) if(length(missing_species) > 0){ cat("未找到对应TIFF文件的物种:\n", paste(missing_species, collapse = "\n ")) }
步骤3:导出筛选后的栅格子集
将匹配到的TIFF文件复制到目标文件夹:
# 批量复制文件 file_copy(path(tiff_source_dir, selected_tiffs), tiff_target_dir, overwrite = TRUE)
步骤4:读取栅格并计算物种丰富度
使用terra包高效读取栅格栈,计算每个像元的物种数量:
# 读取筛选后的栅格栈 raster_stack <- rast(path(tiff_target_dir, selected_tiffs)) # 计算物种丰富度(假设栅格为二进制:1=物种存在,NA/0=不存在) species_richness <- sum(raster_stack, na.rm = TRUE) # 保存丰富度栅格 writeRaster(species_richness, path(tiff_target_dir, "species_richness.tif"), overwrite = TRUE) # 快速可视化丰富度图 plot(species_richness, main = "物种丰富度分布图")
注意事项
- 确保所有TIFF栅格的投影、分辨率、范围完全一致,否则栅格栈会创建失败;
- 若你的物种栅格不是二进制(比如存在其他数值),需先转换为存在/缺失标记:
raster_stack[raster_stack > 0] <- 1; terra包相比传统的raster包处理大数据效率更高,适合4000+文件的场景。
内容的提问来源于stack exchange,提问作者JoeG
相关产品推荐
相关产品推荐

