Fiona: dapatkan setiap tingkat fitur (batas)


8

Saya mencari di Fiona untuk mendapatkan masing-masing fitur tetapi saya tidak menemukan caranya.

Saya sudah mencoba jauh untuk melakukan sesuatu seperti di bawah ini

import fiona

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

Saya mengharapkan untuk mendapatkan metode untuk ini di tingkat variabel f. Setelah membaca beberapa dokumentasi, saya telah melihat bahwa f adalah catatan python murni. Jadi pada akhirnya, bagaimana dengan Fiona saya bisa mendapatkan tingkat (atau kotak pembatas) dari masing-masing geometri fitur?

PS: Saya sudah tahu solusi python GDAL / OGR murni jadi saya harap solusi Fiona


Saya akan sangat tertarik melihat solusi python OGR. Saya akan membaca dokumentasi, dan sepertinya lapisan untuk lapisan dan fitur ditangani secara berbeda di OGR.
lini

Jawaban:


14

Saya akan melakukannya seperti ini:

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)

Hanya dalam kasus itu tidak jelas: pendekatan di atas bekerja untuk GeoJSON terurai secara umum dan tidak terbatas untuk digunakan dengan Fiona.
sgillies

Saya membuat sedikit perubahan untuk menggunakan json ESRI dan ini memecahkan salah satu masalah saya juga. Terima kasih!
CMPalmer

11

Anda perlu menggunakan fungsi shapedari 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)

Saya telah menerima jawaban @sgillies karena tidak ada ketergantungan lib tetapi saya menghargai juga jawaban Anda. Terima kasih
ThomasG77

Memang Thomas, tapi begitulah, itu tidak implisit!
Berbulu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.