QGIS: Atlas con grafici dinamici

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).

immagine-3
screenshot compositore di stampe – cornice HTML – CSS

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:


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

view raw
com_EN_pop16_alt.csv
hosted with ❤ by GitHub


Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

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):

immagine-6
layout stampa – riquadri mappa e regole

per ottenere la visualizzazione della figura di sopra occorre tematizzare il layer tramite tre regole (nell’ordine):

$id= @atlas_featureid AND @map_id ='ZOOM' — Comune
@map_id ='PROVINCIA' — Provincia
$id= @atlas_featureid AND @map_id ='PROVINCIA' — Selezionato

view raw
regole_atlas.txt
hosted with ❤ by GitHub

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:

<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>

view raw
valori_area.html
hosted with ❤ by GitHub

il codice HTML di sopra va copiato ed incollato in sorgente del riquadro:

immagine-8
codice HTML – 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:

immagine-9
foglio di stile utente – CSS

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.

immagine-11
SCREENSHOT – grafico a torta

per il secondo grafico, relativo alla popolazione, utilizzare questo codice:

<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.


dati e progetto EPSG 3004

3 pensieri su “QGIS: Atlas con grafici dinamici

Rispondi a ansecooper Cancella risposta

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.