@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.
Files changed (309) hide show
  1. package/dist/cesium.d.ts +257 -0
  2. package/dist/geojson.d.ts +27 -0
  3. package/dist/index.d.ts +15 -2
  4. package/dist/index.js +9 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/ol.d.ts +138 -0
  7. package/dist/src/classRegistry.js +2 -2
  8. package/dist/src/classRegistry.js.map +1 -1
  9. package/dist/src/featureProvider/abstractFeatureProvider.d.ts +2 -1
  10. package/dist/src/featureProvider/abstractFeatureProvider.js +2 -1
  11. package/dist/src/featureProvider/abstractFeatureProvider.js.map +1 -1
  12. package/dist/src/featureProvider/tileProviderFeatureProvider.d.ts +1 -1
  13. package/dist/src/featureProvider/tileProviderFeatureProvider.js +2 -2
  14. package/dist/src/featureProvider/tileProviderFeatureProvider.js.map +1 -1
  15. package/dist/src/featureProvider/wmsFeatureProvider.d.ts +1 -1
  16. package/dist/src/featureProvider/wmsFeatureProvider.js +4 -3
  17. package/dist/src/featureProvider/wmsFeatureProvider.js.map +1 -1
  18. package/dist/src/interaction/eventHandler.js +3 -3
  19. package/dist/src/interaction/eventHandler.js.map +1 -1
  20. package/dist/src/interaction/featureProviderInteraction.js +1 -1
  21. package/dist/src/interaction/featureProviderInteraction.js.map +1 -1
  22. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.d.ts +4 -1
  23. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js +31 -2
  24. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js.map +1 -1
  25. package/dist/src/layer/cesium/resourceHelper.d.ts +2 -0
  26. package/dist/src/layer/cesium/resourceHelper.js +12 -0
  27. package/dist/src/layer/cesium/resourceHelper.js.map +1 -0
  28. package/dist/src/layer/cesium/singleImageCesiumImpl.js +2 -1
  29. package/dist/src/layer/cesium/singleImageCesiumImpl.js.map +1 -1
  30. package/dist/src/layer/cesium/terrainCesiumImpl.js +1 -1
  31. package/dist/src/layer/cesium/terrainCesiumImpl.js.map +1 -1
  32. package/dist/src/layer/cesium/tmsCesiumImpl.js +2 -1
  33. package/dist/src/layer/cesium/tmsCesiumImpl.js.map +1 -1
  34. package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js +1 -0
  35. package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js.map +1 -1
  36. package/dist/src/layer/cesium/vectorTileImageryProvider.d.ts +2 -0
  37. package/dist/src/layer/cesium/vectorTileImageryProvider.js +3 -1
  38. package/dist/src/layer/cesium/vectorTileImageryProvider.js.map +1 -1
  39. package/dist/src/layer/cesium/wmsCesiumImpl.js +2 -1
  40. package/dist/src/layer/cesium/wmsCesiumImpl.js.map +1 -1
  41. package/dist/src/layer/cesium/wmtsCesiumImpl.js +2 -1
  42. package/dist/src/layer/cesium/wmtsCesiumImpl.js.map +1 -1
  43. package/dist/src/layer/cesiumTilesetLayer.d.ts +5 -1
  44. package/dist/src/layer/cesiumTilesetLayer.js +17 -7
  45. package/dist/src/layer/cesiumTilesetLayer.js.map +1 -1
  46. package/dist/src/layer/czmlLayer.js +2 -1
  47. package/dist/src/layer/czmlLayer.js.map +1 -1
  48. package/dist/src/layer/featureLayer.js +2 -2
  49. package/dist/src/layer/featureLayer.js.map +1 -1
  50. package/dist/src/layer/featureStoreLayer.js +8 -5
  51. package/dist/src/layer/featureStoreLayer.js.map +1 -1
  52. package/dist/src/layer/featureStoreLayerChanges.d.ts +20 -8
  53. package/dist/src/layer/featureStoreLayerChanges.js +26 -26
  54. package/dist/src/layer/featureStoreLayerChanges.js.map +1 -1
  55. package/dist/src/layer/featureStoreLayerState.d.ts +1 -5
  56. package/dist/src/layer/featureStoreLayerState.js +0 -9
  57. package/dist/src/layer/featureStoreLayerState.js.map +1 -1
  58. package/dist/src/layer/geojsonLayer.js +3 -2
  59. package/dist/src/layer/geojsonLayer.js.map +1 -1
  60. package/dist/src/layer/layer.d.ts +15 -0
  61. package/dist/src/layer/layer.js +30 -4
  62. package/dist/src/layer/layer.js.map +1 -1
  63. package/dist/src/layer/layerImplementation.d.ts +1 -0
  64. package/dist/src/layer/layerImplementation.js +2 -0
  65. package/dist/src/layer/layerImplementation.js.map +1 -1
  66. package/dist/src/layer/oblique/vectorObliqueImpl.js +9 -6
  67. package/dist/src/layer/oblique/vectorObliqueImpl.js.map +1 -1
  68. package/dist/src/layer/openlayers/loadFunctionHelpers.d.ts +2 -0
  69. package/dist/src/layer/openlayers/loadFunctionHelpers.js +20 -0
  70. package/dist/src/layer/openlayers/loadFunctionHelpers.js.map +1 -0
  71. package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js +25 -1
  72. package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js.map +1 -1
  73. package/dist/src/layer/openlayers/tmsOpenlayersImpl.js +9 -1
  74. package/dist/src/layer/openlayers/tmsOpenlayersImpl.js.map +1 -1
  75. package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js +1 -1
  76. package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js.map +1 -1
  77. package/dist/src/layer/openlayers/wmsOpenlayersImpl.d.ts +4 -1
  78. package/dist/src/layer/openlayers/wmsOpenlayersImpl.js +20 -1
  79. package/dist/src/layer/openlayers/wmsOpenlayersImpl.js.map +1 -1
  80. package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js +9 -1
  81. package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js.map +1 -1
  82. package/dist/src/layer/pointCloudLayer.js +2 -2
  83. package/dist/src/layer/pointCloudLayer.js.map +1 -1
  84. package/dist/src/layer/terrainHelpers.d.ts +3 -3
  85. package/dist/src/layer/terrainHelpers.js +12 -7
  86. package/dist/src/layer/terrainHelpers.js.map +1 -1
  87. package/dist/src/layer/terrainLayer.js +1 -1
  88. package/dist/src/layer/terrainLayer.js.map +1 -1
  89. package/dist/src/layer/tileProvider/mvtTileProvider.d.ts +1 -1
  90. package/dist/src/layer/tileProvider/mvtTileProvider.js +4 -3
  91. package/dist/src/layer/tileProvider/mvtTileProvider.js.map +1 -1
  92. package/dist/src/layer/tileProvider/staticGeojsonTileProvider.d.ts +1 -1
  93. package/dist/src/layer/tileProvider/staticGeojsonTileProvider.js +4 -3
  94. package/dist/src/layer/tileProvider/staticGeojsonTileProvider.js.map +1 -1
  95. package/dist/src/layer/tileProvider/tileProvider.d.ts +14 -11
  96. package/dist/src/layer/tileProvider/tileProvider.js +23 -20
  97. package/dist/src/layer/tileProvider/tileProvider.js.map +1 -1
  98. package/dist/src/layer/tileProvider/urlTemplateTileProvider.d.ts +1 -1
  99. package/dist/src/layer/tileProvider/urlTemplateTileProvider.js +4 -3
  100. package/dist/src/layer/tileProvider/urlTemplateTileProvider.js.map +1 -1
  101. package/dist/src/layer/vectorLayer.d.ts +1 -2
  102. package/dist/src/layer/vectorLayer.js +3 -3
  103. package/dist/src/layer/vectorLayer.js.map +1 -1
  104. package/dist/src/layer/vectorProperties.d.ts +11 -16
  105. package/dist/src/layer/vectorProperties.js +16 -13
  106. package/dist/src/layer/vectorProperties.js.map +1 -1
  107. package/dist/src/layer/wfsLayer.js +9 -6
  108. package/dist/src/layer/wfsLayer.js.map +1 -1
  109. package/dist/src/layer/wmsHelpers.d.ts +10 -0
  110. package/dist/src/layer/wmsHelpers.js +53 -12
  111. package/dist/src/layer/wmsHelpers.js.map +1 -1
  112. package/dist/src/layer/wmsLayer.d.ts +6 -0
  113. package/dist/src/layer/wmsLayer.js +5 -2
  114. package/dist/src/layer/wmsLayer.js.map +1 -1
  115. package/dist/src/map/cameraLimiter.d.ts +5 -0
  116. package/dist/src/map/cameraLimiter.js +11 -4
  117. package/dist/src/map/cameraLimiter.js.map +1 -1
  118. package/dist/src/map/cesiumMap.d.ts +20 -1
  119. package/dist/src/map/cesiumMap.js +51 -2
  120. package/dist/src/map/cesiumMap.js.map +1 -1
  121. package/dist/src/map/vcsMap.js +2 -2
  122. package/dist/src/map/vcsMap.js.map +1 -1
  123. package/dist/src/oblique/helpers.d.ts +1 -1
  124. package/dist/src/oblique/helpers.js +5 -9
  125. package/dist/src/oblique/helpers.js.map +1 -1
  126. package/dist/src/oblique/obliqueCollection.d.ts +1 -0
  127. package/dist/src/oblique/obliqueCollection.js +1 -1
  128. package/dist/src/oblique/obliqueCollection.js.map +1 -1
  129. package/dist/src/oblique/obliqueDataSet.d.ts +3 -1
  130. package/dist/src/oblique/obliqueDataSet.js +13 -6
  131. package/dist/src/oblique/obliqueDataSet.js.map +1 -1
  132. package/dist/src/oblique/obliqueImageMeta.d.ts +2 -0
  133. package/dist/src/oblique/obliqueImageMeta.js +2 -0
  134. package/dist/src/oblique/obliqueImageMeta.js.map +1 -1
  135. package/dist/src/oblique/obliqueView.d.ts +1 -0
  136. package/dist/src/oblique/obliqueView.js +12 -2
  137. package/dist/src/oblique/obliqueView.js.map +1 -1
  138. package/dist/src/oblique/parseImageJson.d.ts +6 -5
  139. package/dist/src/oblique/parseImageJson.js +7 -5
  140. package/dist/src/oblique/parseImageJson.js.map +1 -1
  141. package/dist/src/ol/geom/circle.js.map +1 -1
  142. package/dist/src/style/declarativeStyleItem.js +10 -2
  143. package/dist/src/style/declarativeStyleItem.js.map +1 -1
  144. package/dist/src/style/styleFactory.js +2 -2
  145. package/dist/src/style/styleFactory.js.map +1 -1
  146. package/dist/src/style/styleHelpers.js +13 -3
  147. package/dist/src/style/styleHelpers.js.map +1 -1
  148. package/dist/src/style/vectorStyleItem.js +29 -16
  149. package/dist/src/style/vectorStyleItem.js.map +1 -1
  150. package/dist/src/util/clipping/clippingPlaneHelper.js +3 -3
  151. package/dist/src/util/clipping/clippingPlaneHelper.js.map +1 -1
  152. package/dist/src/util/editor/createFeatureSession.d.ts +2 -2
  153. package/dist/src/util/editor/createFeatureSession.js +2 -2
  154. package/dist/src/util/editor/createFeatureSession.js.map +1 -1
  155. package/dist/src/util/editor/editFeaturesSession.d.ts +2 -2
  156. package/dist/src/util/editor/editGeometrySession.d.ts +2 -2
  157. package/dist/src/util/editor/editorSessionHelpers.d.ts +2 -2
  158. package/dist/src/util/editor/selectFeaturesSession.d.ts +2 -2
  159. package/dist/src/util/editor/selectFeaturesSession.js +2 -2
  160. package/dist/src/util/editor/selectFeaturesSession.js.map +1 -1
  161. package/dist/src/util/featureconverter/arcToCesium.d.ts +1 -1
  162. package/dist/src/util/featureconverter/arcToCesium.js +5 -2
  163. package/dist/src/util/featureconverter/arcToCesium.js.map +1 -1
  164. package/dist/src/util/featureconverter/circleToCesium.d.ts +4 -2
  165. package/dist/src/util/featureconverter/circleToCesium.js +8 -3
  166. package/dist/src/util/featureconverter/circleToCesium.js.map +1 -1
  167. package/dist/src/util/featureconverter/extent3D.js.map +1 -1
  168. package/dist/src/util/featureconverter/featureconverterHelper.js +2 -2
  169. package/dist/src/util/featureconverter/featureconverterHelper.js.map +1 -1
  170. package/dist/src/util/featureconverter/lineStringToCesium.d.ts +3 -1
  171. package/dist/src/util/featureconverter/lineStringToCesium.js +7 -2
  172. package/dist/src/util/featureconverter/lineStringToCesium.js.map +1 -1
  173. package/dist/src/util/featureconverter/pointToCesium.js +1 -1
  174. package/dist/src/util/featureconverter/pointToCesium.js.map +1 -1
  175. package/dist/src/util/featureconverter/polygonToCesium.d.ts +3 -3
  176. package/dist/src/util/featureconverter/polygonToCesium.js +9 -15
  177. package/dist/src/util/featureconverter/polygonToCesium.js.map +1 -1
  178. package/dist/src/util/fetch.d.ts +2 -0
  179. package/dist/src/util/fetch.js +16 -0
  180. package/dist/src/util/fetch.js.map +1 -1
  181. package/dist/src/util/flight/flightAnchor.d.ts +23 -0
  182. package/dist/src/util/flight/flightAnchor.js +152 -0
  183. package/dist/src/util/flight/flightAnchor.js.map +1 -0
  184. package/dist/src/util/flight/flightCollection.d.ts +25 -0
  185. package/dist/src/util/flight/flightCollection.js +63 -0
  186. package/dist/src/util/flight/flightCollection.js.map +1 -0
  187. package/dist/src/util/flight/flightHelpers.d.ts +29 -0
  188. package/dist/src/util/flight/flightHelpers.js +134 -0
  189. package/dist/src/util/flight/flightHelpers.js.map +1 -0
  190. package/dist/src/util/flight/flightInstance.d.ts +57 -0
  191. package/dist/src/util/flight/flightInstance.js +166 -0
  192. package/dist/src/util/flight/flightInstance.js.map +1 -0
  193. package/dist/src/util/flight/flightPlayer.d.ts +30 -0
  194. package/dist/src/util/flight/flightPlayer.js +247 -0
  195. package/dist/src/util/flight/flightPlayer.js.map +1 -0
  196. package/dist/src/util/flight/flightVisualizer.d.ts +18 -0
  197. package/dist/src/util/flight/flightVisualizer.js +151 -0
  198. package/dist/src/util/flight/flightVisualizer.js.map +1 -0
  199. package/dist/src/util/hiddenObjects.d.ts +8 -0
  200. package/dist/src/util/hiddenObjects.js +17 -0
  201. package/dist/src/util/hiddenObjects.js.map +1 -0
  202. package/dist/src/util/mapCollection.js +2 -2
  203. package/dist/src/util/mapCollection.js.map +1 -1
  204. package/dist/src/util/overrideCollection.d.ts +8 -3
  205. package/dist/src/util/overrideCollection.js +17 -0
  206. package/dist/src/util/overrideCollection.js.map +1 -1
  207. package/dist/src/util/projection.js +5 -2
  208. package/dist/src/util/projection.js.map +1 -1
  209. package/dist/src/util/viewpoint.d.ts +1 -0
  210. package/dist/src/util/viewpoint.js +24 -7
  211. package/dist/src/util/viewpoint.js.map +1 -1
  212. package/dist/src/vcsApp.d.ts +10 -3
  213. package/dist/src/vcsApp.js +34 -15
  214. package/dist/src/vcsApp.js.map +1 -1
  215. package/dist/src/vcsModule.d.ts +4 -0
  216. package/dist/src/vcsModule.js.map +1 -1
  217. package/dist/tests/unit/helpers/cesiumHelpers.d.ts +2 -2
  218. package/dist/tests/unit/helpers/cesiumHelpers.js +2 -1
  219. package/dist/tests/unit/helpers/cesiumHelpers.js.map +1 -1
  220. package/dist/tests/unit/helpers/terrain/terrainData.d.ts +7 -0
  221. package/dist/tests/unit/helpers/terrain/terrainData.js +2 -2
  222. package/dist/tests/unit/helpers/terrain/terrainData.js.map +1 -1
  223. package/index.ts +39 -1
  224. package/package.json +4 -2
  225. package/src/classRegistry.ts +2 -2
  226. package/src/featureProvider/abstractFeatureProvider.ts +2 -0
  227. package/src/featureProvider/tileProviderFeatureProvider.ts +2 -0
  228. package/src/featureProvider/wmsFeatureProvider.ts +4 -2
  229. package/src/interaction/eventHandler.ts +3 -3
  230. package/src/interaction/featureProviderInteraction.ts +1 -0
  231. package/src/layer/cesium/cesiumTilesetCesiumImpl.ts +44 -5
  232. package/src/layer/cesium/resourceHelper.ts +15 -0
  233. package/src/layer/cesium/singleImageCesiumImpl.ts +2 -1
  234. package/src/layer/cesium/terrainCesiumImpl.ts +2 -1
  235. package/src/layer/cesium/tmsCesiumImpl.ts +2 -1
  236. package/src/layer/cesium/vectorRasterTileCesiumImpl.ts +1 -0
  237. package/src/layer/cesium/vectorTileImageryProvider.ts +10 -1
  238. package/src/layer/cesium/wmsCesiumImpl.ts +2 -1
  239. package/src/layer/cesium/wmtsCesiumImpl.ts +4 -2
  240. package/src/layer/cesiumTilesetLayer.ts +25 -7
  241. package/src/layer/czmlLayer.ts +2 -1
  242. package/src/layer/featureLayer.ts +2 -2
  243. package/src/layer/featureStoreLayer.ts +8 -8
  244. package/src/layer/featureStoreLayerChanges.ts +63 -45
  245. package/src/layer/featureStoreLayerState.ts +6 -5
  246. package/src/layer/geojsonLayer.ts +3 -3
  247. package/src/layer/layer.ts +41 -4
  248. package/src/layer/layerImplementation.ts +3 -0
  249. package/src/layer/oblique/vectorObliqueImpl.ts +9 -8
  250. package/src/layer/openlayers/loadFunctionHelpers.ts +24 -0
  251. package/src/layer/openlayers/singleImageOpenlayersImpl.ts +25 -1
  252. package/src/layer/openlayers/tmsOpenlayersImpl.ts +8 -1
  253. package/src/layer/openlayers/vectorTileOpenlayersImpl.ts +1 -0
  254. package/src/layer/openlayers/wmsOpenlayersImpl.ts +23 -2
  255. package/src/layer/openlayers/wmtsOpenlayersImpl.ts +8 -1
  256. package/src/layer/pointCloudLayer.ts +2 -2
  257. package/src/layer/terrainHelpers.ts +19 -6
  258. package/src/layer/terrainLayer.ts +8 -4
  259. package/src/layer/tileProvider/mvtTileProvider.ts +9 -3
  260. package/src/layer/tileProvider/staticGeojsonTileProvider.ts +9 -3
  261. package/src/layer/tileProvider/tileProvider.ts +49 -13
  262. package/src/layer/tileProvider/urlTemplateTileProvider.ts +10 -3
  263. package/src/layer/vectorLayer.ts +9 -9
  264. package/src/layer/vectorProperties.ts +46 -22
  265. package/src/layer/wfsLayer.ts +9 -6
  266. package/src/layer/wmsHelpers.ts +78 -10
  267. package/src/layer/wmsLayer.ts +11 -2
  268. package/src/map/cameraLimiter.ts +21 -2
  269. package/src/map/cesiumMap.ts +67 -2
  270. package/src/map/vcsMap.ts +2 -2
  271. package/src/oblique/helpers.ts +5 -13
  272. package/src/oblique/obliqueCollection.ts +2 -0
  273. package/src/oblique/obliqueDataSet.ts +16 -2
  274. package/src/oblique/obliqueImageMeta.ts +4 -0
  275. package/src/oblique/obliqueView.ts +12 -2
  276. package/src/oblique/parseImageJson.ts +7 -4
  277. package/src/ol/geojson.d.ts +1 -2
  278. package/src/ol/geom/circle.ts +1 -1
  279. package/src/style/declarativeStyleItem.ts +10 -2
  280. package/src/style/styleFactory.ts +2 -2
  281. package/src/style/styleHelpers.ts +13 -4
  282. package/src/style/vectorStyleItem.ts +32 -20
  283. package/src/util/clipping/clippingPlaneHelper.ts +3 -3
  284. package/src/util/editor/createFeatureSession.ts +9 -8
  285. package/src/util/editor/editFeaturesSession.ts +1 -1
  286. package/src/util/editor/editGeometrySession.ts +1 -1
  287. package/src/util/editor/editorSessionHelpers.ts +2 -2
  288. package/src/util/editor/selectFeaturesSession.ts +3 -3
  289. package/src/util/featureconverter/arcToCesium.ts +5 -1
  290. package/src/util/featureconverter/circleToCesium.ts +8 -2
  291. package/src/util/featureconverter/extent3D.ts +1 -1
  292. package/src/util/featureconverter/featureconverterHelper.ts +3 -5
  293. package/src/util/featureconverter/lineStringToCesium.ts +8 -1
  294. package/src/util/featureconverter/pointToCesium.ts +1 -1
  295. package/src/util/featureconverter/polygonToCesium.ts +6 -15
  296. package/src/util/fetch.ts +25 -0
  297. package/src/util/flight/flightAnchor.ts +195 -0
  298. package/src/util/flight/flightCollection.ts +78 -0
  299. package/src/util/flight/flightHelpers.ts +208 -0
  300. package/src/util/flight/flightInstance.ts +240 -0
  301. package/src/util/flight/flightPlayer.ts +326 -0
  302. package/src/util/flight/flightVisualizer.ts +202 -0
  303. package/src/util/hiddenObjects.ts +35 -0
  304. package/src/util/mapCollection.ts +2 -2
  305. package/src/util/overrideCollection.ts +26 -3
  306. package/src/util/projection.ts +5 -2
  307. package/src/util/viewpoint.ts +27 -7
  308. package/src/vcsApp.ts +56 -15
  309. 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, checkMaybe } from '@vcsuite/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
- checkMaybe(target, [String, HTMLElement]);
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. 3) replaced is called for items
31
- * which where replaced. replaced is called after added has been called for the item.
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 after added
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;
@@ -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, { epsg: [String, Number], proj4: [String, undefined, null] });
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
  }