关于 gdal
面向常见栅格与矢量地理空间任务的 GDAL 命令行技能,指导选择工具、检查输入并验证输出。内容涵盖转换、裁剪、镶嵌及概览等工作流。
主要功能
- 01栅格与矢量数据检查
- 02格式转换与重投影
- 03栅格镶嵌与裁剪
- 04构建概览与瓦片
- 05输出结果验证
适用场景
- 01检查未知地理空间数据
- 02转换或裁剪矢量数据
- 03重投影并处理栅格
- 04验证栅格转换结果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ isaaccorley/ geospatial-skills --skill gdal安装后在 Claude Code 中输入/gdal确认已加载。
附带文件references/gdal-recipes.md
详细介绍
GDAL 技能
使用 GDAL 命令行工具完成常见的栅格和矢量地理空间工作流。
工具
优先选择最适合任务的最小工具:
gdalinfoogrinfogdalwarpgdal_translategdalbuildvrtgdaladdogdaltindexgdal_rasterizegdal2tiles.pyogr2ogr
如果未安装 GDAL,请先让用户安装,再继续操作。
工作流
1. 先检查
gdalinfo INPUT.tif
ogrinfo INPUT.shp -so -al
对于未知数据,先完整输出一次 gdalinfo 信息很有价值;之后再用 grep 搜索所需的行(Size is|Origin|Pixel Size|Band|Overviews|ID\[)——完整的 WKT 输出很长。对于矢量数据,-so -al 会输出图层摘要;如果只用 -so,却不带 -al 或图层名称,则不会输出有用信息。
2. 选择栅格或矢量处理路径
- 栅格任务:
gdalwarp、gdal_translate、gdalbuildvrt、gdal_rasterize、gdal2tiles.py - 矢量任务:
ogr2ogr、ogrinfo、gdaltindex
3. 写入新输出
- 优先使用新输出文件
- 有意保留 CRS 和 nodata
- 对大型栅格使用压缩
4. 验证输出
使用与操作相匹配的检查方式——验证时临时发挥往往会导致任务出错:
# Any lossless conversion or mosaic: band checksums must match the input
gdalinfo -checksum INPUT.tif | grep Checksum
gdalinfo -checksum OUTPUT.tif | grep Checksum
# COG: quick layout check, then real validation
gdalinfo OUTPUT.tif | grep -E "LAYOUT|Block=|Overviews"
rio cogeo validate OUTPUT.tif # via `uv run --with rio-cogeo` if not installed
# Warp/clip: CRS, resolution, per-band min/max in one call
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)
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
# Vector: layer summary + SQLite-dialect counts
ogrinfo OUTPUT.gpkg LAYER -so
ogrinfo OUTPUT.gpkg -dialect SQLite -sql "SELECT COUNT(*) FROM layer"
对可写的 GeoTIFF 使用 gdaladdo 会构建内部概览;使用 -ro 则会强制创建外部 .ovr 伴随文件。因此,输出文件旁边没有 .ovr 文件,就能证明概览存储在内部。
快速参考
# Inspect
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
# Raster reprojection (choose -r intentionally: bilinear/cubic for continuous, near for categorical)
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
# 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
# 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
# Internal overviews on an existing GeoTIFF (-r near for categorical; -ro writes external .ovr instead)
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/
# COG (format-only conversion — smallest tool that fits)
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
# Vector SQL: OGR's default dialect has no GROUP BY, window, or spatial functions —
# pass -dialect SQLite for anything beyond simple SELECT/WHERE
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
参考
references/gdal-recipes.md(唯一的参考文件)
评论
支持 Markdown