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


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)

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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.