👻

GeoPackageの使い方(ベクトルデータ編)

2021/12/09に公開

はじめに

GeoPackageでベクトルデータを扱う方法を調べてみました。

まずはGeoPackageがどんなものなのか知っておきましょう
・GeoPackageはSQLiteコンテナ。
・拡張子はgpkg。
・ベクタとラスタタイルを扱える。
・ファイルエンコーディングとしてセキュリティ機能はもっていない。

ほとんどSpatiaLiteですね。
ただし、PostGISやSpatiaLiteとは異なるWell-Known Binary(WKB)エンコーディングを使用していることは注意です。

用意しておくと便利なもの

  • GDAL
    データ変換で使います。
    こいつが肝です。
  • QGIS3.22
    データの確認に便利です。
    インストールするとGDALも入りますのでGDALのバージョンにこだわりが無ければこちらで。
  • spatialite-gui
    GeoPackageの中身を覗くのにあると便利です。
    名前の通りSpatialite用GUIツールですがGeoPackageでも利用できます。

GeoPackageの操作

サンプルデータを取得

GIS実習オープン教材の提供サイト(試験公開版)』で公開されているデータセットtokyo.zipを使わせていただきましょう。
こちらのライセンスは© GIS Open Educational Resources WG, CC BY-SA 4.0となっております。

ダウンロードしたら解凍します。

ファイルがいろいろと入っているかと思いますが判りやすいところでtokyo_23ku_jgd2011_9.shpをQGISに載せるとこんな感じに表示されます。

レイヤの作成方法

gpkgファイルに新規レイヤを追加するのは、基本的にQGISなどのアプリケーションから作成するか、別形式(Shapefileなど)のデータから変換するかになります。
直にレイヤを作成することは、できないわけじゃないですが、空間インデックスやなんやかんやを正しく設定するのは多数のSQLを実行しないといけないので諦めました。

それでも興味がある方は、以下を読み解いていただき私にも教えて欲しいです。
https://www.geopackage.org/spec121/

レイヤの削除方法

gpkgファイルから対象レイヤを削除してみましょう。
レイヤテーブルはgpkg_contentsやgpkg_metadata_reference等々に関連データを持っていますので対象テーブルをSQLでDropしてしまうと残骸が残ってしまうためお勧めしません。
ogrinfoを通してDropすることで関連データも削除することができます。

コマンドは
ogrinfo -sql "DROP TABLE <対象レイヤテーブル>" <gpkgファイル>

> ogrinfo -sql "DROP TABLE tokyo_23ku_jgd2011_9" tokyo.gpkg
INFO: Open of `tokyo.gpkg'
      using driver `GPKG' successful.

spatialite_guiをリフレッシュしてgpkg_contentsの中身を覗いてみます。

綺麗に削除できました。
レイヤの追加も削除と同じように簡単に出来たらいいのになぁ。

Shapefileの変換方法

ShapefileファイルをGeoPackageに変換します。

gdalのGeoPackageベクタ変換コマンドはこの辺りを参考に
https://gdal.org/drivers/vector/gpkg.html#examples
https://gdal.org/programs/ogr2ogr.html

コマンドは
ogr2ogr -f <フォーマット指定> <変換ファイル名> <データファイル>

ogr2ogr -f GPKG tokyo.gpkg subway_9kei.shp

指定したtokyo.gpkgファイルが生成されました。
さっそくspatialite_guiで覗いてみましょう。

subway_9keiというテーブルに格納されていることが判ります。

よく使うコマンドオプション

テーブル名を指定

テーブル名を指定したい場合は-nlnオプションを指定します。

ogr2ogr -f GPKG -nln subway_pl tokyo.gpkg subway_9kei.shp

SRS(空間参照系)を指定

SRSを指定したい場合は-a_srsオプションを指定します。
異なるSRSに再投影したい場合は-t_srsオプションを指定します。

ogr2ogr -f GPKG -t_srs EPSG:4326 tokyo.gpkg subway_9kei.shp

ジオメトリタイプを指定

ジオメトリタイプを指定したい場合は-nltオプションを指定します。

ogr2ogr -f GPKG -nlt LINESTRING tokyo.gpkg subway_9kei.shp

レイヤを追加

既存のgpkgファイルにレイヤを追加する場合は-updateオプションを指定します。

ogr2ogr -update -f GPKG tokyo.gpkg subway_9kei.shp

レイヤを更新

既存レイヤを更新する場合は-overwriteオプションを指定します。
DropしてCreateし直すような挙動かな?

ogr2ogr -overwrite -f GPKG tokyo.gpkg subway_9kei.shp

データを追記

既存レイヤにデータを追記する場合は-appendオプションを指定します。

ogr2ogr -append -f GPKG tokyo.gpkg subway_9kei.shp

よくある警告

例えばtokyo_23ku_jgd2011_9.shpを登録しようとすると以下のようにWarningが出ます。

> ogr2ogr -update -f GPKG tokyo.gpkg tokyo_23ku_jgd2011_9.shp

Warning 1: A geometry of type MULTIPOLYGON is inserted into layer tokyo_23ku_jgd2011_9 of geometry type POLYGON, which is not normally allowed by the GeoPackage specification, but the driver will however do it. To create a conformant GeoPackage, if using ogr2ogr, the -nlt option can be used to override the layer geometry type. This warning will no longer be emitted for this combination of layer and feature geometry type.

超訳すると

ジオメトリタイプがMULTIPOLYGONのデータをPOLYGONのレイヤに挿入したよ。
GeoPackage仕様では許可されていませんよ。
-nltオプションを使ってジオメトリタイプを定義してね。

という感じでしょうか。

spatialite_guiをリフレッシュしてみると

tokyo_23ku_jgd2011_9は登録できています。
ジオメトリタイプを確認

SELECT ROWID, *
FROM gpkg_geometry_columns
ORDER BY ROWID
rowid table_name column_name geometry_type_name srs_id z m
1 subway_9kei geom LINESTRING 6677 0 0
2 tokyo_23ku_jgd2011_9 geom POLYGON 6677 0 0

tokyo_23ku_jgd2011_9にはマルチポリゴンのデータが含まれていますが、ジオメトリタイプがポリゴンに定義されています。
この状態でもQGISでは特に問題なく閲覧・編集できるようですが非推奨状態ですね。

それでは-nltオプションを使って正しく入れなおしてみます。
レイヤを更新するため-overwriteも付けます。

> ogr2ogr -overwrite -nlt MULTIPOLYGON -f GPKG tokyo.gpkg tokyo_23ku_jgd2011_9.shp

今度はWarningなく取り込むことができました。

ジオメトリタイプを確認

SELECT ROWID, *
FROM gpkg_geometry_columns
ORDER BY ROWID
rowid table_name column_name geometry_type_name srs_id z m
1 subway_9kei geom LINESTRING 6677 0 0
2 tokyo_23ku_jgd2011_9 geom MULTIPOLYGON 6677 0 0

今度はtokyo_23ku_jgd2011_9がマルチポリゴンに定義されていますね。

ディレクトリ内のShapefileをまとめて生成

フォルダ内のShapefileを一括変換することができます。
取り込みたいShapefileがたくさんある場合は便利ですね。

コマンドは
ogr2ogr -f <フォーマット指定> <変換ファイル名> <対象フォルダ>

> ogr2ogr -f GPKG tokyo2.gpkg ./
Warning 1: A geometry of type MULTILINESTRING is inserted into layer river_9kei of geometry type LINESTRING, which is not normally allowed by the GeoPackage specification, but the driver will however do it. To create a conformant GeoPackage, if using ogr2ogr, the -nlt option can be used to override the layer geometry type. This warning will no longer be emitted for this combination of layer and feature geometry type.
Warning 1: A geometry of type MULTIPOLYGON is inserted into layer tokyo_23ku_jgd2011_9 of geometry type POLYGON, which is not normally allowed by the GeoPackage specification, but the driver will however do it. To create a conformant GeoPackage, if using ogr2ogr, the -nlt option can be used to override the layer geometry type. This warning will no longer be emitted for this combination of layer and feature geometry type.

ジオメトリタイプを確認

SELECT ROWID, *
FROM gpkg_geometry_columns
ORDER BY ROWID
rowid table_name column_name geometry_type_name srs_id z m
1 cvs_jgd2011_9 geom POINT 6677 0 0
2 post_office_9kei geom POINT 6677 0 0
3 rail_9kei geom LINESTRING 6677 0 0
4 river_9kei geom LINESTRING 6677 0 0
5 station_9kei geom POINT 6677 0 0
6 subway_9kei geom LINESTRING 6677 0 0
7 tokyo_23ku_jgd2011_9 geom POLYGON 6677 0 0

マルチ系のデータが含まれている場合はジオメトリタイプが正確ではないので非推奨ですね。

そういう場合は-nlt PROMOTE_TO_MULTIを付けて全部マルチ系にしちゃいましょう。

> ogr2ogr -overwrite -f GPKG -nlt PROMOTE_TO_MULTI tokyo2.gpkg ./
rowid table_name column_name geometry_type_name srs_id z m
1 cvs_jgd2011_9 geom MULTIPOINT 6677 0 0
2 post_office_9kei geom MULTIPOINT 6677 0 0
3 rail_9kei geom MULTILINESTRING 6677 0 0
4 river_9kei geom MULTILINESTRING 6677 0 0
5 station_9kei geom MULTIPOINT 6677 0 0
6 subway_9kei geom MULTILINESTRING 6677 0 0
7 tokyo_23ku_jgd2011_9 geom MULTIPOLYGON 6677 0 0

大は小を兼ねるで問題ないことが多いです。
少なくともPOLYGONにMULTIPOLYGONが入っているよりは全然マシですね。

QGISで確認

ブラウザパネルのGeoPackageから新規接続でgpkgファイルを選択して
表示したいテーブルをレイヤパネルにD&Dします。

ちゃんと表示されていますね。

Discussion