gdalwarp重投影裁剪与重采样实操
gdalwarp 是 GDAL 里专门做栅格重投影、裁剪和重采样的命令行工具:用 -t_srs 指定目标坐标系,用 -te 或 -cutline 控制输出范围,用 -r 选择重采样算法,再配合 -tr/-ts 定分辨率或像元尺寸。一条命令就能把输入栅格变到目标投影、裁出需要区域并控制像元质量。下面按实操顺序写清命令写法、参数怎么选,以及怎么验收结果。

基本重投影怎么写
要解决的问题很直接:源栅格是一个 CRS,目标分析或出图要用另一个 CRS。先确认源数据自带正确的地理参考(可用 gdalinfo 看),再指定目标 SRS。坐标系写法支持 EPSG、WKT、PROJ 字符串或 .prj 文件;动态 CRS 还可配合历元参数。投影与坐标转换的背景可对照本站GDAL 重投影与投影坐标转地理坐标说明。
- 确认输入:gdalinfo input.tif,看 Coordinate System、Origin、Pixel Size。
- 最小可用命令:指定目标 SRS 并写出输出文件。
gdalwarp -t_srs EPSG:4326 input.tif output.tif - 源 SRS 缺失或错误时显式写出:加 -s_srs EPSG:xxxx。
- 需要覆盖已有文件时加 -overwrite;指定格式用 -of GTiff,创建选项用 -co TILED=YES -co COMPRESS=LZW 等。
- 验收:再跑一次 gdalinfo output.tif,核对目标 CRS、范围、分辨率是否符合预期。
更完整的选项说明以官方文档为准,可查阅 GDAL gdalwarp 最新程序说明。从 GDAL 3.11 起也有等价的新 CLI:gdal raster reproject,日常脚本里 gdalwarp 仍然最常见。
裁剪:地理范围与矢量 cutline
重投影时常顺带裁掉无关区域,减少体积、加快后续处理。两种主流做法:矩形范围(-te)和矢量边界(-cutline)。
- -te xmin ymin xmax ymax:输出外包矩形,默认按目标 SRS 解释;若范围写在别的坐标系,加 -te_srs。
- -cutline:用 shapefile、GeoPackage 或(GDAL ≥3.9)POLYGON/MULTIPOLYGON 的 WKT;可用 -cl、-cwhere、-csql 选图层/要素。
- -crop_to_cutline:把输出范围收紧到 cutline 外包,避免大片空白。
- -cblend:边界处按像素距离做混合,减轻硬切边。
- cutline 与目标 CRS 不一致时,指定 -cutline_srs(≥3.9)。
典型命令:
- 矩形裁剪:
gdalwarp -t_srs EPSG:3857 -te 12000000 4000000 13000000 5000000 input.tif clipped.tif - 矢量裁剪并收紧范围:
gdalwarp -cutline boundary.shp -crop_to_cutline -t_srs EPSG:4326 input.tif clipped.tif
注意:xmin 必须小于 xmax、ymin 必须小于 ymax,否则可能报非法负尺寸。非地理参考影像裁剪要额外处理仿射/变换参数,这类场景相对少见,按官方示例核对即可。

重采样方法与分辨率怎么选
重投影一定会重采样。默认是 near(最近邻),速度快,适合分类栅格,但对连续表面容易出现锯齿。连续值(高程、影像 DN、温度等)一般改用 bilinear、cubic 或 lanczos。分辨率用 -tr(目标像元大小)或 -ts(宽高像元数)控制,二者互斥;需要像素对齐时加 -tap。
| 方法(-r) | 适用数据 | 特点 |
|---|---|---|
| near | 分类、掩膜、离散编码 | 默认;最快;不产生新类别值 |
| bilinear | 连续表面、多数遥感影像 | 平滑较好,常用折中 |
| cubic / cubicspline | 影像、DEM 可视化 | 更平滑;COG 场景常见 cubic |
| lanczos | 对锐度要求高的影像 | 保边较好,计算更重 |
| average / rms / mode / sum 等 | 统计汇总、下采样专题 | 按语义选;rms≥3.3,sum≥3.1 |
示例(定分辨率 + 双线性 + 重投影):
gdalwarp -tr 0.001 0.001 -r bilinear -t_srs EPSG:4326 input.tif output.tif
下采样时默认会利用源 overview;若 overview 质量差、结果发糊,可加 -ovr NONE 强制从全分辨率算。分辨率、重采样与边界如何一起验收,可继续看本站gdalwarp 重投影怎么控精度:分辨率、重采样与边界验收。
内存、多线程与输出质量注意点
大栅格容易 OOM 或跑得很慢,也容易出现“看起来像分辨率忽变”的分块伪影。实用做法:
- 加大工作内存:-wm 500 或百分比(GDAL ≥3.10 支持单位/%);同时可设 –config GDAL_CACHEMAX 500。
- 计算多线程:-wo NUM_THREADS=ALL_CPUS;I/O 多线程可加 -multi。
- 默认用近似变换加速,平铺与非平铺结果可能略有差别;小图要严格一致时用 -et 0(更慢)。
- 大变形区域、非 nearest 重采样时,局部尺度估计可能导致块状伪影:可尝试加大 -wm,或按官方建议用 -wo XSCALE=… YSCALE=… 强制尺度。
- 直接压缩输出有时体积异常大:可先 warp 到 VRT,再用 gdal_translate 加压缩创建选项;或输出时带 -co TILED=YES。
- 无数据值:用 -srcnodata / -dstnodata;需要透明通道时加 -dstalpha。
验收建议:对照源范围与目标 CRS 检查四至;抽查若干控制点或与参考图层叠合;分类数据看类别是否被“冲淡”;连续数据看边缘是否锯齿或发糊。需要批量投影时,也可对照本站ArcPy 批量投影与重投影做法做流程对比,命令行与脚本各取所长。
常见问题
为什么输出锯齿很明显、看着很糊或很糙?
默认重采样是 nearest。连续数据请显式加 -r bilinear 或 cubic/lanczos;分类数据才适合 near。同时核对是否误用了低质量 overview(必要时 -ovr NONE)。
报内存不足或跑到一半崩掉怎么办?
增大 -wm 与 GDAL_CACHEMAX,优先 64 位环境;避免一次塞进过大 chunk。仍不够就先裁切范围或切块再拼。
-te 报错尺寸为负或范围怪异?
检查坐标顺序是否满足 xmin<xmax、ymin<ymax;范围若写在源坐标系,用 -te_srs 标明,不要默认当成目标 SRS。
cutline 裁出来偏了或失败?
确认矢量与目标 CRS 一致,或显式写 -cutline_srs;需要收紧空白时加 -crop_to_cutline。gdalwarp 只处理栅格,向量当输入会报格式不支持。
实操时先写通「-t_srs + 合适的 -r + 明确的 -te/-cutline」,再用 -tr/-ts 和 -wm/多线程把分辨率与性能压稳;验收以 gdalinfo 的 CRS/范围/分辨率和叠图检查为准。建议把常用参数固化成脚本模板,大范围任务优先裁切再重投影,既省内存也少伪影。