É possível ter nomes de camadas dinâmicas no projeto QGIS?

9

Eu tenho um projeto QGIS com camadas, com base em consultas SQL PostGIS que usam data atual. Como os dados no banco de dados são alterados, essas consultas retornam dados diferentes a cada novo dia.

É possível alterar dinamicamente o nome da camada no painel da árvore de camadas, para que ele represente a data atual? (ou seja, nome da camada Traffic on 24.01.2015, que muda a cada novo dia). Os dados para a legenda devem ser obtidos do atributo de qualquer recurso em uma camada - todos eles têm o mesmo valor para o campo traffic_date.

mofoyoda
fonte
O que exatamente você extrairia da tabela do banco de dados, "Tráfego" ou a data atual?
Germán Carrillo
Estou extraindo dados da data atual para uma camada e dados de previsão para outras camadas. Portanto, "24.01.2015" é realmente um valor de campo, proveniente do banco de dados. Preciso que o nome da camada no projeto mude automaticamente correspondente à data.
precisa saber é o seguinte
Seria bom alterar o nome sempre que o projeto for carregado?
Nathan W

Respostas:

13

Se você acertou, a resposta é sim, o QGIS suporta nomes de camadas dinâmicas.

Você precisaria escrever uma macro Python para ser executada toda vez que o projeto for aberto. Este seria o fluxo de trabalho:

  1. Vá para QGIS->Project->Project Propertiese substitua openProject()pelo seguinte código Python:

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )
    

    insira a descrição da imagem aqui

    Nota 1: Eu testei em arquivos shapefiles, portanto, o campo do qual tomo datas é traffic_daporque os Shapefiles não suportam mais letras nos nomes dos campos. Ajuste isso no código para trabalhar em suas camadas.

    Nota 2: Dependendo da configuração do seu projeto, você deve adicionar o código de validação para atuar apenas nas camadas desejadas. Por exemplo, se você executar o código em camadas raster, os erros aparecerão com certeza. Se você precisar de ajuda com isso, abra uma nova pergunta, eu posso ajudá-lo.

  2. Certifique-se de habilitar macros no seu projeto, desta maneira: Settings->Options->General->Enable macros: Always

  3. Carregue suas camadas no projeto.

  4. Salve seu projeto.

Sempre que você abrir seu projeto a partir deste ponto, os nomes de suas camadas serão dinâmicos, a data será retirada do campo traffic_datena tabela de atributos de cada camada.

Após a primeira vez que abri o projeto, foi assim que meus nomes de camada foram gerados dinamicamente:

insira a descrição da imagem aqui

Acho que isso pode ajudar você a começar. Diga-me se você enfrentar problemas não óbvios.

Germán Carrillo
fonte
Eu descobri lendo seu comentário, postei 1s antes de enviar a resposta. Alguns ajustes devem ser feitos no código para se ajustar ao arranjo específico das camadas, mas espero que o @mofoyoda possa lidar com eles.
Germán Carrillo
11
Sim, é uma boa primeira vez. Você também pode encontrar o índice one a faixa de lá até o final para economizar usando o regex.
Nathan W
11
@gcarrillo intenso! Mas ótimo!
DPSSpatial
11
@gcarrillo Muito legal, obrigado! Ainda tentando descobrir como aplicar apenas a determinadas camadas, espero que eu consiga. Obrigado por uma ótima resposta!
mofoyoda