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

ThomasG77
sumber
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)
sgillies
sumber
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)
gen
sumber
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