如何创建循环批量处理文件夹内多栅格文件并执行QC?
批量处理HDF遥感文件并构建栅格栈
你完全可以通过循环实现批量处理,下面是适配你需求的完整R代码,同时修正了原单文件代码里的一处错误(原代码中evi_1_qc误使用ndvi_1作为输入,已修正为evi_1):
批量处理代码
# 加载必要包 library(terra) # 设置HDF文件所在文件夹路径(替换为你的实际路径) hdf_dir <- "./your_hdf_folder" # 获取文件夹内所有HDF文件路径 hdf_files <- list.files(hdf_dir, pattern = "\\.hdf$", full.names = TRUE) # 初始化空列表,用于存储所有处理后的图层 processed_layers <- list() # 遍历每个HDF文件 for (file in hdf_files) { # 读取HDF文件为栅格对象 t <- rast(file) # 提取目标图层(建议优先用图层名而非索引,避免版本差异导致索引变化) # 可先运行names(t)查看具体图层名,替换成你实际需要的名称 ndvi <- t[[1]] # 或 t[["250m 16 days NDVI"]] evi <- t[[2]] # 或 t[["250m 16 days EVI"]] qc <- t[[12]] # 或 t[["250m 16 days VI Quality"]] date <- t[[11]] # 或 t[["250m 16 days composite day of the year"]] # QC过滤:标记大于1的像元为无效(NA) qc[qc > 1] <- NA # 用QC栅格掩膜NDVI和EVI,去除无效像元 ndvi_qc <- mask(ndvi, qc) evi_qc <- mask(evi, qc) # 给图层命名(包含日期信息,方便后续识别) file_date <- gsub(".*A(\\d{7}).*", "\\1", basename(file)) # 从文件名提取日期码 names(ndvi_qc) <- paste0("NDVI_", file_date) names(evi_qc) <- paste0("EVI_", file_date) names(date) <- paste0("Date_", file_date) # 将处理后的图层加入列表 processed_layers <- c(processed_layers, ndvi_qc, evi_qc, date) } # 将所有图层合并为栅格栈 final_stack <- rast(processed_layers) # 可选:查看栅格栈信息 print(final_stack) plot(final_stack[[1:4]]) # 绘制前4个图层预览
关键注意事项
- 路径替换:务必将
hdf_dir替换为你的HDF文件实际存放路径 - 图层索引/名称:不同版本的MYD13Q1产品可能图层顺序有差异,建议先运行
names(rast(your_single_hdf_file))确认图层名称,用名称提取比索引更可靠 - 内存管理:如果处理全年文件(约23个HDF),确保电脑有足够内存;若内存不足,可分批次处理后再合并
- 文件名解析:代码中用正则从文件名提取日期码(如A2020313对应2020年第313天),如果你的文件名格式不同,需要调整正则表达式
内容的提问来源于stack exchange,提问作者jwell123
相关产品推荐
相关产品推荐

