Giovanni Pirrotta

Just a curious person

Protezione Civile POP: crea gli avvisi di allerta della tua città

May 17, 2018

Dal 5 marzo di quest’anno il Dipartimento della Protezione Civile pubblica sul proprio sito i bollettini di criticità nazionale e di allerta in formato xml, shape, csv e pdf. C’è di più! Dopo circa un mese gli stessi dati sono stati rilasciati con licenza aperta, cioè riutilizzabili liberamente in altri contesti.

Già in un mio precedente post ho raccontato come aprire i dati della Protezione Civile della Regione Siciliana a partire dai bollettini PDF che pubblicavano ogni giorno sul loro sito.

Con la pubblicazione in opendata dei dati della protezione civile su scala nazionale il cambio di passo è davvero notevole e diventa realistico progettare importanti servizi digitali che siano sostenibili e a beneficio dei cittadini.

Stimolato anche dall’amico Andrea Borruso, che già aveva scritto un post sulla pubblicazione di questi dati,

vediamo come ottenere una maggiore flessibilità e facilità di accesso.

Sin da subito, tuttavia, noto alcune criticità.

  • I link ai dati non sono univoci; una parte del link è costituita dal giorno di rilascio a cui vengono aggiunti 4 numeri random. Sarà l’orario di rilascio??? Non è dato sapere. Ne segue che per estrarre il link dovrò ricorrere allo scraping, purtroppo :-(
  • I link ai vari formati disponibili (xml, pdf, shp) in realtà rimandano a un file zip, all’interno del quale si trovano i dati della protezione civile, che non è proprio il massimo per accedere programmaticamente al dato.

I dati dovrebbero invece essere esposti in modo da garantire il massimo livello di flessibilità, secondo un formato standard e strutturato, in grado di filtrare i dati da consumare secondo le proprie specifiche necessità.

Uno dei modi più semplici e facili per accedere a dati su Webva è tramite API dedicate in formato JSON.

JSON (JavaScript Object Notation) è un formato aperto, semplice e adatto alla memorizzazione di informazioni e ai trasferimenti di dati dal client al server o viceversa.

Per la varietà di ambiti di applicazione, oltre al formato JSON, scelgo di esporre anche i dati in formato RSS.

RSS è uno dei più popolari formati per la distribuzione di contenuti Web; è basato su XML, da cui ha ereditato la semplicità, l’estensibilità e la flessibilità. Attraverso particolare software chiamati feedreader è possibile convogliare tutti i feed di interesse in un’unica applicazione (Web, standalone o mobile) in modo da avere in un unico punto le informazioni di tutti i siti di interesse senza doverli visitare manualmente ad uno ad uno.

Inoltre gli RSS si integrano in modo naturale con una serie di applicazioni, servizi e tool online con i quali è possibile creare nuovi servizi. Il servizio IFTTT, ad esempio, è in grado di agganciare un feed RSS a tantissimi altri servizi: social newtork, app di instant messaging, email, applicazioni di domotica in grado di accendere lampade, aprire finestre, avviare elettrodomestici e tanto altro.

Immaginate una lampada che cambia colore a seconda del colore dell’allerta meteo del giorno successivo ricordandovi ad esempio di lavare e stendere i panni oggi perchè domani sono previsti forti temporali. E che automaticamente disattiva l’irrigazione del giardino per il giorno successivo riattivandosi successivamente in assenza di allerta. Questi sono solo alcuni esempi di applicazioni potenzialmente realizzabili grazie al riutilizzo dei dati della Protezione Civile, riusabili perchè opendata.

Una volta deciso il formato da esporre voglio poter accedere ai dati in modo da personalizzare la mia richiesta in base all’uso che ne devo fare, secondo le seguenti caratteristiche:

  • le informazioni devono riferirsi alla città in cui vivo o di cui mi interessa sapere le previsioni;
  • devo poter scegliere la tipologia di rischio (idraulico, idrogeologico e temporali) di cui mi interessano le informazioni;
  • devo poter scegliere il livello minimo di allerta, tra verde, gialla, arancione e rossa (vedi figura);
  • devo poter scegliere se mi interessano le previsioni del giorno corrente o del giorno successivo.

Iniziamo dal primo punto.

Il Bollettino di criticità nazionale/allerta della Protezione Civile segnala la valutazione dei livelli di criticità/allerta idraulica, per temporali e idrogeologica mediamente attesi fino alle 24.00 del giorno di emissione e nelle 24 ore del giorno successive sulle 156 zone di allerta (vedi figura) in cui è suddiviso il territorio italiano. Il documento viene pubblicato ogni giorno, di norma, alle 16.00.

Le zone definite dalla Protezione Civile non combaciano con le province italiane per cui il primo problema da risolvere è individuare la zona di appartenenza di ciascuna città italiana. Per fare questo utilizzo il seguente script python.

import shapefile
from shapely.geometry import Point 
from shapely.geometry import shape 
import csv

# Apro il formato shape dei dati
shp = shapefile.Reader('data/20180502_1615_today') 

# leggo tutti i poligoni
all_shapes = shp.shapes() 

# e tutte le informazioni associate ai poligoni
all_records = shp.records()

# ottengo il numero dei poligoni
len_shapes = len(all_shapes)

# inizializzo un file CSV in scrittura
ofile  = open('comuni-con-zone.csv', "w")
writer = csv.writer(ofile, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)

rownum = 0

# il file comuni.csv contiene tutte le città italiane con le relative latitudini e longitudini
with open("comuni.csv", "r") as f:
    reader = csv.reader(f)
    for row in reader:
        
        # la prima riga la salto perchè è l'header
        if rownum == 0:
            header = row
            header.append('zona_protezione_civile')
            writer.writerow(header)
            rownum+=1
        else:
            # per ogni città mi creo un oggetto Point a cui passo
            # nel costruttore la latitudine e la longitudine
            point = Point(float(row[4]), float(row[3]))
            
            # devo capire dentro quale shape si trova il punto 
            # per cui ciclo su tutti i poligoni della protezione civile    
            for i in range(len_shapes):
                # leggo il poligono i-esimo
                boundary = all_shapes[i] 
                
                # se il punto, cioè la città, si trova dentro il poligono
                if point.within(shape(boundary)):  
                    # aggiungo la zona alla riga
                    row.append(all_records[i][0])
                    # e la salvo in un nuovo file CSV
                    writer.writerow(row)
                    break

Alla fine dello script verrà creato un nuovo file CSV chiamato comuni-con-zone.csv identico al file di partenza comuni.csv con in più la colonna zona della Protezione Civile per ogni città.

Questa è la parte più difficile di tutta l’applicazione. Una volta estratte le zone di ogni città il passo è breve. Nello stesso zip che contiene il formato SHP dei dati sono presenti due file CSV contenenti le previsioni della protezione civile del giorno stesso e del giorno successivo, le tipologie di rischio e il livello di allerta. Sempre con uno script python leggo questi dati, li organizzo secondo le mie necessità e li salvo banalmente su un db mysql. Quest’ultimo script lo collego ad un job cron che quotidianamente mi aggiornerà i dati del db.

La parte dell’applicazione relativa alla data integration è conclusa. Vediamo adesso come implementare la web-application.

Per generare la richiesta API e il feed RSS viene sviluppata un’interfaccia Web in grado di configurare le opzioni in modo da massimizzarne la flessibilità.

Secondo i seguenti parametri API:

Di seguito come appare l’interfaccia Web.

La web-application, di fatto un configuratore delle API, è di utilizzo immediato.
Basta scegliere la città di interesse, il rischio, la soglia minima di allerta, il giorno di interesse, il formato e il gioco è fatto!

Flusso JSON

Feed RSS

N.B. Con la scelta della soglia minima di allerta il flusso verrà generato solo se l’allerta è maggiore o uguale a quella scelta. Per cui, se l’allerta scelta è quella arancione, il flusso conterrà eventuali allerte arancioni e rosse ma non bianche e gialle.

L’applicazione si trova al seguente indirizzo:

Protezione Civile POP

Nei prossimi post vedremo come agganciare i feed RSS ad altri servizi esterni, come ad esempio Facebook, Twitter e Telegram.

Se questo progetto ti è piaciuto, mi aiuti a farlo conoscere con un tweet?

Per consigli, feedback, suggerimenti, bug potete inserire una issue su questo repository.

Grazie!

That’s all folks! Stay tuned!

Comments