I layout di stampa di QGIS permettono di gestire piuttosto agevolmente le scale metriche, garantendo un buon livello di flessibilità.

In questo articolo approfondiremo come gestire una scala numerica utilizzando due metodi differenti.
Ciò che vogliamo ottenere è una definizione di scala numerica ( es. 1:10.000 ) che sia collegata dinamicamente ad una mappa di layout e che permetta di gestire il separatore delle migliaia e l’arrotondamento dei decimali.

Metodo 1, tramite interfaccia grafica

Ipotizziamo di avere un layout con una mappa e di voler affiancare un box con la relativa scala numerica che si aggiorni automaticamente al variare della scala della mappa.

scala 1:10.000

All’interno del nostro layout di lavoro clicchiamo sull’icona ‘Barra di Scala‘ e operiamo sul pannello delle proprietà dell’oggetto. In primo luogo, nella sezione Proprietà principali, alla voce ‘Stile’ impostiamo il valore ‘Numerico’ e, se in presenza di più mappe all’interno dello stesso layout, alla voce ‘Mappa’ selezioniamo la mappa di interesse a cui associare la scala numerica.

Nella sezione Visualizzazione impostiamo lo stile del testo definendo, tra le varie opzioni, il font e le dimensioni.

Successivamente cliccando sul pulsante Personalizza accediamo alla relativa maschera di personalizzazione dove poter impostare i valori degli arrotondamenti dei decimali e dei separatori delle migliaia.

Metodo 2, tramite espressione

Operazioni preliminari

Il medesimo risultato è gestibile tramite un semplice box di testo e una espressione. Vediamo come costruire l’espressione passo passo:

Assegnamo un id alla mappa del layout per poterla recuperare all’interno dell’espressione. Per farlo è sufficinete accedere alle proprietà dell’oggetto mappa e compilare la sezione ‘ID oggetto’. Nel nostro caso digiteremo ‘1’. Ma potrebbe essere un qualunque numero di nostra scelta.

Creiamo una casella di testo e nelle relative proprietà clicchiamo sul pulsante ‘Inserisci/Modifica espressione

Editor delle espressioni

Utilizziamo la funzione map_get. Questa funzione recupera un determinato valore di una mappa selzionando una specifica chiave di ricerca. la funzione accetta due argomenti:

  • map, la mappa da interrogare
  • key, la chiave di ricerca desiderata

L’argomento map deve essere compilato con la funzione item_variables e il relativo id della mappa che abbiamo assegnato all’inizio dell’esercizio. Nel nostro caso è 1.

Come argomento key* invece usiamo ‘map_scale‘:

*per la lista completa delle variabili consultare la tabella variabili nelle proprietà dell’oggetto mappa.

/* map_get(map, key) */

map_get( item_variables(1), 'map_scale')

La funzione ci restituisce come valore:

10000.000000000082

Per arrotondare il valore e inserire il separatore delle migliaia utilizziamo la funzione format_number:

/* format_number(number,places,language)
*
*  number: numero da formattare
*
*  places: posizioni dei decimali (es. 0 per rimuovere i decimali)
*
*  language (opzionale): codice lingua per lo stile della formattazione (es. 'it')
*/

format_number(map_get( item_variables(1), 'map_scale'),0, 'it')     

ottenendo:

10.000

Infine con la funzione concat possiamo unire il valore di scala con altre stringhe di testo. Di seguito l’espressione completa e il risultato finale:

/* concat(string1,string2…) */

concat( 'scala 1:', format_number( map_get( item_variables(1), 'map_scale'), 0, 'it'))

scala 1:10.000

Conclusioni

I due metodi sono molto semplici e producono risultati sovrapponibili. Con entrambi i metodi, in caso di modifica della scala della mappa, il valore riportato nella scala numerica si aggiornerà automaticamente. Il metodo 1 probabilmente è il più indicato per chi ha poca dimestichezza con la scrittura di codice. Personalmente ritengo preferibile il metodo 2 perché più flessibile e modificabile più rapidamente, una volta compresa la logica del codice.

Tags: ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.