mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
Two independently toggleable open-data raster overlays — OpenSeaMap sea marks (buoys, lighthouses, ports) and OpenSnowMap ski pistes — drawn as Cesium.ImageryLayers directly on the Cesium globe surface. Same "small array of descriptors" shape as MAP_STACKS in mapStackController.js. Visible on the osm/bing-aerial/bing-labels map stacks and invisible (not broken — the layer's stats say so in plain text) on the default photoreal stack, since Google Photorealistic 3D Tiles render with the globe hidden. OpenRailwayMap and OpenInfraMap, also requested in #10, are deliberately NOT included in this pass: OpenRailwayMap's public tile server enforces a Referer allowlist scoped to its own site (confirmed by direct request — every other Referer, including none, 403s), and OpenInfraMap serves MapLibre GL vector tiles, not raster XYZ — that would need a genuine vector-tile rendering pipeline, not a Cesium.ImageryLayer drop-in. Worth its own dedicated pass. Co-Authored-By: Claude Sonnet 5 <[email protected]>
81 lines
3.2 KiB
JavaScript
81 lines
3.2 KiB
JavaScript
import { DataLayerManager } from '../data/manager.js';
|
|
import flightsLayer from '../data/flights.js';
|
|
import militaryFlightsLayer from '../data/militaryFlights.js';
|
|
import earthquakesLayer from '../data/earthquakes.js';
|
|
import satellitesLayer from '../data/satellites.js';
|
|
import rocketLaunchesLayer from '../data/rocketLaunches.js';
|
|
import trafficLayer from '../data/traffic.js';
|
|
import cctvLayer from '../data/cctv.js';
|
|
import radioLayer from '../data/radio.js';
|
|
import bikeshareLayer from '../data/bikeshare.js';
|
|
import aisLiveVesselsLayer from '../data/aisLiveVessels.js';
|
|
import militaryInstallationsLayer from '../data/militaryInstallations.js';
|
|
import osmOverlaysLayer from '../data/osmOverlays.js';
|
|
import militaryAwarenessLayer from '../data/militaryAwareness.js';
|
|
import localDataLayers from '../data/localLayers.js';
|
|
import { LAYER_STATE_REGISTRY } from '../data/layerState.js';
|
|
|
|
/** Register the standalone layer catalog before allowing state restoration. */
|
|
export function createStandaloneData({
|
|
scene: { viewer },
|
|
controls: { styleManager },
|
|
allowQaRegistration,
|
|
defer,
|
|
}) {
|
|
// Initialize data layer manager
|
|
const dataManager = new DataLayerManager(viewer, {
|
|
allowQaRegistration,
|
|
});
|
|
defer(async () => {
|
|
await dataManager.destroyAll();
|
|
if (dataManager.layers.size)
|
|
throw new Error(
|
|
`Data layers could not be destroyed: ${[...dataManager.layers.keys()].join(', ')}`,
|
|
);
|
|
});
|
|
dataManager.register(flightsLayer);
|
|
dataManager.register(militaryFlightsLayer);
|
|
dataManager.register(earthquakesLayer);
|
|
dataManager.register(satellitesLayer);
|
|
dataManager.register(rocketLaunchesLayer);
|
|
rocketLaunchesLayer.attachDataManager(dataManager);
|
|
dataManager.register(trafficLayer);
|
|
dataManager.register(cctvLayer);
|
|
dataManager.register(radioLayer);
|
|
dataManager.register(bikeshareLayer);
|
|
dataManager.register(aisLiveVesselsLayer);
|
|
dataManager.register(militaryInstallationsLayer);
|
|
dataManager.register(osmOverlaysLayer);
|
|
dataManager.register(militaryAwarenessLayer);
|
|
militaryAwarenessLayer.attachDataManager(dataManager);
|
|
for (const layer of localDataLayers) {
|
|
dataManager.register(layer);
|
|
}
|
|
// Restoration starts only after the complete production registry is sealed.
|
|
dataManager.finalizeRegistrations(LAYER_STATE_REGISTRY);
|
|
if (allowQaRegistration) {
|
|
window.__gevQaRegisterLayer = (targetManager, layerModule) => {
|
|
if (targetManager !== dataManager)
|
|
throw new Error('QA layer manager mismatch');
|
|
return dataManager.registerForQa(layerModule);
|
|
};
|
|
window.__gevQaUnregisterLayer = (targetManager, layerId) => {
|
|
if (targetManager !== dataManager)
|
|
throw new Error('QA layer manager mismatch');
|
|
return dataManager.unregisterForQa(layerId);
|
|
};
|
|
const register = window.__gevQaRegisterLayer;
|
|
const unregister = window.__gevQaUnregisterLayer;
|
|
defer(() => {
|
|
if (window.__gevQaRegisterLayer === register)
|
|
delete window.__gevQaRegisterLayer;
|
|
if (window.__gevQaUnregisterLayer === unregister)
|
|
delete window.__gevQaUnregisterLayer;
|
|
});
|
|
}
|
|
dataManager.buildTogglePanel(document.getElementById('data-toggles'));
|
|
styleManager.attachDataManager(dataManager);
|
|
|
|
return { dataManager };
|
|
}
|