W jaki sposób sprawdzać, czy wybrana jest funkcja podczas iteracji po warstwie wektorowej za pomocą pyqgis?

10

Czy podczas iteracji po warstwie wektorowej przy użyciu następującego kodu (w skrócie z przykładu w książce kucharskiej pyqgis ) istnieje sposób, aby sprawdzić, czy wybrano funkcję?

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

Alternatywnie mogę utworzyć listę wybranych funkcji przy użyciu vlayer.selectedFeatures(), ale mam nadzieję, że istnieje sposób na sprawdzenie każdej z nich bezpośrednio.

Cyrus
źródło

Odpowiedzi:

8

Wydaje się, że nie ma sposobu bezpośredniego znalezienia warstwy rodzicielskiej obiektu cechy lub tego, czy jest on wybrany z metody w klasie QgsFeature.

Podobnym podejściem vlayer.selectedFeatures()jest sprawdzenie, czy feat.id()jest w vlayer.selectedFeaturesIds(). QgsFeatureIds nie są unikatowymi wartościami w porównaniu z innymi warstwami wektorowymi, tylko w obrębie własnej warstwy.

Alternatywnie możesz zacząć od vlayer.selectedFeatures()tych funkcji i iterować je zamiast wszystkich funkcji dostawcy.

Jeszcze innym podejściem jest początkowe zebranie zestawów (lub list) wybranych i niewybranych identyfikatorów funkcji dla danej warstwy wektorowej:

# 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

Nie mogę znaleźć pojedynczego wezwania do pobrania odwołania do wszystkich funkcji (lub identyfikatorów) dla warstwy wektorowej (tj. Nadal muszę używać QgsVectorLayer.select()i iterować QgsVectorLayer.nextFeature()).

Edycja : zaktualizowany kod, aby odzwierciedlić QgsVectorLaer może obsługiwać wybrane połączenia (nie trzeba bezpośrednio kontaktować się z dostawcą) i nie psuje faktycznych wybranych funkcji w obszarze roboczym mapy, które wymagałyby setSelectedFeatures()aktualizacji.

Edycja 2 : po zbudowaniu zestawów identyfikatorów funkcji możesz iterować nad nimi i QgsVectorLayer.featureAtId(featid)uzyskiwać dostęp do funkcji.

dakcarto
źródło
Podejrzewałem, że może tak być, ale bardzo dziękuję za pomocne sugestie.
Cyrus,