如何简化R语言批量加载SpatVector/SpatRaster并执行掩膜合并脚本?
基于terra包批量处理非连续编号栅格瓦片的简化方案
核心需求
使用带5km缓冲区的SpatVector掩膜100+个编号不连续的.tif栅格瓦片,避免手动逐文件加载的重复代码,解决之前出现的vect_list和rast_list为空的问题。
完整简化脚本
1. 加载依赖包与矢量预处理
library(terra) # 加载目标矢量文件(替换为你的shapefile路径) vect_data <- vect("your_target_shape.shp") # 坐标系适配:确保矢量使用米为单位的投影坐标系(避免地理坐标系下缓冲区单位错误) if (grepl("longlat", crs(vect_data, proj=TRUE))) { # 自动匹配数据所在区域的UTM投影(无需手动指定带号) utm_crs <- crs(vect_data, proj=TRUE, utm=TRUE) vect_data <- project(vect_data, utm_crs) } # 创建5km缓冲区(width单位为米,与投影坐标系匹配) buffered_vect <- buffer(vect_data, width = 5000)
2. 批量获取非连续编号的栅格文件
# 设置栅格文件所在的文件夹路径 raster_folder <- "path/to/your/raster_tiles" # 匹配所有符合命名规则的.tif文件(示例匹配A+数字的格式,如A10.tif、A100.tif) # 可根据实际文件名修改pattern,比如"Tile_\\w+\\d+\\.tif$"匹配Tile_A10.tif这类格式 rast_files <- list.files( path = raster_folder, pattern = "^A\\d+\\.tif$", full.names = TRUE, # 返回完整文件路径,避免加载失败 recursive = FALSE # 若栅包子文件夹中也有文件,设为TRUE ) # 校验是否成功获取文件 if (length(rast_files) == 0) { stop("未找到符合规则的栅格文件,请检查路径或文件名匹配模式") }
3. 批量掩膜与合并栅格
# 定义单栅格处理函数:加载→坐标系匹配→掩膜 process_single_rast <- function(file_path) { # 加载栅格 single_rast <- rast(file_path) # 确保栅格与矢量坐标系一致,不一致则转换栅格 if (!identical(crs(single_rast), crs(buffered_vect))) { single_rast <- project(single_rast, crs(buffered_vect)) } # 执行掩膜操作 masked_rast <- mask(single_rast, buffered_vect) return(masked_rast) } # 批量处理所有栅格 masked_raster_list <- lapply(rast_files, process_single_rast) # 合并所有掩膜后的栅格 # - 无重叠瓦片用merge;有重叠瓦片用mosaic,可指定合并规则(如fun="mean"取均值、fun="max"取最大值) final_merged_raster <- merge(masked_raster_list) # 若有重叠区域,替换为: # final_merged_raster <- mosaic(masked_raster_list, fun = "max") # 保存最终结果(替换为你的输出路径) writeRaster( final_merged_raster, filename = "final_masked_merged_raster.tif", overwrite = TRUE, progress = "text" # 显示保存进度 )
关键注意事项
- 文件名匹配规则:
pattern参数需严格匹配你的栅格命名格式,可使用正则表达式调整,比如匹配包含特定前缀/后缀的文件 - 坐标系一致性:栅格与矢量必须使用同一坐标系,否则掩膜会失效;脚本中加入了自动转换逻辑,可根据实际数据调整
- 内存优化:若栅格数量极大,可使用
terra::sprc(masked_raster_list)创建栅格集合后再合并,或分批次处理减少内存占用 - 空列表问题排查:若再次出现
rast_list为空,检查list.files的path是否正确、pattern是否匹配文件名、full.names是否设为TRUE
内容的提问来源于stack exchange,提问作者LittleXQ
相关产品推荐
相关产品推荐

