¿Filtrar características basadas en sus atributos usando Python?

16

¿Cómo obtener características por sus atributos (similar a Iqueryfilter en arcobjects) en Qgis usando python? En lugar de obtener todas las funciones y filtrarlas manualmente, ¿hay alguna opción para usar la cláusula where para filtrarlas?

Ejemplo: tengo un nombre de campo llamado 'Condados'. Tiene más de cincuenta mil funciones. Es decir, no es posible obtener todas las funciones y filtrarlas debido a su tiempo. Así que puedo consultarlo usando iqueryfilter.whereclause = 'Counties = Norwich' en arcobjects. Lo mismo que necesito en PyQgis.

    
pregunta venkat 20.04.2013 - 06:48

4 respuestas

12

El motor de expresión de QGIS puede hacer esto usando el método QgsFeatureRequest.setFilterExpression( unicode ) (Desde QGIS 2.2)

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

A partir de QGIS 2.10, incluso es posible que el filtrado de esa manera le brinde un rendimiento adicional sobre otros tipos de filtrado (como las implementaciones de python).

Básicamente, esto se aplica si se cumplen las siguientes tres condiciones:

  • Está utilizando una capa con el proveedor de postgis En este momento (2.16), mucho más que el proveedor de postgis implementa esto (spatialite, ogr, oracle ...).
  • Su expresión no es demasiado complicada (se admiten cosas como > , = , IN , NOT NULL ...
  • Has habilitado esta función en Configuración > Opciones > Fuentes de datos > Manejo de fuente de datos > Ejecutar expresión en el lado del servidor postgres
  • El beneficio de rendimiento es óptimo con índices apropiados en las tablas de base de datos

Con QGIS 3.0, incluso es posible hacerlo simplemente

features = l.getFeatures('"Counties" = \'Norwicth\'')
    
respondido por el Matthias Kuhn 21.10.2013 - 09:32
1

Esta publicación , que podría considerarse una respuesta a una pregunta duplicada, detalla cómo recuperar todos los atributos de una capa. El autor describe el proceso que está buscando como filtrar los datos manualmente una vez que se devuelven. Es una referencia bastante completa y su enlace realmente debería ayudarlo.

    
respondido por el Tom 20.04.2013 - 07:09
1

Al usar una consulta SQL también es posible con ogr . Podría ejecutar este código, por ejemplo, en la consola de Python de QGIS o en una secuencia de comandos independiente.
Ejemplo :

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'
    
respondido por el Curlew 21.10.2013 - 11:04
0

La especificación de los filtros SQL aún no se admite mediante la API de QGIS a partir de la versión 1.9.

Según entiendo de este artículo de la lista de correo , soporte para "SQL del proveedor nativo" solo estaría en una versión futura.

    
respondido por el vinayan 22.05.2013 - 14:03

Lea otras preguntas en las etiquetas