@vcmap/core 5.0.2 → 5.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cesium.d.ts +257 -0
- package/dist/geojson.d.ts +27 -0
- package/dist/index.d.ts +15 -2
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/ol.d.ts +138 -0
- package/dist/src/classRegistry.js +2 -2
- package/dist/src/classRegistry.js.map +1 -1
- package/dist/src/featureProvider/abstractFeatureProvider.d.ts +2 -1
- package/dist/src/featureProvider/abstractFeatureProvider.js +2 -1
- package/dist/src/featureProvider/abstractFeatureProvider.js.map +1 -1
- package/dist/src/featureProvider/tileProviderFeatureProvider.d.ts +1 -1
- package/dist/src/featureProvider/tileProviderFeatureProvider.js +2 -2
- package/dist/src/featureProvider/tileProviderFeatureProvider.js.map +1 -1
- package/dist/src/featureProvider/wmsFeatureProvider.d.ts +1 -1
- package/dist/src/featureProvider/wmsFeatureProvider.js +4 -3
- package/dist/src/featureProvider/wmsFeatureProvider.js.map +1 -1
- package/dist/src/interaction/eventHandler.js +3 -3
- package/dist/src/interaction/eventHandler.js.map +1 -1
- package/dist/src/interaction/featureProviderInteraction.js +1 -1
- package/dist/src/interaction/featureProviderInteraction.js.map +1 -1
- package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.d.ts +4 -1
- package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js +31 -2
- package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js.map +1 -1
- package/dist/src/layer/cesium/resourceHelper.d.ts +2 -0
- package/dist/src/layer/cesium/resourceHelper.js +12 -0
- package/dist/src/layer/cesium/resourceHelper.js.map +1 -0
- package/dist/src/layer/cesium/singleImageCesiumImpl.js +2 -1
- package/dist/src/layer/cesium/singleImageCesiumImpl.js.map +1 -1
- package/dist/src/layer/cesium/terrainCesiumImpl.js +1 -1
- package/dist/src/layer/cesium/terrainCesiumImpl.js.map +1 -1
- package/dist/src/layer/cesium/tmsCesiumImpl.js +2 -1
- package/dist/src/layer/cesium/tmsCesiumImpl.js.map +1 -1
- package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js +1 -0
- package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js.map +1 -1
- package/dist/src/layer/cesium/vectorTileImageryProvider.d.ts +2 -0
- package/dist/src/layer/cesium/vectorTileImageryProvider.js +3 -1
- package/dist/src/layer/cesium/vectorTileImageryProvider.js.map +1 -1
- package/dist/src/layer/cesium/wmsCesiumImpl.js +2 -1
- package/dist/src/layer/cesium/wmsCesiumImpl.js.map +1 -1
- package/dist/src/layer/cesium/wmtsCesiumImpl.js +2 -1
- package/dist/src/layer/cesium/wmtsCesiumImpl.js.map +1 -1
- package/dist/src/layer/cesiumTilesetLayer.d.ts +5 -1
- package/dist/src/layer/cesiumTilesetLayer.js +17 -7
- package/dist/src/layer/cesiumTilesetLayer.js.map +1 -1
- package/dist/src/layer/czmlLayer.js +2 -1
- package/dist/src/layer/czmlLayer.js.map +1 -1
- package/dist/src/layer/featureLayer.js +2 -2
- package/dist/src/layer/featureLayer.js.map +1 -1
- package/dist/src/layer/featureStoreLayer.js +8 -5
- package/dist/src/layer/featureStoreLayer.js.map +1 -1
- package/dist/src/layer/featureStoreLayerChanges.d.ts +20 -8
- package/dist/src/layer/featureStoreLayerChanges.js +26 -26
- package/dist/src/layer/featureStoreLayerChanges.js.map +1 -1
- package/dist/src/layer/featureStoreLayerState.d.ts +1 -5
- package/dist/src/layer/featureStoreLayerState.js +0 -9
- package/dist/src/layer/featureStoreLayerState.js.map +1 -1
- package/dist/src/layer/geojsonLayer.js +3 -2
- package/dist/src/layer/geojsonLayer.js.map +1 -1
- package/dist/src/layer/layer.d.ts +15 -0
- package/dist/src/layer/layer.js +30 -4
- package/dist/src/layer/layer.js.map +1 -1
- package/dist/src/layer/layerImplementation.d.ts +1 -0
- package/dist/src/layer/layerImplementation.js +2 -0
- package/dist/src/layer/layerImplementation.js.map +1 -1
- package/dist/src/layer/oblique/vectorObliqueImpl.js +9 -6
- package/dist/src/layer/oblique/vectorObliqueImpl.js.map +1 -1
- package/dist/src/layer/openlayers/loadFunctionHelpers.d.ts +2 -0
- package/dist/src/layer/openlayers/loadFunctionHelpers.js +20 -0
- package/dist/src/layer/openlayers/loadFunctionHelpers.js.map +1 -0
- package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js +25 -1
- package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js.map +1 -1
- package/dist/src/layer/openlayers/tmsOpenlayersImpl.js +9 -1
- package/dist/src/layer/openlayers/tmsOpenlayersImpl.js.map +1 -1
- package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js +1 -1
- package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js.map +1 -1
- package/dist/src/layer/openlayers/wmsOpenlayersImpl.d.ts +4 -1
- package/dist/src/layer/openlayers/wmsOpenlayersImpl.js +20 -1
- package/dist/src/layer/openlayers/wmsOpenlayersImpl.js.map +1 -1
- package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js +9 -1
- package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js.map +1 -1
- package/dist/src/layer/pointCloudLayer.js +2 -2
- package/dist/src/layer/pointCloudLayer.js.map +1 -1
- package/dist/src/layer/terrainHelpers.d.ts +3 -3
- package/dist/src/layer/terrainHelpers.js +12 -7
- package/dist/src/layer/terrainHelpers.js.map +1 -1
- package/dist/src/layer/terrainLayer.js +1 -1
- package/dist/src/layer/terrainLayer.js.map +1 -1
- package/dist/src/layer/tileProvider/mvtTileProvider.d.ts +1 -1
- package/dist/src/layer/tileProvider/mvtTileProvider.js +4 -3
- package/dist/src/layer/tileProvider/mvtTileProvider.js.map +1 -1
- package/dist/src/layer/tileProvider/staticGeojsonTileProvider.d.ts +1 -1
- package/dist/src/layer/tileProvider/staticGeojsonTileProvider.js +4 -3
- package/dist/src/layer/tileProvider/staticGeojsonTileProvider.js.map +1 -1
- package/dist/src/layer/tileProvider/tileProvider.d.ts +14 -11
- package/dist/src/layer/tileProvider/tileProvider.js +23 -20
- package/dist/src/layer/tileProvider/tileProvider.js.map +1 -1
- package/dist/src/layer/tileProvider/urlTemplateTileProvider.d.ts +1 -1
- package/dist/src/layer/tileProvider/urlTemplateTileProvider.js +4 -3
- package/dist/src/layer/tileProvider/urlTemplateTileProvider.js.map +1 -1
- package/dist/src/layer/vectorLayer.d.ts +1 -2
- package/dist/src/layer/vectorLayer.js +3 -3
- package/dist/src/layer/vectorLayer.js.map +1 -1
- package/dist/src/layer/vectorProperties.d.ts +11 -16
- package/dist/src/layer/vectorProperties.js +16 -13
- package/dist/src/layer/vectorProperties.js.map +1 -1
- package/dist/src/layer/wfsLayer.js +9 -6
- package/dist/src/layer/wfsLayer.js.map +1 -1
- package/dist/src/layer/wmsHelpers.d.ts +10 -0
- package/dist/src/layer/wmsHelpers.js +53 -12
- package/dist/src/layer/wmsHelpers.js.map +1 -1
- package/dist/src/layer/wmsLayer.d.ts +6 -0
- package/dist/src/layer/wmsLayer.js +5 -2
- package/dist/src/layer/wmsLayer.js.map +1 -1
- package/dist/src/map/cameraLimiter.d.ts +5 -0
- package/dist/src/map/cameraLimiter.js +11 -4
- package/dist/src/map/cameraLimiter.js.map +1 -1
- package/dist/src/map/cesiumMap.d.ts +20 -1
- package/dist/src/map/cesiumMap.js +51 -2
- package/dist/src/map/cesiumMap.js.map +1 -1
- package/dist/src/map/vcsMap.js +2 -2
- package/dist/src/map/vcsMap.js.map +1 -1
- package/dist/src/oblique/helpers.d.ts +1 -1
- package/dist/src/oblique/helpers.js +5 -9
- package/dist/src/oblique/helpers.js.map +1 -1
- package/dist/src/oblique/obliqueCollection.d.ts +1 -0
- package/dist/src/oblique/obliqueCollection.js +1 -1
- package/dist/src/oblique/obliqueCollection.js.map +1 -1
- package/dist/src/oblique/obliqueDataSet.d.ts +3 -1
- package/dist/src/oblique/obliqueDataSet.js +13 -6
- package/dist/src/oblique/obliqueDataSet.js.map +1 -1
- package/dist/src/oblique/obliqueImageMeta.d.ts +2 -0
- package/dist/src/oblique/obliqueImageMeta.js +2 -0
- package/dist/src/oblique/obliqueImageMeta.js.map +1 -1
- package/dist/src/oblique/obliqueView.d.ts +1 -0
- package/dist/src/oblique/obliqueView.js +12 -2
- package/dist/src/oblique/obliqueView.js.map +1 -1
- package/dist/src/oblique/parseImageJson.d.ts +6 -5
- package/dist/src/oblique/parseImageJson.js +7 -5
- package/dist/src/oblique/parseImageJson.js.map +1 -1
- package/dist/src/ol/geom/circle.js.map +1 -1
- package/dist/src/style/declarativeStyleItem.js +10 -2
- package/dist/src/style/declarativeStyleItem.js.map +1 -1
- package/dist/src/style/styleFactory.js +2 -2
- package/dist/src/style/styleFactory.js.map +1 -1
- package/dist/src/style/styleHelpers.js +13 -3
- package/dist/src/style/styleHelpers.js.map +1 -1
- package/dist/src/style/vectorStyleItem.js +29 -16
- package/dist/src/style/vectorStyleItem.js.map +1 -1
- package/dist/src/util/clipping/clippingPlaneHelper.js +3 -3
- package/dist/src/util/clipping/clippingPlaneHelper.js.map +1 -1
- package/dist/src/util/editor/createFeatureSession.d.ts +2 -2
- package/dist/src/util/editor/createFeatureSession.js +2 -2
- package/dist/src/util/editor/createFeatureSession.js.map +1 -1
- package/dist/src/util/editor/editFeaturesSession.d.ts +2 -2
- package/dist/src/util/editor/editGeometrySession.d.ts +2 -2
- package/dist/src/util/editor/editorSessionHelpers.d.ts +2 -2
- package/dist/src/util/editor/selectFeaturesSession.d.ts +2 -2
- package/dist/src/util/editor/selectFeaturesSession.js +2 -2
- package/dist/src/util/editor/selectFeaturesSession.js.map +1 -1
- package/dist/src/util/featureconverter/arcToCesium.d.ts +1 -1
- package/dist/src/util/featureconverter/arcToCesium.js +5 -2
- package/dist/src/util/featureconverter/arcToCesium.js.map +1 -1
- package/dist/src/util/featureconverter/circleToCesium.d.ts +4 -2
- package/dist/src/util/featureconverter/circleToCesium.js +8 -3
- package/dist/src/util/featureconverter/circleToCesium.js.map +1 -1
- package/dist/src/util/featureconverter/extent3D.js.map +1 -1
- package/dist/src/util/featureconverter/featureconverterHelper.js +2 -2
- package/dist/src/util/featureconverter/featureconverterHelper.js.map +1 -1
- package/dist/src/util/featureconverter/lineStringToCesium.d.ts +3 -1
- package/dist/src/util/featureconverter/lineStringToCesium.js +7 -2
- package/dist/src/util/featureconverter/lineStringToCesium.js.map +1 -1
- package/dist/src/util/featureconverter/pointToCesium.js +1 -1
- package/dist/src/util/featureconverter/pointToCesium.js.map +1 -1
- package/dist/src/util/featureconverter/polygonToCesium.d.ts +3 -3
- package/dist/src/util/featureconverter/polygonToCesium.js +9 -15
- package/dist/src/util/featureconverter/polygonToCesium.js.map +1 -1
- package/dist/src/util/fetch.d.ts +2 -0
- package/dist/src/util/fetch.js +16 -0
- package/dist/src/util/fetch.js.map +1 -1
- package/dist/src/util/flight/flightAnchor.d.ts +23 -0
- package/dist/src/util/flight/flightAnchor.js +152 -0
- package/dist/src/util/flight/flightAnchor.js.map +1 -0
- package/dist/src/util/flight/flightCollection.d.ts +25 -0
- package/dist/src/util/flight/flightCollection.js +63 -0
- package/dist/src/util/flight/flightCollection.js.map +1 -0
- package/dist/src/util/flight/flightHelpers.d.ts +29 -0
- package/dist/src/util/flight/flightHelpers.js +134 -0
- package/dist/src/util/flight/flightHelpers.js.map +1 -0
- package/dist/src/util/flight/flightInstance.d.ts +57 -0
- package/dist/src/util/flight/flightInstance.js +166 -0
- package/dist/src/util/flight/flightInstance.js.map +1 -0
- package/dist/src/util/flight/flightPlayer.d.ts +30 -0
- package/dist/src/util/flight/flightPlayer.js +247 -0
- package/dist/src/util/flight/flightPlayer.js.map +1 -0
- package/dist/src/util/flight/flightVisualizer.d.ts +18 -0
- package/dist/src/util/flight/flightVisualizer.js +151 -0
- package/dist/src/util/flight/flightVisualizer.js.map +1 -0
- package/dist/src/util/hiddenObjects.d.ts +8 -0
- package/dist/src/util/hiddenObjects.js +17 -0
- package/dist/src/util/hiddenObjects.js.map +1 -0
- package/dist/src/util/mapCollection.js +2 -2
- package/dist/src/util/mapCollection.js.map +1 -1
- package/dist/src/util/overrideCollection.d.ts +8 -3
- package/dist/src/util/overrideCollection.js +17 -0
- package/dist/src/util/overrideCollection.js.map +1 -1
- package/dist/src/util/projection.js +5 -2
- package/dist/src/util/projection.js.map +1 -1
- package/dist/src/util/viewpoint.d.ts +1 -0
- package/dist/src/util/viewpoint.js +24 -7
- package/dist/src/util/viewpoint.js.map +1 -1
- package/dist/src/vcsApp.d.ts +10 -3
- package/dist/src/vcsApp.js +34 -15
- package/dist/src/vcsApp.js.map +1 -1
- package/dist/src/vcsModule.d.ts +4 -0
- package/dist/src/vcsModule.js.map +1 -1
- package/dist/tests/unit/helpers/cesiumHelpers.d.ts +2 -2
- package/dist/tests/unit/helpers/cesiumHelpers.js +2 -1
- package/dist/tests/unit/helpers/cesiumHelpers.js.map +1 -1
- package/dist/tests/unit/helpers/terrain/terrainData.d.ts +7 -0
- package/dist/tests/unit/helpers/terrain/terrainData.js +2 -2
- package/dist/tests/unit/helpers/terrain/terrainData.js.map +1 -1
- package/index.ts +39 -1
- package/package.json +4 -2
- package/src/classRegistry.ts +2 -2
- package/src/featureProvider/abstractFeatureProvider.ts +2 -0
- package/src/featureProvider/tileProviderFeatureProvider.ts +2 -0
- package/src/featureProvider/wmsFeatureProvider.ts +4 -2
- package/src/interaction/eventHandler.ts +3 -3
- package/src/interaction/featureProviderInteraction.ts +1 -0
- package/src/layer/cesium/cesiumTilesetCesiumImpl.ts +44 -5
- package/src/layer/cesium/resourceHelper.ts +15 -0
- package/src/layer/cesium/singleImageCesiumImpl.ts +2 -1
- package/src/layer/cesium/terrainCesiumImpl.ts +2 -1
- package/src/layer/cesium/tmsCesiumImpl.ts +2 -1
- package/src/layer/cesium/vectorRasterTileCesiumImpl.ts +1 -0
- package/src/layer/cesium/vectorTileImageryProvider.ts +10 -1
- package/src/layer/cesium/wmsCesiumImpl.ts +2 -1
- package/src/layer/cesium/wmtsCesiumImpl.ts +4 -2
- package/src/layer/cesiumTilesetLayer.ts +25 -7
- package/src/layer/czmlLayer.ts +2 -1
- package/src/layer/featureLayer.ts +2 -2
- package/src/layer/featureStoreLayer.ts +8 -8
- package/src/layer/featureStoreLayerChanges.ts +63 -45
- package/src/layer/featureStoreLayerState.ts +6 -5
- package/src/layer/geojsonLayer.ts +3 -3
- package/src/layer/layer.ts +41 -4
- package/src/layer/layerImplementation.ts +3 -0
- package/src/layer/oblique/vectorObliqueImpl.ts +9 -8
- package/src/layer/openlayers/loadFunctionHelpers.ts +24 -0
- package/src/layer/openlayers/singleImageOpenlayersImpl.ts +25 -1
- package/src/layer/openlayers/tmsOpenlayersImpl.ts +8 -1
- package/src/layer/openlayers/vectorTileOpenlayersImpl.ts +1 -0
- package/src/layer/openlayers/wmsOpenlayersImpl.ts +23 -2
- package/src/layer/openlayers/wmtsOpenlayersImpl.ts +8 -1
- package/src/layer/pointCloudLayer.ts +2 -2
- package/src/layer/terrainHelpers.ts +19 -6
- package/src/layer/terrainLayer.ts +8 -4
- package/src/layer/tileProvider/mvtTileProvider.ts +9 -3
- package/src/layer/tileProvider/staticGeojsonTileProvider.ts +9 -3
- package/src/layer/tileProvider/tileProvider.ts +49 -13
- package/src/layer/tileProvider/urlTemplateTileProvider.ts +10 -3
- package/src/layer/vectorLayer.ts +9 -9
- package/src/layer/vectorProperties.ts +46 -22
- package/src/layer/wfsLayer.ts +9 -6
- package/src/layer/wmsHelpers.ts +78 -10
- package/src/layer/wmsLayer.ts +11 -2
- package/src/map/cameraLimiter.ts +21 -2
- package/src/map/cesiumMap.ts +67 -2
- package/src/map/vcsMap.ts +2 -2
- package/src/oblique/helpers.ts +5 -13
- package/src/oblique/obliqueCollection.ts +2 -0
- package/src/oblique/obliqueDataSet.ts +16 -2
- package/src/oblique/obliqueImageMeta.ts +4 -0
- package/src/oblique/obliqueView.ts +12 -2
- package/src/oblique/parseImageJson.ts +7 -4
- package/src/ol/geojson.d.ts +1 -2
- package/src/ol/geom/circle.ts +1 -1
- package/src/style/declarativeStyleItem.ts +10 -2
- package/src/style/styleFactory.ts +2 -2
- package/src/style/styleHelpers.ts +13 -4
- package/src/style/vectorStyleItem.ts +32 -20
- package/src/util/clipping/clippingPlaneHelper.ts +3 -3
- package/src/util/editor/createFeatureSession.ts +9 -8
- package/src/util/editor/editFeaturesSession.ts +1 -1
- package/src/util/editor/editGeometrySession.ts +1 -1
- package/src/util/editor/editorSessionHelpers.ts +2 -2
- package/src/util/editor/selectFeaturesSession.ts +3 -3
- package/src/util/featureconverter/arcToCesium.ts +5 -1
- package/src/util/featureconverter/circleToCesium.ts +8 -2
- package/src/util/featureconverter/extent3D.ts +1 -1
- package/src/util/featureconverter/featureconverterHelper.ts +3 -5
- package/src/util/featureconverter/lineStringToCesium.ts +8 -1
- package/src/util/featureconverter/pointToCesium.ts +1 -1
- package/src/util/featureconverter/polygonToCesium.ts +6 -15
- package/src/util/fetch.ts +25 -0
- package/src/util/flight/flightAnchor.ts +195 -0
- package/src/util/flight/flightCollection.ts +78 -0
- package/src/util/flight/flightHelpers.ts +208 -0
- package/src/util/flight/flightInstance.ts +240 -0
- package/src/util/flight/flightPlayer.ts +326 -0
- package/src/util/flight/flightVisualizer.ts +202 -0
- package/src/util/hiddenObjects.ts +35 -0
- package/src/util/mapCollection.ts +2 -2
- package/src/util/overrideCollection.ts +26 -3
- package/src/util/projection.ts +5 -2
- package/src/util/viewpoint.ts +27 -7
- package/src/vcsApp.ts +56 -15
- package/src/vcsModule.ts +4 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Cartesian3,
|
|
3
|
+
CatmullRomSpline,
|
|
4
|
+
HeadingPitchRoll,
|
|
5
|
+
LinearSpline,
|
|
6
|
+
QuaternionSpline,
|
|
7
|
+
Scene,
|
|
8
|
+
ScreenSpaceCameraController,
|
|
9
|
+
} from '@vcmap-cesium/engine';
|
|
10
|
+
import { getLogger } from '@vcsuite/logger';
|
|
11
|
+
import { check } from '@vcsuite/check';
|
|
12
|
+
import CesiumMap from '../../map/cesiumMap.js';
|
|
13
|
+
import { getSplineAndTimesForInstance } from './flightHelpers.js';
|
|
14
|
+
import FlightInstance from './flightInstance.js';
|
|
15
|
+
import VcsEvent from '../../vcsEvent.js';
|
|
16
|
+
import VcsApp from '../../vcsApp.js';
|
|
17
|
+
|
|
18
|
+
export type FlightPlayerClock = {
|
|
19
|
+
startTime: number;
|
|
20
|
+
endTime: number;
|
|
21
|
+
currentTime: number;
|
|
22
|
+
times: number[];
|
|
23
|
+
currentSystemTime?: number;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export type FlightPlayerState = 'playing' | 'paused' | 'stopped';
|
|
27
|
+
|
|
28
|
+
export type FlightPlayer = {
|
|
29
|
+
readonly flightInstanceName: string;
|
|
30
|
+
readonly state: FlightPlayerState;
|
|
31
|
+
readonly stateChanged: VcsEvent<FlightPlayerState>;
|
|
32
|
+
readonly destroyed: VcsEvent<void>;
|
|
33
|
+
clock: FlightPlayerClock;
|
|
34
|
+
play(): void;
|
|
35
|
+
stop(): void;
|
|
36
|
+
pause(): void;
|
|
37
|
+
/**
|
|
38
|
+
* jumps to the given time
|
|
39
|
+
* @param time time in seconds
|
|
40
|
+
*/
|
|
41
|
+
goToTime(time: number): void;
|
|
42
|
+
forward(): void;
|
|
43
|
+
backward(): void;
|
|
44
|
+
destroy(): void;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
function getDefaultFlightPlayerClock(): FlightPlayerClock {
|
|
48
|
+
return {
|
|
49
|
+
startTime: 0,
|
|
50
|
+
endTime: 0,
|
|
51
|
+
currentTime: 0,
|
|
52
|
+
times: [],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function createFlightPlayer(
|
|
57
|
+
instance: FlightInstance,
|
|
58
|
+
app: VcsApp,
|
|
59
|
+
): Promise<FlightPlayer> {
|
|
60
|
+
check(instance, FlightInstance);
|
|
61
|
+
check(app, VcsApp);
|
|
62
|
+
|
|
63
|
+
let cesiumMap: CesiumMap =
|
|
64
|
+
app.maps.activeMap instanceof CesiumMap
|
|
65
|
+
? app.maps.activeMap
|
|
66
|
+
: (app.maps.getByType(CesiumMap.className)[0] as CesiumMap);
|
|
67
|
+
if (!cesiumMap) {
|
|
68
|
+
throw new Error('Cannot start a flight player without a cesium map');
|
|
69
|
+
}
|
|
70
|
+
await instance.initialize();
|
|
71
|
+
|
|
72
|
+
const clock: FlightPlayerClock = getDefaultFlightPlayerClock();
|
|
73
|
+
|
|
74
|
+
let playerState: FlightPlayerState = 'stopped';
|
|
75
|
+
|
|
76
|
+
const stateChanged = new VcsEvent<FlightPlayerState>();
|
|
77
|
+
|
|
78
|
+
const setState = (state: FlightPlayerState): void => {
|
|
79
|
+
playerState = state;
|
|
80
|
+
stateChanged.raiseEvent(playerState);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
let destinationSpline: CatmullRomSpline | LinearSpline | undefined;
|
|
84
|
+
|
|
85
|
+
let quaternionSpline: QuaternionSpline | undefined;
|
|
86
|
+
|
|
87
|
+
let postRenderListener: (() => void) | undefined;
|
|
88
|
+
|
|
89
|
+
let backedBeforeTimeout: number | undefined;
|
|
90
|
+
|
|
91
|
+
let screenSpaceCameraController: ScreenSpaceCameraController | undefined;
|
|
92
|
+
|
|
93
|
+
const stop = (): void => {
|
|
94
|
+
if (playerState !== 'stopped') {
|
|
95
|
+
if (postRenderListener) {
|
|
96
|
+
postRenderListener();
|
|
97
|
+
postRenderListener = undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (screenSpaceCameraController) {
|
|
101
|
+
screenSpaceCameraController.enableInputs = true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
setState('stopped');
|
|
105
|
+
|
|
106
|
+
clock.currentTime = 0;
|
|
107
|
+
clock.currentSystemTime = undefined;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const updateSplines = (): void => {
|
|
112
|
+
if (!instance.isValid()) {
|
|
113
|
+
stop();
|
|
114
|
+
Object.assign(clock, getDefaultFlightPlayerClock());
|
|
115
|
+
} else {
|
|
116
|
+
const splines = getSplineAndTimesForInstance(instance);
|
|
117
|
+
|
|
118
|
+
({ destinationSpline, quaternionSpline } = splines);
|
|
119
|
+
const { times } = splines;
|
|
120
|
+
clock.endTime = times[times.length - 1];
|
|
121
|
+
clock.times = times;
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
updateSplines();
|
|
125
|
+
|
|
126
|
+
const listeners = [
|
|
127
|
+
instance.anchorsChanged.addEventListener(updateSplines),
|
|
128
|
+
instance.propertyChanged.addEventListener((property) => {
|
|
129
|
+
if (property === 'interpolation' || property === 'loop') {
|
|
130
|
+
updateSplines();
|
|
131
|
+
}
|
|
132
|
+
}),
|
|
133
|
+
app.maps.mapActivated.addEventListener(() => {
|
|
134
|
+
stop();
|
|
135
|
+
if (app.maps.activeMap instanceof CesiumMap) {
|
|
136
|
+
cesiumMap = app.maps.activeMap;
|
|
137
|
+
}
|
|
138
|
+
}),
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
const cesiumPostRender = (scene: Scene): void => {
|
|
142
|
+
const time = Date.now() / 1000;
|
|
143
|
+
if (!clock.currentSystemTime) {
|
|
144
|
+
clock.currentSystemTime = time;
|
|
145
|
+
}
|
|
146
|
+
const seconds = time - clock.currentSystemTime;
|
|
147
|
+
clock.currentSystemTime = time;
|
|
148
|
+
if (playerState === 'paused') {
|
|
149
|
+
if (screenSpaceCameraController) {
|
|
150
|
+
screenSpaceCameraController.enableInputs = true;
|
|
151
|
+
}
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
clock.currentTime += seconds * instance.multiplier;
|
|
156
|
+
if (clock.currentTime > clock.endTime) {
|
|
157
|
+
if (instance.loop && clock.endTime > 0) {
|
|
158
|
+
while (clock.currentTime > clock.endTime) {
|
|
159
|
+
clock.currentTime -= clock.endTime;
|
|
160
|
+
}
|
|
161
|
+
} else {
|
|
162
|
+
stop();
|
|
163
|
+
}
|
|
164
|
+
} else if (clock.currentTime < clock.startTime) {
|
|
165
|
+
if (instance.loop) {
|
|
166
|
+
clock.currentTime = clock.endTime + clock.currentTime;
|
|
167
|
+
} else {
|
|
168
|
+
clock.currentTime = clock.startTime;
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const view = {
|
|
174
|
+
destination: destinationSpline!.evaluate(clock.currentTime) as Cartesian3,
|
|
175
|
+
orientation: HeadingPitchRoll.fromQuaternion(
|
|
176
|
+
quaternionSpline!.evaluate(clock.currentTime),
|
|
177
|
+
),
|
|
178
|
+
};
|
|
179
|
+
scene.camera.setView(view);
|
|
180
|
+
if (playerState === 'playing') {
|
|
181
|
+
if (screenSpaceCameraController) {
|
|
182
|
+
screenSpaceCameraController.enableInputs = false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const play = (): void => {
|
|
188
|
+
if (playerState === 'playing') {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (!(app.maps.activeMap instanceof CesiumMap)) {
|
|
192
|
+
getLogger('FlightPlayer').warning(
|
|
193
|
+
'cannot play without a cesium map active',
|
|
194
|
+
);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (playerState === 'paused') {
|
|
198
|
+
setState('playing');
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (postRenderListener) {
|
|
202
|
+
postRenderListener();
|
|
203
|
+
postRenderListener = undefined;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const scene = cesiumMap.getScene();
|
|
207
|
+
if (!scene) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
({ screenSpaceCameraController } = scene);
|
|
211
|
+
postRenderListener = scene.postRender.addEventListener(cesiumPostRender);
|
|
212
|
+
clock.currentSystemTime = undefined;
|
|
213
|
+
|
|
214
|
+
setState('playing');
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const goToTime = (time: number): void => {
|
|
218
|
+
if (time > clock.endTime) {
|
|
219
|
+
getLogger('FlightPlayer').warning(`time: ${time} out of range`);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
clock.currentTime = time;
|
|
223
|
+
clock.currentSystemTime = undefined;
|
|
224
|
+
if (playerState !== 'playing') {
|
|
225
|
+
const view = {
|
|
226
|
+
destination: destinationSpline!.evaluate(
|
|
227
|
+
clock.currentTime,
|
|
228
|
+
) as Cartesian3,
|
|
229
|
+
orientation: HeadingPitchRoll.fromQuaternion(
|
|
230
|
+
quaternionSpline!.evaluate(clock.currentTime),
|
|
231
|
+
),
|
|
232
|
+
};
|
|
233
|
+
cesiumMap.getScene()?.camera.setView(view);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
const destroyed = new VcsEvent<void>();
|
|
237
|
+
const destroy = (): void => {
|
|
238
|
+
if (postRenderListener) {
|
|
239
|
+
postRenderListener();
|
|
240
|
+
postRenderListener = undefined;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (screenSpaceCameraController) {
|
|
244
|
+
screenSpaceCameraController.enableInputs = true;
|
|
245
|
+
screenSpaceCameraController = undefined;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (backedBeforeTimeout != null) {
|
|
249
|
+
clearTimeout(backedBeforeTimeout);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
listeners.forEach((cb) => {
|
|
253
|
+
cb();
|
|
254
|
+
});
|
|
255
|
+
stateChanged.destroy();
|
|
256
|
+
destroyed.raiseEvent();
|
|
257
|
+
destroyed.destroy();
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
listeners.push(
|
|
261
|
+
app.flights.removed.addEventListener((flight) => {
|
|
262
|
+
if (flight === instance) {
|
|
263
|
+
destroy();
|
|
264
|
+
}
|
|
265
|
+
}),
|
|
266
|
+
app.flights.added.addEventListener((flight) => {
|
|
267
|
+
if (flight.name === instance.name) {
|
|
268
|
+
destroy();
|
|
269
|
+
}
|
|
270
|
+
}),
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
return {
|
|
274
|
+
clock,
|
|
275
|
+
get flightInstanceName(): string {
|
|
276
|
+
return instance.name;
|
|
277
|
+
},
|
|
278
|
+
get state(): FlightPlayerState {
|
|
279
|
+
return playerState;
|
|
280
|
+
},
|
|
281
|
+
get stateChanged(): VcsEvent<FlightPlayerState> {
|
|
282
|
+
return stateChanged;
|
|
283
|
+
},
|
|
284
|
+
get destroyed(): VcsEvent<void> {
|
|
285
|
+
return destroyed;
|
|
286
|
+
},
|
|
287
|
+
play,
|
|
288
|
+
stop,
|
|
289
|
+
pause(): void {
|
|
290
|
+
if (playerState === 'playing') {
|
|
291
|
+
setState('paused');
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
goToTime,
|
|
295
|
+
/**
|
|
296
|
+
* forwards the currentTime to the next anchor
|
|
297
|
+
*/
|
|
298
|
+
forward(): void {
|
|
299
|
+
const seconds = clock.currentTime;
|
|
300
|
+
const newTime =
|
|
301
|
+
clock.times.find((t) => t > seconds) ||
|
|
302
|
+
clock.times[clock.times.length - 1];
|
|
303
|
+
goToTime(newTime);
|
|
304
|
+
},
|
|
305
|
+
/**
|
|
306
|
+
* resets the currentTime to the previous anchor
|
|
307
|
+
*/
|
|
308
|
+
backward(): void {
|
|
309
|
+
const seconds = clock.currentTime;
|
|
310
|
+
let index = clock.times.findIndex((t) => t >= seconds) - 1;
|
|
311
|
+
if (backedBeforeTimeout != null) {
|
|
312
|
+
index -= 1;
|
|
313
|
+
clearTimeout(backedBeforeTimeout);
|
|
314
|
+
}
|
|
315
|
+
if (index < 0) {
|
|
316
|
+
index = 0;
|
|
317
|
+
}
|
|
318
|
+
const newTime = clock.times[index];
|
|
319
|
+
goToTime(newTime);
|
|
320
|
+
backedBeforeTimeout = window.setTimeout(() => {
|
|
321
|
+
backedBeforeTimeout = undefined;
|
|
322
|
+
}, 700);
|
|
323
|
+
},
|
|
324
|
+
destroy,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PrimitiveCollection,
|
|
3
|
+
Camera,
|
|
4
|
+
Cartesian3,
|
|
5
|
+
HeadingPitchRoll,
|
|
6
|
+
Scene,
|
|
7
|
+
} from '@vcmap-cesium/engine';
|
|
8
|
+
import { createEmpty, isEmpty } from 'ol/extent.js';
|
|
9
|
+
import Feature from 'ol/Feature.js';
|
|
10
|
+
import { Point, LineString } from 'ol/geom.js';
|
|
11
|
+
import { check } from '@vcsuite/check';
|
|
12
|
+
|
|
13
|
+
import { mercatorToWgs84Transformer, wgs84Projection } from '../projection.js';
|
|
14
|
+
import VectorLayer from '../../layer/vectorLayer.js';
|
|
15
|
+
import Viewpoint from '../viewpoint.js';
|
|
16
|
+
import CesiumMap from '../../map/cesiumMap.js';
|
|
17
|
+
import VcsCameraPrimitive from '../../cesium/cesiumVcsCameraPrimitive.js';
|
|
18
|
+
import FlightInstance from './flightInstance.js';
|
|
19
|
+
import type VcsApp from '../../vcsApp.js';
|
|
20
|
+
import { getFlightPathCoordinatesFromInstance } from './flightHelpers.js';
|
|
21
|
+
import LayerState from '../../layer/layerState.js';
|
|
22
|
+
import VcsEvent from '../../vcsEvent.js';
|
|
23
|
+
import DeclarativeStyleItem from '../../style/declarativeStyleItem.js';
|
|
24
|
+
import { markVolatile } from '../../vcsModule.js';
|
|
25
|
+
|
|
26
|
+
export type FlightVisualization = {
|
|
27
|
+
readonly state: LayerState;
|
|
28
|
+
readonly stateChanged: VcsEvent<LayerState>;
|
|
29
|
+
readonly destroyed: VcsEvent<void>;
|
|
30
|
+
deactivate(): void;
|
|
31
|
+
activate(): Promise<void>;
|
|
32
|
+
destroy(): void;
|
|
33
|
+
zoomToExtent(): Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const flightVisualizationSymbol = Symbol('flightVisualization');
|
|
37
|
+
export async function createFlightVisualization(
|
|
38
|
+
instance: FlightInstance & {
|
|
39
|
+
[flightVisualizationSymbol]?: FlightVisualization;
|
|
40
|
+
},
|
|
41
|
+
app: VcsApp,
|
|
42
|
+
): Promise<FlightVisualization> {
|
|
43
|
+
check(instance, FlightInstance);
|
|
44
|
+
if (instance[flightVisualizationSymbol]) {
|
|
45
|
+
return instance[flightVisualizationSymbol];
|
|
46
|
+
}
|
|
47
|
+
await instance.initialize();
|
|
48
|
+
let extent = createEmpty();
|
|
49
|
+
|
|
50
|
+
const primitives = new PrimitiveCollection();
|
|
51
|
+
primitives.show = false;
|
|
52
|
+
const layer = new VectorLayer({
|
|
53
|
+
projection: wgs84Projection.toJSON(),
|
|
54
|
+
name: `flightLayer-${instance.name}`,
|
|
55
|
+
style: {
|
|
56
|
+
type: DeclarativeStyleItem.className,
|
|
57
|
+
declarativeStyle: {
|
|
58
|
+
// eslint-disable-next-line no-template-curly-in-string
|
|
59
|
+
labelText: '${title}',
|
|
60
|
+
image: 'false',
|
|
61
|
+
color: 'color("#333333")',
|
|
62
|
+
strokeWidth: '2',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
vectorProperties: {
|
|
66
|
+
altitudeMode: 'absolute',
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
markVolatile(layer);
|
|
70
|
+
|
|
71
|
+
let scene: Scene | undefined;
|
|
72
|
+
const [cesiumMap] = app.maps.getByType(CesiumMap.className) as CesiumMap[];
|
|
73
|
+
if (cesiumMap) {
|
|
74
|
+
scene = cesiumMap.getScene();
|
|
75
|
+
if (scene && !scene.primitives.contains(primitives)) {
|
|
76
|
+
scene.primitives.add(primitives);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
app.layers.add(layer);
|
|
81
|
+
const setFeatures = (): void => {
|
|
82
|
+
layer.removeAllFeatures();
|
|
83
|
+
primitives.removeAll();
|
|
84
|
+
|
|
85
|
+
const features: Feature<Point | LineString>[] = [];
|
|
86
|
+
for (const anchor of instance.anchors) {
|
|
87
|
+
if (scene) {
|
|
88
|
+
const camera = new Camera(scene);
|
|
89
|
+
camera.frustum.far = 200;
|
|
90
|
+
camera.frustum.near = 10;
|
|
91
|
+
camera.setView({
|
|
92
|
+
destination: Cartesian3.fromDegrees(
|
|
93
|
+
anchor.coordinate[0],
|
|
94
|
+
anchor.coordinate[1],
|
|
95
|
+
anchor.coordinate[2],
|
|
96
|
+
),
|
|
97
|
+
orientation: HeadingPitchRoll.fromDegrees(
|
|
98
|
+
anchor.heading,
|
|
99
|
+
anchor.pitch,
|
|
100
|
+
anchor.roll,
|
|
101
|
+
),
|
|
102
|
+
});
|
|
103
|
+
primitives.add(new VcsCameraPrimitive({ camera, allowPicking: false }));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
features.push(
|
|
107
|
+
new Feature({
|
|
108
|
+
geometry: new Point(anchor.coordinate, 'XYZ'),
|
|
109
|
+
title: anchor.title ?? anchor.name,
|
|
110
|
+
duration: anchor.duration,
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (instance.isValid()) {
|
|
116
|
+
const pathCoordinates = getFlightPathCoordinatesFromInstance(instance);
|
|
117
|
+
|
|
118
|
+
const flightPath = new Feature({
|
|
119
|
+
geometry: new LineString(pathCoordinates, 'XYZ'),
|
|
120
|
+
});
|
|
121
|
+
flightPath.setId('flightPathGeom');
|
|
122
|
+
|
|
123
|
+
features.push(flightPath);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
layer.addFeatures(features);
|
|
127
|
+
const mercatorExtent = layer.getSource().getExtent();
|
|
128
|
+
extent = mercatorToWgs84Transformer(mercatorExtent, mercatorExtent, 2);
|
|
129
|
+
};
|
|
130
|
+
setFeatures();
|
|
131
|
+
|
|
132
|
+
const changeListeners = [
|
|
133
|
+
instance.anchorsChanged.addEventListener(setFeatures),
|
|
134
|
+
instance.propertyChanged.addEventListener((property) => {
|
|
135
|
+
if (property === 'loop' || property === 'interpolation') {
|
|
136
|
+
setFeatures();
|
|
137
|
+
}
|
|
138
|
+
}),
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
const destroyed = new VcsEvent<void>();
|
|
142
|
+
const destroy = (): void => {
|
|
143
|
+
layer.deactivate();
|
|
144
|
+
app.layers.remove(layer);
|
|
145
|
+
layer.destroy();
|
|
146
|
+
|
|
147
|
+
if (scene && scene.primitives.contains(primitives)) {
|
|
148
|
+
scene.primitives.remove(primitives);
|
|
149
|
+
}
|
|
150
|
+
changeListeners.forEach((cb) => {
|
|
151
|
+
cb();
|
|
152
|
+
});
|
|
153
|
+
destroyed.raiseEvent();
|
|
154
|
+
destroyed.destroy();
|
|
155
|
+
delete instance[flightVisualizationSymbol];
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
changeListeners.push(
|
|
159
|
+
app.flights.removed.addEventListener((flight) => {
|
|
160
|
+
if (flight === instance) {
|
|
161
|
+
destroy();
|
|
162
|
+
}
|
|
163
|
+
}),
|
|
164
|
+
app.flights.added.addEventListener((flight) => {
|
|
165
|
+
if (flight.name === instance.name) {
|
|
166
|
+
destroy();
|
|
167
|
+
}
|
|
168
|
+
}),
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
const visualization: FlightVisualization = {
|
|
172
|
+
get state(): LayerState {
|
|
173
|
+
return layer.state;
|
|
174
|
+
},
|
|
175
|
+
get stateChanged(): VcsEvent<LayerState> {
|
|
176
|
+
return layer.stateChanged;
|
|
177
|
+
},
|
|
178
|
+
get destroyed(): VcsEvent<void> {
|
|
179
|
+
return destroyed;
|
|
180
|
+
},
|
|
181
|
+
async activate(): Promise<void> {
|
|
182
|
+
await layer.activate();
|
|
183
|
+
primitives.show = true;
|
|
184
|
+
},
|
|
185
|
+
deactivate(): void {
|
|
186
|
+
layer.deactivate();
|
|
187
|
+
primitives.show = false;
|
|
188
|
+
},
|
|
189
|
+
destroy,
|
|
190
|
+
async zoomToExtent(): Promise<void> {
|
|
191
|
+
if (!instance.isValid() || isEmpty(extent)) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const viewpoint = Viewpoint.createViewpointFromExtent(extent);
|
|
195
|
+
if (viewpoint) {
|
|
196
|
+
await app.maps.activeMap?.gotoViewpoint(viewpoint);
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
instance[flightVisualizationSymbol] = visualization;
|
|
201
|
+
return visualization;
|
|
202
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type GlobalHider from '../layer/globalHider.js';
|
|
2
|
+
import makeOverrideCollection, {
|
|
3
|
+
OverrideCollection,
|
|
4
|
+
} from './overrideCollection.js';
|
|
5
|
+
import Collection from './collection.js';
|
|
6
|
+
import { moduleIdSymbol } from '../moduleIdSymbol.js';
|
|
7
|
+
|
|
8
|
+
export type HiddenObject = {
|
|
9
|
+
id: string;
|
|
10
|
+
[moduleIdSymbol]?: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function createHiddenObjectsCollection(
|
|
14
|
+
getDynamicModuleId: () => string,
|
|
15
|
+
globalHider: GlobalHider,
|
|
16
|
+
): OverrideCollection<HiddenObject> {
|
|
17
|
+
const collection = makeOverrideCollection<
|
|
18
|
+
HiddenObject,
|
|
19
|
+
Collection<HiddenObject>
|
|
20
|
+
>(new Collection<HiddenObject>('id'), getDynamicModuleId);
|
|
21
|
+
|
|
22
|
+
collection.added.addEventListener(({ id }) => {
|
|
23
|
+
globalHider.hideObjects([id]);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
collection.replaced.addEventListener(({ new: item }) => {
|
|
27
|
+
globalHider.showObjects([item.id]);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
collection.removed.addEventListener(({ id }) => {
|
|
31
|
+
globalHider.showObjects([id]);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
return collection;
|
|
35
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { check,
|
|
1
|
+
import { check, maybe, oneOf } from '@vcsuite/check';
|
|
2
2
|
import { getLogger } from '@vcsuite/logger';
|
|
3
3
|
import VcsEvent from '../vcsEvent.js';
|
|
4
4
|
import Collection from './collection.js';
|
|
@@ -240,7 +240,7 @@ class MapCollection extends Collection<VcsMap> {
|
|
|
240
240
|
* Set the target for these maps.
|
|
241
241
|
*/
|
|
242
242
|
setTarget(target: string | HTMLElement): void {
|
|
243
|
-
|
|
243
|
+
check(target, maybe(oneOf(String, HTMLElement)));
|
|
244
244
|
|
|
245
245
|
this._target =
|
|
246
246
|
typeof target === 'string' ? document.getElementById(target) : target;
|
|
@@ -27,14 +27,19 @@ export type OverrideCollectionItem = {
|
|
|
27
27
|
/**
|
|
28
28
|
* The override collection adds the ability to override a unique item and re-creating it, should the override
|
|
29
29
|
* be removed. This does change some flow of called events. 1) if you override an item, removed is not called for the
|
|
30
|
-
* removed current item. 2) added can be called more the once for the same unique id.
|
|
31
|
-
*
|
|
30
|
+
* removed current item. 2) replaced is called for items which where replaced. 3) added can be called more the once for the same unique id.
|
|
31
|
+
* Replaced is called before added has been called for the item.
|
|
32
32
|
*/
|
|
33
33
|
export type OverrideCollectionInterface<T> = {
|
|
34
34
|
/**
|
|
35
|
-
* replaced is called
|
|
35
|
+
* replaced is called before added
|
|
36
36
|
*/
|
|
37
37
|
replaced: VcsEvent<ReplacedEvent<T>>;
|
|
38
|
+
/**
|
|
39
|
+
* Replacement is only supported for items of the dynamic module. For other items you may use override instead.
|
|
40
|
+
* Returns the replaced item or null if the item could not be inserted
|
|
41
|
+
*/
|
|
42
|
+
replace: (item: T) => T | null;
|
|
38
43
|
shadowMap: Map<string, (object & { [moduleIdSymbol]?: string })[]>;
|
|
39
44
|
/**
|
|
40
45
|
* returns the overriden item or null if the item could not be inserted (this would be the result of a race condition)
|
|
@@ -104,6 +109,24 @@ function makeOverrideCollection<
|
|
|
104
109
|
|
|
105
110
|
overrideCollection.shadowMap = new Map();
|
|
106
111
|
|
|
112
|
+
overrideCollection.replace = function replace(item: T): T | null {
|
|
113
|
+
const itemId = item[overrideCollection.uniqueKey] as string;
|
|
114
|
+
const old = overrideCollection.getByKey(itemId);
|
|
115
|
+
if (old?.[moduleIdSymbol] === getDynamicModuleId()) {
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
117
|
+
// @ts-ignore
|
|
118
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
119
|
+
const index = overrideCollection._remove(old);
|
|
120
|
+
overrideCollection.replaced.raiseEvent({ old, new: item });
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
122
|
+
// @ts-ignore
|
|
123
|
+
if ((overrideCollection.add(item, index) as number) >= 0) {
|
|
124
|
+
return item;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
};
|
|
129
|
+
|
|
107
130
|
overrideCollection.override = function override(item: T): T | null {
|
|
108
131
|
let shadow;
|
|
109
132
|
let index;
|
package/src/util/projection.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
import { register } from 'ol/proj/proj4.js';
|
|
8
8
|
import type { Coordinate } from 'ol/coordinate.js';
|
|
9
9
|
import proj4 from 'proj4';
|
|
10
|
-
import { check } from '@vcsuite/check';
|
|
10
|
+
import { check, maybe, oneOf } from '@vcsuite/check';
|
|
11
11
|
|
|
12
12
|
export type ProjectionOptions = {
|
|
13
13
|
type?: string;
|
|
@@ -102,7 +102,10 @@ function registerProjection(options: ProjectionOptions): ProjectionOptions {
|
|
|
102
102
|
* projection created prior to this functions call.
|
|
103
103
|
*/
|
|
104
104
|
export function setDefaultProjectionOptions(options: ProjectionOptions): void {
|
|
105
|
-
check(options, {
|
|
105
|
+
check(options, {
|
|
106
|
+
epsg: oneOf(String, Number),
|
|
107
|
+
proj4: maybe(String),
|
|
108
|
+
});
|
|
106
109
|
if (!validateProjectionOptions(options)) {
|
|
107
110
|
throw new Error('Cannot set invalid projection options as default options');
|
|
108
111
|
}
|