Khi lặp qua một lớp vectơ với pyqgis, làm cách nào để kiểm tra xem một tính năng có được chọn không?


10

Trong khi lặp qua một lớp vectơ bằng mã sau đây (được hè từ ví dụ trong sách nấu ăn pyqgis ), có cách nào để kiểm tra xem một tính năng có được chọn không?

provider = vlayer.dataProvider()
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
while provider.nextFeature(feat):
    geom = feat.geometry()
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        print "%d: %s" % (k, attr.toString())

Ngoài ra, tôi có thể tạo danh sách các tính năng được chọn bằng cách sử dụng vlayer.selectedFeatures(), nhưng tôi hy vọng có một cách để kiểm tra trực tiếp từng tính năng.

Câu trả lời:


8

Dường như không có cách nào để tìm thấy trực tiếp lớp cha của đối tượng tính năng hoặc liệu nó có được chọn từ một phương thức trong lớp QssFeature hay không.

Một cách tiếp cận tương tự vlayer.selectedFeatures()là để kiểm tra xem feat.id()có trong không vlayer.selectedFeaturesIds(). QssFeatureIds không phải là giá trị duy nhất so với các lớp vectơ khác, chỉ trong lớp riêng của chúng.

Ngoài ra, bạn có thể bắt đầu với vlayer.selectedFeatures()và lặp lại các tính năng đó, thay vì tất cả các tính năng của nhà cung cấp.

Tuy nhiên, một cách tiếp cận khác là thu thập ban đầu các tập hợp (hoặc danh sách) các id tính năng được chọn và không được chọn cho một lớp vectơ đã cho:

# previous relevant code

set_selids = set(vlayer.selectedFeaturesIds())
feat = QgsFeature()
vlayer.select([], QgsRectangle(), False)
set_allids = set()
while vlayer.nextFeature(feat):
    set_allids.add(feat.id())

set_notselids = set_allids - set_selids

print set_allids
print set_selids
print set_notselids

Tôi dường như không thể tìm thấy một cuộc gọi duy nhất để truy xuất một tham chiếu đến tất cả các tính năng (hoặc id) cho một lớp vectơ (tức là vẫn phải sử dụng QgsVectorLayer.select()và lặp lại với QgsVectorLayer.nextFeature()).

Chỉnh sửa : mã được cập nhật để phản ánh QssVectorLaer có thể xử lý cuộc gọi được chọn (không cần phải trực tiếp nhận nhà cung cấp) và không làm rối các tính năng được chọn thực tế trong khung vẽ bản đồ, cần setSelectedFeatures()phải cập nhật.

Chỉnh sửa 2 : sau khi xây dựng bộ id tính năng, bạn có thể lặp lại chúng và sử dụng QgsVectorLayer.featureAtId(featid)để truy cập tính năng.


Tôi nghi ngờ đó có thể là trường hợp, nhưng cảm ơn rất nhiều vì những gợi ý hữu ích.
Cyrus
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.