Mappa interattiva dell’Italia in tempo reale che mostra l’indice di stress da calore WBGT (Wet Bulb Globe Temperature, ISO 7243), costruita con ixMaps.
Mappa live: https://gjrichter.github.io/stage/live/temperature_attuali_wbgt_kde.html
File: stage/live/temperature_attuali_wbgt_kde.html
L’obiettivo è andare oltre la semplice temperatura dell’aria e mostrare come cambia la pressione del caldo sul corpo umano, mettendo a confronto sulla stessa mappa diversi livelli di lettura della situazione termica:
Passando da una modalità all’altra si vede come la stessa giornata si trasforma: una temperatura moderata può nascondere uno stress elevato in presenza di alta umidità e sole intenso, mentre aria secca e ventilata possono ridurre lo stress reale anche con temperature alte. Confrontare misurata → percepita/WBGT rende visibile questa differenza, che è ciò che conta per la salute delle persone.
Target: offrire una lettura immediata del rischio termico in Italia. I due indici servono pubblici diversi:
Avere entrambi sulla stessa mappa permette a ciascun pubblico di leggere la situazione con l’indice giusto per il proprio scopo.
Tutti i modelli di stress sono calcolabili perché MeteoHub serve tutti i valori necessari (temperatura, umidità, vento e radiazione solare) dalla stessa rete di stazioni. Un’unica differenza pratica: il WBGT ha meno punti delle altre modalità, perché la radiazione solare è misurata solo da un sottoinsieme di stazioni — e senza quel dato la temperatura del globo non è calcolabile.
All’apertura la mappa parte in modalità WBGT: ogni stazione è un grafico a lollipop colorato secondo le fasce di rischio ISO 7243, sovrapposto a un campo KDE (interpolazione spaziale) colorato con le stesse fasce. L’utente può passare a tre altre modalità: Temperature misurate, Temperature percepite, Umidità.
I dati provengono dall’API REST di MeteoHub (Agenzia ItaliaMeteo —
https://meteohub.agenziaitaliameteo.it/api/observations), la piattaforma
meteorologica nazionale che aggrega oltre 4000 stazioni e 3 milioni di
osservazioni giornaliere. L’endpoint accetta una query sul reftime (timestamp
in UTC) e sul codice prodotto BUFR, restituendo le ultime osservazioni in JSON.
Una GitHub Action (fetch-meteohub-data.yml, repo data) interroga l’API
ogni ora filtrando esplicitamente la licenza CCBY_COMPLIANT (solo dati
ridistribuibili con attribuzione, CC-BY), con reliabilityCheck=true e last=true
per prendere il valore più recente e verificato di ciascuna stazione. Scarica
quattro variabili BUFR, le salva come file JSON nel repo data e li commit-pusha;
da lì sono servite via CDN jsDelivr (cache globale) e consumate dalla mappa
insieme a un metadata.json con l’ora dell’ultimo aggiornamento.
| Codice BUFR | Variabile | Uso |
|---|---|---|
B12101 |
Temperatura aria a 2 m | Ta |
B13003 |
Umidità relativa a 2 m | RH → Tnw |
B11002 |
Velocità vento a 10 m | v → Tg |
B14198 |
Irradiazione solare (W/m²) | S → Tg |
La pipeline è completamente serverless: nessun backend, solo l’Action schedulata + file statici su CDN.
La temperatura apparente (AT) usa la formula semplificata BOM/Steadman, valida sia per il caldo che per il freddo:
AT = Ta + 0.33·e − 0.70·v − 4
e = (RH / 100) · 6.105 · exp( 17.27·Ta / (237.7 + Ta) )
L’umidità (tramite e) alza la temperatura percepita, il vento la abbassa.
Bastano quindi temperatura, umidità e vento — variabili presenti in quasi tutte
le stazioni — quindi la modalità Temperature percepite copre molti più punti del
WBGT, che richiede in più la radiazione solare.
Per ogni stazione che dispone del dato di radiazione solare:
WBGT = 0.7·Tnw + 0.2·Tg + 0.1·Ta
Tg = T + 0.0146·S − 0.70·vLe stazioni senza dato solare (necessario per Tg) non vengono calcolate → circa 226 stazioni attive. Questo è il motivo per cui il WBGT copre meno stazioni della temperatura percepita.
Prima del calcolo:
min = Q1 − 3·IQR, max = Q3 + 3·IQR> 105% o < 0% scartati come errori di sensore| Modalità | Variabile | KDE |
|---|---|---|
| Temperature misurate | temperatura aria | anomalie (campo rosso sopra la media) |
| Temperature percepite | temperatura apparente (BOM/Steadman) | anomalie |
| Umidità | umidità relativa, celle aggregate | nessuno |
| WBGT | stress termico ISO 7243 | fasce di rischio |
Il KDE delle anomalie normalizzava la deviazione dividendo per la media
((T − media) / |media| · 100). Questo amplificava le anomalie a basse
temperature: una differenza di 3 °C valeva ~60% in inverno (media 5 °C) contro
~10% in estate (media 30 °C), facendo apparire rosso scuro anche senza calore reale.
Per mediare, il campo viene moltiplicato per un inviluppo basato sulla temperatura assoluta locale interpolata:
env = clamp( (T_locale − T_LO) / (T_HI − T_LO), 0, 1 ) con T_LO = 24 °C, T_HI = 33 °C
valore_KDE = deviazione · env
Il rosso scuro richiede quindi sia un’anomalia positiva sia una temperatura realmente alta. Esempi:
| Scenario | media → picco | deviazione | inviluppo | risultato |
|---|---|---|---|---|
| Freddo | 5 → 8 °C | 60% | 0.00 | non disegnato |
| Mite | 22 → 27 °C | 23% | 0.33 | 7.6 (chiaro) |
| Caldo | 33 → 37 °C | 12% | 1.00 | 12 (moderato) |
| Afa | 30 → 40 °C | 33% | 1.00 | 33 (rosso scuro) |
Le soglie KDE_T_LO / KDE_T_HI sono costanti regolabili nel codice.
Colori del KDE in modalità WBGT:
| Colore | WBGT | Rischio |
|---|---|---|
🔵 #4575b4 |
< 18 °C | nessun rischio |
🟢 #66bd63 |
18–25 °C | rischio basso |
🟠 #fdae61 |
25–28 °C | rischio moderato |
🔴 #a50026 |
28–30 °C | rischio alto |
🟣 #4d0026 |
> 30 °C | molto alto / pericoloso |
| AT (BOM/Steadman) | WBGT (ISO 7243) | |
|---|---|---|
| Uso | comfort percepito, bollettini | sicurezza lavoro / sport |
| Radiazione solare | no | sì (temperatura globo) |
| Vento | esplicito | implicito (bulbo umido) |
| Umidità | pressione vapore | bulbo umido |
| Soglie normative | no | sì |
Il WBGT può risultare più basso sia della temperatura apparente sia della temperatura misurata: con aria secca e ventilata il bulbo umido scende molto sotto l’aria secca, perché la sudorazione raffredda in modo efficiente. È questo che lo rende l’indice corretto per valutare il rischio fisiologico (usato da medici del lavoro, eserciti, comitati olimpici).
Dati: MeteoHub — ItaliaMeteo (licenza CC-BY) · Visualizzazione: iXMaps / Data Viz Italia