Wie überprüfe ich beim Durchlaufen einer Vektorebene mit pyqgis, ob ein Feature ausgewählt ist?

10

Gibt es eine Möglichkeit, beim Durchlaufen einer Vektorebene mit dem folgenden Code (zusammengefasst aus dem Beispiel im Pyqgis-Kochbuch ) zu überprüfen, ob eine Funktion ausgewählt ist?

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

Alternativ könnte ich eine Liste ausgewählter Features mit erstellen vlayer.selectedFeatures(), aber ich hoffe, dass es eine Möglichkeit gibt, jedes Feature direkt zu überprüfen.

Cyrus
quelle

Antworten:

8

Es scheint keine Möglichkeit zu geben, die übergeordnete Ebene eines Feature-Objekts direkt zu finden oder ob sie aus einer Methode in der QgsFeature-Klasse ausgewählt wurde.

Ein ähnlicher Ansatz vlayer.selectedFeatures()besteht darin, zu testen, ob das in feat.id()ist vlayer.selectedFeaturesIds(). QgsFeatureIds sind keine eindeutigen Werte im Vergleich zu anderen Vektorebenen, sondern nur innerhalb ihrer eigenen Ebene.

Alternativ können Sie mit vlayer.selectedFeatures()diesen Funktionen beginnen und diese durchlaufen, anstatt mit allen Funktionen des Anbieters.

Ein weiterer Ansatz besteht darin, zunächst Sätze (oder Listen) ausgewählter und nicht ausgewählter Feature-IDs für eine bestimmte Vektorebene zu erfassen:

# 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

Ich kann anscheinend keinen einzigen Aufruf zum Abrufen eines Verweises auf alle Features (oder IDs) für eine Vektorebene finden (dh muss noch verwendet QgsVectorLayer.select()und iteriert werden QgsVectorLayer.nextFeature()).

Bearbeiten : Der aktualisierte Code, der QgsVectorLaer widerspiegelt, kann ausgewählte Anrufe verarbeiten (es ist nicht erforderlich, den Anbieter direkt zu kontaktieren) und bringt die tatsächlich ausgewählten Funktionen im Kartenbereich nicht durcheinander, die setSelectedFeatures()aktualisiert werden müssten .

Bearbeiten 2 : Nachdem Sie Feature-ID-Sätze erstellt haben, können Sie diese durchlaufen und QgsVectorLayer.featureAtId(featid)für den Zugriff auf das Feature verwenden.

Dakcarto
quelle
Ich vermutete, dass dies der Fall sein könnte, aber vielen Dank für die hilfreichen Vorschläge.
Cyrus