"Sélectionner par attribut" dans QGIS en utilisant python?

16

Existe-t-il un moyen d'utiliser la fonction "Sélectionner par attribut" dans QGIS en utilisant une commande python? Dans mon plugin, l'utilisateur doit entrer une valeur via une interface graphique et cette valeur doit être utilisée dans une fonction qui sélectionne toutes les fonctionnalités qui ont cet attribut. Le nom de la colonne est fixe dans le code, la fonction ne doit rechercher que la valeur correcte.

Dans ma solution actuelle, la fonction connecte QGIS à une base de données PostgreSQL et exécute une instruction SQL. Cela crée une table à partir du résultat et la table est visualisée comme Shapefile dans QGIS.

En principe, il suffirait de mettre en évidence les fonctionnalités et non de créer un nouveau Shapefile de la sélection. L'utilisation de la fonction "Sélectionner par attribut" ignorerait également la connexion de base de données inutile.

Existe-t-il un moyen d'utiliser la fonction "Sélectionner par attribut" en python pour que les fonctionnalités soient mises en évidence? En utilisant la fonction dans QGIS, toutes les fonctionnalités qui ne correspondent pas à la requête sont supprimées temporairement, ce qui serait bien aussi.

userHH
la source
1
Ces réponses nécessitent une mise à jour qgis 3.
MonsterMushroom

Réponses:

8

Oui. Vous pouvez obtenir tous les attributs via les liaisons python et implémenter un filtrage supplémentaire dans votre propre plugin. Voir cet extrait de CoQook PyQGIS pour le récapitulatif et quelques exemples. Vous excluriez alors tout résultat non correspondant du dictionnaire renvoyé.

En ce qui concerne la visualisation, vous devrez probablement encore créer une autre couche, car elle select()n'a pas d'arguments appropriés. Vous pouvez utiliser une couche mémoire pour éviter d'avoir à créer des fichiers physiques (plus à ce sujet dans le livre de recettes).

Éditer:

En fait, vous pouvez utiliser selectedFeaturesIds()avec setSelectedFeatures(ids)pour modifier la sélection dans le sous-ensemble que vous avez créé. Citant directement la mise en œuvre:

/** 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);
lynxlynxlynx
la source
Quel dommage! Je pensais que c'était possible dans QGIS, car c'est également possible dans ArcGIS en utilisant arcpy. Merci néanmoins pour votre réponse!
userHH
Il y a peut-être un moyen; Je ne le sais juste pas. Donnez du temps aux autres utilisateurs du site - peut-être que quelqu'un le fait.
lynxlynxlynx
Je pense que cela doit être possible. Dans QGIS, toutes les fonctionnalités sont visualisées qui correspondent à la sélection, toutes les autres fonctionnalités sont temporairement supprimées.
userHH
C'est, je l'ai trouvé. QGIS fait cela dans le noyau, mais il semble qu'il expose suffisamment l'interface pour ajuster correctement la sélection.
lynxlynxlynx
Peux-tu m'envoyer un lien?
userHH
9

À partir de QGIS 2.2, cela est pris en charge de manière très naturelle. Cela peut être fait via le moteur d'expression QGIS en utilisant la QgsFeatureRequest.setFilterExpression( unicode )méthode.

# 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 meilleure chose à ce sujet: si vous avez une version récente de QGIS (2.10 et ultérieure), celle-ci sera filtrée directement dans la base de données tellement plus performante que les autres solutions tout en étant très lisible.

Matthias Kuhn
la source