Wie wähle ich Features mit einem Ausdruck mit pyqgis aus?


11

Wie kann ich Features mit pyqgis mithilfe eines Ausdrucks auswählen?

Ich habe versucht, eine QgsExpression zu verwenden, aber die select-Methode akzeptiert sie nicht:

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

Ist es möglich und wenn ja, wie mache ich das?

Antworten:


23

Folge diesen Schritten:

  1. Holen Sie sich die Ebenenreferenz:

    cLayer = iface.mapCanvas().currentLayer()

  2. Holen Sie sich einen featureIterator aus einem Ausdruck:

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

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Erstellen Sie eine Liste der Feature-IDs aus dem Ergebnis in 2.:

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

  4. Wählen Sie Features mit den in 3 erhaltenen IDs aus:

    cLayer.setSelectedFeatures( ids )


HINWEIS: Wenn Sie einen Ausdruck mit einem Zeichenfolgenwert festlegen möchten , müssen Sie diesem Wert auf folgende Weise Anführungszeichen hinzufügen:

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

Wenn Ihr Zeichenfolgenwert von einer Variablen stammt, können Sie Folgendes tun:

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

Wie kann ich sagen "\"ogc_fid\"=482 AND name=\"hello world\""? Hier heißt es, dass dies in Python nicht verfügbar ist: qgis.org/api/… . Vielleicht kennen Sie einen Weg, um diese Einschränkung zu umgehen?
Jenia Ivanov

2
Beachten Sie, dass Feldnamen in doppelte Anführungszeichen, Zeichenfolgenwerte in einfache Anführungszeichen und Zahlen keine Anführungszeichen benötigen. In Ihrem Beispiel : "\"ogc_fid\"=482 AND \"name\"='hello world'". Übrigens besagt der Link, den Sie in Ihren Kommentar aufgenommen haben, dass das statische Attribut BinaryOperatorTextin Python-Bindungen nicht verfügbar ist, aber Operatoren funktionieren QgsExpressionauch dann, wenn sie über Python-Bindungen verwendet werden.
Germán Carrillo

@ GermánCarrillo Ich verwende Ihre obige Methode, kann sie jedoch nicht dazu bringen, Werte zurückzugeben, obwohl ich einen bekannten Wert kopiert und eingefügt habe, nach dem gesucht werden soll. Die Spalte enthält Zeichenfolgen, also habe ich verwendet expr = QgsExpression("\"police_ref\" = 'P0580996'"). Ich habe versucht, dem Suchbegriff ein Unterbrechungszeichen hinzuzufügen (für einfache Anführungszeichen), aber es macht keinen Unterschied. Interessanterweise trifft es eine Auswahl, wenn ich die Attributtabelle öffne, die ich abfrage, und dort den Ausdrucksgenerator verwende, wenn sich die von mir als Beispiel verwendete Polizeiref in der allerersten Zeile befindet, aber nicht anders
Alex

@ GermánCarrillo Entschuldigung, egal, ich bin mir nicht sicher, was ich anders gemacht habe, aber ich kann es jetzt dazu bringen, Funktionen auszuwählen! Für andere, die lesen, brauchen Sie kein Unterbrechungszeichen für die einfachen Anführungszeichen
Alex

3

Dies funktionierte für mich auf der QGIS Python Console

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

Willkommen bei der GIS SE. Nehmen Sie als neuer Benutzer an der Tour teil . Die bestehende (und akzeptierte) Antwort ist weitaus vollständiger. Wie verbessert sich das? Im Allgemeinen besteht die Möglichkeit, Reputationspunkte zu sammeln, darin, unbeantwortete Fragen zu beantworten. Eine neue vollständige Antwort auf eine drei Jahre alte Frage wäre jedoch zu begrüßen, wenn sie speziell ein Problem mit der vorherigen Lösung anspricht (in diesem Fall sollte das Problem auf jeden Fall erwähnt werden). .
Vince

1

Sie müssen es nur in der GUI-Oberfläche testen: "Select by Expression". Wenn es funktioniert, können Sie es in Ihren Python-Code einfügen, der von doppelten Anführungszeichen "" umgeben ist.

exp = QgsExpression("ogc_fid=482")

Wenn Sie mit einer Zeichenfolge vergleichen, können Sie ein einfaches Anführungszeichen '' hinzufügen.

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

Es ist das gleiche Prinzip in Python, es kann den Unterschied zwischen doppeltem und einfachem Anführungszeichen machen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.