Sélection d'entités à l'aide d'une expression avec PyQGIS


13

Comment puis-je sélectionner des entités avec PyQGIS à l'aide d'une expression?

J'ai essayé d'utiliser un QgsExpressionmais la méthode select ne le prend pas:

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

Est-ce possible et si oui, comment faire?

Réponses:


24

Suivez ces étapes:

  1. Obtenez la référence de la couche:

    cLayer = iface.mapCanvas().currentLayer()

  2. Obtenez un FeatureIterator à partir d'une expression:

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

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Construisez une liste d'ID de fonction à partir du résultat obtenu en 2:

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

  4. Sélectionnez les fonctionnalités avec les identifiants obtenus en 3 .:

    cLayer.setSelectedFeatures( ids )


REMARQUE: Si vous souhaitez définir une expression avec une valeur de chaîne , vous devez ajouter des guillemets à cette valeur, de cette manière:

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

Si la valeur de votre chaîne provient d'une variable, vous pouvez le faire:

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

Comment dire "\"ogc_fid\"=482 AND name=\"hello world\""? Ici, il est indiqué que ce n'est pas disponible en python: qgis.org/api/… . Peut-être connaissez-vous un moyen de contourner cette limitation?
Jenia Ivanov

2
Gardez à l'esprit que les noms de champ doivent être entre guillemets doubles, les valeurs de chaîne entre guillemets simples et les nombres n'ont pas besoin de guillemets. Dans votre exemple: "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW, le lien que vous avez inclus dans votre commentaire indique en fait que l'attribut statique BinaryOperatorTextn'est pas disponible dans les liaisons Python, mais les opérateurs fonctionnent QgsExpression, même s'ils sont utilisés via des liaisons Python.
Germán Carrillo

@ GermánCarrillo J'utilise votre méthode ci-dessus mais je n'arrive pas à la renvoyer de valeurs, malgré le fait d'avoir copié et collé une valeur connue à rechercher. La colonne contient des chaînes, j'ai donc utilisé expr = QgsExpression("\"police_ref\" = 'P0580996'"). J'ai essayé d'ajouter un caractère de rupture au terme de recherche (pour les guillemets simples) mais cela ne fait aucune différence. Fait intéressant, si j'ouvre la table attributaire que j'interroge et que j'utilise le générateur d'expressions là-bas, il fait une sélection si la police_ref que j'utilise comme exemple se trouve dans la toute première ligne, mais pas autrement
Alex

@ GermánCarrillo désolé, peu importe, je ne suis pas sûr de ce que j'ai fait différemment mais je peux le faire pour sélectionner des fonctionnalités maintenant! Pour les autres lecteurs, vous n'avez pas besoin d'un caractère de rupture pour les guillemets simples
Alex

6

Cela a fonctionné pour moi sur la console QGIS Python

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

Bienvenue dans GIS SE. En tant que nouvel utilisateur, veuillez faire le Tour . La réponse existante (et acceptée) est beaucoup plus complète. Comment cela améliore-t-il cela? Généralement, le moyen de gagner des points de réputation est de répondre à des questions sans réponse , mais une nouvelle réponse complète à une question de trois ans serait la bienvenue si elle résout spécifiquement un problème avec la solution précédente (auquel cas, le problème doit certainement être mentionné) .
Vince

2

Il suffit de le tester dans l'interface graphique: "Select by Expression". Si cela fonctionne, vous pouvez le coller dans votre code Python entouré de guillemets doubles "".

exp = QgsExpression("ogc_fid=482")

Si vous comparez à une chaîne, vous pouvez ajouter un guillemet simple ''.

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

C'est le même principe en python, cela peut faire la différence entre les guillemets doubles et les guillemets simples.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.