Dateien
AegisSight-Globe/static/js/ui/imagery.js
Claude Dev 1d64ad8d1f 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) <noreply@anthropic.com>
2026-03-27 21:54:48 +01:00

155 Zeilen
5.3 KiB
JavaScript

/**
* Imagery Switcher: Verschiedene Satellitenbilder + historische Aufnahmen.
* Unterstuetzt URL-Template (Esri, Sentinel, OSM) und WMTS (NASA GIBS).
*/
const ImagerySwitch = {
_viewer: null,
_currentLayer: null,
_currentId: 'default',
_sources: {
'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)',
gibs: {
layer: 'MODIS_Terra_CorrectedReflectance_TrueColor',
tileMatrixSet: '250m',
ext: 'jpg',
time: 'today',
maxLevel: 8,
},
},
'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)',
gibs: {
layer: 'GOES-East_ABI_GeoColor',
tileMatrixSet: '2km',
ext: 'jpg',
time: 'today',
maxLevel: 5,
},
},
'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-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-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',
},
'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',
},
},
init(viewer) {
this._viewer = viewer;
},
_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 <= 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) {
if (!this._viewer || this._currentId === id) return;
var src = this._sources[id];
if (!src) return;
// Alten Layer entfernen
if (this._currentLayer) {
this._viewer.imageryLayers.remove(this._currentLayer);
this._currentLayer = null;
}
if (id === 'default') {
// Cesium Ion Default -- nichts hinzufuegen
this._currentId = id;
} else if (src.gibs) {
// NASA GIBS WMTS (REST-URL)
this._currentLayer = this._viewer.imageryLayers.addImageryProvider(
this._buildGibsProvider(src.gibs)
);
this._viewer.imageryLayers.lower(this._currentLayer);
this._currentId = id;
} else if (src.url) {
// URL Template (Esri, Sentinel, OSM)
this._currentLayer = this._viewer.imageryLayers.addImageryProvider(
new Cesium.UrlTemplateImageryProvider({
url: src.url,
maximumLevel: 18,
credit: src.name,
})
);
this._viewer.imageryLayers.lower(this._currentLayer);
this._currentId = id;
}
var sel = document.getElementById('imagery-select');
if (sel) sel.value = id;
var label = document.getElementById('imagery-label');
if (label) label.textContent = src.name;
},
};