Fiona: nhận từng phạm vi tính năng (giới hạn)


8

Tôi đã tìm kiếm ở Fiona để tìm hiểu từng tính năng nhưng tôi không tìm thấy cách nào.

Tôi đã cố gắng để làm điều gì đó như dưới đây

import fiona

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

Tôi đã mong đợi để có được một phương thức cho điều này ở cấp độ biến f. Sau khi đọc một số tài liệu, tôi đã thấy rằng f là một bản ghi trăn thuần túy. Vì vậy, cuối cùng, làm thế nào với Fiona tôi có thể nhận được phạm vi (hoặc hộp giới hạn) của mỗi hình dạng tính năng?

PS: Tôi đã biết giải pháp python / OGR thuần túy vì vậy tôi mong đợi một giải pháp Fiona


Tôi sẽ thực sự thích thú khi thấy giải pháp trăn OGR. Tôi đang xem qua tài liệu này và có vẻ như các phạm vi cho các lớp và các tính năng được xử lý khác nhau trong OGR.
tiền

Câu trả lời:


14

Tôi sẽ làm như thế này:

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)

Chỉ trong trường hợp không rõ ràng: cách tiếp cận ở trên hoạt động đối với GeoJSON đã khử lưu huỳnh nói chung và không giới hạn sử dụng với Fiona.
sgillies

Tôi đã thực hiện một thay đổi nhỏ để sử dụng json của ESRI và điều này cũng giải quyết được một trong những vấn đề của tôi. Cảm ơn!
CMPalmer

11

Bạn cần sử dụng chức năng shapecủa 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)

Tôi đã chấp nhận câu trả lời @sgillies vì ​​không phụ thuộc lib nhưng tôi cũng đánh giá cao câu trả lời của bạn. Cảm ơn
ThomasG77

Nó làm Thomas, nhưng có bạn đi, nó chỉ không ngầm!
Lông
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.