GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Fionaを使ってみよう

本日はFionaを使ってみようと思います。先日、以下エントリーでShapelyを紹介しましたが、Fionaも同じようにGIS関係で有名なPythonライブラリです。

www.gis-py.com

Fionaとは

Fionaはデータの読み書きに特化したシンプルなライブラリです。逆に言うと、他のことはできないと考えてください。ただし、Shapelyやpyprojなどと連携できますので、必要に応じて相互補完することができます。

pyprojに関しては以下エントリーで紹介していますので、ぜひ読んでみてください。
www.gis-py.com

特徴

  1. データの読み書きに特化
  2. データをGeoJsonのように扱う

GeoJsonについては以下エントリーでも紹介していますので、興味がある方は読んでみてください。
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])

このような形でデータを取得できました。
f:id:sanvarie:20181026091437p:plain

f:id:sanvarie:20181026091517p:plain

next()を使うことによって次のデータを読み込むことができます。

next(c)

f:id:sanvarie:20181026092626p:plain

また、以下のように特定の要素を取得することができます。

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

f:id:sanvarie:20181026091929p:plain

import fiona
c = fiona.open(r'D:\gis-py\library\fiona\japan/japan_ver80.shp', 'r')
c.crs

f:id:sanvarie:20181026092001p:plain

データの書き込み

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)

データが書き換わったことが分かりました。
f:id:sanvarie:20181026095232p:plain

新規レコードの追加
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))

レコードが追加されたことが分かりました。変なメッセージが出てしまっていますが、気にしないて下さい。
f:id:sanvarie:20181026095601p:plain

新しい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))

レコードが追加されたことが分かりました。
f:id:sanvarie:20181026104012p:plain

Shapeファイルが作られていますね。
f:id:sanvarie:20181026104047p:plain


以上です。なかなか面白いコンセプトのライブラリだと思います。Jsonのように扱うことができるのでとても使いやすいですし、Shapelyなどと一緒に使えばさらに強力になり、鬼に金棒ですね。