Fiona: obtenha a extensão de cada recurso (limites)


8

Eu estava procurando em Fiona a extensão de cada recurso, mas não encontrei como.

Eu tentei muito longe para fazer algo como abaixo

import fiona

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

Eu esperava obter um método para isso no nível da variável f. Depois de ler a documentação, vi que f é um registro python puro. Então, no final, como com Fiona posso obter a extensão (ou caixa delimitadora) de cada geometria de recurso?

PS: Eu já conheço a solução python GDAL / OGR pura, então espero uma solução Fiona, por favor


Eu estaria realmente interessado em ver a solução python OGR. Estou examinando a documentação e parece que extensões para camadas e recursos são tratadas de maneira diferente no OGR.
midfield99

Respostas:


14

Eu faria assim:

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)

Caso isso não seja óbvio: a abordagem acima funciona geralmente para o GeoJSON desserializado e não se limita ao uso com Fiona.
sgillies

Fiz uma pequena alteração para usar o json da ESRI e isso também resolveu um dos meus problemas. Obrigado!
CMPalmer

11

Você precisa usar a função 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)

Aceitei a resposta @sgillies porque não há dependência de lib, mas também aprecio sua resposta. Graças
ThomasG77

É Thomas, mas lá está, não é implícito!
23617 Hairy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.