Python:使用GDAL裁剪并分块GeoTIFF文件

GEO百科知识2个月前发布 GEO研究员
1,333 0

<think>好的,我现在需要帮助用户解决如何使用PythonGDAL或Rasterio按照中国边界线批量裁剪GeoTIFF文件的问题。首先,我得回忆一下用户提到的引用内容,虽然这些引用可能不完全相关,但里面提到了矢量裁剪栅格数据的方法,比如extract by mask和erase操作,用户需要的是类似clip的功能,保留边界外的数据,不过这里用户可能想保留边界内的,因为是要按中国边界裁剪。 用户的需求是批量处理多个Tiff文件,所以代码需要支持循环处理每个文件。我之前处理过类似的遥感图像裁剪问题,记得GDAL和Rasterio都有相关的方法。GDALgdal.Warp函数可以进行裁剪,而Rasterio的mask函数结合shapely的几何对象也能实现。不过需要注意坐标系的一致性,矢量边界和栅格数据必须使用相同的坐标系统,否则裁剪会出错。 接下来,我需要考虑如何读取中国边界的矢量文件。通常用户可能有Shapefile文件,所以需要使用geopandas或fiona来读取。然后,将矢量几何传递给裁剪函数。在GDAL中,可以通过cutlineDSName参数指定矢量文件路径,而Rasterio可能需要将几何转换为GeoJSON格式。 另外,批量处理需要遍历输入文件夹中的所有Tiff文件,然后逐个处理。输出路径需要合理设置,避免覆盖原文件。可能还需要处理内存问题,特别是当处理大文件时,设置适当的参数如crop=True来保持内存效率。 用户可能需要代码示例,所以得准备GDAL和Rasterio两种方法的示例代码。同时,要提醒用户安装必要的库,比如gdal、rasterio、geopandas等。可能还需要注意裁剪时的重采样方法,以及nodata值的设置,确保输出文件的正确性。 最后,要考虑到用户可能的后续问题,比如如何处理坐标不一致的情况,或者如何优化裁剪速度,批量处理的行计算等。不过根据用户当前的问题,先提供基础的方法,再在相关问题里引导他们深入。</think>以下是使用Python批量裁剪GeoTIFF文件的完整教程,提供GDAL和Rasterio两种实现方案: ### 一、准备工作 1. 安装依赖库 “`bash pip install gdal rasterio geopandas shapely “` 2. 数据要求 – 中国边界矢量文件(建议使用WGS84或与栅格相同的坐标系) – 待裁剪GeoTIFF文件目录 – 输出目录(建议提前创建) ### 二、GDAL实现方案 “`python import os from osgeo import gdal def gdal_clip(input_folder, output_folder, shp_path): for filename in os.listdir(input_folder): if filename.endswith(".tif"): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, f"clip_{filename}") # 关键参数说明 options = gdal.WarpOptions( cutlineDSName=shp_path, # 矢量边界文件 cropToCutline=True, # 严格裁剪到边界范围 dstNodata=0, # 设置无效值 format="GTiff", # 输出格式 multithread=True # 启用多线程 ) gdal.Warp(output_path, input_path, options=options) print(f"已处理: {filename}") “` ### 三、Rasterio实现方案(推荐) “`python import rasterio from rasterio.mask import mask import geopandas as gpd import os def rasterio_clip(input_folder, output_folder, shp_path): # 读取矢量边界 gdf = gpd.read_file(shp_path) geometry = gdf.geometry.values for filename in os.listdir(input_folder): if filename.endswith(".tif"): input_path = os.path.join(input_folder, filename) output_path = os.path.join(output_folder, f"clip_{filename}") with rasterio.open(input_path) as src: # 执行裁剪 out_image, out_transform = mask( src, geometry, crop=True, # 裁剪到最小外接矩形 nodata=0 # 设置无效值 ) # 保持元数据一致 profile = src.profile profile.update({ "height": out_image.shape[1], "width": out_image.shape[2], "transform": out_transform }) with rasterio.open(output_path, "w", **profile) as dst: dst.write(out_image) print(f"已处理: {filename}") “` ### 四、关键技术要点 1. 坐标系一致性:必须确保矢量文件和栅格文件使用相同的坐标系,可使用QGIS检查/转换坐标系[^2] 2. 无效值处理:建议设置`nodata`值避免数据混淆 3. 内存优化:通过`crop=True`参数仅保留有效区域,减少输出文件大小[^1] 4. 批量处理:使用`os.listdir`遍历文件夹,自动处理所有TIFF文件 ### 五、常见问题解决 1. **坐标系不匹配**: “`python # 转换矢量坐标系(示例) gdf = gdf.to_crs(src.crs) # 匹配栅格坐标系 “` 2. **处理超大文件**: “`python # 在WarpOptions中添加分块参数 options = gdal.WarpOptions( cutlineDSName=shp_path, warpMemoryLimit=1024, # 单位MB warpOptions=["NUM_THREADS=ALL_CPUS"] ) “` 3. **保留属性信息**: “`python # 在Rasterio中添加标签 profile.update({ "TILED": "YES", "COMPRESS": "LZW", "PREDICTOR": 2 }) “`

© 版权声明

相关文章

暂无评论

none
暂无评论...