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

如何在R中重命名子文件夹多文件并保留原路径及实现植被指数计算

R语言批量重命名栅格文件并计算NDVI解决方案

问题背景

现有9个子文件夹,每个文件夹内包含3个对应单幅影像的栅格波段文件(文件名含颗粒ID、卫星类型等信息),需要:

  1. 将每个文件夹内的3个文件统一重命名为red.tiff、nir.tiff、fmask.tiff,且保留在原文件夹中
  2. 基于重命名后的文件计算NDVI,结果保存至对应子文件夹

一、批量重命名(保留原路径)

原代码问题:使用list.files(..., full.names = FALSE)仅获取文件名,导致重命名时文件被移动到工作目录。以下代码遍历每个子文件夹,匹配对应波段并在原路径下重命名:

# 设置主目录路径
fieldszn <- '~/Desktop/hls project/fieldszn'
# 获取所有子文件夹的完整路径
subfolders <- list.dirs(fieldszn, recursive = FALSE)

# 遍历每个子文件夹
for (folder in subfolders) {
  # 获取当前文件夹下所有.tiff文件(带完整路径)
  band_files <- list.files(folder, pattern = "\\.tiff$", full.names = TRUE)
  
  # 根据实际文件名匹配对应波段(需根据你的文件名规则调整关键词)
  # 示例:假设红波段文件名含"red"/"B4",近红外含"nir"/"B5",fmask含"fmask"/"QA"
  red_file <- grep("red|RED|B4", band_files, value = TRUE)
  nir_file <- grep("nir|NIR|B5", band_files, value = TRUE)
  fmask_file <- grep("fmask|FMASK|QA", band_files, value = TRUE)
  
  # 在原文件夹内重命名文件
  file.rename(red_file, file.path(folder, "red.tiff"))
  file.rename(nir_file, file.path(folder, "nir.tiff"))
  file.rename(fmask_file, file.path(folder, "fmask.tiff"))
}

关键说明

  • file.path()用于拼接文件夹路径和新文件名,确保文件保留在原目录
  • 正则匹配规则需根据你的实际文件名调整,保证每个波段能被准确识别

二、遍历计算NDVI并保存

使用raster包读取栅格、计算NDVI,结果保存至对应子文件夹:

# 安装并加载raster包(首次运行需安装)
# install.packages("raster")
library(raster)

# 遍历子文件夹计算NDVI
for (folder in subfolders) {
  # 读取当前文件夹下的红波段和近红外波段
  red <- raster(file.path(folder, "red.tiff"))
  nir <- raster(file.path(folder, "nir.tiff"))
  
  # 计算NDVI
  ndvi <- (nir - red) / (nir + red)
  
  # 保存NDVI结果到当前文件夹,文件名包含子文件夹名称
  output_name <- paste0("NDVI_", basename(folder), ".tif")
  writeRaster(ndvi, file.path(folder, output_name), 
              format = "GTiff", overwrite = TRUE)
}

关键说明

  • overwrite = TRUE允许重复运行时覆盖已存在的NDVI文件
  • 若需处理多幅影像堆叠计算,可调整代码使用stack()读取同波段的所有文件,但当前场景下每个子文件夹对应单幅影像,单文件读取更合适

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:35:57