From 1d64ad8d1fc67c234af15d55ba559979964f7059 Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Fri, 27 Mar 2026 21:54:48 +0100 Subject: [PATCH] fix: NASA GIBS Imagery nutzt REST-URL statt KVP-Endpunkt wmts.cgi mit times/clock funktionierte nicht -- Tiles wurden nicht geladen. Jetzt gleicher Ansatz wie nightlights.js: Datum direkt in REST-URL eingebaut. Co-Authored-By: Claude Opus 4.6 (1M context) --- static/js/ui/imagery.js | 185 ++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 100 deletions(-) diff --git a/static/js/ui/imagery.js b/static/js/ui/imagery.js index 26a0057..1229b7c 100644 --- a/static/js/ui/imagery.js +++ b/static/js/ui/imagery.js @@ -5,85 +5,81 @@ const ImagerySwitch = { _viewer: null, _currentLayer: null, - _currentId: "default", + _currentId: 'default', _sources: { - "default": { name: "Cesium Ion (Standard)", url: null }, - "esri": { - name: "Esri World Imagery", - url: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}", + 'default': { name: 'Cesium Ion (Standard)' }, + 'esri': { + name: 'Esri World Imagery', + url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', }, - "nasa-modis": { - name: "NASA MODIS Terra (Heute)", - wmts: { - url: "https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi", - layer: "MODIS_Terra_CorrectedReflectance_TrueColor", - tileMatrixSetID: "250m", - format: "image/jpeg", - time: "today", + 'nasa-modis': { + name: 'NASA MODIS Terra (Heute)', + gibs: { + layer: 'MODIS_Terra_CorrectedReflectance_TrueColor', + tileMatrixSet: '250m', + ext: 'jpg', + time: 'today', maxLevel: 8, }, }, - "nasa-viirs": { - name: "NASA VIIRS SNPP (Heute)", - wmts: { - url: "https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi", - layer: "VIIRS_SNPP_CorrectedReflectance_TrueColor", - tileMatrixSetID: "250m", - format: "image/jpeg", - time: "today", + 'nasa-viirs': { + name: 'NASA VIIRS SNPP (Heute)', + gibs: { + layer: 'VIIRS_SNPP_CorrectedReflectance_TrueColor', + tileMatrixSet: '250m', + ext: 'jpg', + time: 'today', maxLevel: 8, }, }, - "nasa-goes-east": { - name: "NASA GOES East (Live)", - wmts: { - url: "https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi", - layer: "GOES-East_ABI_GeoColor", - tileMatrixSetID: "2km", - format: "image/jpeg", - time: null, + 'nasa-goes-east': { + name: 'NASA GOES East (Live)', + gibs: { + layer: 'GOES-East_ABI_GeoColor', + tileMatrixSet: '2km', + ext: 'jpg', + time: 'today', maxLevel: 5, }, }, - "nasa-goes-west": { - name: "NASA GOES West (Live)", - wmts: { - url: "https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi", - layer: "GOES-West_ABI_GeoColor", - tileMatrixSetID: "2km", - format: "image/jpeg", - time: null, + 'nasa-goes-west': { + name: 'NASA GOES West (Live)', + gibs: { + layer: 'GOES-West_ABI_GeoColor', + tileMatrixSet: '2km', + ext: 'jpg', + time: 'today', maxLevel: 5, }, }, - "s2-2024": { - name: "Sentinel-2 (2024)", - url: "https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2024_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg", + 's2-2024': { + name: 'Sentinel-2 (2024)', + url: 'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2024_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg', }, - "s2-2023": { - name: "Sentinel-2 (2023)", - url: "https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2023_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg", + 's2-2023': { + name: 'Sentinel-2 (2023)', + url: 'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2023_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg', }, - "s2-2022": { - name: "Sentinel-2 (2022)", - url: "https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2022_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg", + 's2-2022': { + name: 'Sentinel-2 (2022)', + url: 'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2022_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg', }, - "s2-2020": { - name: "Sentinel-2 (2020)", - url: "https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2020_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg", + 's2-2020': { + name: 'Sentinel-2 (2020)', + url: 'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2020_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg', }, - "s2-2018": { - name: "Sentinel-2 (2018)", - url: "https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2018_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg", + 's2-2018': { + name: 'Sentinel-2 (2018)', + url: 'https://tiles.maps.eox.at/wmts/1.0.0/s2cloudless-2018_3857/default/GoogleMapsCompatible/{z}/{x}/{y}.jpg', }, - "topo": { - name: "OpenTopoMap", - url: "https://tile.opentopomap.org/{z}/{x}/{y}.png", + 'topo': { + name: 'OpenTopoMap', + url: 'https://tile.opentopomap.org/{z}/{x}/{y}.png', }, - "osm": { - name: "OpenStreetMap", - url: "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png", + 'osm': { + name: 'OpenStreetMap', + url: 'https://a.tile.openstreetmap.org/{z}/{x}/{y}.png', }, }, @@ -91,10 +87,29 @@ const ImagerySwitch = { this._viewer = viewer; }, - _getGibsLabels(maxLevel) { + _buildGibsProvider(g) { + var today = new Date().toISOString().slice(0, 10); + var time = (g.time === 'today') ? today : g.time; var labels = []; - for (var i = 0; i <= maxLevel; i++) labels.push(String(i)); - return labels; + for (var i = 0; i <= g.maxLevel; i++) labels.push(String(i)); + + // REST-URL (gleicher Ansatz wie nightlights.js -- bewaehrt) + var restUrl = 'https://gibs.earthdata.nasa.gov/wmts/epsg4326/best/' + + g.layer + '/default/' + time + '/' + g.tileMatrixSet + + '/{TileMatrix}/{TileRow}/{TileCol}.' + g.ext; + + return new Cesium.WebMapTileServiceImageryProvider({ + url: restUrl, + layer: g.layer, + style: 'default', + tileMatrixSetID: g.tileMatrixSet, + tileMatrixLabels: labels, + format: 'image/' + g.ext, + tilingScheme: new Cesium.GeographicTilingScheme(), + tileWidth: 512, + tileHeight: 512, + credit: 'NASA GIBS', + }); }, switchTo(id) { @@ -108,47 +123,18 @@ const ImagerySwitch = { this._currentLayer = null; } - if (id === "default") { + if (id === 'default') { + // Cesium Ion Default -- nichts hinzufuegen this._currentId = id; - } else if (src.wmts) { - // NASA GIBS WMTS Provider - var w = src.wmts; - var opts = { - url: w.url, - layer: w.layer, - tileMatrixSetID: w.tileMatrixSetID, - format: w.format, - style: "default", - tileWidth: 512, - tileHeight: 512, - tilingScheme: new Cesium.GeographicTilingScheme(), - tileMatrixLabels: this._getGibsLabels(w.maxLevel), - credit: "NASA GIBS", - }; - if (w.time === "today") { - opts.times = new Cesium.TimeIntervalCollection([ - new Cesium.TimeInterval({ - start: Cesium.JulianDate.fromIso8601(new Date().toISOString().slice(0, 10)), - stop: Cesium.JulianDate.fromIso8601("9999-12-31"), - }), - ]); - opts.clock = this._viewer.clock; - } else if (w.time) { - opts.times = new Cesium.TimeIntervalCollection([ - new Cesium.TimeInterval({ - start: Cesium.JulianDate.fromIso8601(w.time), - stop: Cesium.JulianDate.fromIso8601("9999-12-31"), - }), - ]); - opts.clock = this._viewer.clock; - } + } else if (src.gibs) { + // NASA GIBS WMTS (REST-URL) this._currentLayer = this._viewer.imageryLayers.addImageryProvider( - new Cesium.WebMapTileServiceImageryProvider(opts) + this._buildGibsProvider(src.gibs) ); this._viewer.imageryLayers.lower(this._currentLayer); this._currentId = id; - } else { - // URL Template Provider (Esri, Sentinel, OSM) + } else if (src.url) { + // URL Template (Esri, Sentinel, OSM) this._currentLayer = this._viewer.imageryLayers.addImageryProvider( new Cesium.UrlTemplateImageryProvider({ url: src.url, @@ -160,10 +146,9 @@ const ImagerySwitch = { this._currentId = id; } - // Dropdown aktualisieren - var sel = document.getElementById("imagery-select"); + var sel = document.getElementById('imagery-select'); if (sel) sel.value = id; - var label = document.getElementById("imagery-label"); + var label = document.getElementById('imagery-label'); if (label) label.textContent = src.name; }, };