"Seleziona per attributo" in QGIS usando Python?


16

C'è un modo per usare la funzione "Seleziona per attributo" in QGIS usando un comando python? Nel mio plugin l'utente dovrebbe inserire un valore tramite una GUI e questo valore dovrebbe essere usato in una funzione che seleziona tutte le caratteristiche che hanno questo attributo. Il nome della colonna è fisso nel codice, la funzione deve cercare solo il valore corretto.

Nella mia soluzione attuale la funzione collega QGIS a un database PostgreSQL ed esegue un'istruzione SQL. Questo crea una tabella dal risultato e la tabella viene visualizzata come Shapefile in QGIS.

In linea di principio sarebbe sufficiente evidenziare le caratteristiche e non creare un nuovo Shapefile della selezione. L'uso della funzione "Seleziona per attributo" salta anche la connessione al database non necessaria.

Esiste un modo per utilizzare la funzione "Seleziona per attributo" in Python in modo che le funzioni siano evidenziate? Usando la funzione in QGIS tutte le funzionalità che non corrispondono alla query sono temporaneamente cancellate e andrebbero bene.


1
Queste risposte richiedono un aggiornamento di qgis 3.
MonsterMushroom

Risposte:


8

Sì. Puoi ottenere tutti gli attributi attraverso i binding di Python e implementare filtri aggiuntivi nel tuo plugin. Vedi questo estratto del Coobook di PyQGIS per il fatiscente e alcuni esempi. Escluderesti quindi qualsiasi risultato non corrispondente dal dizionario restituito.

Per quanto riguarda la visualizzazione, probabilmente dovrai comunque creare un altro livello, poiché select()non ha argomenti adeguati. È possibile utilizzare un livello di memoria per evitare di dover creare file fisici (altro su quello nel ricettario).

modificare:

In realtà, è possibile utilizzare selectedFeaturesIds()con setSelectedFeatures(ids)per modificare la selezione nel sottoinsieme creato. Citando direttamente l'implementazione:

/** Get a copy of the user-selected features */  
QList<QgsFeature> selectedFeatures();

/** Return reference to identifiers of selected features */
const QSet<qint64> &selectedFeaturesIds() const;

/** Change selection to the new set of features */
void setSelectedFeatures(const QSet<qint64> &ids);

Che peccato! Ho pensato che fosse possibile in QGIS, perché è possibile anche in ArcGIS usando arcpy. Tuttavia, grazie per la tua risposta!
userHH

Forse c'è un modo; Solo che non lo so. Concedi un po 'di tempo agli altri utenti del sito, forse qualcuno lo fa.
lynxlynxlynx,

Penso che debba essere possibile. In QGIS vengono visualizzate tutte le funzionalità corrispondenti alla selezione, tutte le altre funzionalità vengono temporaneamente cancellate.
userHH

Lo è, l'ho trovato. QGIS fa questo nel core, ma sembra che esponga abbastanza dell'interfaccia per regolare correttamente la selezione.
lynxlynxlynx,

Mi puoi inviare un link?
userHH

9

A partire da QGIS 2.2 questo è supportato in modo molto naturale. Può essere fatto tramite il motore di espressione QGIS usando il QgsFeatureRequest.setFilterExpression( unicode )metodo

# The important part: get the feature iterator with an expression
it = l.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"Counties" = \'Norwich\'' ) )
# Set the selection
l.setSelectedFeatures( [ f.id() for f in it ] )

La cosa migliore: se hai una versione QGIS recente (2.10 e successive), questa verrà filtrata direttamente nel database in modo molto più performante rispetto ad altre soluzioni pur essendo molto leggibile.


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.