Last active
July 16, 2021 13:56
-
-
Save gpirrotta/43697a050dfc1e5807a43f72aa1ae32d to your computer and use it in GitHub Desktop.
Script per la generazione di un file JSON contenente il livello di allerta estratto dai bollettini meteo PDF pubblicati giornalmente dalla Protezione Civile della Regione Sicilia
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
# Script per la generazione di un file JSON contenente il livello di allerta | |
# estratto dai bollettini meteo PDF pubblicati giornalmente dalla Protezione Civile della Regione Sicilia | |
# http://www.regione.sicilia.it/presidenza/protezionecivile/pp/archivio_idro.asp | |
# Giovanni Pirrotta - giovanni.pirrotta@gmail.com | |
# 2017 | |
import os | |
import requests | |
import datetime | |
from bs4 import BeautifulSoup | |
import collections | |
import json | |
import re | |
from PIL import Image | |
# Restituisce il vettore contenente le componenti di colore (rgb) del pixel passato in input | |
def get_pixel(image, i, j): | |
width, height = image.size | |
if i > width or j > height: | |
return None | |
pixel = image.getpixel((i, j)) | |
return pixel | |
# Restituisce il livello di rischio relativo al colore passato in in put | |
def get_allerta(r,g,b): | |
if r == 0 and g == 255 and b == 0: | |
return 'ALLERTA VERDE - GENERICA VIGILANZA' | |
elif r == 255 and g == 255 and b == 0: | |
return 'ALLERTA GIALLA - ATTENZIONE' | |
elif r == 255 and g == 204 and b == 0: | |
return 'ALLERTA ARANCIONE - PREALLARME' | |
elif r == 255 and g ==0 and b==0: | |
return 'ALLERTA ROSSA - ALLARME' | |
else: | |
return '' | |
url = 'http://www.regione.sicilia.it/presidenza/protezionecivile/pp/archivio_idro.asp' | |
WEB_ROOT_URL = 'http://www.regione.sicilia.it/presidenza/protezionecivile/' | |
# Mi collego all'URL dell'archivio dei bollettini meteo e individuo il link dell'ultimo PDF pubblicato | |
r = requests.get(url) | |
html = r.text | |
soup = BeautifulSoup(html, 'lxml') | |
pattern = 'Avviso rischio idrogeologico per il (.*)' | |
first_row = soup.find('td',{'class':'testo_tabelle_cent'}) | |
text = first_row.text | |
m = re.match(pattern,text) | |
if m: | |
primo_giorno_text = (m.group(1)) | |
primo_giorno = datetime.datetime.strptime(primo_giorno_text, '%d/%m/%Y') | |
secondo_giorno = primo_giorno + datetime.timedelta(days=+1) | |
secondo_giorno_text = secondo_giorno.strftime("%d/%m/%Y") | |
if first_row.a: | |
link = first_row.a.get('href') | |
if link: | |
href = link[3:] | |
full_url = WEB_ROOT_URL + href | |
file_pdf = 'protezione-civile.pdf' | |
file_png = 'protezione-civile.png' | |
# Download del file PDF | |
wget_cmd = 'wget -O ' + file_pdf + ' "' +full_url + '"' | |
os.system(wget_cmd) | |
# Conversione della prima pagina PDF in formato PNG | |
cmd = 'convert '+ file_pdf + '[0] ' + file_png | |
os.system(cmd) | |
# Dizionario delle zone inizializzato con le posizioni dei pixel da analizzare. | |
pixel_sicilia_zone_primo_giorno = {} | |
pixel_sicilia_zone_primo_giorno['A'] = [262,174] | |
pixel_sicilia_zone_primo_giorno['B'] = [182, 188] | |
pixel_sicilia_zone_primo_giorno['C'] = [105, 186] | |
pixel_sicilia_zone_primo_giorno['D'] = [106, 208] | |
pixel_sicilia_zone_primo_giorno['E'] = [170, 230] | |
pixel_sicilia_zone_primo_giorno['F'] = [219, 269] | |
pixel_sicilia_zone_primo_giorno['G'] = [248, 266] | |
pixel_sicilia_zone_primo_giorno['H'] = [222, 216] | |
pixel_sicilia_zone_primo_giorno['I'] = [246, 202] | |
pixel_sicilia_zone_secondo_giorno = {} | |
pixel_sicilia_zone_secondo_giorno['A'] = [520,174] | |
pixel_sicilia_zone_secondo_giorno['B'] = [438, 188] | |
pixel_sicilia_zone_secondo_giorno['C'] = [364, 186] | |
pixel_sicilia_zone_secondo_giorno['D'] = [364, 209] | |
pixel_sicilia_zone_secondo_giorno['E'] = [431, 230] | |
pixel_sicilia_zone_secondo_giorno['F'] = [477, 268] | |
pixel_sicilia_zone_secondo_giorno['G'] = [506, 265] | |
pixel_sicilia_zone_secondo_giorno['H'] = [480, 216] | |
pixel_sicilia_zone_secondo_giorno['I'] = [504, 202] | |
# Setup struttura per la generazione del file JSON | |
previsioni = {} | |
previsioni['fonte'] = 'Regione Siciliana - Dipartimento della Protezione Civile' | |
previsioni['allerta_meteo'] = {} | |
previsioni['allerta_meteo']['date'] = [] | |
previsioni['allerta_meteo']['url'] = full_url.replace(' ', '%20') | |
prev = collections.OrderedDict() | |
prev[primo_giorno_text] = collections.OrderedDict() | |
prev[secondo_giorno_text] = collections.OrderedDict() | |
picture = Image.open(file_png) | |
for zona in ['A','B','C','D','E','F','G','H','I']: | |
rgb = get_pixel(picture, pixel_sicilia_zone_primo_giorno[zona][0], pixel_sicilia_zone_primo_giorno[zona][1]) | |
allerta = get_allerta(rgb[0], rgb[1], rgb[2]) | |
prev[primo_giorno_text]['ZONA ' + zona]= allerta | |
for zona in ['A','B','C','D','E','F','G','H','I']: | |
rgb = get_pixel(picture, pixel_sicilia_zone_secondo_giorno[zona][0], pixel_sicilia_zone_secondo_giorno[zona][1]) | |
allerta = get_allerta(rgb[0], rgb[1], rgb[2]) | |
prev[secondo_giorno_text]['ZONA ' + zona]= allerta | |
previsioni['allerta_meteo']['date'] = prev | |
# Creazione del file JSON e salvataggio in un file | |
with open('allerta.json', 'w') as f: | |
json.dump(previsioni, f, ensure_ascii=False) | |
# Pubblicazione su un server Web pubblico | |
move_cmd = 'mv allerta.json ../../gpirrotta.tk/regione-siciliana/protezione-civile/allerta.json' | |
os.system(move_cmd) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment