/** * Wetter-Layer: Regenradar via RainViewer (kostenlos, kein API-Key). */ const WeatherLayer = { _viewer: null, _layer: null, _interval: null, _count: 0, start(viewer) { if (this._layer) return; this._viewer = viewer; this._fetchAndShow(); var self = this; this._interval = setInterval(function() { self._fetchAndShow(); }, 300000); }, stop() { if (this._interval) { clearInterval(this._interval); this._interval = null; } if (this._layer && this._viewer) { this._viewer.imageryLayers.remove(this._layer); this._layer = null; } this._count = 0; }, _fetchAndShow() { var self = this; var statusEl = document.getElementById('status-weather'); if (statusEl) { statusEl.textContent = 'Lade Radar...'; statusEl.classList.add('active'); } fetch('https://api.rainviewer.com/public/weather-maps.json') .then(function(r) { return r.json(); }) .then(function(data) { var frames = (data.radar && data.radar.past) || []; if (!frames.length) return; var latest = frames[frames.length - 1]; var tileUrl = 'https://tilecache.rainviewer.com' + latest.path + '/256/{z}/{x}/{y}/2/1_1.png'; if (self._layer && self._viewer) { self._viewer.imageryLayers.remove(self._layer); } self._layer = self._viewer.imageryLayers.addImageryProvider( new Cesium.UrlTemplateImageryProvider({ url: tileUrl, maximumLevel: 12, credit: 'RainViewer', }) ); self._layer.alpha = 0.6; self._count = 1; if (statusEl) statusEl.textContent = 'Regenradar aktiv'; }) .catch(function(e) { console.warn('Weather:', e); if (statusEl) statusEl.textContent = 'Fehler'; }) .finally(function() { setTimeout(function() { if (statusEl) statusEl.classList.remove('active'); }, 5000); }); }, };