¿"Seleccionar por atributo" en QGIS usando python?

16

¿Hay alguna manera de usar la función "Seleccionar por atributo" en QGIS usando un comando python? En mi complemento, el usuario debe ingresar un valor a través de una GUI y este valor debe usarse en una función que selecciona todas las características que tienen este atributo. El nombre de la columna está fijado en el código, la función solo debe buscar el valor correcto.

En mi solución actual, la función conecta QGIS a una base de datos PostgreSQL y ejecuta una instrucción SQL. Esto crea una tabla a partir del resultado y la tabla se visualiza como Shapefile en QGIS.

En principio, sería suficiente resaltar las características y no crear un nuevo Shapefile de la selección. El uso de la función "Seleccionar por atributo" también omitiría la conexión innecesaria de la base de datos.

¿Hay alguna forma de usar la función "Seleccionar por atributo" en Python para que las características se resalten? Al usar la función en QGIS, todas las características que no coinciden con la consulta se borran temporalmente, lo que también estaría bien.

usuarioHH
fuente
1
Estas respuestas necesitan una actualización de qgis 3.
MonsterMushroom

Respuestas:

8

Si. Puede obtener todos los atributos a través de los enlaces de Python e implementar filtros adicionales en su propio complemento. Vea este extracto de PyQGIS Coobook para ver el resumen y algunos ejemplos. Entonces, simplemente excluiría cualquier resultado no coincidente del diccionario devuelto.

En cuanto a la visualización, es probable que aún tenga que crear otra capa, ya select()que no tiene argumentos adecuados. Puede usar una capa de memoria para evitar tener que crear archivos físicos (más sobre eso en el libro de cocina).

editar:

En realidad, puede usar selectedFeaturesIds()con setSelectedFeatures(ids)para cambiar la selección al subconjunto que creó. Citando la implementación directamente:

/** 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);
lynxlynxlynx
fuente
¡Qué pena! Pensé que era posible en QGIS, porque también es posible en ArcGIS usando arcpy. Sin embargo, gracias por tu respuesta!
userHH
Tal vez hay un camino; Simplemente no lo sé. Dele tiempo a otros usuarios del sitio, tal vez alguien lo haga.
lynxlynxlynx
Creo que debe ser posible. En QGIS, se visualizan todas las características que coinciden con la selección, todas las demás características se borran temporalmente.
userHH
Lo es, lo encontré. QGIS hace esto en el núcleo, pero parece que expone suficiente interfaz para ajustar la selección correctamente.
lynxlynxlynx
¿Me pueden enviar un enlace?
userHH
9

A partir de QGIS 2.2, esto es compatible de una manera muy natural. Se puede hacer a través del motor de expresión QGIS utilizando el QgsFeatureRequest.setFilterExpression( unicode )método

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

Lo mejor de todo: si tiene una versión reciente de QGIS (2.10 y posterior), se filtrará directamente en la base de datos con mucho más rendimiento que otras soluciones y seguirá siendo muy legible.

Matthias Kuhn
fuente