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

如何简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:05:27