本日はFionaを使ってみようと思います。先日、以下エントリーでShapelyを紹介しましたが、Fionaも同じようにGIS関係で有名なPythonライブラリです。
Fionaとは
Fionaはデータの読み書きに特化したシンプルなライブラリです。逆に言うと、他のことはできないと考えてください。ただし、Shapelyやpyprojなどと連携できますので、必要に応じて相互補完することができます。
pyprojに関しては以下エントリーで紹介していますので、ぜひ読んでみてください。
www.gis-py.com
また、以下のエントリーでもFionaを紹介していますので、興味のある方はぜひ読んでみてください。
www.gis-py.com
サンプルデータ
以下エントリーで使用した、ESRIの日本地図を使ってみようと思います。
www.gis-py.com
サンプルコート
Shapeファイルを読み込んでその中の一つのフィーチャのプロパティを出力します。
データの読み込み
import fiona import pprint c = fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp', 'r') pprint.pprint(c[1])
このような形でデータを取得できました。
next()を使うことによって次のデータを読み込むことができます。
next(c)
また、以下のように特定の要素を取得することができます。
rec = next(c) rec['id'] rec['geometry']['type']
さらに、以下のようなデータも取得することができます。
import fiona c = fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp', 'r') c.driver
import fiona c = fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp', 'r') c.crs
データの書き込み
idを変更し、propertiesにCNTRY_NAMEという要素を追加します。
既存のデータの書き換え
import fiona import pprint with fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp') as c: rec = next(c) rec['id'] = '-1' rec['properties']['CNTRY_NAME'] = 'Gondor' pprint.pprint(rec)
データが書き換わったことが分かりました。
新規レコードの追加
import fiona with fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp') as c: rec = next(c) with fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp', 'a') as c: print(len(c)) c.write(rec) print(len(c))
レコードが追加されたことが分かりました。変なメッセージが出てしまっていますが、気にしないて下さい。
新しいShapeファイルの作成
japan_ver80.shpから一レコード抽出して新しいShapeファイルを作成します。
import fiona with fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp') as source: source_driver = source.driver source_crs = source.crs source_schema = source.schema rec = next(source) with fiona.open(r'D:\gis-py\library\fiona\japan/test.shp','w',driver=source_driver,crs=source_crs,schema=source_schema) as c: print(len(c)) c.write(rec) print(len(c))
レコードが追加されたことが分かりました。
Shapeファイルが作られていますね。
以上です。なかなか面白いコンセプトのライブラリだと思います。Jsonのように扱うことができるのでとても使いやすいですし、Shapelyなどと一緒に使えばさらに強力になり、鬼に金棒ですね。