趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

PythonでのGeoPackage取り扱い入門

スポンサーリンク

 

 

 

GISデータ形式として主流になりつつあるGeoPackageについて、Pythonでの取り扱う方法に関するメモです。

a



GeoPackageとは(Copilot)

  • オープンフォーマット: 地理空間情報を格納するためのオープンスタンダードです。
  • SQLiteデータベース: データはSQLiteデータベースコンテナに格納されています。
  • ベクターとラスターデータ: ベクターデータ、ラスターデータ、属性データを1つのファイルに統合できます。
  • GISアプリケーション間の互換性: 異なるGISアプリケーション間でのデータ交換に適しています。
  • オフラインマッピング: モバイルデバイスでのオフラインマッピングに利用可能です。
  • QGISでの利用: QGISなどのGISソフトウェアで直接読み込み、使用が可能です。
  • データの作成、編集、共有が容易: 新規のGeoPackageファイルの作成や既存データのエクスポートが可能です。
  • スタイルの保存: スタイル情報をファイル内に保存し、データと一緒に読み込めます。
  • OGCによる開発: Open Geospatial Consortium (OGC)によって開発された標準です。

参考資料

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

github.com


以上、PythonでのGeoPackageの取り扱う方法について簡単にまとめました。 記事のリクエスト等ございましたら、お問い合わせフォームまでお願いいたします。