💬

GDAL 3.11 で追加される gdal コマンドを触ってみる (1) migration guide を読む

に公開

GDAL 3.11 では、gdal というコマンドが追加されます。これまで、GDAL には多種多様なコマンドがあり、目的に応じて使い分ける必要がありましたが、gdal コマンドはそのすべてを網羅し、統一的なインターフェースで使えるようにするために作られました。

ドキュメントはすでにできています。以下のページの冒頭に書かれているように、このコマンドはまだまだ実験的なものです。GDAL 3.11 で正式リリースされても、その後のリリースで大幅な変更が加わるかもしれません。長期的なプロジェクトではまだ使わないほうがよさそうです。

https://gdal.org/en/latest/programs/index.html

gdal コマンドを試すには

この記事を書いている時点では GDAL 3.11 はまだリリースされていませんが、4月17日にベータ版のリリースとテストの呼びかけが GDAL のメーリングリストに投稿されていました。GDAL 3.11 のリリースがいつになるかわからないのですが、「2週間後に RC 版が出る」と言っているので、大きな問題がなければもう数日すると RC 版が出るのだと思います。

https://lists.osgeo.org/pipermail/gdal-dev/2025-April/060458.html

上の投稿に書かれているように、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 が用意されているので、それを読んで勘所を掴んでいきたいと思います。

https://gdal.org/en/latest/programs/migration_guide_to_gdal_cli.html

gdalinfo / ogrinfo

gdalinfo / ogrinfo 相当なのは info サブコマンドです。migration guide ではgdal raster infogdal vector info を使い分けていますが、gdal infoでラスタデータもベクタデータもどっちも扱えます。

gdal info --format=text data.tif
gdal info --format=text data.gpkg

ちなみに、--format=text が指定されていますが、フォーマットには textjson があり、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 --helpgdal 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

gdalwarpogr2ogr では変換先の 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 もしくは gdalbuildvrtgdal_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

続きを書きました:
https://zenn.dev/mierune/articles/61d7d4d05ab58d

MIERUNEのZennブログ

Discussion