Le variabili in QGIS↵
Introduzione↵
Le variabili sono una nuova funzionalità introdotta in QGIS 2.12 Lyon (2015) che consente di creare valori preimpostati da utilizzare ovunque sia possibile utilizzare un'espressione.
Variabili
Rappresentano un nuovo concetto che dà la possibilità di impostare variabili personalizzate da utilizzare nel motore delle espressioni di QGIS
Cassetti↵
Possiamo immaginare le variabili come dei cassetti all'interno dei quali possiamo immagazzinare qualcosa da utilizzare quando necessario. Il contenuto dei cassetti può essere un testo, un numero, una espressione. Le variabili possono essere statiche, ovvero, il loro contenuto è sempre lo stesso, oppure dinamico, ovvero, cambia in funzione del contesto.
flowchart LR;
style id0 fill:#dd8c73,stroke:#343,color:#000000,stroke-width:2px
style id1 fill:#ee7a13,stroke:#343,color:#000000,stroke-width:2px
style id2 fill:#ed7b88,stroke:#343,color:#000000,stroke-width:2px
id0[TESTO]
id1[1234]
id2[$area/10000]
Esempio chiarificatore↵
Ecco un primo esempio che far capire le potenzialità delle variabili: supponiamo che nel nostro progetto QGIS ci siano 5 layer vettoriali e per ognuno avessimo attivato e configurato le etichette. Supponiamo di voler cambiare la dimensione dell'etichette a tutte e 5 i layer, occorrerebbe aprire le proprietà del layer ben 5 volte, una per ogni layer. Ma se impostassimo, a livello di progetto, una variabile altezza_etichetta
e mettessimo dentro il valore 15, basterebbe modificare una sola volta questa variabile per vedere le modifiche su tutti i layer in cui l'avessimo utilizzata.
Contesto↵
Come detto prima, le variabili sono sensibili al contesto, quindi alcune variabili sono utilizzabili ovunque, altre no; per esempio la variabile @grid_axis
è utilizzabile solo nel compositore di stampe. Nel gruppo delle funzioni, presente sia nel Field Calc che in ogni altro Costruttore stringhe espressioni, l'elenco delle variabile è molto variabile! perché, ripeto, dipende dal contesto.
Ambito↵
Oltre al contesto, le variabili, dipendono anche dall'ambito, ovvero, esisitono 4 ambiti principali: Globale, Progetto, Layer, Print Layout, Oggetto del print layout, questi ambiti sono tutti impilati uno sopra l'altro in ordine dal meno specifico al più specifico. Gli ambiti più specifici sovrascrivono eventuali variabili in conflitto esistenti da ambiti meno specifici: supponiamo di aver creato una variabile Globale mio_nome
e successivamente altra variabile a livello di Progetto con stesso nome, la variabile globale verrebbe sovrascritta da quella di progetto.
flowchart LR;
style id0 fill:#ed7b13,stroke:#343,color:#000000,stroke-width:2px
style id1 fill:#ed7b13,stroke:#343,color:#000000,stroke-width:2px
style id2 fill:#ed7b13,stroke:#343,color:#000000,stroke-width:2px
style id3 fill:#ed7b13,stroke:#343,color:#000000,stroke-width:2px
style id4 fill:#ed7b13,stroke:#343,color:#000000,stroke-width:2px
id0((("GLOBALE")))-->
id1(((Progetto)))-->
id2(((Layer)))-->
id3(((Print Layout)))-->
id4(((Oggetto \n Print Layout)))
La variabile Blog
definita a livello Globale è utile in quanto la ritrovo sempre se lavoro nel mio PC e per qualsiasi sessione di lavoro. La variabile Blog
definita a livello di Progetto è usabile SOLO in questo progetto.
- Per definire una variabile Globale: Menu Impostazioni | Opzioni | Variabili e cliccare l'icona in basso a destra;
- per definire una variabile di Progetto: Menu Progetto | Proprietà | Variabili e cliccare l'icona in basso a destra;
- per definire una variabile di Layer: Tasto destro del mouse sul nome del layer presente nel Pannello Layer | Proprietà | Variabili e cliccare l'icona in basso a destra;
Atlante↵
Alcune variabili dipendono anche dalla creazione dell'atlante, ovvero, fin quanto non è stato creato un altlante, le relative variabili (@atlas_feature, @atla_geometry ecc...) non saranno né visibili né utilizzabili da nessuna parte, come è ovvio.
flowchart TD
A[Progetto QGIS] --> B{Atlas?}
B -->|Impostato| C[OK per le variabili] -->D["@atlas_feature\n@atlas_geometry\n@atlas_pagename\n..."]
B -->|Non impostato| E[Variabili NON usabili]
Qui sfruttando sempre l'icona in basso a destra, è possibile aggiungere variabili in funzione all'oggetto selezionato, nel caso specifico sarebbe l'atlante.
Dinamiche contestuali↵
Alcune variabili dinamiche, come per esempio @map_scale
, restituiscono valori diversi a seconda di dove viene utilizzata: map canvas, mappe nuove, mappa print layout; questo perché la variabile riconosce dove è stata richiamata.
Ho etichettato lo stesso layer con la variabile @map_scale
ma in tre contesti diversi visualizzo tre valori diversi!!!
Creare variabile al volo↵
Infine, esiste una funzione with_variable
che permette di creare, al volo, una variabile all'interno di una espressione complessa. Questo è molto utile quando, in espressioni lunghe e complesse, ci sono parti di espressioni che si ripetono più volte, per esempio $area/10000
, potrei crearla come variabile e chiamrla @areaEttari
, questo ha un duplice vantaggio: 1. rende l'espresione più leggibile; 2. rende l'espressione più veloce, perché quel valore verrebbe calcolato solo una volta e non enne volte.
Osservazione: tutte le variabili iniziano con @
, quindi se volessi usare la variabile row_number
dovrei necessariamente scrivere @row_number
Variabili predefinite↵
Quando utiliziamo il Filed Calc o un qualsiasi costruttore Stringhe Espressione, nel gruppo funzioni ci sono, in cima all'elenco e in neretto, una serie di variabili predefinete pronte all'uso e contestualizzate, ovvero cambiano a seconda del contesto:
simbologia↵
in questo caso il contesto è simbologia:
etichette↵
in questo caso è etichettatura:
print layout↵
in questo caso Print Layout, reticolo
Variabile speciale value↵
È stata introdotta, sempre da Nyall, una variabile speciale che viene utilizzata soprattutto nella sovrascrittura definita dai dati , ovvero, in tutti quei casi in cui è possibile pilotare le caratterisitiche delle etichette o della simbologia tramite dati o espressioni. La variabile si chiama @value
.
Questa variabile rientra tra le variabili dinamiche e contestuali perché può assumere vari valori a seconda della caratteristica utilizzata. In sostanza la variabile @value
assume il valore corrente presente nel widget di riferimento. (l'esempio che segue chiarirà il concetto).
La variabile @value
nel caso di Dimensione
assume il valore presente nel relativo widget, nel caso in esame @value=14
;
nel caso di colore sarà nero, nel caso di Stile sarà Regular.
La prima cosa interessante è che appena modifico il valore nel widget, cambia anche il valore associato alla variabile; la seconda cosa interessante è che posso usare la variabile in una espressione, per esempio:
ovvero, per qualsiasi valore inserito nel widget minore o uguale a 14, la dimensione del testo sarà 0, ovvero non visibile, altrimenti lascia il valore corrente!!!Non fate caso all'anteprima, segnerà sempre NULL
e nell'Help ci sarà sempre scritto non impostato
.
Formattazione condizionale↵
nella stessa versione di QGIS 2.12 Lyon, Nathan Woodrow introduce la possibilità di realizzare la formattazione condizionale nelle tabelle degli attributi, un po' come in Excel.
In questo contesto esiste una variabile @value
che rappresente sempre il valore corrente dell'attributo usato.
Da punto di vista del codice, sembrerebbero due variabile che non hanno nulla a che fare l'una con l'altra, infatti l'una è stata implementata da Nyall, l'altra da Nathan; unica cosa in comune è che sono state rilascite nella stessa versione di QGIS.
Esempi di uso↵
- Nella sezione Funzioni, gruppo Variabili, trovate l'elenco di tutte le variabili, però non sono documentate, occorre tempo che non ho per adesso :-);
- Nella sezione Esempi svolti, trovate molti esercizi in cui utilizzo la funzione
with_variable
.
Discussioni↵
Per chi volesse discuterne, approfondire o semplicemente lasciare un commento, qui è il posto migliore.
RIFERIMENTI↵
- Changelog 2.12 - Le variabili
- Post sulle variabili di Nyall Dawson
- Formattazione condizionale by Nathan Woodrow
- DOC QGIS Variabili
- Variabile @value
- Blog post su Pigrecoinfinito sull'uso della variabile map_id
RINGRAZIAMENTI↵
- Gabriel De Luca, qui suo messaggio;
- Andrea Giudiceandrea, qui i suoi contributi.
- Per chi legge: ringraziate Andrea Borruso perché è stato lui a convincermi a pubblicare questo post!