QGIS ha un potente compositore di stampe con cui è possibile realizzare layout di stampa in vari page size (A4, A3 ecc…) ed esportarli in vari formati jpg, PDF e SVG (geoTIFF, geoPDF) oltre alla possibilità di creare dei template, atlanti e tanto altro.
In questo articolo affronterò l’annoso problema dei grafici dinamici in un atlante ovvero la creazione di grafici a torta che si aggiornino al variare delle pagina. cioè del vettore di copertura.
Per definire un grafico in un atlas di QGIS è possibile utilizzare le ‘cornici HTML‘ mediante l’uso di CSS (Cascading Style Sheets, ovvero, fogli di stile a cascata) e del codice HTML come sorgente (sarà più chiaro nel seguito).

Non parlerò di come realizzare un atlas (troverete altri articoli in questo blog) ma focalizzerò l’attenzione su come aggiungere due grafici a torta per la visualizzazione di alcune statistiche legate al vettore di copertura ( è il layer di riferimento per la generazione dell’atlas).
In breve: realizzerò un atlas a partire da un layer poligonale (comuni della provincia di Enna) la cui tabella degli attributi è cosi strutturata:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
id | cod_reg | cod_pro | pro_com | comune | j_Pop_2016 | j_altitudine | |
---|---|---|---|---|---|---|---|
7614 | 19 | 86 | 86012 | Nicosia | 13899 | 724 | |
7616 | 19 | 86 | 86007 | Centuripe | 5470 | 730 | |
7620 | 19 | 86 | 86004 | Barrafranca | 13380 | 450 | |
7623 | 19 | 86 | 86008 | Cerami | 2006 | 970 | |
7624 | 19 | 86 | 86013 | Nissoria | 3000 | 691 | |
7643 | 19 | 86 | 86001 | Agira | 8345 | 650 | |
7644 | 19 | 86 | 86017 | Sperlinga | 805 | 750 | |
7527 | 19 | 86 | 86006 | Catenanuova | 4866 | 170 | |
7586 | 19 | 86 | 86003 | Assoro | 5191 | 850 | |
7589 | 19 | 86 | 86009 | Enna | 28019 | 931 | |
7590 | 19 | 86 | 86014 | Piazza Armerina | 21886 | 697 | |
7591 | 19 | 86 | 86018 | Troina | 9373 | 1121 | |
7606 | 19 | 86 | 86015 | Pietraperzia | 7013 | 476 | |
7594 | 19 | 86 | 86010 | Gagliano Castelferrato | 3593 | 651 | |
7600 | 19 | 86 | 86011 | Leonforte | 13439 | 603 | |
7604 | 19 | 86 | 86020 | Villarosa | 4937 | 523 | |
7628 | 19 | 86 | 86016 | Regalbuto | 7277 | 520 | |
7645 | 19 | 86 | 86019 | Valguarnera Caropepe | 7866 | 590 | |
7638 | 19 | 86 | 86005 | Calascibetta | 4528 | 691 | |
7649 | 19 | 86 | 86002 | Aidone | 4889 | 800 |
il vettore di copertura è il layer dei comuni: nel layout creerò due riquadri mappa definendo l’id oggetto (PROVINCIA nel primo riquadro per visualizzare tutti i comuni, ZOOM secondo riquadro per visualizzare solo il comune corrente):

per ottenere la visualizzazione della figura di sopra occorre tematizzare il layer tramite tre regole (nell’ordine):
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$id= @atlas_featureid AND @map_id ='ZOOM' — Comune | |
@map_id ='PROVINCIA' — Provincia | |
$id= @atlas_featureid AND @map_id ='PROVINCIA' — Selezionato |
NB: questa sintassi è valida da QGIS 2.14 in poi!!!
la prima regola significa: visualizza/tematizza la feature (poligono = comune) quando il suo identificativo ($id) è uguale all’identificativo (@atlas_featureid) della feature visualizzata nell’atlas e (AND) fallo solo nel riquadro mappa (@map_id) di nome ‘ZOOM’;
la seconda regola significa: visualizza/tematizza le feature (tutti i comuni) quando il riquadro mappa (@map_id) è uguale al nome ‘PROVINCIA’;
la terza regola significa: visualizza/tematizza la feature (poligono = comune) quando il suo identificativo ($id) è uguale all’identificativo (@atlas_featureid) della feature visualizzata nell’atlas e (AND) fallo solo nel riquadro mappa (@map_id) di nome ‘PROVINCIA’;
NON preoccupatevi se non vedrete nulla nella map canvas, è normale!!!
ora aggiungiamo, tramite il riquadro HTML (vedi primo screenshot), il primo grafico a torta:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<div class="demo-wrapper"> | |
<div class="csspie" data-start="0" data-value="[% to_int((( $area *100 )/0.26135)) %]"></div> | |
<div class="csspie big" data-start="[% to_int((( $area*100)/0.26135))%]" data-value="[%(100 – to_int((($area*100 )/0.26135)))%]"></div> | |
</div> |
il codice HTML di sopra va copiato ed incollato in sorgente del riquadro:

PS: il valore ‘0.26135’ è la somma di tutte le aree comunali espressa in EPSG 4326!!!
non preoccupatevi se NON vedete ancora nulla, occorre un altro passo, andate più in basso fino a:

all’interno, incollate il seguente codice del file CSS che trovate qui.
Basta ora ‘aggiornare’, cioè cliccare su ‘aggiorna HTML’, comparirà il grafico a torta relativo alla feature corrente.

per il secondo grafico, relativo alla popolazione, utilizzare questo codice:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<div class="demo-wrapper"> | |
<div class="csspie" data-start="0" data-value="[% to_int((( "j_Pop_2016" *100)/169782)) %]" ></div> | |
<div class="csspie big" data-start="[% to_int((( "j_Pop_2016" *100)/169782)) %]" data-value="[% (100 – to_int((("j_Pop_2016" *100 )/169782 ))) %]"></div> | |
</div> |
PS: il valore ‘169782’ è la somma di tutte le ‘popolazioni’ comunali!!!
NB: ogni volta che si aggiunge un riquadro HTML occorre sempre popolare ‘il foglio di stile utente’ con il codice CSS.
note finali: l’idea è nata leggendo un ottimo articolo (lo travate qui) di Mickael HOARAU @Oneil974.
Thx man! sempre tutorial ben fatti e sul pezzo.
"Mi piace"Piace a 1 persona
Grazie!!!
"Mi piace""Mi piace"