Salvando layers temporários no PyQGIS e trabalhando com eles dentro do QGIS

Colegas pesquisadores e entusiastas do GIS de código-livre,

Primeiramente, bem-vindos ao meu blog!

Gostaria de começar com um aviso - posso ser uma pesquisadora desta área, mas isso não quer dizer que tudo o que faço ou escrevo aqui funcionará para você, em suas próprias configurações de desktop e versões de packages. Não assumo responsabilidade nenhuma se você perder dados ou bagunçar sua instalação. Eu também não autorizo nenhum tipo de cópia do meu conteúdo.

Hoje, vou escrever sobre o salvamento de camadas temporárias “temporary scratch layers” no Python Console do QGIS.

Às vezes, eu só estou querendo testar algum código ou ver se uma rotina que eu escrevi no PyQGIS funciona. Ter que criar um arquivo em uma pasta “conhecida” no computador e depois ter que lembrar de deletá-lo manualmente é cansativo e repetitivo. Para evitar isso, eu queria ter a opção de salvar os arquivos gerados no PyQGIS em um layer temporário. Depois de ler alguns dos docs do QGIS sobre isso, fiz alguns testes e consegui salvar meus resultados em um layer temporário, e posteriormente, abrir ele e visualizar. Desde então, venho salvando os arquivos gerados em layers temporários sempre que eles forem produtos intermediários, de natureza auxiliar ao processo principal que eu estou executando. Dessa forma, eles são excluídos automaticamente depois que eu sair do QGIS (ou ao reiniciar o computador), então não preciso me preocupar com eles depois de executar meu código. Bom, decidi fazer um post com um resumo de como eu salvo as saídas das ferramentas executadas no PyQGIS em camadas temporárias, caso isso venha a ser útil para alguém por aí! Claro, tem muito mais informações sobre isso na documentação do QGIS do que aqui no meu post. Por favor, considere este post como um ponto de partida, e não como um guia completo, porque eu, com certeza, não abordei todas as possibilidades de como salvar e abrir camadas no PyQGIS neste este post!

Antes de escrever sobre como salvar camadas temporárias no PyQGIS, farei uma rápida recapitulação de como salvar arquivos gerados no PyQGIS em um arquivo permanente e de como abrir esse arquivo para ver os resultados em seu projeto no QGIS.

Salvando e abrindo um arquivo ou layer não temporário (permanente)

Quase todas as ferramentas que podem ser executadas no Console Python do QGIS têm uma saída. Geralmente, quando as pessoas querem manter essa saída para uso posterior, elas salvam essa camada em uma pasta (não temporária) em seu computador. Para fazer isso, basta definir o parâmetro de saída da seguinte forma:

'OUTPUT' : 'local_saida.shp'

Com isso, eu comporia um dicionário com este e outros parâmetros a serem usados para executar um determinado algoritmo. E em seguida, executaria o algoritmo chamando o comando processing.run. Por exemplo:

paramwedge={ 'AZIMUTH' : 0, 'INNER_RADIUS' : 0, 'INPUT' : 'point.shp', 'OUTER_RADIUS' : 1, 'OUTPUT' : 'local_saida.shp', 'WIDTH' : 45}
processing.run("native:wedgebuffers", paramwedge)

Como eu conheço a pasta e o nome com o qual o arquivo resultante foi salvo, não há necessidade de atribuir o resultado de processing.run a uma variável. E, para abrir o arquivo gerado, posso simplesmente usar

new_layer = QgsVectorLayer('local_saida.shp', 'nome_do_layer', 'ogr')

Para adicionar o layer ao projeto, eu digitaria:

QgsProject.instance().addMapLayers([new_layer])

Aí está:

A wedge based on a center point

Salvando e abrindo um layer temporário

Para salvar um arquivo temporário, defino o local de saída no dicionário de parâmetros como “memory:”. Sim, com os dois pontos “:”.

'OUTPUT' : 'memory:'

O dicionário de parâmetros, completo, ficaria assim (neste exemplo, para o algoritmo que cria uma geometria em formato de cunha):

paramwedge={ 'AZIMUTH' : 0, 'INNER_RADIUS' : 0, 'INPUT' : 'point.shp', 'OUTER_RADIUS' : 1, 'OUTPUT' : 'memory:' , 'WIDTH' : 45}

Ao executar a ferramenta com processing.run, atribua a saída a uma variável. Por exemplo:

layer_wedge=processing.run("native:wedgebuffers", paramwedge)

Isso gera automaticamente um objeto QgsVectorLayer em layer_wedge[‘OUTPUT’], conforme mostrado abaixo:

>>> type(layer_wedge)
<class 'dict'>
>>> type(layer_wedge['OUTPUT'])
<class 'qgis._core.QgsVectorLayer'>

Para abrir a camada no projeto do QGIS e ver seu conteúdo, adicione o layer usando a mesma ferramenta que usaríamos para a camada permanente, mas chame diretamente layer_wedge[‘OUTPUT’]. Para aplicar qualquer outra ferramenta ou transformação a esta camada, devemos também chamá-la pelo nome layer_wedge[‘OUTPUT’].

QgsProject.instance().addMapLayer(layer_wedge['OUTPUT'])

Another wedge based on a center point

Aqui está o setor circular gerado! Com a vantagem de que, este, eu não terei que deletar manualmente após fechar o QGIS!

Luísa Vieira Lucchese
Luísa Vieira Lucchese
Pós-doutoranda

Pós-doutoranda na Universidade de Pittsburgh

Relacionados