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.


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)

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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.