18 votos

Cómo obtener las características en función de sus atributos usando Python?

Cómo Obtener las características por sus atributos (similar a Iqueryfilter en arcobjects) en Qgis usando python? En lugar de obtener todas las características y el filtro manualmente, hay alguna opción para utilizar whereclause para filtrar hacia fuera?

Ejemplo: tengo un nombre de campo llamado "Condados". Tiene más de cincuenta mil de características.yo.e no es posible recuperar todas las características y filtro porque de mucho tiempo. Así que puedo realizar una consulta mediante iqueryfilter.whereclause = 'Condados = Norwich' en arcobjects. Similar cosa que necesito en PyQgis. por favor, hágamelo saber si su factible

15voto

Michael Puntos 11

El QGIS expresión motor es capaz de hacer esto mediante la QgsFeatureRequest.setFilterExpression( unicode ) método (Desde QGIS 2.2)

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

Comenzando con QGIS 2.10 incluso es posible que el filtrado de tal manera le dará algo más de rendimiento respecto a otros tipos de filtrado (como python implementaciones).

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

  • Usted está utilizando una capa con el proveedor de postgis
  • Su expresión no es demasiado complicado (por ejemplo >, =, IN, NOT NULL ... son compatibles)
  • Usted tiene activada esta función en Ajustes > Opciones > Orígenes de Datos > Origen de Datos Manejo de > Ejecutar expresión en postgres en el lado del servidor
  • La ventaja de rendimiento es óptimo con índices adecuados en las tablas de base de datos

1voto

Rihan Meij Puntos 362

Mediante una consulta sql es fácilmente posible con ogr. Puede ejecutar este código, por ejemplo, en el QGIS consola de python o 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'

1voto

timhortons Puntos 690

Este post - que podría ser considerado como una respuesta a una pregunta duplicada de los detalles de cómo obtener todos los atributos de una capa. El autor describe el proceso que se está buscando, como el filtrado de los datos de forma manual una vez que se devuelve. Es bastante completa de referencia y su vínculo realmente debería ayudar.

0voto

kjo Puntos 197

La especificación SQL filtros todavía no se admite el uso de QGIS API de la versión 1.9.

Como yo lo entiendo de esta lista de correo del artículo, el apoyo de los "nativos del proveedor de SQL" sólo sería en un futuro de liberación.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X