@vcmap/core 5.0.3 → 5.1.0-rc.2

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 (307) hide show
  1. package/dist/geojson.d.ts +27 -0
  2. package/dist/index.d.ts +14 -4
  3. package/dist/index.js +9 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/classRegistry.js +2 -2
  6. package/dist/src/classRegistry.js.map +1 -1
  7. package/dist/src/featureProvider/abstractFeatureProvider.d.ts +2 -1
  8. package/dist/src/featureProvider/abstractFeatureProvider.js +2 -1
  9. package/dist/src/featureProvider/abstractFeatureProvider.js.map +1 -1
  10. package/dist/src/featureProvider/tileProviderFeatureProvider.d.ts +1 -1
  11. package/dist/src/featureProvider/tileProviderFeatureProvider.js +2 -2
  12. package/dist/src/featureProvider/tileProviderFeatureProvider.js.map +1 -1
  13. package/dist/src/featureProvider/wmsFeatureProvider.d.ts +1 -1
  14. package/dist/src/featureProvider/wmsFeatureProvider.js +4 -3
  15. package/dist/src/featureProvider/wmsFeatureProvider.js.map +1 -1
  16. package/dist/src/interaction/eventHandler.js +3 -3
  17. package/dist/src/interaction/eventHandler.js.map +1 -1
  18. package/dist/src/interaction/featureProviderInteraction.js +1 -1
  19. package/dist/src/interaction/featureProviderInteraction.js.map +1 -1
  20. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.d.ts +4 -1
  21. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js +31 -2
  22. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js.map +1 -1
  23. package/dist/src/layer/cesium/resourceHelper.d.ts +2 -0
  24. package/dist/src/layer/cesium/resourceHelper.js +12 -0
  25. package/dist/src/layer/cesium/resourceHelper.js.map +1 -0
  26. package/dist/src/layer/cesium/singleImageCesiumImpl.js +2 -1
  27. package/dist/src/layer/cesium/singleImageCesiumImpl.js.map +1 -1
  28. package/dist/src/layer/cesium/terrainCesiumImpl.js +1 -1
  29. package/dist/src/layer/cesium/terrainCesiumImpl.js.map +1 -1
  30. package/dist/src/layer/cesium/tmsCesiumImpl.js +2 -1
  31. package/dist/src/layer/cesium/tmsCesiumImpl.js.map +1 -1
  32. package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js +1 -0
  33. package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js.map +1 -1
  34. package/dist/src/layer/cesium/vectorTileImageryProvider.d.ts +2 -0
  35. package/dist/src/layer/cesium/vectorTileImageryProvider.js +3 -1
  36. package/dist/src/layer/cesium/vectorTileImageryProvider.js.map +1 -1
  37. package/dist/src/layer/cesium/wmsCesiumImpl.js +2 -1
  38. package/dist/src/layer/cesium/wmsCesiumImpl.js.map +1 -1
  39. package/dist/src/layer/cesium/wmtsCesiumImpl.js +2 -1
  40. package/dist/src/layer/cesium/wmtsCesiumImpl.js.map +1 -1
  41. package/dist/src/layer/cesiumTilesetLayer.d.ts +5 -1
  42. package/dist/src/layer/cesiumTilesetLayer.js +17 -7
  43. package/dist/src/layer/cesiumTilesetLayer.js.map +1 -1
  44. package/dist/src/layer/czmlLayer.js +2 -1
  45. package/dist/src/layer/czmlLayer.js.map +1 -1
  46. package/dist/src/layer/featureLayer.js +2 -2
  47. package/dist/src/layer/featureLayer.js.map +1 -1
  48. package/dist/src/layer/featureStoreLayer.js +8 -5
  49. package/dist/src/layer/featureStoreLayer.js.map +1 -1
  50. package/dist/src/layer/featureStoreLayerChanges.d.ts +20 -8
  51. package/dist/src/layer/featureStoreLayerChanges.js +26 -26
  52. package/dist/src/layer/featureStoreLayerChanges.js.map +1 -1
  53. package/dist/src/layer/featureStoreLayerState.d.ts +1 -5
  54. package/dist/src/layer/featureStoreLayerState.js +0 -9
  55. package/dist/src/layer/featureStoreLayerState.js.map +1 -1
  56. package/dist/src/layer/geojsonLayer.js +3 -2
  57. package/dist/src/layer/geojsonLayer.js.map +1 -1
  58. package/dist/src/layer/layer.d.ts +15 -0
  59. package/dist/src/layer/layer.js +30 -4
  60. package/dist/src/layer/layer.js.map +1 -1
  61. package/dist/src/layer/layerImplementation.d.ts +1 -0
  62. package/dist/src/layer/layerImplementation.js +2 -0
  63. package/dist/src/layer/layerImplementation.js.map +1 -1
  64. package/dist/src/layer/oblique/vectorObliqueImpl.js +17 -7
  65. package/dist/src/layer/oblique/vectorObliqueImpl.js.map +1 -1
  66. package/dist/src/layer/openlayers/loadFunctionHelpers.d.ts +2 -0
  67. package/dist/src/layer/openlayers/loadFunctionHelpers.js +20 -0
  68. package/dist/src/layer/openlayers/loadFunctionHelpers.js.map +1 -0
  69. package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js +25 -1
  70. package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js.map +1 -1
  71. package/dist/src/layer/openlayers/tmsOpenlayersImpl.js +9 -1
  72. package/dist/src/layer/openlayers/tmsOpenlayersImpl.js.map +1 -1
  73. package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js +1 -1
  74. package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js.map +1 -1
  75. package/dist/src/layer/openlayers/wmsOpenlayersImpl.d.ts +4 -1
  76. package/dist/src/layer/openlayers/wmsOpenlayersImpl.js +20 -1
  77. package/dist/src/layer/openlayers/wmsOpenlayersImpl.js.map +1 -1
  78. package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js +9 -1
  79. package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js.map +1 -1
  80. package/dist/src/layer/pointCloudLayer.js +2 -2
  81. package/dist/src/layer/pointCloudLayer.js.map +1 -1
  82. package/dist/src/layer/terrainHelpers.d.ts +3 -3
  83. package/dist/src/layer/terrainHelpers.js +12 -7
  84. package/dist/src/layer/terrainHelpers.js.map +1 -1
  85. package/dist/src/layer/terrainLayer.js +1 -1
  86. package/dist/src/layer/terrainLayer.js.map +1 -1
  87. package/dist/src/layer/tileProvider/mvtTileProvider.d.ts +1 -1
  88. package/dist/src/layer/tileProvider/mvtTileProvider.js +4 -3
  89. package/dist/src/layer/tileProvider/mvtTileProvider.js.map +1 -1
  90. package/dist/src/layer/tileProvider/staticGeojsonTileProvider.d.ts +1 -1
  91. package/dist/src/layer/tileProvider/staticGeojsonTileProvider.js +4 -3
  92. package/dist/src/layer/tileProvider/staticGeojsonTileProvider.js.map +1 -1
  93. package/dist/src/layer/tileProvider/tileProvider.d.ts +14 -11
  94. package/dist/src/layer/tileProvider/tileProvider.js +23 -20
  95. package/dist/src/layer/tileProvider/tileProvider.js.map +1 -1
  96. package/dist/src/layer/tileProvider/urlTemplateTileProvider.d.ts +1 -1
  97. package/dist/src/layer/tileProvider/urlTemplateTileProvider.js +4 -3
  98. package/dist/src/layer/tileProvider/urlTemplateTileProvider.js.map +1 -1
  99. package/dist/src/layer/vectorLayer.d.ts +1 -2
  100. package/dist/src/layer/vectorLayer.js +3 -3
  101. package/dist/src/layer/vectorLayer.js.map +1 -1
  102. package/dist/src/layer/vectorProperties.d.ts +11 -16
  103. package/dist/src/layer/vectorProperties.js +16 -13
  104. package/dist/src/layer/vectorProperties.js.map +1 -1
  105. package/dist/src/layer/wfsLayer.js +9 -6
  106. package/dist/src/layer/wfsLayer.js.map +1 -1
  107. package/dist/src/layer/wmsHelpers.d.ts +10 -0
  108. package/dist/src/layer/wmsHelpers.js +53 -12
  109. package/dist/src/layer/wmsHelpers.js.map +1 -1
  110. package/dist/src/layer/wmsLayer.d.ts +6 -0
  111. package/dist/src/layer/wmsLayer.js +5 -2
  112. package/dist/src/layer/wmsLayer.js.map +1 -1
  113. package/dist/src/map/cameraLimiter.d.ts +5 -0
  114. package/dist/src/map/cameraLimiter.js +11 -4
  115. package/dist/src/map/cameraLimiter.js.map +1 -1
  116. package/dist/src/map/cesiumMap.d.ts +20 -1
  117. package/dist/src/map/cesiumMap.js +51 -2
  118. package/dist/src/map/cesiumMap.js.map +1 -1
  119. package/dist/src/map/vcsMap.js +2 -2
  120. package/dist/src/map/vcsMap.js.map +1 -1
  121. package/dist/src/oblique/helpers.d.ts +1 -1
  122. package/dist/src/oblique/helpers.js +5 -9
  123. package/dist/src/oblique/helpers.js.map +1 -1
  124. package/dist/src/oblique/obliqueCollection.d.ts +1 -0
  125. package/dist/src/oblique/obliqueCollection.js +1 -1
  126. package/dist/src/oblique/obliqueCollection.js.map +1 -1
  127. package/dist/src/oblique/obliqueDataSet.d.ts +3 -1
  128. package/dist/src/oblique/obliqueDataSet.js +13 -6
  129. package/dist/src/oblique/obliqueDataSet.js.map +1 -1
  130. package/dist/src/oblique/obliqueImageMeta.d.ts +2 -0
  131. package/dist/src/oblique/obliqueImageMeta.js +2 -0
  132. package/dist/src/oblique/obliqueImageMeta.js.map +1 -1
  133. package/dist/src/oblique/obliqueView.d.ts +1 -0
  134. package/dist/src/oblique/obliqueView.js +12 -2
  135. package/dist/src/oblique/obliqueView.js.map +1 -1
  136. package/dist/src/oblique/parseImageJson.d.ts +6 -5
  137. package/dist/src/oblique/parseImageJson.js +7 -5
  138. package/dist/src/oblique/parseImageJson.js.map +1 -1
  139. package/dist/src/ol/geom/circle.js.map +1 -1
  140. package/dist/src/style/declarativeStyleItem.js +10 -2
  141. package/dist/src/style/declarativeStyleItem.js.map +1 -1
  142. package/dist/src/style/styleFactory.js +2 -2
  143. package/dist/src/style/styleFactory.js.map +1 -1
  144. package/dist/src/style/styleHelpers.js +13 -3
  145. package/dist/src/style/styleHelpers.js.map +1 -1
  146. package/dist/src/style/vectorStyleItem.js +29 -16
  147. package/dist/src/style/vectorStyleItem.js.map +1 -1
  148. package/dist/src/util/clipping/clippingPlaneHelper.js +3 -3
  149. package/dist/src/util/clipping/clippingPlaneHelper.js.map +1 -1
  150. package/dist/src/util/editor/createFeatureSession.d.ts +2 -2
  151. package/dist/src/util/editor/createFeatureSession.js +2 -2
  152. package/dist/src/util/editor/createFeatureSession.js.map +1 -1
  153. package/dist/src/util/editor/editFeaturesSession.d.ts +2 -2
  154. package/dist/src/util/editor/editGeometrySession.d.ts +2 -2
  155. package/dist/src/util/editor/editorSessionHelpers.d.ts +2 -2
  156. package/dist/src/util/editor/selectFeaturesSession.d.ts +2 -2
  157. package/dist/src/util/editor/selectFeaturesSession.js +2 -2
  158. package/dist/src/util/editor/selectFeaturesSession.js.map +1 -1
  159. package/dist/src/util/featureconverter/arcToCesium.d.ts +1 -1
  160. package/dist/src/util/featureconverter/arcToCesium.js +5 -2
  161. package/dist/src/util/featureconverter/arcToCesium.js.map +1 -1
  162. package/dist/src/util/featureconverter/circleToCesium.d.ts +4 -2
  163. package/dist/src/util/featureconverter/circleToCesium.js +8 -3
  164. package/dist/src/util/featureconverter/circleToCesium.js.map +1 -1
  165. package/dist/src/util/featureconverter/extent3D.js.map +1 -1
  166. package/dist/src/util/featureconverter/featureconverterHelper.js +2 -2
  167. package/dist/src/util/featureconverter/featureconverterHelper.js.map +1 -1
  168. package/dist/src/util/featureconverter/lineStringToCesium.d.ts +3 -1
  169. package/dist/src/util/featureconverter/lineStringToCesium.js +7 -2
  170. package/dist/src/util/featureconverter/lineStringToCesium.js.map +1 -1
  171. package/dist/src/util/featureconverter/pointToCesium.js +1 -1
  172. package/dist/src/util/featureconverter/pointToCesium.js.map +1 -1
  173. package/dist/src/util/featureconverter/polygonToCesium.d.ts +3 -3
  174. package/dist/src/util/featureconverter/polygonToCesium.js +9 -15
  175. package/dist/src/util/featureconverter/polygonToCesium.js.map +1 -1
  176. package/dist/src/util/fetch.d.ts +2 -0
  177. package/dist/src/util/fetch.js +16 -0
  178. package/dist/src/util/fetch.js.map +1 -1
  179. package/dist/src/util/flight/flightAnchor.d.ts +23 -0
  180. package/dist/src/util/flight/flightAnchor.js +152 -0
  181. package/dist/src/util/flight/flightAnchor.js.map +1 -0
  182. package/dist/src/util/flight/flightCollection.d.ts +25 -0
  183. package/dist/src/util/flight/flightCollection.js +63 -0
  184. package/dist/src/util/flight/flightCollection.js.map +1 -0
  185. package/dist/src/util/flight/flightHelpers.d.ts +29 -0
  186. package/dist/src/util/flight/flightHelpers.js +134 -0
  187. package/dist/src/util/flight/flightHelpers.js.map +1 -0
  188. package/dist/src/util/flight/flightInstance.d.ts +57 -0
  189. package/dist/src/util/flight/flightInstance.js +166 -0
  190. package/dist/src/util/flight/flightInstance.js.map +1 -0
  191. package/dist/src/util/flight/flightPlayer.d.ts +30 -0
  192. package/dist/src/util/flight/flightPlayer.js +247 -0
  193. package/dist/src/util/flight/flightPlayer.js.map +1 -0
  194. package/dist/src/util/flight/flightVisualizer.d.ts +18 -0
  195. package/dist/src/util/flight/flightVisualizer.js +151 -0
  196. package/dist/src/util/flight/flightVisualizer.js.map +1 -0
  197. package/dist/src/util/hiddenObjects.d.ts +8 -0
  198. package/dist/src/util/hiddenObjects.js +17 -0
  199. package/dist/src/util/hiddenObjects.js.map +1 -0
  200. package/dist/src/util/mapCollection.js +2 -2
  201. package/dist/src/util/mapCollection.js.map +1 -1
  202. package/dist/src/util/overrideCollection.d.ts +8 -3
  203. package/dist/src/util/overrideCollection.js +17 -0
  204. package/dist/src/util/overrideCollection.js.map +1 -1
  205. package/dist/src/util/projection.js +5 -2
  206. package/dist/src/util/projection.js.map +1 -1
  207. package/dist/src/util/viewpoint.d.ts +1 -0
  208. package/dist/src/util/viewpoint.js +24 -7
  209. package/dist/src/util/viewpoint.js.map +1 -1
  210. package/dist/src/vcsApp.d.ts +10 -3
  211. package/dist/src/vcsApp.js +34 -15
  212. package/dist/src/vcsApp.js.map +1 -1
  213. package/dist/src/vcsModule.d.ts +4 -0
  214. package/dist/src/vcsModule.js.map +1 -1
  215. package/dist/tests/unit/helpers/cesiumHelpers.d.ts +2 -2
  216. package/dist/tests/unit/helpers/cesiumHelpers.js +2 -1
  217. package/dist/tests/unit/helpers/cesiumHelpers.js.map +1 -1
  218. package/dist/tests/unit/helpers/terrain/terrainData.d.ts +7 -0
  219. package/dist/tests/unit/helpers/terrain/terrainData.js +2 -2
  220. package/dist/tests/unit/helpers/terrain/terrainData.js.map +1 -1
  221. package/index.ts +39 -1
  222. package/package.json +3 -2
  223. package/src/classRegistry.ts +2 -2
  224. package/src/featureProvider/abstractFeatureProvider.ts +2 -0
  225. package/src/featureProvider/tileProviderFeatureProvider.ts +2 -0
  226. package/src/featureProvider/wmsFeatureProvider.ts +4 -2
  227. package/src/interaction/eventHandler.ts +3 -3
  228. package/src/interaction/featureProviderInteraction.ts +1 -0
  229. package/src/layer/cesium/cesiumTilesetCesiumImpl.ts +44 -5
  230. package/src/layer/cesium/resourceHelper.ts +15 -0
  231. package/src/layer/cesium/singleImageCesiumImpl.ts +2 -1
  232. package/src/layer/cesium/terrainCesiumImpl.ts +2 -1
  233. package/src/layer/cesium/tmsCesiumImpl.ts +2 -1
  234. package/src/layer/cesium/vectorRasterTileCesiumImpl.ts +1 -0
  235. package/src/layer/cesium/vectorTileImageryProvider.ts +10 -1
  236. package/src/layer/cesium/wmsCesiumImpl.ts +2 -1
  237. package/src/layer/cesium/wmtsCesiumImpl.ts +4 -2
  238. package/src/layer/cesiumTilesetLayer.ts +25 -7
  239. package/src/layer/czmlLayer.ts +2 -1
  240. package/src/layer/featureLayer.ts +2 -2
  241. package/src/layer/featureStoreLayer.ts +8 -8
  242. package/src/layer/featureStoreLayerChanges.ts +63 -45
  243. package/src/layer/featureStoreLayerState.ts +6 -5
  244. package/src/layer/geojsonLayer.ts +3 -3
  245. package/src/layer/layer.ts +41 -4
  246. package/src/layer/layerImplementation.ts +3 -0
  247. package/src/layer/oblique/vectorObliqueImpl.ts +18 -12
  248. package/src/layer/openlayers/loadFunctionHelpers.ts +24 -0
  249. package/src/layer/openlayers/singleImageOpenlayersImpl.ts +25 -1
  250. package/src/layer/openlayers/tmsOpenlayersImpl.ts +8 -1
  251. package/src/layer/openlayers/vectorTileOpenlayersImpl.ts +1 -0
  252. package/src/layer/openlayers/wmsOpenlayersImpl.ts +23 -2
  253. package/src/layer/openlayers/wmtsOpenlayersImpl.ts +8 -1
  254. package/src/layer/pointCloudLayer.ts +2 -2
  255. package/src/layer/terrainHelpers.ts +19 -6
  256. package/src/layer/terrainLayer.ts +8 -4
  257. package/src/layer/tileProvider/mvtTileProvider.ts +9 -3
  258. package/src/layer/tileProvider/staticGeojsonTileProvider.ts +9 -3
  259. package/src/layer/tileProvider/tileProvider.ts +49 -13
  260. package/src/layer/tileProvider/urlTemplateTileProvider.ts +10 -3
  261. package/src/layer/vectorLayer.ts +9 -9
  262. package/src/layer/vectorProperties.ts +46 -22
  263. package/src/layer/wfsLayer.ts +9 -6
  264. package/src/layer/wmsHelpers.ts +78 -10
  265. package/src/layer/wmsLayer.ts +11 -2
  266. package/src/map/cameraLimiter.ts +21 -2
  267. package/src/map/cesiumMap.ts +67 -2
  268. package/src/map/vcsMap.ts +2 -2
  269. package/src/oblique/helpers.ts +5 -13
  270. package/src/oblique/obliqueCollection.ts +2 -0
  271. package/src/oblique/obliqueDataSet.ts +16 -2
  272. package/src/oblique/obliqueImageMeta.ts +4 -0
  273. package/src/oblique/obliqueView.ts +12 -2
  274. package/src/oblique/parseImageJson.ts +7 -4
  275. package/src/ol/geojson.d.ts +1 -2
  276. package/src/ol/geom/circle.ts +1 -1
  277. package/src/style/declarativeStyleItem.ts +10 -2
  278. package/src/style/styleFactory.ts +2 -2
  279. package/src/style/styleHelpers.ts +13 -4
  280. package/src/style/vectorStyleItem.ts +32 -20
  281. package/src/util/clipping/clippingPlaneHelper.ts +3 -3
  282. package/src/util/editor/createFeatureSession.ts +9 -8
  283. package/src/util/editor/editFeaturesSession.ts +1 -1
  284. package/src/util/editor/editGeometrySession.ts +1 -1
  285. package/src/util/editor/editorSessionHelpers.ts +2 -2
  286. package/src/util/editor/selectFeaturesSession.ts +3 -3
  287. package/src/util/featureconverter/arcToCesium.ts +5 -1
  288. package/src/util/featureconverter/circleToCesium.ts +8 -2
  289. package/src/util/featureconverter/extent3D.ts +1 -1
  290. package/src/util/featureconverter/featureconverterHelper.ts +3 -5
  291. package/src/util/featureconverter/lineStringToCesium.ts +8 -1
  292. package/src/util/featureconverter/pointToCesium.ts +1 -1
  293. package/src/util/featureconverter/polygonToCesium.ts +6 -15
  294. package/src/util/fetch.ts +25 -0
  295. package/src/util/flight/flightAnchor.ts +195 -0
  296. package/src/util/flight/flightCollection.ts +78 -0
  297. package/src/util/flight/flightHelpers.ts +208 -0
  298. package/src/util/flight/flightInstance.ts +240 -0
  299. package/src/util/flight/flightPlayer.ts +326 -0
  300. package/src/util/flight/flightVisualizer.ts +202 -0
  301. package/src/util/hiddenObjects.ts +35 -0
  302. package/src/util/mapCollection.ts +2 -2
  303. package/src/util/overrideCollection.ts +26 -3
  304. package/src/util/projection.ts +5 -2
  305. package/src/util/viewpoint.ts +27 -7
  306. package/src/vcsApp.ts +56 -15
  307. package/src/vcsModule.ts +4 -0
@@ -0,0 +1,240 @@
1
+ import type { FeatureCollection, Point as GeojsonPoint } from 'geojson';
2
+ import { parseBoolean, parseNumber } from '@vcsuite/parsers';
3
+ import { check, oneOf } from '@vcsuite/check';
4
+ import VcsObject, { VcsObjectOptions } from '../../vcsObject.js';
5
+ import VcsEvent from '../../vcsEvent.js';
6
+ import { parseFlightOptionsFromGeoJson } from './flightHelpers.js';
7
+ import { requestJson } from '../fetch.js';
8
+ import {
9
+ FlightAnchor,
10
+ anchorFromGeojsonFeature,
11
+ anchorToGeojsonFeature,
12
+ FlightAnchorGeojsonFeature,
13
+ } from './flightAnchor.js';
14
+ import IndexedCollection from '../indexedCollection.js';
15
+ import { destroyCollection } from '../../vcsModuleHelpers.js';
16
+
17
+ export type FlightInterpolation = 'spline' | 'linear';
18
+
19
+ export type FlightInstanceMeta = VcsObjectOptions & {
20
+ multiplier?: number;
21
+ interpolation?: FlightInterpolation;
22
+ loop?: boolean;
23
+ };
24
+
25
+ export type FlightInstanceOptions = FlightInstanceMeta & {
26
+ anchors?: FlightAnchorGeojsonFeature[];
27
+ url?: string;
28
+ };
29
+
30
+ class FlightInstance extends VcsObject {
31
+ static get className(): string {
32
+ return 'FlightInstance';
33
+ }
34
+
35
+ anchors: IndexedCollection<FlightAnchor>;
36
+
37
+ private _multiplier: number;
38
+
39
+ private _loop: boolean;
40
+
41
+ private _interpolation: FlightInterpolation;
42
+
43
+ /**
44
+ * Raised when anchors are added, removed, moved or changed
45
+ */
46
+ anchorsChanged = new VcsEvent<void>();
47
+
48
+ /**
49
+ * Raised when multiplier, loop or interpolation changes.
50
+ */
51
+ propertyChanged = new VcsEvent<'multiplier' | 'loop' | 'interpolation'>();
52
+
53
+ private readonly _url: string | undefined;
54
+
55
+ private _readyPromise: Promise<void> | null = null;
56
+
57
+ private _anchorListeners: Map<string, () => void> = new Map();
58
+
59
+ static getDefaultOptions(): FlightInstanceOptions {
60
+ return {
61
+ multiplier: 1,
62
+ loop: false,
63
+ interpolation: 'spline',
64
+ anchors: [],
65
+ };
66
+ }
67
+
68
+ constructor(options: FlightInstanceOptions) {
69
+ super(options);
70
+
71
+ const defaultOptions = FlightInstance.getDefaultOptions();
72
+ const anchorsArray = (options.anchors ?? defaultOptions.anchors!)
73
+ .map(anchorFromGeojsonFeature)
74
+ .filter((a): a is FlightAnchor => !!a);
75
+
76
+ this.anchors = IndexedCollection.from(anchorsArray);
77
+
78
+ this._multiplier = parseNumber(
79
+ options.multiplier,
80
+ defaultOptions.multiplier,
81
+ );
82
+
83
+ this._loop = parseBoolean(options.loop, defaultOptions.loop);
84
+
85
+ this._interpolation =
86
+ options.interpolation || defaultOptions.interpolation!;
87
+
88
+ this.anchorsChanged = new VcsEvent();
89
+
90
+ this._url = options.url;
91
+ }
92
+
93
+ get initialized(): boolean {
94
+ return !!this._readyPromise;
95
+ }
96
+
97
+ get multiplier(): number {
98
+ return this._multiplier;
99
+ }
100
+
101
+ set multiplier(value: number) {
102
+ check(value, Number);
103
+
104
+ if (this._multiplier !== value) {
105
+ this._multiplier = value;
106
+ this.propertyChanged.raiseEvent('multiplier');
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Whether this flight represents a circular flight path or not
112
+ */
113
+ get loop(): boolean {
114
+ return this._loop;
115
+ }
116
+
117
+ set loop(value: boolean) {
118
+ check(value, Boolean);
119
+
120
+ if (this._loop !== value) {
121
+ this._loop = value;
122
+ this.propertyChanged.raiseEvent('loop');
123
+ }
124
+ }
125
+
126
+ get interpolation(): FlightInterpolation {
127
+ return this._interpolation;
128
+ }
129
+
130
+ set interpolation(value: FlightInterpolation) {
131
+ check(value, oneOf('linear', 'spline'));
132
+
133
+ if (this._interpolation !== value) {
134
+ this._interpolation = value;
135
+ this.propertyChanged.raiseEvent('interpolation');
136
+ }
137
+ }
138
+
139
+ initialize(): Promise<void> {
140
+ if (!this._readyPromise) {
141
+ if (this._url) {
142
+ this._readyPromise = requestJson<
143
+ FeatureCollection<
144
+ GeojsonPoint,
145
+ FlightAnchorGeojsonFeature['properties']
146
+ >
147
+ >(this._url).then((collection) => {
148
+ const instance = parseFlightOptionsFromGeoJson(collection);
149
+ (instance.anchors ?? [])
150
+ .map(anchorFromGeojsonFeature)
151
+ .filter((a): a is FlightAnchor => !!a)
152
+ .forEach((anchor) => this.anchors.add(anchor));
153
+ this._multiplier = instance.multiplier ?? this._multiplier;
154
+ this._loop = instance.loop ?? this._loop;
155
+ this._interpolation = instance.interpolation ?? this._interpolation;
156
+ });
157
+ } else {
158
+ this._readyPromise = Promise.resolve();
159
+ }
160
+ for (const anchor of this.anchors) {
161
+ this._anchorListeners.set(
162
+ anchor.name,
163
+ anchor.changed.addEventListener(() => {
164
+ this.anchorsChanged.raiseEvent();
165
+ }),
166
+ );
167
+ }
168
+
169
+ this.anchors.added.addEventListener((anchor) => {
170
+ this._anchorListeners.set(
171
+ anchor.name,
172
+ anchor.changed.addEventListener(() => {
173
+ this.anchorsChanged.raiseEvent();
174
+ }),
175
+ );
176
+ this.anchorsChanged.raiseEvent();
177
+ });
178
+
179
+ this.anchors.removed.addEventListener((anchor) => {
180
+ this._anchorListeners.get(anchor.name)?.();
181
+ this._anchorListeners.delete(anchor.name);
182
+ this.anchorsChanged.raiseEvent();
183
+ });
184
+
185
+ this.anchors.moved.addEventListener(() => {
186
+ this.anchorsChanged.raiseEvent();
187
+ });
188
+ }
189
+
190
+ return this._readyPromise;
191
+ }
192
+
193
+ /**
194
+ * checks if this flightInstance is valid. To be valid, a flight must have at least 2 anchors.
195
+ * @returns
196
+ */
197
+ isValid(): boolean {
198
+ return this.anchors.size >= 2;
199
+ }
200
+
201
+ /**
202
+ * returns an options object for this flight. if this flight was configured via an URL, only the url will be configured.
203
+ * @returns
204
+ */
205
+ toJSON(): FlightInstanceOptions {
206
+ const config = super.toJSON() as FlightInstanceOptions;
207
+
208
+ if (this._url) {
209
+ config.url = this._url;
210
+ return config;
211
+ }
212
+
213
+ const defaultOptions = FlightInstance.getDefaultOptions();
214
+ if (this._multiplier !== defaultOptions.multiplier) {
215
+ config.multiplier = this._multiplier;
216
+ }
217
+
218
+ if (this._loop !== defaultOptions.loop) {
219
+ config.loop = this._loop;
220
+ }
221
+
222
+ if (this._interpolation !== defaultOptions.interpolation) {
223
+ config.interpolation = this._interpolation;
224
+ }
225
+
226
+ if (this.anchors.size > 0) {
227
+ config.anchors = [...this.anchors].map(anchorToGeojsonFeature);
228
+ }
229
+ return config;
230
+ }
231
+
232
+ destroy(): void {
233
+ this.anchorsChanged.destroy();
234
+ destroyCollection(this.anchors);
235
+ this._anchorListeners.clear();
236
+ super.destroy();
237
+ }
238
+ }
239
+
240
+ export default FlightInstance;
@@ -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
+ }