Vai al contenuto

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:

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:

IF (@value <= 14, 0, @value)
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

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!