GDAL 3.11 で追加される gdal コマンドを触ってみる (1) migration guide を読む
GDAL 3.11 では、gdal
というコマンドが追加されます。これまで、GDAL には多種多様なコマンドがあり、目的に応じて使い分ける必要がありましたが、gdal
コマンドはそのすべてを網羅し、統一的なインターフェースで使えるようにするために作られました。
ドキュメントはすでにできています。以下のページの冒頭に書かれているように、このコマンドはまだまだ実験的なものです。GDAL 3.11 で正式リリースされても、その後のリリースで大幅な変更が加わるかもしれません。長期的なプロジェクトではまだ使わないほうがよさそうです。
gdal
コマンドを試すには
この記事を書いている時点では GDAL 3.11 はまだリリースされていませんが、4月17日にベータ版のリリースとテストの呼びかけが GDAL のメーリングリストに投稿されていました。GDAL 3.11 のリリースがいつになるかわからないのですが、「2週間後に RC 版が出る」と言っているので、大きな問題がなければもう数日すると RC 版が出るのだと思います。
上の投稿に書かれているように、Docker イメージが用意されていてお手軽に試すことができます。この記事では ghcr.io/osgeo/gdal:ubuntu-full-latest
を使っていきます。
2d24df689f42:/# gdal --version
GDAL 3.11.0beta1 "Eganville", released 2025/04/18
サブコマンド一覧
gdal
コマンドには以下のサブコマンドがあります。ラスタデータ関連の操作であれば raster
、ベクタデータ関連の操作であれば vector
といった具合です。それぞれのサブコマンドの下にはさらにサブコマンドが続きます。
2d24df689f42:/# gdal -h
Usage: gdal <COMMAND> [OPTIONS]
where <COMMAND> is one of:
- convert: Convert a dataset (shortcut for 'gdal raster convert' or 'gdal vector convert').
- driver: Command for driver specific operations.
- info: Return information on a dataset (shortcut for 'gdal raster info' or 'gdal vector info').
- mdim: Multidimensional commands.
- pipeline: Execute a pipeline (shortcut for 'gdal raster pipeline' or 'gdal vector pipeline').
- raster: Raster commands.
- vector: Vector commands.
- vsi: GDAL Virtual System Interface (VSI) commands.
サブコマンドがいっぱいで、どこから見ていいかわかりませんね...。とりあえず、migration guide が用意されているので、それを読んで勘所を掴んでいきたいと思います。
gdalinfo
/ ogrinfo
gdalinfo
/ ogrinfo
相当なのは info
サブコマンドです。migration guide ではgdal raster info
と gdal vector info
を使い分けていますが、gdal info
でラスタデータもベクタデータもどっちも扱えます。
gdal info --format=text data.tif
gdal info --format=text data.gpkg
ちなみに、--format=text
が指定されていますが、フォーマットには text
と json
があり、json
の方がデフォルトになっています。出力は以下のような感じでした。jq
とかで加工して使うのに便利そうです。
8d325e4a2817:/# gdal info /downloads/logo.tif
{
"description":"/downloads/logo.tif",
"driverShortName":"GTiff",
"driverLongName":"GeoTIFF",
"files":[
"/downloads/logo.tif"
],
"size":[
101,
77
],
"coordinateSystem":{
"wkt":"ENGCRS[\"Cartesian (Meter)\",\n EDATUM[\"Unknown engineering datum\"],\n CS[Cartesian,2],\n AXIS[\"(E)\",east,\n ORDER[1],\n LENGTHUNIT[\"metre\",1,\n ID[\"EPSG\",9001]]],\n AXIS[\"(N)\",north,\n ORDER[2],\n LENGTHUNIT[\"metre\",1,\n ID[\"EPSG\",9001]]]]",
"dataAxisToSRSAxisMapping":[
1,
2
]
},
...
なお、いろいろオプションもあるんですが、gdal info --help
ではいくつかしか表示されず(指定はできる)、gdal raster info --help
、gdal vector info --help
で見る必要がありました。gdal info
は、あくまでショートカットとして用意されているようです。
gdal_translate
/ ogr2ogr
)
データ形式の変換(データ形式の変換は、gdal convert
です。ラスタデータには gdal raster convert
、ベクタデータには gdal vector convert
ですが、gdal convert
で両方扱えます。
gdal convert --of=COG in.nc out.tif
gdal convert in.shp out.gpkg
--of
はアウトプット形式の指定で、ラスタデータもベクタデータも共通のオプションになっています。他にも以下のようなオプションがあります。これも gdal info
と同じく、すべてのオプションは gdal raster convert --help
/ gdal vector convert --help
じゃないと見れないです。
-
-f
,--of
,--format
,--output-format
:出力フォーマット -
--if
,--input-format
:入力フォーマット -
--co
,--creation-option
:出力のオプション -
--oo
,--open-option
:入力のオプション -
--overwrite
,--append
,--update
,--overwrite-layer
:すでに出力先にファイルが存在するときにどうするかの指定(update と overwrite layer はベクタデータのみ) -
-l
,--layer
,--input-layer
:入力レイヤ名の指定(ベクタデータのみ) -
--output-layer
: 出力レイヤ名の指定(ベクタデータのみ)
細かい違い
他のサブコマンドにも共通することですが、いくつか細かい違いに気付いたのでここでメモします。
まず、旧コマンドはこういうプログレスバーを出してくれていましたが、gdal
コマンドはデフォルトではオフになっています(もっと重いデータやファイル数が多い場合は自動でオンになったりするのかもですが、試していません)。これは --progress
というオプションを付けると出せます。
Processing out.tif [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.
あと、出力や入力のオプションを複数指定する場合の違いについて。旧コマンドでは、-co
で複数指定することができました。
gdal_translate -co TILED=YES -co COMPRESS=DEFLATE in.tif out.tif
gdal
コマンドでは、同じように繰り返し指定することもできますし、こんな感じでカンマ区切りで一気に指定することもできるようになったみたいです。
gdal convert --co=TILED=YES,COMPRESS=DEFLATE in.tif out.tif
gdalwarp
/ ogr2ogr -t_srs
)
投影変換(投影変換は、gdal raster reproject
/ gdal vector reproject
です(これは gdal reproject
のようなショートカットは用意されていません)。
gdal raster reproject --dst-crs=EPSG:4326 data.tif data_4326.tif
gdal vector reproject --dst-crs=EPSG:4326 data.gpkg data_4326.gpkg
gdalwarp
や ogr2ogr
では変換先の CRS は -t_srs
というオプションで指定していましたが、gdal
コマンドでは --dst-crs
, -d
という名前になっています。同様に、変換元は --src-crs
, -s
で指定します。
ラスタデータの場合は、リサンプリングの方法や解像度などいろいろオプションがあります。たぶん gdalwarp
相当のオプションが揃ってるんだろうな...、とは思うのですが、私はあまりよく知らないので詳しい人に検証してほしいところです。
Options:
-f, --of, --format, --output-format <OUTPUT-FORMAT> Output format ("GDALG" allowed)
--co, --creation-option <KEY>=<VALUE> Creation option [may be repeated]
--overwrite Whether overwriting existing output is allowed
-s, --src-crs <SRC-CRS> Source CRS
-d, --dst-crs <DST-CRS> Destination CRS
-r, --resampling <RESAMPLING> Resampling method. RESAMPLING=nearest|bilinear|cubic|cubicspline|lanczos|average|rms|mode|min|max|med|q1|q3|sum (default: nearest)
--resolution <xres>,<yres> Target resolution (in destination CRS units)
Mutually exclusive with --size
--size <width>,<height> Target size in pixels
Mutually exclusive with --resolution
--bbox <BBOX> Target bounding box (in destination CRS units)
--bbox-crs <BBOX-CRS> CRS of target bounding box
Advanced Options:
--if, --input-format <INPUT-FORMAT> Input formats [may be repeated]
--oo, --open-option <KEY=VALUE> Open options [may be repeated]
--target-aligned-pixels Round target extent to target resolution
--srcnodata <SRCNODATA> Set nodata values for input bands ('None' to unset). [1.. values]
--dstnodata <DSTNODATA> Set nodata values for output bands ('None' to unset). [1.. values]
--addalpha Adds an alpha mask band to the destination when the source raster have none.
--wo, --warp-option <NAME>=<VALUE> Warping option(s) [may be repeated]
--to, --transform-option <NAME>=<VALUE> Transform option(s) [may be repeated]
--et, --error-threshold <ERROR-THRESHOLD> Error threshold
gdal_translate -projwin
/ ogr2ogr -clipsrc
)
データの切り抜き(指定した領域でデータを切り抜くには、gdal raster clip
/ gdal vector clip
が使えます。以下のように指定します。
gdal raster clip --bbox=2,49,3,50 in.tif out.tif
gdal vector clip --bbox=2,49,3,50 in.gpkg out.gpkg
あと、切り抜くのではなく、bbox に一部でも含まれている地物に絞り込むのは、gdal vector filter
というコマンドが用意されています。旧コマンドだと ogr2ogr -spat
に相当するもののようです。
gdal vector filter --bbox=2,49,3,50 in.gpkg out.gpkg
filter
は他にも、--where
で属性の値によってフィルタリングしたりできます(たぶんogr2ogr
の -where
と同じです)。
COG への変換
複数の GeoTiff のマージと変換
まず、複数の GeoTIFF をマージして COG 形式に変換するには、migration guide 曰く旧コマンドだとこんな感じでした。日本語の資料を検索した感じ、gdalbuildvrt
ではなくて gdal_merge.py
でやるのが一般的なんでしょうか...?
gdalbuildvrt tmp.vrt src/*.tif
gdal_translate -of COG tmp.vrt out.tif
gdal
コマンドの場合は、gdal raster mosaic
を使うとこんな感じで VRT を挟まず一気に変換できるらしいです。
gdal raster mosaic --of=COG src/*.tif out.tif
gdal raster mosaic
は、VRT をつくるのにも使えます。
gdal raster mosaic src/*.tif out.vrt
ピラミッド画像の生成
gdaladdo
でやっていた解像度が低いピラミッド画像の生成は、gdal raster overview add
でできます。ちなみに、overview delete
で削除もできるみたいです。
gdal raster overview add -r average --levels=2,4,8,16 my.tif
複数のラスタデータをマルチバンド画像として結合
単一バンドの GeoTIFF を一つにまとめるには、gdal raster stack
を使います。旧コマンドだと、gdal_merge
もしくは gdalbuildvrt
→ gdal_translate
でやるみたいです。
gdal raster stack red.tif green.tif blue.tif out.tif
複数のベクタデータを1つのデータに結合
複数のベクタデータを結合するには、旧コマンドでは ogrmerge
が用意されていました。
gdal vector concat --mode=stack *.shp merged.gpkg
--mode
に指定できるのは、以下の3つで、merge-per-layer-name
がデフォルトになっています。レイヤ名が同じでもファイルが違うなら別で扱いたい場合は、stack
にすると、かぶらないレイヤ名をつけてくれます。
merge-per-layer-name
stack
single
最後に
ということで、migration guide を読んでなんとなく基本的な使い方はつかめたような気がします。とはいえ、あまり実際のデータで動作確認できていないので、変な挙動とかあるかもしれません。余裕がある方は、早めに試して、バグっぽい挙動を見つけたら GitHub に報告するのがいいと思います。
今回は、互換性的なところに着目してみていきましたが、gdal
コマンドにしかない新機能についても調べて記事にできたらなと思っています(とか言って (1) だけで力尽きたらすみません...)。具体的にはこのあたりが気になってます。
-
gdal raster pipeline
/gdal vector pipeline
gdal raster calc
gdal vsi
gdal driver
- Python API
続きを書きました:
Discussion