Filtern von Features anhand ihrer Attribute mit Python?

16

Wie erhalte ich Features anhand ihrer Attribute (ähnlich wie bei Iqueryfilter in arcobjects) in Qgis mit Python? Gibt es eine Option, die WHERE-Klausel zum Herausfiltern zu verwenden, anstatt alle Features manuell abzurufen und zu filtern?

Beispiel: Ich habe einen Feldnamen namens 'Counties'. Es verfügt über mehr als fünfzigtausend Features. Aufgrund des Zeitaufwands ist es nicht möglich, alle Features abzurufen und zu filtern. So kann ich es mit iqueryfilter.whereclause = 'Counties = Norwich' in arcobjects abfragen. Ähnliches brauche ich in PyQgis.

venkat
quelle
1
@ NathanW ja du bist richtig. Ich brauche nur die Daten mit einer Abfrage aus der Ebene zurückzugeben. Könnten Sie mir bitte ein Beispiel für Pyqgis geben?
Venkat
@ NathanW Hallo, ich habe es verstanden. Es funktioniert wie eine Definitionsabfrage in arcgis. siehe dieses Beispiel. t = outputLayer.setSubsetString ('UniqID =' + inputFeat.attribute ("UniqID"). toPyObject ()) if t == True: outputProvider = outputLayer.dataProvider () print outputProvider.featureCount () dh es wird nur die Abfrage zurückgegeben zufriedene Daten
venkat
@venkat Wo in QGIS stellen Sie die Abfrage? Vielen Dank.
ianbroad

Antworten:

12

Die QGIS-Expression-Engine kann dies mit der QgsFeatureRequest.setFilterExpression( unicode )Methode (seit QGIS 2.2) ausführen.

request = QgsFeatureRequest().setFilterExpression( u'"Counties" = \'Norwich\'' )
it = l.getFeatures( request )

Ab QGIS 2.10 ist es sogar möglich, dass das Filtern auf diese Weise gegenüber anderen Filtertypen (z. B. Python-Implementierungen) zusätzliche Leistung bringt.

Grundsätzlich gilt dies, wenn die folgenden drei Bedingungen erfüllt sind:

  • Sie verwenden eine Ebene mit dem Postgis-Anbieter Zur Zeit (2.16) implementieren weit mehr als nur Postgis-Anbieter dies (Spatialite, Ogr, Orakel ...).
  • Ihr Ausdruck ist nicht allzu kompliziert (Dinge wie >, =, IN, NOT NULL... werden unterstützt)
  • Sie haben diese Funktion unter " Einstellungen"> "Optionen"> "Datenquellen"> "Datenquellenbehandlung"> "Ausdruck auf Postgres-Serverseite ausführen" aktiviert
  • Der Leistungsvorteil ist bei entsprechenden Indizes für die Datenbanktabellen optimal

Mit QGIS 3.0 ist das sogar einfach möglich

features = l.getFeatures('"Counties" = \'Norwicth\'')
Matthias Kuhn
quelle
1

In diesem Beitrag, der als Antwort auf eine doppelte Frage betrachtet werden kann, wird beschrieben, wie alle Attribute aus einer Ebene abgerufen werden. Der Autor beschreibt den gewünschten Vorgang als manuelles Filtern der Daten, sobald diese zurückgegeben werden. Es ist eine ziemlich vollständige Referenz und ihr Link sollte Ihnen wirklich helfen.

Tom
quelle
2
Dies ist keine doppelte Frage. Ich möchte nicht alle Attribute von einer Ebene abrufen. Filtern Sie es zuerst und dann möchte ich die Eigenschaften holen, die unter die Filterkriterien kommen. dh die Leistung ist viel besser.
Venkat
1

Durch die Verwendung einer SQL-Abfrage ist dies auch problemlos mit möglich ogr. Sie können diesen Code beispielsweise in der QGIS-Python-Konsole oder in einem eigenständigen Skript ausführen.
Beispiel :

from osgeo import ogr

path = "path to your shapefile.shp"
ID = "FieldID" # For instance 'Countries' 
datasource = ogr.Open(str(path)) # your datasource

layer = datasource.GetLayer(0) # Import layer 0 --> only works with shapefiles
layerName = str( layer.GetName() )# Save the Layersname first

# Do the sql query
# Selects all features from a layer datasource where Field Countries is equal to 'Germany'
layers = datasource.ExecuteSQL("SELECT * FROM %s WHERE %s = '%s'" % (layerName, ID, 'Germany') )
res = []
for i in range(0,layers.GetFeatureCount()):
   f = layers.GetFeature(i)
   g = f.GetGeometryRef()
   res.append(g.Area()) 

# res now contains the measured area of each feature where the attribute ID has the value 'Germany'
Brachvogel
quelle
0

Das Angeben von SQL-Filtern wird mit der QGIS-API ab Version 1.9 noch nicht unterstützt.

Wie ich aus diesem Mailinglisten-Artikel verstehe , wird die Unterstützung für "SQL des systemeigenen Anbieters" nur in einer zukünftigen Version angeboten.

Vinayan
quelle