GeoPackageの使い方(ベクトルデータ編)
はじめに
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を実行しないといけないので諦めました。
それでも興味がある方は、以下を読み解いていただき私にも教えて欲しいです。
レイヤの削除方法
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ベクタ変換コマンドはこの辺りを参考に
コマンドは
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