Seleccionar características usando una expresión con PyQGIS

13

¿Cómo puedo seleccionar características con PyQGIS usando una expresión?

Intenté usar un QgsExpressionpero el método select no lo toma:

exp = QgsExpression("'ogc_fid' = 482")
cLayer = canvas.currentLayer()
cLayer.select(exp)

¿Es posible y, de ser así, cómo lo hago?

ustroetz
fuente

Respuestas:

24

Sigue estos pasos:

  1. Obtenga la referencia de capa:

    cLayer = iface.mapCanvas().currentLayer()

  2. Obtenga un FeatureIterator de una expresión:

    expr = QgsExpression( "\"ogc_fid\"=482" )

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Cree una lista de ID de características a partir del resultado obtenido en 2 .:

    ids = [i.id() for i in it]

  4. Seleccione características con los ID obtenidos en 3 .:

    cLayer.setSelectedFeatures( ids )


NOTA: Si desea establecer una expresión con un valor de cadena , debe agregar comillas a dicho valor, de esta manera:

expr = QgsExpression( " \"name\" = 'my string' " )

Si su valor de cadena proviene de una variable, puede hacer esto:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )
Germán Carrillo
fuente
¿Cómo puedo decir "\"ogc_fid\"=482 AND name=\"hello world\""? Aquí dice que esto no está disponible en python: qgis.org/api/… . ¿Quizás conoces una forma de sortear esta limitación?
Jenia Ivanov
2
Tenga en cuenta que los nombres de campo deben estar entre comillas dobles, los valores de cadena entre comillas simples y los números no necesitan comillas. En su ejemplo: "\"ogc_fid\"=482 AND \"name\"='hello world'". Por cierto, el enlace que incluiste en tu comentario en realidad indica que el atributo estático BinaryOperatorTextno está disponible en los enlaces de Python, pero los operadores sí funcionan QgsExpression, incluso si se usan a través de enlaces de Python.
Germán Carrillo
@ GermánCarrillo Estoy usando su método anterior, pero no consigo que devuelva ningún valor, a pesar de haber copiado y pegado un valor conocido para buscar. La columna contiene cadenas, por lo que he usado expr = QgsExpression("\"police_ref\" = 'P0580996'"). Intenté agregar un carácter de ruptura al término de búsqueda (para las comillas simples) pero no hace la diferencia. Curiosamente, si abro la tabla de atributos que estoy consultando y uso el generador de expresiones allí, hace una selección si police_ref que uso como ejemplo está en la primera fila, pero no de otra manera
Alex
@ GermánCarrillo lo siento, no importa, no estoy seguro de lo que hice de manera diferente, ¡pero ahora puedo seleccionar algunas funciones! Para otros que leen, no necesita un carácter de ruptura para las comillas simples
Alex
6

Esto funcionó para mí en la consola QGIS Python

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))
mehmet ercan
fuente
Bienvenido a GIS SE. Como nuevo usuario, tome el Tour . La respuesta existente (y aceptada) es mucho más completa. ¿Cómo mejora esto sobre eso? En general, la forma de ganar puntos de reputación es responder preguntas no respondidas, pero una nueva respuesta completa a una pregunta de tres años sería bienvenida si aborda específicamente un problema con la solución anterior (en cuyo caso, el problema ciertamente debería mencionarse) .
Vince
2

Solo necesita probarlo en la interfaz GUI: "Seleccionar por expresión". Si funciona, puede pegarlo en su código de Python rodeado de comillas dobles "".

exp = QgsExpression("ogc_fid=482")

Si compara con una cadena, puede agregar comillas simples ''.

exp = QgsExpression("ogc_fid='482'")

Es el mismo principio en Python, puede marcar la diferencia entre comillas dobles y comillas simples.

Tao
fuente