Python调用GDAL裁剪重投影栅格
用 Python 调用 GDAL 裁剪并重投影栅格,直接用 from osgeo import gdal 后调用 gdal.Warp() 即可一步完成重投影、裁剪(按边界框或矢量掩膜)和重采样;仅需窗口子集时用 gdal.Translate() 的 projWin 更轻量。GDAL 3.11 起新增 gdal.alg.raster.clip 与 reproject 接口,写法更接近命令行。优先 Conda 安装,截至 2026 年 11 月最新稳定版为 3.13.3,配合 NumPy 与 PROJ 即可稳定运行。

安装与环境准备
动手前先解决依赖。推荐 Conda,跨平台且自动处理 libgdal、PROJ 和 Python 绑定,避免头文件版本冲突。Windows 用户若坚持 pip,可参考本站Python 安装 GDAL 报错与 Wheel 下载指南获取匹配 wheel。
- 创建环境并安装:conda create -n gdal_env python=3.11,激活后执行 conda install -c conda-forge gdal(自动含 Python 绑定与核心驱动)。
- 验证:进入 Python 执行 from osgeo import gdal; print(gdal.__version__),应显示 3.13.x 或你安装的版本;建议紧接着写 gdal.UseExceptions() 让错误抛出异常而非静默返回。
- 可选增强:需要数组接口时确认 NumPy 已装;大文件或特殊驱动可加 libgdal 或对应插件包。
| 安装方式 | 适用场景 | 注意事项 |
|---|---|---|
| Conda(conda-forge) | 首选,跨平台 | 版本与库同步,自动处理 PROJ≥6.3.1 |
| pip install gdal | 系统已有 libgdal 头文件 | 建议 pip install gdal[numpy]==”$(gdal-config –version).*” 精确匹配 |
| 源码 / OSGeo4W | 定制驱动或 Windows 全功能 | 需 CMake≥3.16、C++17,构建复杂 |
运行时若遇 GDAL_DATA 路径问题,Conda 环境通常已设好;手动安装时检查环境变量即可。
经典方法:gdal.Warp 一步裁剪+重投影
这是最常用、最稳妥的方式,对应命令行 gdalwarp,支持目标 CRS、输出边界、矢量 cutline、分辨率与重采样算法。适合既要改投影又要裁剪的场景。更多掩膜裁剪对比可看本站Python 栅格裁剪:Rasterio 掩膜与 GDAL 裁剪影像。
- 准备输入:源栅格(GeoTIFF 等)、可选矢量掩膜(shp/geojson)或已知边界框(xmin, ymin, xmax, ymax,注意与源 CRS 一致或先统一)。
- 调用 Warp:指定输出路径、输入路径,以及 dstSRS、outputBounds 或 cutlineDSName + cropToCutline=True。
- 常用选项:resampleAlg(如 “bilinear”、”near”)、xRes/yRes、srcNodata/dstNodata、creationOptions=[“TILED=YES”,”COMPRESS=DEFLATE”]、multithread=True。
- 验收:用 gdalinfo 检查输出 CRS、尺寸、Nodata;在 QGIS 叠加矢量目视确认无多余黑边、范围正确。
示例写法:gdal.Warp(“out.tif”, “in.tif”, dstSRS=”EPSG:4326″, cutlineDSName=”mask.shp”, cropToCutline=True, dstNodata=0, resampleAlg=”bilinear”)。若只用边界框:加 outputBounds=[xmin,ymin,xmax,ymax]。cutline 时建议加 warpOptions=[“CUTLINE_ALL_TOUCHED=YES”] 减少边缘丢失。
仅做地理窗口裁剪且不改投影时,可用更轻的 gdal.Translate(“out.tif”, “in.tif”, projWin=[ulx,uly,lrx,lry]),详见官方 gdal_translate 文档。
GDAL 3.11+ 新接口:raster clip 与 reproject
从 3.11 起官方增加 CLI 风格算法,Python 侧可用 gdal.Run(“raster clip”, …) 或 3.12+ 的 gdal.alg.raster.clip / reproject,支持管道且裁剪时默认保持原 SRS 与分辨率(无强制重采样)。适合脚本清晰、只需单一操作的流程。完整参数见 官方 raster clip 说明。
- 纯裁剪(保持原投影):gdal.alg.raster.clip(input=”in.tif”, output=”out.tif”, window=[xmin,ymin,xmax,ymax]) 或提供 cutline。
- 纯重投影:gdal.alg.raster.reproject(input=”in.tif”, output=”out.tif”, dst_crs=”EPSG:3857″, resample_alg=”bilinear”)。
- 组合:先 reproject 再 clip,或用 pipeline;bbox 超出源范围时加允许参数避免报错。
旧版无 gdal.alg 时仍用 Warp/Translate。新接口对“只裁不改分辨率”更友好,复杂变换仍推荐 Warp。

参数选择、注意事项与验收
选择原则:需要同时改 CRS + 裁剪 → Warp;只要像素/地理窗口且保持原 SRS → Translate 或新 clip;大范围矢量掩膜注意几何加密(densify)避免投影变形导致漏裁。滑窗批量裁切可参考本站Python 调用 GDAL 做预测时的滑窗裁切写法。
| 场景 | 推荐函数 | 关键参数 |
|---|---|---|
| 裁剪+重投影 | gdal.Warp | dstSRS, outputBounds 或 cutlineDSName+cropToCutline, resampleAlg |
| 仅窗口子集 | gdal.Translate | projWin(地理)或 srcWin(像素) |
| 保持分辨率纯裁剪 | gdal.alg.raster.clip | window 或 cutline,默认无重采样 |
| 仅改投影 | gdal.alg.raster.reproject 或 Warp | dst_crs / dstSRS, xRes/yRes |
- CRS 必须明确:源与目标不一致时先统一 cutline,或分两步。
- Nodata:显式设 dstNodata,避免多波段被意外改写;注意源有效值与 Nodata 冲突时的警告。
- 性能:大文件开 multithread=True,输出加 TILED=YES;内存紧张可用 VSIMEM 中间结果。
- 验收标准:输出文件存在且大小合理;gdalinfo 显示正确 EPSG/Proj4、GeoTransform、Band Nodata;与参考矢量叠加无系统性偏移或大片黑边。
常见问题
ImportError: No module named ‘osgeo’ 或版本不匹配怎么办?
优先改用 Conda 重装;pip 用户确认系统 libgdal 版本与 Python 包一致,并安装带 NumPy 的变体。Windows 检查 PATH 与预编译 wheel 来源,详见本站安装报错文章。
裁剪后出现黑边或不完整?
对矢量 cutline 加上 warpOptions=[“CUTLINE_ALL_TOUCHED=YES”];确认 cutline 与栅格 CRS 一致,必要时先重投影矢量或 densify 几何;bbox 顺序必须是 xmin,ymin,xmax,ymax。
提示窗口/bbox 超出源范围报错?
默认会报错。检查坐标是否与源 CRS 匹配;新 clip 接口可开启允许超出选项,或先用 gdalinfo 确认源实际范围再缩小窗口。
WarpOptions 写成字符串后出现警告或异常?
warpOptions、creationOptions 等请用列表或正确字典格式,不要传单个长字符串;同时开启 gdal.UseExceptions() 便于定位。
总结:日常裁剪重投影优先 gdal.Warp,简单窗口用 Translate,新版本可尝试 alg 接口保持分辨率。先 Conda 装好环境并验证版本,再按上面参数表选工具,最后用 gdalinfo + 目视叠加验收。建议收藏本站相关裁剪教程,遇到安装或掩膜细节直接对照实践,效率更高。