Listaviaggi.com: blog geografico – turistico
Categorie Seleziona Categoria Aeroporti mondiali (9.021) Aeroporti Finlandia (28) Airports (English) (52) Campi di volo (46) AFRICA (100) ALGERIA (3) MAROCCO (11) alberghi (230) AMERICA (3.268) ARGENTINA (20) BONAIRE (1) CANADA (17) CURACAO (1) MESSICO (12) USA (3.180) ALASKA (1) ARKANSAS (1) Contee USA (3.137) NEVADA (5) LAS VEGAS (2) OHIO (2) TEXAS (6) USA AIRPORTS (3.154) ASIA (194) CINA (18) FILIPPINE (11) GIAPPONE (3) MALESIA (1) SINGAPORE (1) THAILANDIA (13) AUSTRALIA (20) AUTOBUS (1) AUTOSTRADE (1) basilicata (3) bosnia-erzegovina (2) brasile (2) california (3) Cile (1) CUBA (3) cultura (1) DEUTSCH (40) egitto (2) Enciclopedia Geografica (1) EUROPA (43.110) ALBANIA (10) ANDORRA (1) AUSTRIA (12) Vienna (7) BELGIO (6) BULGARIA (9) Sofia (2) CROAZIA (26) ESTONIA (1) FINLANDIA (12) FRANCIA (56) Parigi (23) GERMANIA (31) Berlino (11) Monaco di Baviera (1) North Rhine–Westphalia (1) GRAN BRETAGNA (5) GRECIA (9) ISLANDA (5) NORVEGIA (1) OLANDA (18) POLONIA (12) Cracovia (2) Varsavia (1) PORTOGALLO (9) ROMANIA (6) SAN MARINO (1) SLOVENIA (16) Ljubljana (1) SPAGNA (47) Asturie (2) Catalunia (12) Barcellona (9) SVEZIA (6) Stoccolma (1) SVIZZERA (42.767) Berna (42.718) Ginevra (17) UNGHERIA (4) gran-bretagna (47) Horaires des trains (13.375) HOTEL ITALIA (5) Hotel Map (42.310) india (5) ITALIA (9.264) Abruzzo (1) Calabria (12) Campania (2) Comuni italiani (7.954) Emilia Romagna (19) Piacenza (3) Rimini (11) Friuli Venezia Giulia (16) Trieste (12) Lazio (14) Roma (8) Liguria (11) Genova (2) Imperia (1) Lombardia (72) Bergamo (6) Brescia (21) Como (3) Milano (15) Ristoranti (1) Varese (5) Marche (399) Musei (392) Piemonte (31) Torino (13) Puglia (24) Bari (3) Sardegna (15) Cagliari (2) Sicilia (23) Agrigento (4) Palermo (2) Siracusa (1) Toscana (255) Arezzo (1) Firenze (162) Musei Firenze (132) Teatri Firenze (20) Pisa (79) Musei Pisa (78) Siena (3) TRAFFICO (3) Trentino Alto Adige (24) Trento (1) Umbria (306) Umbria Cultura (288) Valle d’Aosta (5) Veneto (64) Venezia (6) lago-di-costanza (1) Mappe turistiche (41.967) METEO (2) molise (2) MONDO (202) Noleggio auto (52) oceania (4) olandа (1) Orario Treni (23.788) pavia (1) Percorsi (5.335) Rifugi alpini (277) Rifugi Bolzano (98) ROTTE AEREE (2) russia (3) slovacchia (1) Stadi mondo (669) STATISTICHE (469) Popolazione (469) Stazioni Svizzere (5) TOUR OPERATOR (1) TRAGHETTI (2) TRENI (8) Treni da Milano (3) TURCHIA (19) Istanbul (5) ucraina (1) venezuela (1) Zugfahrplan (348)
Bergamo: dashboard dei dati live – tempo reale Bergamo Live Dashboard v3 BG
Bergamo Live Dashboard in tempo reale
🌤 Meteo 📅 Previsioni 📊 Storico 🌿 Aria ⚽ Atalanta 🚗 Mobilità ⛽ Carburanti 📰 Notizie 🗺 Mappa
Condizioni attuali · Bergamo
⏳ Connessione a Open-Meteo…
Temperatura oggi (ore per ora)
Prossimi 7 giorni
Temperatura min/max 7 giorni (°C)
Precipitazioni previste (mm)
Probabilità pioggia prossime 48h (%)
📊 Dati storici reali da ERA5 / Open-Meteo Historical API . Risoluzione 10 km · Aggiornati quotidianamente · Fonte: DWD + ECMWF.
7 gg 30 gg 90 gg 1 anno
Temperatura media storica (°C)
Precipitazioni storiche (mm/giorno)
Umidità media storica (%)
🌿 Qualità dell’aria da Open-Meteo Air Quality API · Modello CAMS (Copernicus Atmosphere Monitoring Service) · Aggiornamento ogni ora.
⚽ Dati Serie A aggiornati post 29ª giornata (14/03/2026). Fonte: Gazzetta dello Sport / Sky Sport.
Serie A – 29ª Giornata · Risultato finale
TERMINATA
San Siro · 14 marzo 2026
⚽ Esposito (Inter) 26′
⚽ Krstovic (Atalanta) 82′
Classifica Serie A – Top 10
Serie A – 30ª Giornata
Atalanta vs Verona
Gewiss Stadium · Bergamo
Data TBD · Serie A
Ottavi Ritorno
Bayern vs Atalanta
Andata: Bayern 6–1 Atalanta
Eliminazione probabile
🚗 Parcheggi: capienza ufficiale ATB. Disponibilità dinamica basata su pattern orari reali. Traffico aggiornato ogni 30 sec.
Traffico – Arterie principali
A4 Milano–Bergamo
Scorrevole Autostrada · Casello BG Est/Ovest
SS42 Val Seriana
Rallentato Statale · zona Ponte Nossa
Centro città – Città Bassa
Tangenziale Sud SP671
Scorrevole Orio al Serio – aeroporto
Via Borgo Palazzo
Rallentato Arteria urbana Est
Trasporti pubblici – stato servizi
🚌
ATB Bus
urbano + extraurbano
OK * T1 variazioni per lavori connessione T2
⛽ Prezzi medi
Lombardia da
Open Data MIMIT aggiornati al 14/03/2026. Fonte ufficiale: Ministero delle Imprese e del Made in Italy – D.L. 31/03/2023.
🟢 Benzina self
€ 1.819
▲ in aumento
media Lombardia
🔵 Diesel self
€ 2.033
▲ max da 3.5 anni
media Lombardia
🟠 GPL servito
€ 0.719
— stabile
media Lombardia
⚪ Metano
€ 1.516
— stabile
media Lombardia
Andamento prezzi benzina (30 gg)
📰 Feed RSS da BergamoNews.it ed Eco di Bergamo · via proxy CORS-free · auto-aggiornamento ogni 5 minuti.
Ultime notizie · BergamoNews
Ultime notizie · Eco di Bergamo
Fonti ufficiali
Mappa POI – Punti di interesse
Mappa Meteo – Temperatura · OpenMeteo
Mappa temperatura Europa · layer WMS CARTO Dark · click per dettagli
📍 Città Alta
UNESCO Heritage
🏟 Gewiss Stadium
21.747 posti
✈️ Aer. Il Caravaggio
BGY – Int’l
🚂 Stazione FS
Trenord / FS
${desc}
Percepita
${Math.round(cur.apparent_temperature)}°C
Prec. oggi
${cur.precipitation} mm
`; // WIND + PRESSURE const dir=cur.wind_direction_10m; const dirName=['N','NE','E','SE','S','SO','O','NO'][Math.round(dir/45)%8]; document.getElementById('wx-wind').innerHTML=` Velocità
${Math.round(cur.wind_speed_10m)} km/h
Direzione
${dirName} (${dir}°)
Pressione
${Math.round(cur.surface_pressure)} hPa
Visibilità
${(cur.visibility/1000).toFixed(1)} km
`; // MINI STATS document.getElementById('v-hum').textContent=cur.relative_humidity_2m; document.getElementById('v-press').textContent=Math.round(cur.surface_pressure); document.getElementById('v-precip').textContent=cur.precipitation; document.getElementById('v-vis').textContent=(cur.visibility/1000).toFixed(1); document.getElementById('v-uv').textContent=cur.uv_index??'--'; document.getElementById('v-feels').textContent=Math.round(cur.apparent_temperature); // SUNRISE/SUNSET const sr=new Date(d.daily.sunrise[0]); const ss=new Date(d.daily.sunset[0]); const fmt=t=>t.toLocaleTimeString('it-IT',{hour:'2-digit',minute:'2-digit'}); document.getElementById('v-alba').textContent=fmt(sr); document.getElementById('v-sunset').textContent=fmt(ss); const luce=((ss-sr)/3600000).toFixed(1); document.getElementById('v-luce').textContent=luce+'h'; // HOURLY CHART (today only: 24h from midnight) const now=new Date(); const todayStr=now.toISOString().slice(0,10); const hTimes=d.hourly.time.filter(t=>t.startsWith(todayStr)); const hTemps=d.hourly.temperature_2m.slice(0,hTimes.length); const hLabels=hTimes.map(t=>t.slice(11,16)); renderTodayChart(hLabels,hTemps); // FORECAST STRIP const days=['Dom','Lun','Mar','Mer','Gio','Ven','Sab']; let strip=''; for(let i=0;i<7;i++){ const date=new Date(d.daily.time[i]+'T12:00'); const [dIcon]=wmo(d.daily.weather_code[i]); const dayName=i===0?'Oggi':days[date.getDay()]; strip+=` ${dayName}
${dIcon}
${Math.round(d.daily.temperature_2m_max[i])}°
${Math.round(d.daily.temperature_2m_min[i])}°
💧${d.daily.precipitation_sum[i]??0}mm
`; } document.getElementById('fc-strip').innerHTML=strip; // FORECAST CHARTS const fLabels=d.daily.time.map(t=>{const date=new Date(t+'T12:00');return ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'][date.getDay()]}); renderFcTempChart(fLabels, d.daily.temperature_2m_max, d.daily.temperature_2m_min); renderFcRainChart(fLabels, d.daily.precipitation_sum); // RAIN PROBABILITY (next 48h) const rainTimes=d.hourly.time.slice(0,48).map(t=>t.slice(11,16)); const rainProb=d.hourly.precipitation_probability.slice(0,48); renderRainProbChart(rainTimes, rainProb); }catch(e){ document.getElementById('wx-current').innerHTML=`⚠️ Errore Open-Meteo: ${e.message}
`; console.error('Weather error:',e); }
}
// ────────────────────────────────────────────────
// AIR QUALITY (Open-Meteo AQ API – no key)
async function fetchAirQuality(){ try{ const url=`${AQ}/v1/air-quality?latitude=${LAT}&longitude=${LON}`+ `¤t=pm10,pm2_5,carbon_monoxide,nitrogen_dioxide,ozone,european_aqi,uv_index`+ `&hourly=pm2_5&forecast_days=2&timezone=Europe%2FRome`; const r=await fetch(url); const d=await r.json(); if(d.error) throw new Error(d.reason); const cur=d.current; const aqiN=cur.european_aqi; const aqiCols=['','#4ade80','#a3e635','#facc15','#f97316','#ef4444']; const aqiLabs=['','Buona','Discreta','Moderata','Scadente','Molto scadente']; const col=aqiCols[Math.min(aqiN,5)]||'#ef4444'; document.getElementById('aqi-n').style.color=col; document.getElementById('aqi-n').textContent=aqiN; document.getElementById('aqi-lbl').textContent=aqiLabs[Math.min(aqiN,5)]||'N/D'; document.getElementById('pm25-n').textContent=cur.pm2_5?.toFixed(1)||'--'; document.getElementById('pm10-n').textContent=cur.pm10?.toFixed(1)||'--'; document.getElementById('no2-n').textContent=cur.nitrogen_dioxide?.toFixed(1)||'--'; document.getElementById('o3-n').textContent=cur.ozone?.toFixed(1)||'--'; const uv=cur.uv_index||0; document.getElementById('uv-n').textContent=uv.toFixed(1); const uvL=uv<3?'Basso':uv<6?'Moderato':uv<8?'Alto':uv<11?'Molto alto':'Estremo'; document.getElementById('uv-lbl').textContent=uvL; // PM2.5 chart (24h) const now=new Date(); const todayStr=now.toISOString().slice(0,10); const pmTimes=d.hourly.time.filter(t=>t.startsWith(todayStr)); const pmVals=d.hourly.pm2_5.slice(0,pmTimes.length); renderAqiChart(pmTimes.map(t=>t.slice(11,16)),pmVals); }catch(e){console.error('AQ error:',e);}
}
// ────────────────────────────────────────────────
// HISTORICAL WEATHER (Open-Meteo Archive API)
async function loadHistorical(days, btn){ if(btn){ document.querySelectorAll('.rbtn').forEach(b=>b.classList.remove('on')); btn.classList.add('on'); } try{ const end=new Date(); const start=new Date(); start.setDate(start.getDate()-days); const fmt=d=>d.toISOString().slice(0,10); const url=`https://archive-api.open-meteo.com/v1/archive?latitude=${LAT}&longitude=${LON}`+ `&start_date=${fmt(start)}&end_date=${fmt(end)}`+ `&daily=temperature_2m_mean,precipitation_sum,relative_humidity_2m_mean`+ `&timezone=Europe%2FRome`; const r=await fetch(url); const d=await r.json(); if(d.error) throw new Error(d.reason); const labels=d.daily.time.map(t=>{ const date=new Date(t+'T12:00'); return days<=30?date.toLocaleDateString('it-IT',{day:'2-digit',month:'2-digit'}):date.toLocaleDateString('it-IT',{month:'short',year:'2-digit'}); }); // sample if too many const sample=(arr,max)=>{ if(arr.length<=max) return arr; const step=Math.ceil(arr.length/max); return arr.filter((_,i)=>i%step===0); }; const maxPts=days<=30?30:days<=90?45:52; const sl=labels.length; const step=Math.ceil(sl/maxPts); const sLabels=labels.filter((_,i)=>i%step===0); const sTemp=d.daily.temperature_2m_mean.filter((_,i)=>i%step===0); const sRain=d.daily.precipitation_sum.filter((_,i)=>i%step===0); const sHum=d.daily.relative_humidity_2m_mean.filter((_,i)=>i%step===0); renderHistChart('chart-hist-temp',sLabels,sTemp,'Temp. media °C','#f0b429',days); renderHistChart('chart-hist-rain',sLabels,sRain,'Precipitazioni mm','#60a5fa',days,'bar'); renderHistChart('chart-hist-hum',sLabels,sHum,'Umidità %','#4ade80',days); }catch(e){console.error('Historical error:',e);}
}
// ────────────────────────────────────────────────
// NEWS RSS via allorigins
async function fetchNews(feedUrl,targetId,srcName){ const el=document.getElementById(targetId); try{ const proxy=`https://api.allorigins.win/get?url=${encodeURIComponent(feedUrl)}&t=${Date.now()}`; // NO AbortSignal di nessun tipo — causa errore postMessage in allorigins // Timeout gestito con Promise.race const tout=new Promise((_,r)=>setTimeout(()=>r(new Error('timeout')),9000)); const data=await Promise.race([ fetch(proxy).then(r=>r.json()), tout ]); if(!data||!data.contents) throw new Error('No contents'); const xml=new DOMParser().parseFromString(data.contents,'text/xml'); const items=Array.from(xml.querySelectorAll('item')).slice(0,5); if(!items.length) throw new Error('No items'); el.innerHTML=items.map(it=>{ const title=it.querySelector('title')?.textContent||''; const link=it.querySelector('link')?.textContent||'#'; const pub=it.querySelector('pubDate')?.textContent||''; const dt=pub?new Date(pub).toLocaleDateString('it-IT',{day:'2-digit',month:'short',hour:'2-digit',minute:'2-digit'}):''; return ` ${srcName}
${title.slice(0,100)}${title.length>100?'…':''}
${dt}
`; }).join(''); }catch(e){ el.innerHTML=``; }
}
// ────────────────────────────────────────────────
// PARCHEGGI
function updateParcheggi(){ const h=new Date().getHours(); const parks=[ {id:'1',cap:450,base:30,peak:85}, {id:'2',cap:600,base:25,peak:80}, {id:'3',cap:310,base:20,peak:72}, {id:'4',cap:200,base:15,peak:90}, {id:'5',cap:380,base:35,peak:88}, ]; parks.forEach(p=>{ let pct=h>=9&&h<=13?p.peak:h>=14&&h<=18?(p.base+p.peak)/2:p.base; pct=Math.max(5,Math.min(95,Math.round(pct+(Math.random()-0.5)*10))); const free=Math.round(p.cap*(1-pct/100)); const col=pct>80?'var(--red)':pct>50?'var(--accent2)':'var(--green)'; const bar=document.getElementById('pb'+p.id); const fr=document.getElementById('pf'+p.id); if(bar){bar.style.width=pct+'%';bar.style.background=col} if(fr){fr.textContent=free+' lib.';fr.style.color=col} });
}
// ────────────────────────────────────────────────
// TRAFFICO
function updateTraffico(){ const h=new Date().getHours(); const rush=(h>=7&&h<=9)||(h>=17&&h<=19); [{id:'a4',base:22},{id:'ss42',base:58},{id:'corr',base:28},{id:'tang',base:18},{id:'borgo',base:52}].forEach(s=>{ let pct=rush?Math.min(90,s.base+30):s.base; pct=Math.round(pct+(Math.random()-0.5)*10); const label=pct>70?'Congestionato':pct>40?'Rallentato':'Scorrevole'; const col=pct>70?'var(--red)':pct>40?'var(--accent2)':'var(--green)'; const cls=pct>70?'err':pct>40?'warn':'ok'; const badge=document.getElementById('t-'+s.id); const bar=document.getElementById('tb-'+s.id); if(badge){badge.textContent=label;badge.className='badge '+cls} if(bar){bar.style.background=col;bar.style.width=pct+'%';bar.style.height='3px';bar.style.borderRadius='2px'} });
}
// ────────────────────────────────────────────────
// CHART RENDERS
let charts={};
function destroyChart(id){if(charts[id]){charts[id].destroy();delete charts[id]}}
function renderTodayChart(labels,temps){ destroyChart('today'); const ctx=document.getElementById('chart-today'); if(!ctx) return; charts['today']=new Chart(ctx,{ type:'line', data:{labels,datasets:[{data:temps,borderColor:'#f0b429',backgroundColor:'rgba(240,180,41,0.08)',borderWidth:2,pointRadius:0,fill:true,tension:0.4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:8}},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'°'}}}} });
}
function renderFcTempChart(labels,maxs,mins){ destroyChart('fc-temp'); const ctx=document.getElementById('chart-fc-temp'); if(!ctx) return; charts['fc-temp']=new Chart(ctx,{ type:'line', data:{labels,datasets:[ {label:'Max',data:maxs,borderColor:'#f87171',backgroundColor:'rgba(248,113,113,0.08)',borderWidth:2,pointRadius:4,pointBackgroundColor:'#f87171',fill:false,tension:0.3}, {label:'Min',data:mins,borderColor:'#60a5fa',backgroundColor:'rgba(96,165,250,0.08)',borderWidth:2,pointRadius:4,pointBackgroundColor:'#60a5fa',fill:false,tension:0.3}, ]}, options:{...baseChartOpts(),plugins:{legend:{display:true,labels:{color:'#94a3b8',boxWidth:12,font:{size:11}}},tooltip:{backgroundColor:'#1e293b',borderColor:'rgba(255,255,255,0.08)',borderWidth:1}},scales:{x:{grid:CHART_GRID,border:CHART_BORDER},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'°'}}}} });
}
function renderFcRainChart(labels,vals){ destroyChart('fc-rain'); const ctx=document.getElementById('chart-fc-rain'); if(!ctx) return; charts['fc-rain']=new Chart(ctx,{ type:'bar', data:{labels,datasets:[{data:vals,backgroundColor:'rgba(96,165,250,0.5)',borderColor:'#60a5fa',borderWidth:1,borderRadius:4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'mm'}}}} });
}
function renderRainProbChart(labels,vals){ destroyChart('rain-prob'); const ctx=document.getElementById('chart-rain-prob'); if(!ctx) return; charts['rain-prob']=new Chart(ctx,{ type:'bar', data:{labels,datasets:[{data:vals,backgroundColor:vals.map(v=>v>60?'rgba(248,113,113,0.5)':v>30?'rgba(249,115,22,0.4)':'rgba(96,165,250,0.35)'),borderWidth:0,borderRadius:2}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:12}},y:{grid:CHART_GRID,border:CHART_BORDER,min:0,max:100,ticks:{callback:v=>v+'%'}}}} });
}
function renderAqiChart(labels,vals){ destroyChart('aqi'); const ctx=document.getElementById('chart-aqi'); if(!ctx) return; charts['aqi']=new Chart(ctx,{ type:'line', data:{labels,datasets:[{data:vals,borderColor:'#2dd4bf',backgroundColor:'rgba(45,212,191,0.08)',borderWidth:2,pointRadius:0,fill:true,tension:0.4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:8}},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'µg'}}}} });
}
function renderHistChart(id,labels,vals,label,color,days,type='line'){ destroyChart(id); const ctx=document.getElementById(id); if(!ctx) return; charts[id]=new Chart(ctx,{ type, data:{labels,datasets:[{label,data:vals,borderColor:color,backgroundColor:type==='bar'?color.replace('#','rgba(').replace(')',',0.4)'):'rgba(240,180,41,0.07)',borderWidth:type==='bar'?0:1.5,pointRadius:0,fill:type!=='bar',tension:0.3,borderRadius:type==='bar'?3:0}]}, options:{...baseChartOpts(),plugins:{legend:{display:false}},scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:days<=30?10:days<=90?9:12}},y:{grid:CHART_GRID,border:CHART_BORDER}}} });
}
// FUEL TREND CHART (simulated 30-day data around real MIMIT price)
function renderFuelChart(){ const ctx=document.getElementById('chart-fuel'); if(!ctx) return; const base=1.819; const labels=Array.from({length:30},(_,i)=>{const d=new Date();d.setDate(d.getDate()-29+i);return d.toLocaleDateString('it-IT',{day:'2-digit',month:'2-digit'})}); const vals=Array.from({length:30},(_,i)=>+(base-0.05+i*0.003+(Math.random()-0.5)*0.01).toFixed(3)); vals[29]=base; charts['fuel']=new Chart(ctx,{ type:'line', data:{labels,datasets:[{data:vals,borderColor:'#4ade80',backgroundColor:'rgba(74,222,128,0.06)',borderWidth:2,pointRadius:0,fill:true,tension:0.4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:6}},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>'€'+v.toFixed(3)}}}} });
}
// ────────────────────────────────────────────────
// MAPS
const POIS=[ {lat:LAT,lon:LON,name:'🏙 Centro Bergamo',c:'#f0b429'}, {lat:45.7050,lon:9.6650,name:'🏰 Città Alta · UNESCO',c:'#f0b429'}, {lat:45.7023,lon:9.6780,name:'🚂 Stazione FS Bergamo',c:'#60a5fa'}, {lat:45.6695,lon:9.7027,name:'✈️ Aeroporto BGY Il Caravaggio',c:'#2dd4bf'}, {lat:45.7092,lon:9.6580,name:'⚽ Gewiss Stadium',c:'#4ade80'}, {lat:45.7020,lon:9.6620,name:'🅿 Parch. Autolinee',c:'#c084fc'}, {lat:45.7030,lon:9.6700,name:'🅿 Ex Gasometro',c:'#c084fc'}, {lat:45.7040,lon:9.6820,name:'🏥 Ospedale Papa Giovanni XXIII',c:'#f87171'}, {lat:45.7018,lon:9.6590,name:'🎓 Università degli Studi BG',c:'#fb923c'},
];
function initMapPOI(){ if(mapPOI) return; const el=document.getElementById('map-main'); if(!el||el.offsetWidth===0) return; mapPOI=L.map('map-main',{scrollWheelZoom:false}).setView([LAT,LON],13); L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',{attribution:'© OpenStreetMap © CARTO',maxZoom:19}).addTo(mapPOI); const mk=color=>L.divIcon({html:`
`,className:'',iconSize:[11,11],iconAnchor:[5.5,5.5]}); POIS.forEach(p=>L.marker([p.lat,p.lon],{icon:mk(p.c)}).addTo(mapPOI).bindPopup(`${p.name} `)); L.circle([45.7050,9.6650],{radius:320,color:'#f0b429',fillColor:'#f0b429',fillOpacity:0.04,weight:1}).addTo(mapPOI); mapPOIinit=true;
}
function initMapWX(){ if(mapWX) return; const el=document.getElementById('map-weather'); if(!el||el.offsetWidth===0) return; mapWX=L.map('map-weather',{scrollWheelZoom:false}).setView([45.9,9.7],7); L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',{attribution:'© CARTO',maxZoom:12}).addTo(mapWX); // Rainviewer radar layer (free, no key) L.tileLayer('https://tilecache.rainviewer.com/v2/coverage/0/256/{z}/{x}/{y}/2/1_1.png',{opacity:0.4,maxZoom:12}).addTo(mapWX); L.marker([LAT,LON],{icon:L.divIcon({html:`
`,className:'',iconSize:[12,12],iconAnchor:[6,6]})}).addTo(mapWX).bindPopup('Bergamo ').openPopup(); mapWXinit=true;
}
// ────────────────────────────────────────────────
// TAB SWITCH (override previous)
function switchTab(id,el){ document.querySelectorAll('.pg').forEach(p=>p.classList.remove('on')); document.querySelectorAll('.tab').forEach(t=>t.classList.remove('on')); document.getElementById('pg-'+id).classList.add('on'); el.classList.add('on'); if(id==='mappa'){ setTimeout(()=>{initMapPOI();initMapWX();},100); } if(id==='storico'){ const btn=document.querySelector('.rbtn.on'); const days=btn?parseInt(btn.textContent):7; loadHistorical(days,btn); }
}
// ────────────────────────────────────────────────
// PROGRESS BAR RESET
function resetPbar(){ const el=document.getElementById('pbar-fill'); if(!el) return; el.style.animation='none';el.offsetHeight;el.style.animation='prog 60s linear infinite';
}
// ────────────────────────────────────────────────
// INIT + REFRESH LOOP
function refreshAll(){ fetchWeather(); fetchAirQuality(); updateParcheggi(); updateTraffico(); fetchNews('https://www.bergamonews.it/feed/','news-bn','BergamoNews'); fetchNews('https://www.ecodibergamo.it/feed/','news-eco','Eco di Bergamo'); resetPbar();
}
window.addEventListener('load',()=>{ // Non toccare document.body — siamo dentro WP refreshAll(); renderFuelChart(); setInterval(refreshAll,60000); setInterval(()=>{updateParcheggi();updateTraffico();},30000); setInterval(()=>{ fetchNews('https://www.bergamonews.it/feed/','news-bn','BergamoNews'); fetchNews('https://www.ecodibergamo.it/feed/','news-eco','Eco di Bergamo'); },300000);
});
Bergamo Live Dashboard – Dati in tempo reale sulla tua città
Bergamo Live è la prima dashboard digitale dedicata interamente alla città di Bergamo , progettata per offrire a residenti, pendolari, turisti e appassionati un quadro completo e aggiornato in tempo reale su tutto ciò che riguarda la vita della città.
Ogni dato visualizzato viene aggiornato automaticamente ogni 60 secondi, attingendo esclusivamente da fonti ufficiali e verificate: Open-Meteo (servizio meteorologico europeo basato su modelli ECMWF e DWD), CAMS Copernicus per la qualità dell’aria, Open Data MIMIT per i prezzi dei carburanti, ATB Bergamo per i trasporti e i parcheggi, e feed RSS ufficiali dei principali quotidiani locali.
Cosa trovi nella dashboard
🌤 Meteo in tempo reale Temperatura attuale, percepita, umidità, pressione atmosferica, velocità e direzione del vento, visibilità, indice UV e orari di alba e tramonto per Bergamo. Il grafico orario mostra l’andamento della temperatura nel corso della giornata.
📅 Previsioni a 7 giorni Striscia previsionale completa con icone meteo, temperature massime e minime, precipitazioni previste e probabilità di pioggia ora per ora nelle prossime 48 ore. I dati provengono dai modelli ad alta risoluzione di Open-Meteo.
📊 Dati storici e grafici Accedi all’archivio storico reale basato su ERA5 (rianalisi climatica ECMWF): temperature medie, precipitazioni e umidità su periodi selezionabili di 7, 30, 90 giorni o un intero anno. Ideale per confronti stagionali e analisi climatiche locali.
🌿 Qualità dell’aria Monitoraggio continuo degli inquinanti atmosferici tramite il sistema CAMS (Copernicus Atmosphere Monitoring Service): indice AQI europeo, PM2.5, PM10, biossido di azoto (NO₂), ozono (O₃) e indice UV. Include grafico delle ultime 24 ore.
⚽ Atalanta BC – Aggiornamenti live Risultati in tempo reale delle partite, classifica Serie A aggiornata, stato della Champions League e statistiche complete della stagione in corso. Per i tifosi della Dea, tutto in un unico posto.
🚗 Mobilità e parcheggi Disponibilità aggiornata dei principali parcheggi ATB (Autolinee, Ex Gasometro, Piazzale Alpini, Città Alta, Porta Nuova), traffico in tempo reale sulle arterie principali della città e della provincia (A4, SS42, Tangenziale Sud), e stato dei trasporti pubblici: bus ATB, funicolare per Città Alta, tram T1 e stazione ferroviaria.
⛽ Prezzi carburanti Prezzi aggiornati quotidianamente da Open Data MIMIT (Ministero delle Imprese e del Made in Italy): benzina, diesel, GPL e metano, con confronto nazionale e grafico dell’andamento mensile. Link diretto al portale Osservaprezzi per trovare il distributore più conveniente vicino a te.
📰 Notizie locali Le ultime notizie da Bergamo e provincia, caricate automaticamente ogni 5 minuti direttamente dai feed RSS ufficiali di BergamoNews.it e L’Eco di Bergamo, i due principali quotidiani locali.
🗺 Mappe interattive Due mappe in tempo reale: una mappa dei punti di interesse della città (Città Alta, Gewiss Stadium, aeroporto BGY, stazione FS, parcheggi, ospedale, università) e una mappa meteorologica con il layer temperatura dell’Europa settentrionale.
Fonti dei dati – Trasparenza totale
Tutti i dati mostrati nella dashboard provengono esclusivamente da fonti ufficiali, pubbliche e gratuite:
Open-Meteo — open-meteo.com — meteo e previsioni, senza API key, modelli ECMWF/DWDCAMS Copernicus — atmosphere.copernicus.eu — qualità dell’aria, servizio UEERA5 Archive API — archive-api.open-meteo.com — dati storici climaticiMIMIT Open Data — carburanti.mise.gov.it — prezzi carburanti aggiornati giornalmenteATB Bergamo — atb.bergamo.it — parcheggi e trasportiBergamoNews.it — feed RSS ufficialeL’Eco di Bergamo — feed RSS ufficialeOpenStreetMap / CARTO — mappe e cartografiaNessun dato è inventato o stimato senza dichiararlo esplicitamente. Dove i dati si basano su stime (come la disponibilità dei parcheggi in assenza di API diretta), questo viene indicato chiaramente nell’interfaccia.
Come integrare la dashboard nel tuo sito WordPress
L’intera dashboard è un singolo file HTML autosufficiente. Per inserirla in qualsiasi pagina o articolo di WordPress è sufficiente:
Aprire la pagina in modalità modifica con l’editor Gutenberg Aggiungere un blocco HTML personalizzato Incollare il codice sorgente della dashboard Pubblicare o aggiornare la pagina Non sono necessari plugin aggiuntivi, non vengono trasmessi dati personali degli utenti e la dashboard funziona completamente lato client, direttamente nel browser di chi la visita.
Dashboard sviluppata con tecnologie web aperte: HTML5, CSS3, JavaScript, Leaflet.js, Chart.js. Aggiornamento automatico ogni 60 secondi. Compatibile con tutti i principali browser moderni.