"Nach Attributen auswählen" in QGIS mit Python?


16

Gibt es eine Möglichkeit, die Funktion "Auswahl nach Attribut" in QGIS mit einem Python-Befehl zu verwenden? In meinem Plugin sollte der Benutzer einen Wert über eine GUI eingeben und dieser Wert sollte in einer Funktion verwendet werden, die alle Funktionen auswählt, die dieses Attribut aufweisen. Der Spaltenname ist im Code festgelegt, die Funktion sollte nur nach dem richtigen Wert suchen.

In meiner aktuellen Lösung verbindet die Funktion QGIS mit einer PostgreSQL-Datenbank und führt eine SQL-Anweisung aus. Dies erstellt eine Tabelle aus dem Ergebnis und die Tabelle wird in QGIS als Shapefile dargestellt.

Grundsätzlich genügt es, die Features zu markieren und kein neues Shapefile der Auswahl zu erstellen. Die Verwendung der Funktion "Auswahl nach Attribut" würde auch die unnötige Datenbankverbindung überspringen.

Gibt es eine Möglichkeit, die Funktion "Nach Attributen auswählen" in Python zu verwenden, damit die Features hervorgehoben werden? Wenn Sie die Funktion in QGIS verwenden, werden alle Funktionen, die nicht mit der Abfrage übereinstimmen, vorübergehend ausgeblendet, was ebenfalls in Ordnung wäre.


1
Diese Antworten benötigen ein Update von qgis 3.
MonsterMushroom

Antworten:


8

Ja. Sie können alle Attribute über die Python-Bindungen abrufen und zusätzliche Filter in Ihrem eigenen Plugin implementieren. In diesem PyQGIS Coobook-Auszug finden Sie einige Beispiele. Sie würden dann nur nicht übereinstimmende Ergebnisse aus dem zurückgegebenen Wörterbuch ausschließen.

In Bezug auf die Visualisierung müssen Sie wahrscheinlich noch eine weitere Ebene erstellen, da select()keine passenden Argumente vorhanden sind. Sie können eine Speicherebene verwenden, um zu vermeiden, dass physische Dateien erstellt werden müssen (mehr dazu im Kochbuch).

bearbeiten:

Tatsächlich können Sie selectedFeaturesIds()mit setSelectedFeatures(ids)die Auswahl in die von Ihnen erstellte Teilmenge ändern. Die Implementierung direkt zitieren:

/** 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);

Was für eine Schande! Ich dachte, dass dies in QGIS möglich ist, da es auch in ArcGIS mit arcpy möglich ist. Trotzdem danke für deine Antwort!
userHH

Vielleicht gibt es einen Weg; Ich weiß es einfach nicht. Geben Sie anderen Benutzern der Website etwas Zeit - vielleicht tut es jemand.
Lynxlynxlynx

Ich denke es muss möglich sein. In QGIS werden alle mit der Auswahl übereinstimmenden Features visualisiert, alle anderen Features werden temporär ausgeblendet.
userHH

Es ist, ich habe es gefunden. QGIS macht dies im Kern, aber es sieht so aus, als ob es genug von der Oberfläche freigibt, um die Auswahl richtig anzupassen.
Lynxlynxlynx

Können Sie mir einen Link senden?
userHH

9

Ab QGIS 2.2 wird dies auf sehr natürliche Weise unterstützt. Dies kann mit der QgsFeatureRequest.setFilterExpression( unicode )Methode über die QGIS Expression Engine erfolgen .

# 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 ] )

Das Beste daran: Wenn Sie über eine aktuelle QGIS-Version (2.10 und höher) verfügen, wird diese direkt in der Datenbank gefiltert und ist so viel performanter als andere Lösungen, obwohl sie noch sehr gut lesbar ist.


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.