📚

GDAL 3.13 で gdal コマンドに追加された新機能一覧

に公開

GDAL 3.13 がもうすぐリリースです(これを書いている時点で RC2 が出ています)。3.12 が出たのがついこないだだと思っていたら、あっという間ですね...。前回のまとめはこれでした。

https://zenn.dev/mierune/articles/198eff1c3b8f90

gdal vector combine

ベクターデータの地物をコレクションにします。複数の POLYGONMULTIPOLYGON に、様々な型の地物であれば GEOMETRYCOLLECTION に、みたいなことです。これは PostGIS でいう ST_Collect です(ただし、ネストした地物をどう扱うかが違うらしい? 詳しくはリンク先の Description を参照)。

何も指定しないと全地物がひとつのコレクションにまとめられますが、--group-by を指定すると、その属性値に基づいてグループ化されます。例えば以下のようにすれば、country という属性値が同じ地物がまとめられます。

gdal vector combine --group-by country input.gpkg output.gpkg

ちなみに、その他の属性値は、グループ内ですべて同じ値だったらそれが保持され、違っていたら null になる、という挙動のようです。結局このあたりの挙動を細かくコントロールするためには SQL を書きたくなりそう(つまり GDAL じゃなくて DuckDB とかでやりたい...)なので、使いどころが難しそうな感じもします。

gdal vector concave-hull / gdal vector convex-hull

その名の通り、凹包、凸包をつくります。↑のドキュメントに載っていましたが、例えば、こんな感じで pipeline で使うと、ある属性値を持つ地物の凸包を求めることができるらしいです。おしゃれですね。

gdal vector pipeline ! \
    read ne_10m_populated_places.shp ! \
    buffer 0.1 ! \
    combine --group-by ADM0_A3 ! \
    convex-hull ! \
    write country_city_hulls.gpkg

gdal vector create

ベクタデータに空の新規レイヤーを追加します。pipeline の中で、最初にこれでレイヤーを追加しておいて、そこに地物を追加していく、みたいな使い方を想定しているっぽいです。

gdal vector create can be used as the first step of a pipeline.

あまりピンと来ていませんが、たしかにあらかじめレイヤーやスキーマが定義されていないとできない操作もあるんだろうな、という気はします。

gdal vector dissolve

地物を結合します。結合の操作は、PostGIS で言うと地物の種類によって ST_Union とか ST_LineMerge とかいろいろありますが、gdal コマンドのこれはいろいろ兼ねているみたいです。↑のドキュメントには

  • 重複する頂点を取り除く
  • LINESTRING の交点にはノードを追加する
  • 重なり合ったポリゴンはひとつにまとめる
  • LINESTRING の場合は、まず連続する線分をつなぎ合わせるステップがある

とかいろいろ書かれています。いろいろ勝手にやってくれて便利そうな感じと、細かくコントロールするためにやっぱり SQL を使いたくなる予感と、どっちもあります。

以下はドキュメントに載っている pipeline での使用例です。やはり combine とのコンボがおしゃれですね。

gdal vector pipeline read countries.shp !
    combine --group-by CONTINENT ! \
    dissolve ! \
    write continents.shp

gdal vector export-schema

ベクタデータのスキーマを OGR_SCHEMA という GDAL 独自?の形式(中身は JSON です)でエクスポートします。使いどころがあまりよくわかりませんが、gdal vector create とかに渡すとか...?

gdal vector update

これは、説明が難しいですが、あるデータの属性値を別のデータの属性値で上書きします。gdal raster update のベクタデータ版です。

例えばこれがドキュメントに載っている例ですが、out.gpkg(名前が紛らわしいが、既存のデータ)の属性値を、in.gpkg のデータのうち identifier の値が一致するもので上書きします。SQL で言えば JOIN してる感じでしょうか。

gdal vector update --key identifier in.gpkg out.gpkg

gdal vector rename-layer

レイヤ名を変更します。--ascii で ASCII 文字のみの名前にしたりできるみたいです。他にも、使用禁止文字を指定したり、いろいろオプションがあります。

gdal vector sort

ベクタデータを空間的にソートします。--method でソートするアルゴリズムが指定できて、現時点ではhilbert(ヒルベルト曲線)、strtreeSTR-tree、GEOS が必要)の二つから選択できます。

これも pipeline のステップで使えるということで、Parquet のようにソートが重要なデータ形式で書き出したいときに便利なのかもです。

gdal dataset check

データの中身がエラーなく読めるかをチェックします。ただし、どの程度のチェックなのかはデータ形式によって異なり、このコマンドでエラーにならないからといって正しいデータとは限らないという点には注意が必要です。

gdal driver cog validate / gdal driver gpkg validate

データが COG や GeoPackage の仕様に従っているか検証します。これは、一般ユーザーよりも、こうしたデータフォーマットを扱うコードを書いている開発者にとって便利なものです。私も rusqlite-gpkg という GeoPackage を扱う Rust ライブラリを開発しているのですが、このコマンドのおかげで細かなミスを炙り出すことができました。

その他

他は読んでも私の知識ではあまり分からないのですが、めぼしいのはこのあたりでしょうか。

  • Zarr v3 のサポートの強化
  • E57 のドライバ(読み取りのみ)の追加
  • SAR Compensated Phase History Data (CPHD) のドライバ(読み取りのみ)の追加
  • JP2GROK(Grok という JPEG 2000 のドライバ)の追加[1]

あとは...、これですね...

AWS と Azure へのアツいメッセージ

https://github.com/OSGeo/gdal/pull/14313

難しいなあ、という気持ちになります。

脚注
  1. この Grok は X のあれとは無関係のものらしい。なお、JPEG-2000 のドライバは他にも複数ある(が、詳しくないので、GDAL が複数のドライバを持っているモチベーションがよくわかっていない) ↩︎

MIERUNEのZennブログ

Discussion