如何用R语言迭代裁剪掩膜多栅格并按原名保存至子文件夹?
自动化批量处理栅格裁剪与掩膜方案
核心思路
针对大尺寸、范围各异的栅格文件,采用逐个遍历处理的方式避免内存溢出:遍历目标文件夹内所有栅格 → 裁剪至矢量边界范围 → 执行掩膜操作 → 以原文件名保存到指定子文件夹。
实现代码(基于Rasterio)
import os import glob import rasterio from rasterio.mask import mask from rasterio.windows import from_bounds import geopandas as gpd from shapely.geometry import mapping # 配置路径 raster_dir = "./your_raster_folder" # 替换为你的栅格文件夹路径 shape_path = "./your_mask_shapefile.shp" # 替换为你的矢量文件路径 output_dir = "./processed_rasters" # 创建输出文件夹(不存在则自动生成) os.makedirs(output_dir, exist_ok=True) # 读取矢量掩膜文件 mask_gdf = gpd.read_file(shape_path) # 遍历所有栅格文件(以.tif为例,可根据实际格式修改后缀) for raster_path in glob.glob(os.path.join(raster_dir, "*.tif")): # 获取原文件名与输出路径 raster_name = os.path.basename(raster_path) output_path = os.path.join(output_dir, raster_name) try: with rasterio.open(raster_path) as src: # 统一矢量与栅格的坐标系 if mask_gdf.crs != src.crs: mask_gdf = mask_gdf.to_crs(src.crs) geoms = [mapping(geom) for geom in mask_gdf.geometry] # 第一步:裁剪至矢量边界(缩小后续掩膜处理的数据量) bounds = mask_gdf.total_bounds window = from_bounds(*bounds, transform=src.transform) cropped_data = src.read(window=window) cropped_transform = src.window_transform(window) # 第二步:执行掩膜操作 masked_data, masked_transform = mask( dataset=rasterio.MemoryFile().open( driver=src.driver, height=cropped_data.shape[1], width=cropped_data.shape[2], count=src.count, dtype=cropped_data.dtype, transform=cropped_transform, crs=src.crs ).write(cropped_data), shapes=geoms, crop=False, nodata=src.nodata ) # 保存处理后的栅格(保留原文件元数据) with rasterio.open( output_path, "w", driver=src.driver, height=masked_data.shape[1], width=masked_data.shape[2], count=src.count, dtype=masked_data.dtype, transform=masked_transform, crs=src.crs, nodata=src.nodata ) as dst: dst.write(masked_data) print(f"处理完成:{raster_name}") except Exception as e: print(f"处理失败 {raster_name}: {str(e)}") continue
关键细节说明
- 内存优化:先通过
window裁剪缩小处理范围,再执行掩膜,大幅降低大文件的内存占用 - 坐标系兼容:自动检测并转换矢量与栅格的坐标系,避免投影不匹配问题
- 容错机制:添加异常捕获,单个文件处理失败时不中断整个批量流程
- 元数据保留:完全继承原栅格的驱动、数据类型、nodata等信息,保证输出文件一致性
运行前准备
- 安装依赖库:
pip install rasterio geopandas shapely - 替换代码中的
raster_dir、shape_path为你的实际路径 - 若栅格为其他格式(如.img),修改
glob中的文件后缀匹配规则
内容的提问来源于stack exchange,提问作者Nikos
相关产品推荐
相关产品推荐

