Ketika iterasi di atas layer vektor dengan pyqgis, bagaimana cara saya mengecek apakah fitur dipilih?

10

Sementara iterasi di atas layer vektor menggunakan kode berikut (dihidupkan dari contoh di buku masak pyqgis ), apakah ada cara untuk memeriksa apakah fitur dipilih?

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())

Atau, saya bisa membuat daftar fitur yang dipilih menggunakan vlayer.selectedFeatures(), tapi saya berharap ada cara untuk memeriksa setiap fitur secara langsung.

Cyrus
sumber

Jawaban:

8

Tampaknya tidak ada cara untuk secara langsung menemukan lapisan induk objek fitur atau apakah itu dipilih dari metode di kelas QgsFeature.

Pendekatan serupa vlayer.selectedFeatures()adalah untuk menguji apakah feat.id()ada di vlayer.selectedFeaturesIds(). QgsFeatureIds bukan nilai unik dibandingkan dengan layer vektor lainnya, hanya di dalam layer mereka sendiri.

Atau, Anda bisa mulai dengan vlayer.selectedFeatures()dan beralih ke fitur-fitur itu, alih-alih semua fitur penyedia.

Namun pendekatan lain adalah awalnya mengumpulkan set (atau daftar) id fitur yang dipilih dan tidak terpilih untuk lapisan vektor yang diberikan:

# 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

Saya sepertinya tidak dapat menemukan satu panggilan untuk mengambil referensi ke semua fitur (atau id) untuk layer vektor (yaitu masih harus menggunakan QgsVectorLayer.select()dan beralih dengan QgsVectorLayer.nextFeature()).

Sunting : kode yang diperbarui untuk mencerminkan QgsVectorLaer dapat menangani panggilan pilih (tidak perlu mendapatkan penyedia secara langsung), dan tidak mengacaukan fitur yang dipilih sebenarnya dalam kanvas peta, yang perlu setSelectedFeatures()diperbarui.

Sunting 2 : setelah membuat set id fitur, Anda dapat mengulanginya dan menggunakannya QgsVectorLayer.featureAtId(featid)untuk mengakses fitur.

dakcarto
sumber
Saya menduga itu mungkin terjadi, tetapi terima kasih banyak atas saran yang bermanfaat.
Cyrus