Selecionando recursos usando uma expressão com PyQGIS

13

Como posso selecionar recursos com o PyQGIS usando uma expressão?

Eu tentei usar um, QgsExpressionmas o método select não aceita:

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

É possível e, em caso afirmativo, como faço?

ustroetz
fonte

Respostas:

24

Siga esses passos:

  1. Obtenha a referência da camada:

    cLayer = iface.mapCanvas().currentLayer()

  2. Obtenha um featureIterator a partir de uma expressão:

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

    it = cLayer.getFeatures( QgsFeatureRequest( expr ) )

  3. Crie uma lista de IDs de recursos a partir do resultado obtido em 2 .:

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

  4. Selecione os recursos com os IDs obtidos em 3 .:

    cLayer.setSelectedFeatures( ids )


NOTA: Se você deseja definir uma expressão com um valor de sequência , é necessário adicionar aspas a esse valor, desta maneira:

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

Se o seu valor de sequência vier de uma variável, você pode fazer isso:

myVariable = 'my string'
expr = QgsExpression( " \"name\" = '{}' ".format(myVariable) )
Germán Carrillo
fonte
Como eu digo "\"ogc_fid\"=482 AND name=\"hello world\""? Aqui diz que isso não está disponível em python: qgis.org/api/… . Talvez você saiba uma maneira de contornar essa limitação?
Jenia Ivanov 28/05
2
Lembre-se de que os nomes dos campos devem estar entre aspas duplas, os valores de sequência entre aspas e os números não precisam de aspas. No seu exemplo: "\"ogc_fid\"=482 AND \"name\"='hello world'". BTW, o link que você incluiu no seu comentário está realmente afirmando que o atributo estático BinaryOperatorTextnão está disponível nas ligações do Python, mas os operadores trabalham para isso QgsExpression, mesmo que sejam usados ​​através das ligações do Python.
Germán Carrillo
@ GermánCarrillo Estou usando o método acima, mas não consigo retornar nenhum valor, apesar de ter copiado e colado um valor conhecido a ser pesquisado. A coluna contém seqüências de caracteres, então eu usei expr = QgsExpression("\"police_ref\" = 'P0580996'"). Tentei adicionar um caractere de quebra ao termo de pesquisa (para aspas simples), mas isso não faz diferença. Curiosamente, se eu abrir a tabela de atributos Eu estou consultando, e usar a expressão construtor lá, ele faz uma seleção se o police_ref eu uso como um exemplo é na primeira fila, mas sem qualquer outro
Alex
@ GermánCarrillo desculpe, não importa, eu não tenho certeza do que fiz de maneira diferente, mas posso selecioná-lo agora! Para outros leitura, você não precisa de uma pausa de caracteres para as aspas simples
Alex
6

Isso funcionou para mim no QGIS Python Console

layer = qgis.utils.iface.activeLayer()
layer .selectByExpression(" \"ogc_fid\" = '{}' ".format(482))
mehmet ercan
fonte
Bem-vindo ao GIS SE. Como novo usuário, faça o Tour . A resposta existente (e aceita) é muito mais completa. Como isso melhora isso? Geralmente, a maneira de obter pontos de reputação é responder a perguntas não respondidas, mas uma nova resposta completa para uma pergunta de três anos seria bem-vinda se abordar especificamente um problema com a solução anterior (nesse caso, o problema certamente deve ser mencionado) .
Vince
2

Você só precisa testá-lo na interface da GUI: "Selecionar por expressão". Se funcionar, você pode colá-lo no seu código Python entre aspas duplas "".

exp = QgsExpression("ogc_fid=482")

Se você comparar com uma string, poderá adicionar aspas simples ''.

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

É o mesmo princípio em python, ele pode fazer a diferença entre aspas duplas e aspas simples.

Tao
fonte