Fiona: obtenez chaque étendue de fonctionnalité (limites)

8

Je cherchais dans Fiona pour obtenir pour chaque fonctionnalité son étendue mais je n'ai pas trouvé comment.

J'ai essayé trop loin de faire quelque chose comme ci-dessous

import fiona

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

Je m'attendais à obtenir une méthode pour cela au niveau variable f. Après quelques lectures de documentation, j'ai vu que f est un pur enregistrement python. Donc, à la fin, comment avec Fiona puis-je obtenir l'étendue (ou la boîte englobante) de chaque géométrie d'entité?

PS: Je connais déjà la pure solution python GDAL / OGR donc j'attends une solution Fiona s'il vous plait

ThomasG77
la source
Je serais vraiment intéressé à voir la solution python OGR. Je passe en revue la documentation, et il semble que les étendues pour les couches et les fonctionnalités soient traitées différemment dans OGR.
midfield99

Réponses:

14

Je le ferais comme ça:

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
la source
Juste au cas où ce n'est pas évident: l'approche ci-dessus fonctionne pour GeoJSON désérialisé en général et n'est pas limitée à une utilisation avec Fiona.
sgillies
J'ai fait un léger changement pour utiliser le json d'ESRI et cela a également résolu l'un de mes problèmes. Merci!
CMPalmer
11

Vous devez utiliser la fonction shapede Shapely :

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)
gène
la source
J'ai accepté la réponse de @sgillies car aucune dépendance à la bibliothèque mais j'apprécie également votre réponse. Merci
ThomasG77
C'est le cas de Thomas, mais voilà, ce n'est tout simplement pas implicite!
Hairy