Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save gpirrotta/43697a050dfc1e5807a43f72aa1ae32d to your computer and use it in GitHub Desktop.
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
# 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