フィオナ:各フィーチャの範囲(境界)を取得する


8

フィオナで各機能の範囲を調べるために探していましたが、方法がわかりませんでした。

私は以下のようなことをするために遠くまで努力しました

import fiona

with fiona.open('countries/ne_10m_admin_0_countries.shp', 'r') as source:
    for f in source:
        geom = f['geometry']
        print geom

このためのメソッドをf変数レベルで取得することを期待していました。ドキュメントを読んだ後、fが純粋なpythonレコードであることがわかりました。最後に、Fionaを使用して各フィーチャジオメトリの範囲(または境界ボックス)を取得するにはどうすればよいですか?

PS:私はすでに純粋なGDAL / OGR Pythonソリューションを知っているので、Fionaソリューションを期待してください


私はOGR pythonソリューションに本当に興味があります。私はドキュメントを調べていますが、レイヤーとフィーチャのエクステントがOGRでは異なる方法で処理されているようです。
midfield99

回答:


14

私はこのようにします:

def explode(coords):
    """Explode a GeoJSON geometry's coordinates object and yield coordinate tuples.
    As long as the input is conforming, the type of the geometry doesn't matter."""
    for e in coords:
        if isinstance(e, (float, int, long)):
            yield coords
            break
        else:
            for f in explode(e):
                yield f

def bbox(f):
    x, y = zip(*list(explode(f['geometry']['coordinates'])))
    return min(x), min(y), max(x), max(y)

上記のアプローチは一般に、逆シリアル化されたGeoJSONで機能し、Fionaでの使用に限定されません。
sgillies 14年

ESRIのjsonを使用するように少し変更を加えたところ、問題も解決しました。ありがとう!
CMPalmer 2016

11

あなたは、関数を使用する必要があるshape格好の良いを

from shapely.geometry import shape
c = fiona.open("ne_10m_admin_0_countries.shp")
# first record
country = c.next()
print "country name :",country['properties']['NAME']
country name : Aruba
# shape(country['geometry']) -> shapely geometry
print "bounds:", shape(country['geometry']).bounds
bounds: (-70.062408006999874, 12.417669989000046, -69.876820441999939, 12.632147528000104)

libsに依存しないため、@ sgilliesの回答を受け入れましたが、あなたの回答にも感謝します。ありがとう
ThomasG77 14年

それはトーマスをします、しかしあなたが行く、それは単に暗黙的ではありません!
毛深い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.