GISのデータ形式として主流になりつつあるGeoPackageについて、Pythonでの取り扱う方法に関するメモです。
- GeoPackageとは(Copilot)
- PythonでGeoPackageで取り扱うためのライブラリ
- サンプルデータ
- GeoPackageへの書き込み
- GeoPackageからの読み込み
- 参考サイト
- GitHub
GeoPackageとは(Copilot)
- オープンフォーマット: 地理空間情報を格納するためのオープンスタンダードです。
- SQLiteデータベース: データはSQLiteデータベースコンテナに格納されています。
- ベクターとラスターデータ: ベクターデータ、ラスターデータ、属性データを1つのファイルに統合できます。
- GISアプリケーション間の互換性: 異なるGISアプリケーション間でのデータ交換に適しています。
- オフラインマッピング: モバイルデバイスでのオフラインマッピングに利用可能です。
- QGISでの利用: QGISなどのGISソフトウェアで直接読み込み、使用が可能です。
- データの作成、編集、共有が容易: 新規のGeoPackageファイルの作成や既存データのエクスポートが可能です。
- スタイルの保存: スタイル情報をファイル内に保存し、データと一緒に読み込めます。
- OGCによる開発: Open Geospatial Consortium (OGC)によって開発された標準です。
参考資料
- Geopackageの基本的な使い方 #GIS - Qiita
- GeoPackageの使い方(ベクトルデータ編)
- シェープファイルやGeoJSONの代わりにGeopackageファイルを使用する必要があるのはなぜですか?
- OGCジオパッケージ(GPKG)
- OGC® GeoPackage Encoding Standard - with Corrigendum
- GPKG -- GeoPackage vector — GDAL documentation
PythonでGeoPackageで取り扱うためのライブラリ
基本的にはFionaを使いますが、必要なモジュールの大半がWrapされたGeoPandasを使うほうが扱いやすいと思うます。 ここでは、GeoPandasを使った方法を解説します。
サンプルデータ
以下に上げたデータを使用しています。
https://github.com/computational-sediment-hyd/python_geopackage/tree/main/sampledata
import numpy as np import pandas as pd import geopandas as gpd import fiona
print(gpd.__version__) print(fiona.__version__)
0.14.4
1.9.6
- サンプルデータ:ポイントデータ
gdf1 = gpd.read_file('sampledata/83031000Tsurumi.geojson')
gdf1.head()
観測項目 | 水系名 | 河川名 | 観測所名 | 所在地 | 観測所記号 | lon | lat | 最新の零点高 | geometry | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 水位流量 | 鶴見川 | 鶴見川 | 鶴見川河口 | 神奈川県横浜市鶴見区末広町 | 303061283310010 | 139.684167 | 35.479444 | T.P. 0.000m | POINT (139.68417 35.47944) |
1 | 水位流量 | 鶴見川 | 鶴見川 | 芦穂橋 | 神奈川県横浜市鶴見区鶴見中央 | 303061283310020 | 139.685556 | 35.506111 | T.P. 0.000m | POINT (139.68556 35.50611) |
2 | 水位流量 | 鶴見川 | 鶴見川 | 末吉橋 | 神奈川県川崎市幸区小倉 | 303061283310030 | 139.666111 | 35.534444 | T.P. 0.000m | POINT (139.66611 35.53444) |
3 | 水位流量 | 鶴見川 | 鶴見川 | 綱島 | 神奈川県横浜市港北区綱島東 | 303061283310040 | 139.635556 | 35.534444 | T.P. 0.000m | POINT (139.63556 35.53444) |
4 | 水位流量 | 鶴見川 | 鶴見川 | 太尾 | 神奈川県横浜市港北区太尾町 | 303061283310050 | 139.618056 | 35.531389 | T.P. 0.000m | POINT (139.61806 35.53139) |
GeoPackageへの書き込み
- layer名を指定し、任意のGeoPackageファイルに書き込む。
- layer名はユニークであること。存在する場合は上書きされる。
- GeoPackageファイル名は存在する場合は上書き、無い場合は作成される。
out = gdf1.to_file("tmp.gpkg", layer='Tsurumi', driver="GPKG")
- 同様に別データを追加しておく。
gdf2 = gpd.read_file('sampledata/83032000Sagami.geojson') out = gdf1.to_file("tmp.gpkg", layer='Sagami', driver="GPKG") del out
GeoPackageからの読み込み
layer名リストを取得
この作業だけはGeopandasだけでは無理でFionaが必要。
lics = fiona.listlayers('tmp.gpkg') print(lics)
['Tsurumi', 'Sagami']
layer名を指定して読み込み
gdf = gpd.read_file('tmp.gpkg', layer='Tsurumi')
gdf.head()
観測項目 | 水系名 | 河川名 | 観測所名 | 所在地 | 観測所記号 | lon | lat | 最新の零点高 | geometry | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 水位流量 | 鶴見川 | 鶴見川 | 鶴見川河口 | 神奈川県横浜市鶴見区末広町 | 303061283310010 | 139.684167 | 35.479444 | T.P. 0.000m | POINT (139.68417 35.47944) |
1 | 水位流量 | 鶴見川 | 鶴見川 | 芦穂橋 | 神奈川県横浜市鶴見区鶴見中央 | 303061283310020 | 139.685556 | 35.506111 | T.P. 0.000m | POINT (139.68556 35.50611) |
2 | 水位流量 | 鶴見川 | 鶴見川 | 末吉橋 | 神奈川県川崎市幸区小倉 | 303061283310030 | 139.666111 | 35.534444 | T.P. 0.000m | POINT (139.66611 35.53444) |
3 | 水位流量 | 鶴見川 | 鶴見川 | 綱島 | 神奈川県横浜市港北区綱島東 | 303061283310040 | 139.635556 | 35.534444 | T.P. 0.000m | POINT (139.63556 35.53444) |
4 | 水位流量 | 鶴見川 | 鶴見川 | 太尾 | 神奈川県横浜市港北区太尾町 | 303061283310050 | 139.618056 | 35.531389 | T.P. 0.000m | POINT (139.61806 35.53139) |
応用編:zip形式のGeoPackageファイルから直接読み込み
GeoPackageはファイルサイズが大きくなりがちなのでzip形式にすることも多いですが、Fiona, GeoPandasでは解凍なしで直接読み込み可能です。
lics = fiona.listlayers('zip://tmp.zip') print(lics)
['Tsurumi', 'Sagami']
gdf = gpd.read_file('zip://tmp.zip', layer='Tsurumi')
参考サイト
Reading and writing files — GeoPandas 1.0.1+0.g747d66e.dirty documentation
geopandas - Open GPKG embedded layers in python - Geographic Information Systems Stack Exchange
GitHub
以上、PythonでのGeoPackageの取り扱う方法について簡単にまとめました。 記事のリクエスト等ございましたら、お問い合わせフォームまでお願いいたします。
リンク