使用Python裁剪TIFF文件:基于多边形坐标的技术求助
TIFF文件按GeoJSON多边形裁剪的实现方案
现有一份TIFF文件,需要根据给定的GeoJSON格式多边形坐标对其进行裁剪。之前找到的代码仅能实现固定尺寸的分块裁剪,无法满足按自定义多边形裁剪的需求,以下是具体的解决方案:
示例GeoJSON数据:
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "coordinates": [ [ [ 26.323586194745644, 51.5136424962856 ], [ 26.318436259612497, 51.51043743329282 ], [ 26.32558894729766, 51.50830059935572 ], [ 26.333599957503935, 51.51168387347343 ], [ 26.323586194745644, 51.5136424962856 ] ] ], "type": "Polygon" } } ] }
实现思路
使用rasterio的栅格掩膜(mask)功能,结合geopandas读取GeoJSON中的多边形几何信息,直接对TIFF文件进行裁剪,同时保留原文件的投影、数据类型等元数据。
步骤与代码
1. 安装依赖库
确保已安装所需库:
pip install rasterio geopandas
2. 完整裁剪代码
import rasterio from rasterio.mask import mask import geopandas as gpd from shapely.geometry import mapping # 输入文件路径 tiff_path = "images/B12.tiff" geojson_path = "你的GeoJSON文件路径.json" # 也可直接使用内存中的GeoJSON字符串 output_path = "result/cropped_B12.tif" # 读取GeoJSON中的多边形 gdf = gpd.read_file(geojson_path) # 获取第一个多边形的几何信息(多多边形可遍历features批量处理) geometries = [mapping(gdf.iloc[0]['geometry'])] # 读取TIFF文件并执行裁剪 with rasterio.open(tiff_path) as src: # 强制坐标系一致,避免裁剪偏移 if gdf.crs != src.crs: gdf = gdf.to_crs(src.crs) geometries = [mapping(gdf.iloc[0]['geometry'])] # 裁剪并自动适配多边形边界范围 out_image, out_transform = mask(src, geometries, crop=True) # 更新元数据为裁剪后的尺寸与变换参数 out_meta = src.meta.copy() out_meta.update({ "height": out_image.shape[1], "width": out_image.shape[2], "transform": out_transform }) # 保存裁剪结果 with rasterio.open(output_path, "w", **out_meta) as dest: dest.write(out_image)
3. 关键说明
- 坐标系一致性:必须保证TIFF和GeoJSON的坐标系(CRS)相同,否则裁剪结果会出现偏移,代码中已加入自动转换逻辑。
- 多多边形处理:如果GeoJSON包含多个多边形,只需遍历
gdf中的每个feature,将几何信息依次加入geometries列表即可。 - 原代码说明:你之前找到的代码是将TIFF分割为固定尺寸的瓦片,并非按自定义多边形裁剪,因此无法满足需求。
内容的提问来源于stack exchange,提问作者Tip-Rok
相关产品推荐
相关产品推荐

