Fiona: Holen Sie sich jede Feature-Ausdehnung (Grenzen)

8

Ich habe in Fiona nach dem Umfang jedes Features gesucht, aber ich habe nicht herausgefunden, wie.

Ich habe zu weit versucht, so etwas wie unten zu tun

import fiona

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

Ich hatte erwartet, eine Methode dafür auf der Ebene der Variablen f zu bekommen. Nach einigem Lesen der Dokumentation habe ich gesehen, dass f ein reiner Python-Datensatz ist. Wie kann ich am Ende mit Fiona die Ausdehnung (oder den Begrenzungsrahmen) jeder Feature-Geometrie ermitteln?

PS: Ich kenne die reine GDAL / OGR-Python-Lösung bereits, daher erwarte ich bitte eine Fiona-Lösung

ThomasG77
quelle
Ich würde mich sehr für die OGR-Python-Lösung interessieren. Ich gehe die Dokumentation durch und es sieht so aus, als würden Extents für Layer und Features in OGR unterschiedlich behandelt.
Mittelfeld99

Antworten:

14

Ich würde es so machen:

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)
sgillies
quelle
Nur für den Fall, dass es nicht offensichtlich ist: Der obige Ansatz funktioniert im Allgemeinen für deserialisiertes GeoJSON und ist nicht auf die Verwendung mit Fiona beschränkt.
Sgillies
Ich habe eine kleine Änderung vorgenommen, um ESRIs JSON zu verwenden, und dies hat auch eines meiner Probleme gelöst. Vielen Dank!
CMPalmer
11

Sie müssen die Funktion shapevon Shapely verwenden :

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)
Gen
quelle
Ich habe die Antwort von @sgillies akzeptiert, weil keine lib-Abhängigkeit besteht, aber ich schätze auch Ihre Antwort. Danke
ThomasG77
Es tut Thomas, aber los geht's, es ist einfach nicht implizit!
Haarige