È possibile avere nomi di layer dinamici nel progetto QGIS?


9

Ho un progetto QGIS con livelli, basato su query PostGIS SQL che utilizzano la data corrente. Poiché i dati nel database cambiano, queste query restituiscono dati diversi ogni nuovo giorno.

È possibile modificare dinamicamente il nome del layer nel pannello dell'albero dei layer, in modo che rappresenti la data corrente? (ad esempio il nome del layer Traffic on 24.01.2015, che cambia ogni nuovo giorno). I dati per la didascalia dovrebbero essere presi dall'attributo di qualsiasi funzione in un livello: hanno tutti lo stesso valore per il campo traffic_date.


Cosa estrarresti esattamente dalla tabella del tuo database, "Traffic" o la data corrente?
Germán Carrillo,

Sto estraendo i dati per la data corrente su un livello e i dati di previsione su altri livelli. Quindi "24.01.2015" è in realtà un valore di campo, che proviene dal database. Ho bisogno che il nome del livello nel progetto cambi automaticamente in base alla data.
Mofoyoda,

Andrebbe bene cambiare il nome ogni volta che il progetto viene caricato?
Nathan W,

Risposte:


13

Se ho capito bene, la risposta è sì, QGIS supporta nomi di layer dinamici.

Dovresti scrivere una macro Python da eseguire ogni volta che il progetto viene aperto. Questo sarebbe il flusso di lavoro:

  1. Vai a QGIS->Project->Project Propertiese sostituisci openProject()con il seguente codice 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 )

    inserisci qui la descrizione dell'immagine

    Nota 1: l'ho testato su shapefile, quindi il campo da cui prendo le date è traffic_daperché gli Shapefile non supportano più lettere nei nomi dei campi. Modifica quello nel codice per lavorare sui tuoi livelli.

    Nota 2: a seconda della configurazione del progetto, è necessario aggiungere un codice di convalida per agire solo sui livelli desiderati. Ad esempio, se si esegue il codice su livelli raster, gli errori appariranno sicuramente. Se hai bisogno di aiuto con questo, apri una nuova domanda, posso aiutarti.

  2. Assicurati di abilitare le macro sul tuo progetto, in questo modo: Settings->Options->General->Enable macros: Always

  3. Carica i tuoi livelli nel progetto.

  4. Salva il tuo progetto.

Ogni volta che apri il tuo progetto da questo punto, i nomi dei tuoi layer saranno dinamici, la data verrà presa dal campo traffic_datesulla tabella degli attributi di ogni layer.

Dopo la prima volta che ho aperto il progetto, ecco come sono stati generati dinamicamente i nomi dei miei layer:

inserisci qui la descrizione dell'immagine

Penso che questo possa aiutarti a iniziare. Dimmi se affronti problemi non ovvi.


L'ho capito leggendo il tuo commento, pubblicato 1 s prima di inviare la risposta. Alcune modifiche dovrebbero essere fatte nel codice per adattarsi alla disposizione specifica dei livelli, ma spero che @mofoyoda possa affrontarli.
Germán Carrillo,

1
Sì, è un buon primo tentativo. Potresti anche trovare l'indice one strisciare da lì alla fine per risparmiare usando regex.
Nathan W,

1
@gcarrillo intense! Ma fantastico!
DPSSpatial

1
@gcarrillo Molto bello, grazie! Sto ancora cercando di capire come applicare solo alcuni livelli, spero di riuscirci. Grazie per un'ottima risposta!
Mofoyoda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.