alsperGIS
DATI
SOFTWARE

SOFTWARE >> QGIS 3

Esempio di stile 6

Stile per curve di livello


(realizzato con QGIS 2.99)


In questo esempio vedremo un possibile stile per le curve di livello (isoipse). La tabella attributi associata al layer ha un campo contenente la quota di ciascuna linea. Per prima cosa, partendo dalle quote, calcoleremo un nuovo campo in cui le linee sono classificate in base all'equidistanza verticale. Sulla base di questo nuovo campo costruiremo una simbologia differenziata. Poi aggiungeremo etichette con i valori di quota alle curve più importanti ed infine stabiliremo condizioni di visualizzazione in base alla scale per le classi di equidistanza  meno importanti.
 

Il layer isoipse appena importato, con la simbologia asseganta automaticamente dal programma, appare così:


Se apriamo la tabella degli attributi associala al layer (tasto destro del mouse sul nome del layer > "Apri tabella attributi") vediamo che la colonna 'CV_LIV_Q' contiene la quota di ogni curva. Però avremmo bisogno di un campo in cui le curve siano classificate in base all'equidistanza verticale (es: 10, 50, 100 ...). Possiamo crearlo usando il "calcolatore di campi" (icona-pallottoliere).


Nella finestra del "Calcolatore di campi" scegliamo "Crea un nuovo campo" poi spuntiamo l'opzione "Crea campo virtuale". Come dice il programma
"un campo virtuale viene ricalcolato ogni volta che viene usato. La sua definizione viene salvata nel file di progetto. Non viene salvato del database del file e quindi i suoi valori non sono disponibili in altri programmi". Questo significa che il campo virtuale non viene salvato insieme al dato, quindi se aprissimo il layer con un altro programma non ritroveremmo il campo appena creato (in altri progetti di QGIS invece possiamo ritrovare il campo virtuale se salviamo un file di stile .qml associato al layer). Ha però alcuni vantaggi: può essere creato anche per layer non modificabili (ad esempio uno shapefile compresso in .zip), può essere cambiato/corretto/migliorato modificandone l'espressione, viene automaticamente aggiornato se si cambia il valore di un campo usato nell'espressione (nell'esempio seguente se correggiamo una quota da 20 a 200 la sua classe di equidistanza cambia automaticamente da 10 a 100).



Per creare le classi di equidistanza ci serve un nuovo campo che avrà nome 'EQUIDIST', di tipo 'Numero intero (integer)' (conterrà i valori 1, 10, 50, 100, 500, 1000) e lunghezza 10 (basterebbe anche meno ma lasciamo il valore preimpostato).
Nella sezione "Espressione" andiamo a scrivere la regola che darà i valori di classe di equidistanza in base alla quota delle curve. A questo punto ci serve una regola che dica:

QUANDO la quota è multipla di 1000 ALLORA IL RISULTATO è 1000
ALTRIMENTI QUANDO la quota è multipla di 500 ALLORA IL RISULTATO è 500
ALTRIMENTI QUANDO la quota è multipla di 100 ALLORA IL RISULTATO è 100
ALTRIMENTI QUANDO la quota è multipla di 10 ALLORA IL RISULTATO è 10
ALTRIMENTI IL RISULTATO è 1

Per fare questo è utile la funzione CASE (la troviamo nella colonna centrale nel gruppo "Condizioni": facendo doppio click su di essa viene trascritta nell'area di sinistra, mentre a destra possiamo leggere la spiegazione dell'espressione).

CASE
WHEN condizione1 è vera THEN risultato1
WHEN condizione2 è vera THEN risultato2
WHEN condizione3 è vera THEN risultato3
WHEN condizione... è vera THEN risultato...
ELSE risultato_alternativo
END



I vari risultati di CASE saranno appunto le classi di equidistanza (dalla maggiore alla minore: 1000, 500, 100, 10, 1). Un po' più complessa è la costruzione delle condizioni. Per prima cosa inseriamo nell'espressione il campèo contenente i valori di quota: per far questo cerchiamo il campèo 'CV_LIV_Q' nel gruppo "Campi e valori" e facciamo doppio click su di esso (possiamo anche scriverlo direttamente nell'espressione ricordando di metterlo tra virgolette).



Ora, per determinare se un valore di 'CV_LIV_Q' è multiplo di una classe di equidistanza usiamo l'operatore % che restituisce il resto della divisione: se il resto di una divisione è 0 significa che il dividendo è multiplo del divisore.
Quindi se 'CV_LIV_Q' % 1000 = 0 allora è multiplo di 1000.
Tradotto in CASE:   WHEN ("CV_LIV_Q" % 1000 = 0) THEN 1000
Scriviamo una riga simile per ogni classe di equidistanza è come risultato alternativo finale indichiamo 1 (ELSE 1), ovvero i valori che non appartengono a nessuna classe indicata saranno assegnati alla classe 1.

Alla fine dobbiamo ottenere la seguente espressione:
CASE
WHEN ( "CV_LIV_Q"  % 1000 = 0)  THEN 1000
WHEN ( "CV_LIV_Q"  % 500 = 0)  THEN 500
WHEN ( "CV_LIV_Q"  % 100 = 0)  THEN 100
WHEN ( "CV_LIV_Q"  % 50 = 0)  THEN 50
WHEN ( "CV_LIV_Q"  % 10 = 0)  THEN 10
ELSE 1
END



Se l'espressione è corretta comparirà in basso alla vore "Anteprima" il primo valore calcolato
A questo punto possiamo dare l'OK e nella tabella degli attributi comparirà il campo 'EQUIDIST' con i nuovi valori calcolati:


Come già detto i nuovi valori non sono salvati fisicamente nel database del layer; viene invece salvata l'espressione nel progetto di QGIS ed eventualmente nel file di stile .qml del layer. Quindi se vogliamo modificare i valori nel campo virtuale possiamo/dobbiamo modificare l'espressione che li genera. Per farlo apriamo la finestra "Proprietà vettore" del layer (tasto destro del mouse sul nome del layer > "Proprietà") e andiamo alla scheda "Campi Sorgente: vediamo che il campo 'EQUIDIST', nella colonna "Commento" contiene parte dell'espressione che avevamo inserito.



Cliccando sull'icona dell'espressione (quella simile ad un 3 al contrario) si apre la finestra che ci permette di modificare l'espressione. Ad esempio possiamo aggiungere una condizione per definire la classe di equidistanza 50.


Una volta che il campo 'EQUIDIST' è completo con tutti i valori che ci servono possiamo utilizzarlo per differenziare la simbologia delle curve di levello.
Sempre nella finestra "Proprietà vettore", passiamo alla scheda "Simbologia", impostiamo lo stile per categoria ("Categorized"), scegliamo il campo 'EQUIDIST' come colonna in base a cui determinare le categorie e clicchiamo su "Classifica": vengono così creatidiversi simboli lineari, uno per ogni classe di equidistanza più un simbolo per eventuali valori nulli.



Visto che dobbiamo differenziare le linee per spessore e non per colore selezioniamo tutti i simboli, clicchiamo con il tasto destro del mouse e selezioniamo cambia colore: scegliamo ad esempio un marrone (R=100, G=50, B=0).
  >> 

Ora differenziamo gli spessori: selezioniamo i simboli delle curve direttrici (quelle con equidistanza 100 e 500) e cambiamo larghezza impostando un valore maggiore,
  >> 
poi selezioniamo gli altri e diminuiamo lo spessore.
Eventualmente togliamo la spunta al simbolo del valore di equidistanza 1 in modo da non visualizzare le curve a meno di 10 m.

Ed ecco il risultato in mappa:








Affinché le curve di livello siano utili dobbiamo visualizzarne la quota; non su tutte, altrimenti la mappa diventa troppo affollata di numeri, ma almeno sulle curve principali con equidistanza 100 m.
Apriamo quindi la solita finestra "Proprietà vettore" del layer (tasto destro del mouse sul nome del layer > "Proprietà") e andiamo alla scheda "Etichette". Impostiamo la modalità di etichettarura sulla voce "Etichettatura tramite regole" e clicchiamo in basso sul bottone + ("Aggiungi regola").


Nella finestra che compare ("Modifica regola") andiamo a specificare le condizioni ed i parametri dell'etichettatura.
Inseriamo un nome/descrizione della regola che ci aiuta a distinguerla quando usiamo più regole,

poi alla voce filtro clicchiamo sull'icona dell'espressione per scrivere la condizione della regola.
Nella finestra "Costruttore stringhe espressione" scriviamo
"EQUIDIST" >= 100

Dando OK la condizione viene riportata alla voce "Filtro";

in questo modo la regola di etichettatura verrà applicata solo alle curve di livello con attributo 'EQUIDIST' maggiore o uguale a 100.

(Volendo è possibile specificare un intervallo di scala nel quale visualizzare le etichette)

Nella sezione "Etichette" (che dev'essere spuntata) andiamo ad indicare il campo contenente i valori da usare per l'etichettatura; in questo caso sono le quote contenute nel campo 'CV_LIV_Q'.
A questo punto possiamo dare "OK", poi "Apply" (nella finestra "Proprietà vettore") per vedere come appaiono le etichette:



Ok, le quote ci sono ma per evitare equivoci sarebbe meglio posizionarle sovrapposte alle linee cui si riferiscono e con lo stesso colore. Torniamo quindi alla finestra "Proprietà vettore", scheda "Etichette" e clicchiamo in basso sul bottone con foglio e matita ("Modifica regola").


Si riapre la finestra della regala dove possiamo cambiare le caratteristiche delle etichette.
Nella sezione "Etichette" selezioniamo la voce "Testo" e andiamo a cambiare il colore impostando lo stesso delle curve.


Passiamo poi alla voce "Posizionamento": spuntiamo l'opzione "Sulla linea" e togliamo "Sopra la linea". In questo modo le etichette andranno a sovrapporsi alle rispettive linee.


Se però sovrapponiamo le etichette alle curve con lo stesso colore rischiamo di renderle illeggibili. Meglio dare un leggero bordo bianco alle scritte per staccarle un po' dalle linee. Andiamo perciò sulla voce "Buffer", attiviamo l'opzione "Disegna buffer del testo", possiamo lasciare invariati dimensione (1,000) e colore (bianco) ma eventualmente diminuiamo l'opacità per avere un bordo leggermente trasparente.


Questo è il risultato in cui le quote si fondono meglio con le rispettive curve rimanendo comunque leggibili:



Ci rimane ancora una cosa da sistemare: se allarghiamo l'area inquadrata (ovvero diminuiamo la scala) le curve di livello diventano troppo ravvicinate e fanno confusione. Possiamo però impostare intervalli di scala di visualizzazione diversi per ogni classe di equidistanza in modo che diminuendo la scala vengano tolte gradualmente le curve meno importanti (ovvero con equidistanza verticale inferiore).
Per fare questo apriamo ancora la finestra "Proprietà vettore" del layer (tasto destro del mouse sul nome del layer > "Proprietà"), scheda "Simbologia" e cambiamo la modalità da "Categorized" a "Rule-based" (Tramite regole).


Rimangono le stesse classi di simbologia basate sull'equidistana verticale ma in basso compare un icona di "Modifica regola attuale" che ci permette non solo di cambire il simbolo ma anche di impostare un intervallo di scala per la classe selezionata.


Cambiamo ad esempio l'intervallo di scala per la classe 10

e per la classe 50


(togliamo ancora la spunta alla classe 1)

Ed ecco i risultati a diverse scale di visualizzazione:










Salvataggio stile in file .qml

Nel caso si voglia utilizzare questo stesso layer con lo stesso stile (simbologia, etichette, etc.) in un altro progetto di QGIS non è necessario rifare tutta  la procedura. Possiamo creare un file di stile che salva tutti i parametri appena impostati (anche il campo virtuale).
Per farlo apriamo la finestra "Proprietà vettore" del layer (tasto destro del mouse sul nome del layer > "Proprietà"), scheda "Simbologia" e in basso a sinistra clicchiamo su "Stile" > "Salva stile" > "QGIS Layer Style File..."



Viene così creato un file di testo con estensione .qml simile a questo:

dove sono specificati i vari parametri dello stile.
Se viene salvato nella stessa cartella dello shapefile e con lo stesso nome esse viene letto automaticamente quando si aggiunge il layer in QGIS, altrimenti può essere caricato dalla finestra "Proprietà vettore", scheda "Simbologia", cliccando su "Stile" > "Carica stile".





Gennaio 2018
Alessandro Perego