gdalwarp重投影裁剪与重采样实操

坐标系与投影
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

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

重投影前后像元网格变化示意

基本重投影怎么写

要解决的问题很直接:源栅格是一个 CRS,目标分析或出图要用另一个 CRS。先确认源数据自带正确的地理参考(可用 gdalinfo 看),再指定目标 SRS。坐标系写法支持 EPSG、WKT、PROJ 字符串或 .prj 文件;动态 CRS 还可配合历元参数。投影与坐标转换的背景可对照本站GDAL 重投影与投影坐标转地理坐标说明。

  1. 确认输入:gdalinfo input.tif,看 Coordinate System、Origin、Pixel Size。
  2. 最小可用命令:指定目标 SRS 并写出输出文件。
    gdalwarp -t_srs EPSG:4326 input.tif output.tif
  3. 源 SRS 缺失或错误时显式写出:加 -s_srs EPSG:xxxx。
  4. 需要覆盖已有文件时加 -overwrite;指定格式用 -of GTiff,创建选项用 -co TILED=YES -co COMPRESS=LZW 等。
  5. 验收:再跑一次 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)。

典型命令:

  1. 矩形裁剪:
    gdalwarp -t_srs EPSG:3857 -te 12000000 4000000 13000000 5000000 input.tif clipped.tif
  2. 矢量裁剪并收紧范围:
    gdalwarp -cutline boundary.shp -crop_to_cutline -t_srs EPSG:4326 input.tif clipped.tif

注意:xmin 必须小于 xmax、ymin 必须小于 ymax,否则可能报非法负尺寸。非地理参考影像裁剪要额外处理仿射/变换参数,这类场景相对少见,按官方示例核对即可。

GDAL 官方 gdalwarp 文档中的选项与示例页面
GDAL 官方 gdalwarp 文档中的选项与示例页面(截图来源:gdal.org)

重采样方法与分辨率怎么选

重投影一定会重采样。默认是 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/范围/分辨率和叠图检查为准。建议把常用参数固化成脚本模板,大范围任务优先裁切再重投影,既省内存也少伪影。