Fiona: obtén cada extensión de característica (límites)

8

Estaba buscando en Fiona para obtener el alcance de cada función, pero no encontré cómo.

He intentado lejos para hacer algo como a continuación

import fiona

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

Esperaba obtener un método para esto en el nivel variable f. Después de leer un poco de documentación, he visto que f es un registro de Python puro. Entonces, al final, ¿cómo con Fiona puedo obtener la extensión (o cuadro delimitador) de cada geometría de entidad?

PD: Ya conozco la solución Python GDAL / OGR pura, así que espero una solución Fiona, por favor.

ThomasG77
fuente
Estaría realmente interesado en ver la solución de Python de OGR. Estoy revisando la documentación, y parece que las extensiones para las capas y las características se manejan de manera diferente en OGR.
midfield99

Respuestas:

14

Lo haría así:

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
fuente
Por si acaso no es obvio: el enfoque anterior funciona para GeoJSON deserializado en general y no se limita al uso con Fiona.
sgillies
Hice un ligero cambio para usar el json de ESRI y esto también resolvió uno de mis problemas. ¡Gracias!
CMPalmer el
11

Necesita usar la función 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)
gene
fuente
He aceptado la respuesta @sgillies porque no hay dependencia de la biblioteca, pero también agradezco su respuesta. Gracias
ThomasG77
Lo hace Thomas, pero ahí lo tienes, ¡no está implícito!
Peludo