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.