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


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)

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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.