Quando si scorre su un livello vettoriale con pyqgis, come posso verificare se una funzione è selezionata?


10

Mentre si scorre su un livello vettoriale usando il seguente codice ( aggiornato dall'esempio nel ricettario di pyqgis ), c'è un modo per verificare se una funzione è selezionata?

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

In alternativa, potrei creare un elenco di funzionalità selezionate utilizzando vlayer.selectedFeatures(), ma spero che ci sia un modo per controllare direttamente ogni funzione.

Risposte:


8

Non sembra esserci un modo per trovare direttamente il livello padre di un oggetto funzione o se è selezionato da un metodo nella classe QgsFeature.

Un approccio simile vlayer.selectedFeatures()è testare se feat.id()è presente vlayer.selectedFeaturesIds(). QgsFeatureIds non sono valori univoci rispetto ad altri livelli vettoriali, ma solo all'interno del proprio livello.

In alternativa, è possibile iniziare vlayer.selectedFeatures()e scorrere su tali funzionalità, anziché su tutte le funzionalità del provider.

Ancora un altro approccio è quello di raccogliere inizialmente insiemi (o elenchi) di ID di funzionalità selezionati e non selezionati per un dato livello vettoriale:

# 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

Non riesco a trovare una singola chiamata per recuperare un riferimento a tutte le funzionalità (o ID) per un livello vettoriale (cioè devo ancora usare QgsVectorLayer.select()e iterare con QgsVectorLayer.nextFeature()).

Modifica : il codice aggiornato per riflettere QgsVectorLaer può gestire la chiamata selezionata (non è necessario ottenere direttamente il provider) e non confonde le effettive funzioni selezionate nell'area della mappa, che richiederebbe setSelectedFeatures()l'aggiornamento.

Modifica 2 : dopo aver creato i set di ID funzionalità, è possibile scorrere su di essi e utilizzare QgsVectorLayer.featureAtId(featid)per accedere alla funzione.


Sospettavo che potesse essere il caso, ma grazie mille per i suggerimenti utili.
Ciro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.