/** * GDELT Nachrichten-Layer: Geokodierte Echtzeit-News. */ const GdeltLayer = { _viewer: null, _dataSource: null, _interval: null, _count: 0, start(viewer) { if (this._dataSource) return; this._viewer = viewer; this._dataSource = new Cesium.CustomDataSource('gdelt'); viewer.dataSources.add(this._dataSource); this._fetch(); var self = this; this._interval = setInterval(function() { self._fetch(); }, 600000); }, stop() { if (this._interval) { clearInterval(this._interval); this._interval = null; } if (this._dataSource && this._viewer) { this._viewer.dataSources.remove(this._dataSource); this._dataSource = null; } this._count = 0; }, _fetch() { var self = this; fetch('/api/gdelt') .then(function(r) { return r.json(); }) .then(function(data) { if (!self._dataSource) return; self._dataSource.entities.removeAll(); var features = data.features || []; self._count = features.length; features.forEach(function(f) { var c = f.geometry.coordinates; var p = f.properties || {}; var title = (p.name || p.title || 'Nachricht').substring(0, 80); var url = p.url || ''; self._dataSource.entities.add({ position: Cesium.Cartesian3.fromDegrees(c[0], c[1]), point: { pixelSize: 5, color: Cesium.Color.fromCssColorString('#ff8800'), outlineColor: Cesium.Color.fromCssColorString('#663300'), outlineWidth: 1, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: Number.POSITIVE_INFINITY, }, description: '