Pyqgis ile bir vektör katmanı üzerinde yineleme yaparken, bir özelliğin seçili olup olmadığını nasıl kontrol edebilirim?


10

Aşağıdaki kodu ( pyqgis yemek kitabındaki örnekten yazılan ) kullanarak bir vektör katmanı üzerinde yineleme yaparken , bir özelliğin seçilip seçilmediğini kontrol etmenin bir yolu var mı?

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

Alternatif olarak, kullanarak seçilen özelliklerin bir listesini oluşturabilirim vlayer.selectedFeatures(), ancak her bir özelliği doğrudan kontrol etmenin bir yolu olduğunu umuyorum.

Yanıtlar:


8

Bir özellik nesnesinin üst katmanını veya QgsFeature sınıfındaki bir yöntemden seçilip seçilmediğini doğrudan bulmanın bir yolu yoktur.

Benzer bir yaklaşım , içinde vlayer.selectedFeatures()olup olmadığını test feat.id()etmektir vlayer.selectedFeaturesIds(). QgsFeatureIds, diğer vektör katmanlarıyla karşılaştırıldığında yalnızca kendi katmanları içinde benzersiz değerler değildir.

Alternatif olarak, vlayer.selectedFeatures()sağlayıcının tüm özellikleri yerine bu özelliklerle başlayabilir ve bu özellikleri tekrarlayabilirsiniz.

Yine başka bir yaklaşım, başlangıçta belirli bir vektör katmanı için seçilen ve seçilmemiş özellik kimliklerinin kümelerini (veya listelerini) toplamaktır:

# 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

Bir vektör katmanı için tüm özelliklere (veya kimliklere) bir referans almak için tek bir çağrı bulamıyorum (yani hala kullanmak QgsVectorLayer.select()ve tekrarlamak zorunda QgsVectorLayer.nextFeature()).

Düzenleme : QgsVectorLaer'ı yansıtacak şekilde güncellenmiş kod, seçili çağrıyı (doğrudan sağlayıcı almanıza gerek yoktur) işleyebilir ve harita tuvalinde setSelectedFeatures()güncellenmesi gereken gerçek seçilen özellikleri bozmaz .

Düzenleme 2 : Özellik kimliği kümelerini oluşturduktan sonra, bunları yineleyebilir QgsVectorLayer.featureAtId(featid)ve özelliğe erişmek için kullanabilirsiniz .


Bunun olabileceğinden şüphelendim, ancak yararlı öneriler için çok teşekkürler.
Cyrus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.