La mappa dei rischi dei comuni italiani

Consultazione, interrogazione e download tramite API REST

Introduzione

Da poco l’Istituto nazionale di statistica e Casa Italia rendono disponibile un quadro informativo integrato sui rischi naturali in Italia, suddiviso per Comune: http://www.istat.it/it/mappa-rischi/.

L’obiettivo è fornire variabili e indicatori di qualità, a livello comunale, che permettono una visione di insieme sui rischi di esposizione a terremoti, eruzioni vulcaniche, frane e alluvioni, attraverso l’integrazione di dati provenienti da varie fonti istituzionali, quali Istat, INGV, ISPRA, Ministero dei beni e delle attività culturali e del turismo.
Per ciascun Comune i dati sul rischio sismico, idrogeologico e vulcanico sono corredati da informazioni demografiche, abitative, territoriali e geografiche.

Due le modalità di consultazione, quella tramite indicatori e quella cartografica.

Nella prima, si seleziona il comune e poi è possibile scaricare il report con gli indicatori per quel comune, o visualizzare un report in PDF.

Un esempio di report in PDF dei rischi per un comune

Nella seconda è possibile consultare i dati tramite un’interfaccia cartografica.

ISTAT espone questi dati anche tramite un’interfaccia REST. A seguire alcune brevi note sull'utilizzo.

Il server REST cartografico

Questi dati sono esposti (la mappa è una delle modalità di visualizzazione possibili) tramite un motore REST cartografico, la cui ricca documentazione è possibile leggere qui.

In particolare i dati sulla “Mappa dei rischi” sono consultabili a partire da questo URL:
http://gisportal.istat.it/arcgis/rest/services/mapparischi/mapparischi/MapServer.

Sulle modalità di accesso a questi dati tramite questo motore, non mi dilungherò molto e rimando a un post a tema del 2014.

Su ogni layer posso lanciare una query. Ad esempio per l’”Indice vulnerabilità sociale e materiale” il form per lanciare le query è il seguente:
http://gisportal.istat.it/.../mapparischi/MapServer/7/query

Posso combinare i campi di input e fare ad esempio questo tipo di richieste:

Si può fare molto di più, come documentato qui.

Download dei dati

Visto che i dati sono esposti via REST con output in JSON, è possibile fare il download dei dati.

A seguire un piccolo script in bash che:

  • esegue il download dei 26 layer esposti in formato JSON, soltanto la parte alfanumerica ed estraendo dal JSON nativo lo stretto indispensabile. Non ho inserito anche il download delle geometrie perché era ridondante per 26 volte richiedere i limiti comunali; basta scaricare il layer dei comuni di Italia e poi fare il JOIN tra attributi e geometrie via ID del comune;
  • converte i 26 file JSON di output in CSV.

I requisiti sono jq e csvkit.

Con jq viene fatta una query sul JSON per estrarre solo gli attributi [.features[].attributes].

Con csvkit — in particolare con in2csv — viene fatta la conversione da JSON a CSV con in2csv --no-inference -f json input.json > output.csv. Il parametro --no-inference per impedire che in2csv faccia possibili interpretazioni automatiche delle stringhe e quindi conversioni sul tipo di campo (ad esempio da 12/03/2017 a 2017-03-12).

Qui un file compresso in cui ho inserito gli output (al 16 agosto 2017). Dovrebbe valere (salvo mi sia perso delle note di rilascio) l’open by default, quindi sono dati aperti in CC BY.

La lettura via API è più comoda sia per eseguire query live e personalizzate, a partire da un sito web, una app, un bot, ecc., che per avere dati grezzi e in bulk.

Ringrazio lorenzo perone per avermi fatto conoscere questi dati, che utilizzerà con il team di Ricostruzione Trasparente.

# Per ogni layer da 0 a 25, faccio il download. La variabile i
# verrà usata per la costruzione degli URL di download che hanno
# questa struttura http://gisportal.istat.it/.../MapServer/$i/...
for i in {0..25};
do curl -sL "http://gisportal.istat.it/arcgis/rest/services/mapparischi/mapparischi/MapServer/$i/query?where=1%3D1&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&relationParam=&outFields=*&returnGeometry=false&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=4326&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&returnDistinctValues=false&resultOffset=&resultRecordCount=&f=pjson" | jq "[.features[].attributes]" > "istatRischioClean_$i".json
done
for i in *.json; 
do
#creo una variabile che uso per estrarre il nome del file
filename=$(basename "$i")
#estraggo nome file
filename="${filename%.*}"
in2csv --no-inference -f json "$i" > "$filename".csv
done