gdal
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGDAL Skill
GDAL技能
Use GDAL command line tools for common raster and vector geospatial workflows.
使用GDAL命令行工具完成常见的栅格和矢量地理空间工作流。
Tools
工具
Prefer the smallest tool that fits the task:
gdalinfoogrinfogdalwarpgdal_translategdalbuildvrtgdaladdogdaltindexgdal_rasterizegdal2tiles.pyogr2ogr
If GDAL is not installed, ask the user to install it before continuing.
优先选择最适合任务的最小工具:
gdalinfoogrinfogdalwarpgdal_translategdalbuildvrtgdaladdogdaltindexgdal_rasterizegdal2tiles.pyogr2ogr
如果未安装GDAL,请先要求用户安装后再继续。
Workflow
工作流程
1. Inspect first
1. 先检查数据
bash
gdalinfo INPUT.tif
ogrinfo INPUT.shp -so -alOne full dump on unknown data is worth it; after that, grep for the lines you need () — full WKT dumps are large. For vectors, prints the layer summary; bare without or a layer name prints nothing useful.
gdalinfoSize is|Origin|Pixel Size|Band|Overviews|ID\[-so -al-so-albash
gdalinfo INPUT.tif
ogrinfo INPUT.shp -so -al对未知数据执行一次完整的输出是很有必要的;之后可以通过grep筛选所需行()——完整的WKT输出内容很大。对于矢量数据,会打印图层摘要;仅使用而不加或图层名称不会输出有用信息。
gdalinfoSize is|Origin|Pixel Size|Band|Overviews|ID\[-so -al-so-al2. Pick raster vs vector path
2. 选择栅格或矢量处理路径
- Raster tasks: ,
gdalwarp,gdal_translate,gdalbuildvrt,gdal_rasterizegdal2tiles.py - Vector tasks: ,
ogr2ogr,ogrinfogdaltindex
- 栅格任务:、
gdalwarp、gdal_translate、gdalbuildvrt、gdal_rasterizegdal2tiles.py - 矢量任务:、
ogr2ogr、ogrinfogdaltindex
3. Write a new output
3. 生成新输出文件
- prefer new output files
- preserve CRS and nodata intentionally
- use compression for large rasters
- 优先生成新的输出文件
- 有意保留坐标参考系统(CRS)和无数据值(nodata)
- 对大型栅格使用压缩
4. Validate output
4. 验证输出结果
Use the check that matches the operation — improvising verification is where runs go wrong:
bash
undefined使用与操作匹配的检查方法——随意的验证会导致运行出错:
bash
undefinedAny lossless conversion or mosaic: band checksums must match the input
任何无损转换或镶嵌:输出波段的校验和必须与输入一致
gdalinfo -checksum INPUT.tif | grep Checksum
gdalinfo -checksum OUTPUT.tif | grep Checksum
gdalinfo -checksum INPUT.tif | grep Checksum
gdalinfo -checksum OUTPUT.tif | grep Checksum
COG: quick layout check, then real validation
COG:先快速检查布局,再进行正式验证
gdalinfo OUTPUT.tif | grep -E "LAYOUT|Block=|Overviews"
rio cogeo validate OUTPUT.tif # via if not installed
uv run --with rio-cogeogdalinfo OUTPUT.tif | grep -E "LAYOUT|Block=|Overviews"
rio cogeo validate OUTPUT.tif # 若未安装,可通过运行
uv run --with rio-cogeoWarp/clip: CRS, resolution, per-band min/max in one call
重投影/裁剪:一次调用即可检查CRS、分辨率及各波段的最小值/最大值
gdalinfo -mm OUTPUT.tif
gdalinfo -mm OUTPUT.tif
Mosaic seamlessness: each quadrant bit-identical to its source tile
镶嵌无缝性:每个象限与源瓦片完全一致
(explicit offsets per tile — avoid shell arrays, the login shell may be zsh)
(为每个瓦片指定明确偏移量——避免使用shell数组,登录shell可能是zsh)
gdal_translate -q -of VRT -srcwin 0 0 256 256 MOSAIC.tif /tmp/quad.vrt
gdalinfo -checksum /tmp/quad.vrt | grep Checksum # compare vs TILE_0.tif
gdal_translate -q -of VRT -srcwin 0 0 256 256 MOSAIC.tif /tmp/quad.vrt
gdalinfo -checksum /tmp/quad.vrt | grep Checksum # 与TILE_0.tif对比
Vector: layer summary + SQLite-dialect counts
矢量数据:图层摘要 + SQLite方言统计
ogrinfo OUTPUT.gpkg LAYER -so
ogrinfo OUTPUT.gpkg -dialect SQLite -sql "SELECT COUNT(*) FROM layer"
`gdaladdo` on a writable GeoTIFF builds internal overviews; `-ro` forces an external `.ovr` sidecar — so the absence of a `.ovr` file next to the output proves the overviews are internal.ogrinfo OUTPUT.gpkg LAYER -so
ogrinfo OUTPUT.gpkg -dialect SQLite -sql "SELECT COUNT(*) FROM layer"
对可写入的GeoTIFF执行`gdaladdo`会构建内部概览;`-ro`参数会强制生成外部`.ovr`辅助文件——因此输出文件旁若没有`.ovr`文件,说明概览是存储在内部的。Quick Reference
快速参考
bash
undefinedbash
undefinedInspect
检查数据
gdalinfo INPUT.tif
ogrinfo INPUT.shp -so
gdalinfo INPUT.tif
ogrinfo INPUT.shp -so
Vector conversion and clipping
矢量转换与裁剪
ogr2ogr -f GeoJSON -t_srs epsg:4326 OUTPUT.geojson INPUT.shp
gdaltindex -t_srs epsg:4326 -f GeoJSON OUTPUT_EXTENT.geojson INPUT_RASTER.tif
ogr2ogr -f GeoJSON -clipsrc OUTPUT_EXTENT.geojson OUTPUT_CLIPPED.geojson INPUT.shp
ogr2ogr -f GeoJSON -t_srs epsg:4326 OUTPUT.geojson INPUT.shp
gdaltindex -t_srs epsg:4326 -f GeoJSON OUTPUT_EXTENT.geojson INPUT_RASTER.tif
ogr2ogr -f GeoJSON -clipsrc OUTPUT_EXTENT.geojson OUTPUT_CLIPPED.geojson INPUT.shp
Raster reprojection (choose -r intentionally: bilinear/cubic for continuous, near for categorical)
栅格重投影(需有意选择-r参数:连续数据用bilinear/cubic,分类数据用near)
gdalwarp -t_srs EPSG:XXXX -tr XRES YRES -r bilinear -co TILED=YES -co COMPRESS=DEFLATE -co PREDICTOR=2 INPUT.tif OUTPUT.tif
gdalwarp -t_srs EPSG:XXXX -tr XRES YRES -r bilinear -co TILED=YES -co COMPRESS=DEFLATE -co PREDICTOR=2 INPUT.tif OUTPUT.tif
Raster clipping
栅格裁剪
gdal_translate -srcwin XOFF YOFF XSIZE YSIZE INPUT.tif OUTPUT.tif # by pixel window (exact, no resampling)
gdal_translate -projwin ULX ULY LRX LRY INPUT.tif OUTPUT.tif # by georeferenced bounds
gdalwarp -cutline INPUT.shp -crop_to_cutline -dstalpha INPUT.tif OUTPUT.tif # by polygon
gdal_translate -srcwin XOFF YOFF XSIZE YSIZE INPUT.tif OUTPUT.tif # 按像素窗口裁剪(精确,无重采样)
gdal_translate -projwin ULX ULY LRX LRY INPUT.tif OUTPUT.tif # 按地理参考范围裁剪
gdalwarp -cutline INPUT.shp -crop_to_cutline -dstalpha INPUT.tif OUTPUT.tif # 按多边形裁剪
Raster conversion
栅格转换
gdal_translate -b 1 -b 2 -b 3 INPUT.tif OUTPUT.tif
gdal_translate -b 1 -b 2 -b 3 -of JPEG -outsize 400 0 INPUT.tif OUTPUT.jpg
gdal_translate -b 1 -b 2 -b 3 INPUT.tif OUTPUT.tif
gdal_translate -b 1 -b 2 -b 3 -of JPEG -outsize 400 0 INPUT.tif OUTPUT.jpg
Mosaic and stack
镶嵌与堆叠
gdalbuildvrt OUTPUT.vrt path/to/tiffs/*.tif
gdal_translate -co TILED=YES -co BIGTIFF=YES -co NUM_THREADS=ALL_CPUS -co COMPRESS=LZW -co PREDICTOR=2 OUTPUT.vrt OUTPUT.tif
gdalbuildvrt OUTPUT.vrt path/to/tiffs/*.tif
gdal_translate -co TILED=YES -co BIGTIFF=YES -co NUM_THREADS=ALL_CPUS -co COMPRESS=LZW -co PREDICTOR=2 OUTPUT.vrt OUTPUT.tif
Internal overviews on an existing GeoTIFF (-r near for categorical; -ro writes external .ovr instead)
为现有GeoTIFF添加内部概览(分类数据用-r near;-ro参数会写入外部.ovr文件)
gdaladdo -r average OUTPUT.tif 2 4 8
gdaladdo -r average OUTPUT.tif 2 4 8
Rasterize and tile
栅格化与切片
gdal_rasterize -burn 1.0 -ot Byte -of GTiff -co COMPRESS=LZW -co BIGTIFF=YES INPUT.shp OUTPUT.tif
gdal2tiles.py -z 10-16 INPUT_BYTE.tif OUTPUT/
gdal_rasterize -burn 1.0 -ot Byte -of GTiff -co COMPRESS=LZW -co BIGTIFF=YES INPUT.shp OUTPUT.tif
gdal2tiles.py -z 10-16 INPUT_BYTE.tif OUTPUT/
COG (format-only conversion — smallest tool that fits)
COG(仅格式转换——选择最适合的最小工具)
gdal_translate -of COG -co COMPRESS=LZW -co PREDICTOR=2 -co NUM_THREADS=ALL_CPUS INPUT.tif OUTPUT.tif
gdal_translate -of COG -co COMPRESS=LZW -co PREDICTOR=2 -co NUM_THREADS=ALL_CPUS INPUT.tif OUTPUT.tif
use gdalwarp -of COG only when also reprojecting in the same step
仅当同时进行重投影时,才使用gdalwarp -of COG
Vector SQL: OGR's default dialect has no GROUP BY, window, or spatial functions —
矢量SQL:OGR默认方言不支持GROUP BY、窗口函数或空间函数——
pass -dialect SQLite for anything beyond simple SELECT/WHERE
若需执行简单SELECT/WHERE之外的操作,请传入-dialect SQLite参数
ogr2ogr -f GPKG OUT.gpkg IN.shp -dialect SQLite
-sql "SELECT *, ST_Area(ST_Transform(geometry, EPSG)) AS area_m2 FROM layer WHERE landuse IN ('ag')"
-t_srs EPSG:XXXX -nln layername
-sql "SELECT *, ST_Area(ST_Transform(geometry, EPSG)) AS area_m2 FROM layer WHERE landuse IN ('ag')"
-t_srs EPSG:XXXX -nln layername
undefinedogr2ogr -f GPKG OUT.gpkg IN.shp -dialect SQLite
-sql "SELECT *, ST_Area(ST_Transform(geometry, EPSG)) AS area_m2 FROM layer WHERE landuse IN ('ag')"
-t_srs EPSG:XXXX -nln layername
-sql "SELECT *, ST_Area(ST_Transform(geometry, EPSG)) AS area_m2 FROM layer WHERE landuse IN ('ag')"
-t_srs EPSG:XXXX -nln layername
undefinedReferences
参考资料
- (the only reference file)
references/gdal-recipes.md
- (唯一参考文件)
references/gdal-recipes.md