Selezione delle funzioni usando un'espressione con PyQGIS


13

Come posso selezionare le funzionalità con PyQGIS usando un'espressione?

Ho provato a usare un QgsExpressionma il metodo select non lo accetta:

exp = QgsExpression("'ogc_fid' = 482")
cLayer = canvas.currentLayer()
cLayer.select(exp)

È possibile e, in caso affermativo, come posso farlo?

Risposte:


24

Segui questi passi:

  1. Ottieni il riferimento di livello:

    cLayer = iface.mapCanvas().currentLayer()

  2. Ottieni un FeatureIterator da un'espressione:

    expr = QgsExpression( "\"ogc_fid\"=482" )

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Crea un elenco di ID funzione dal risultato ottenuto in 2 .:

    ids = [i.id() for i in it]

  4. Seleziona le funzionalità con gli ID ottenuti in 3 .:

    cLayer.setSelectedFeatures( ids )


NOTA: se si desidera impostare un'espressione con un valore stringa , è necessario aggiungere virgolette a tale valore, in questo modo:

expr = QgsExpression( " \"name\" = 'my string' " )

Se il valore della stringa proviene da una variabile, puoi farlo:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )

Come faccio a dire "\"ogc_fid\"=482 AND name=\"hello world\""? Qui dice che questo non è disponibile in Python: qgis.org/api/… . Forse conosci un modo per aggirare questa limitazione?
Jenia Ivanov,

2
Tieni presente che i nomi dei campi devono essere racchiusi tra virgolette doppie, i valori di stringa tra virgolette singole e che i numeri non richiedono virgolette. Nel tuo esempio: "\"ogc_fid\"=482 AND \"name\"='hello world'". A proposito, il link che hai incluso nel tuo commento sta effettivamente affermando che l'attributo statico BinaryOperatorTextnon è disponibile nei bind Python, ma gli operatori funzionano QgsExpressionanche se sono usati attraverso i bind Python.
Germán Carrillo,

@ GermánCarrillo Sto usando il tuo metodo sopra ma non riesco a farlo per restituire alcun valore, nonostante abbia copiato e incollato un valore noto da cercare. La colonna contiene stringhe, quindi l'ho usata expr = QgsExpression("\"police_ref\" = 'P0580996'"). Ho provato ad aggiungere un carattere di interruzione al termine di ricerca (per le virgolette singole) ma non fa differenza. È interessante notare che, se apro la tabella degli attributi che sto interrogando e utilizzo lì il generatore di espressioni, effettua una selezione se il police_ref che uso come esempio è nella prima riga, ma non altrimenti
Alex

@ GermánCarrillo mi dispiace non importa, non sono sicuro di cosa ho fatto in modo diverso, ma ora riesco a selezionarlo! Per gli altri che leggono, non è necessario un carattere di interruzione per le virgolette singole
Alex

6

Questo ha funzionato per me su QGIS Python Console

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))

Benvenuti in GIS SE. Come nuovo utente, partecipa al tour . La risposta esistente (e accettata) è molto più completa. In che modo questo migliora? In generale, il modo per guadagnare punti reputazione è rispondere a domande senza risposta, ma una nuova risposta completa a una domanda di tre anni sarebbe benvenuta se affronta in modo specifico un problema con la soluzione precedente (nel qual caso, il problema dovrebbe certamente essere menzionato) .
Vince il

2

Devi solo testarlo nell'interfaccia della GUI: "Seleziona per espressione". Se funziona, puoi incollarlo nel tuo codice Python racchiuso tra virgolette "".

exp = QgsExpression("ogc_fid=482")

Se si confronta con una stringa, è possibile aggiungere una virgoletta singola ''.

exp = QgsExpression("ogc_fid='482'")

È lo stesso principio in Python, può fare la differenza tra virgolette doppie e virgolette singole.

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.