"Selecionar por atributo" no QGIS usando python?

16

Existe uma maneira de usar a função "Selecionar por atributo" no QGIS usando um comando python? No meu plugin, o usuário deve inserir um valor por meio de uma GUI e esse valor deve ser usado em uma função que seleciona todos os recursos que possuem esse atributo. O nome da coluna é fixo no código, a função deve procurar apenas o valor correto.

Na minha solução atual, a função conecta o QGIS a um banco de dados PostgreSQL e executa uma instrução SQL. Isso cria uma tabela a partir do resultado e a tabela é visualizada como Shapefile no QGIS.

Em princípio, seria suficiente destacar os recursos e não criar um novo Shapefile da seleção. O uso da função "Selecionar por atributo" também ignoraria a conexão desnecessária ao banco de dados.

Existe uma maneira de usar a função "Selecionar por atributo" em python para que os recursos sejam destacados? Usando a função no QGIS, todos os recursos que não correspondem à consulta são apagados temporariamente, o que também seria aceitável.

userHH
fonte
1
Essas respostas precisam de uma atualização do qgis 3.
MonsterMushroom 08/04/19

Respostas:

8

Sim. Você pode obter todos os atributos através das ligações python e implementar filtragem extra em seu próprio plugin. Veja este trecho do PyQGIS Coobook para o resumo e alguns exemplos. Você excluiria todos os resultados não correspondentes do dicionário retornado.

Quanto à visualização, você provavelmente ainda precisará criar outra camada, pois select()não possui argumentos adequados. Você pode usar uma camada de memória para evitar a necessidade de criar arquivos físicos (mais sobre isso no livro de receitas).

editar:

Na verdade, você pode usar selectedFeaturesIds()com setSelectedFeatures(ids)para alterar a seleção para o subconjunto que você criou. Citando a implementação diretamente:

/** 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
fonte
Que pena! Eu pensei que era possível no QGIS, porque também é possível no ArcGIS usando o arcpy. No entanto, obrigado pela sua resposta!
userHH
Talvez haja um caminho; Eu simplesmente não sei. Dê a outros usuários do site algum tempo - talvez alguém o faça.
Lynxlynxlynx
Eu acho que deve ser possível. No QGIS, todos os recursos são visualizados de acordo com a seleção, todos os outros recursos são temporariamente apagados.
userHH
É, eu encontrei. O QGIS faz isso no núcleo, mas parece que expõe o suficiente da interface para ajustar a seleção corretamente.
Lynxlynxlynx
Você pode me enviar o link?
userHH
9

A partir do QGIS 2.2, isso é suportado de uma maneira muito natural. Isso pode ser feito através do mecanismo de expressão QGIS usando o 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 ] )

A melhor coisa: se você possui uma versão recente do QGIS (2.10 e posterior), ela será filtrada diretamente no banco de dados com muito mais desempenho do que outras soluções e ainda assim sendo muito legível.

Matthias Kuhn
fonte