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

如何用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等信息,保证输出文件一致性

运行前准备

  1. 安装依赖库:pip install rasterio geopandas shapely
  2. 替换代码中的raster_dir、shape_path为你的实际路径
  3. 若栅格为其他格式(如.img),修改glob中的文件后缀匹配规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:25:27