@vcmap/core 5.0.0-rc.0

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 (146) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +44 -0
  3. package/build/postinstall.js +44 -0
  4. package/index.js +139 -0
  5. package/package.json +92 -0
  6. package/src/cesium/cesium3DTileFeature.js +9 -0
  7. package/src/cesium/cesium3DTilePointFeature.js +9 -0
  8. package/src/cesium/cesiumVcsCameraPrimitive.js +146 -0
  9. package/src/cesium/wallpaperMaterial.js +64 -0
  10. package/src/ol/feature.js +47 -0
  11. package/src/ol/geom/circle.js +24 -0
  12. package/src/ol/geom/geometryCollection.js +33 -0
  13. package/src/ol/render/canvas/canvasTileRenderer.js +179 -0
  14. package/src/ol/source/ClusterEnhancedVectorSource.js +39 -0
  15. package/src/ol/source/VcsCluster.js +37 -0
  16. package/src/vcs/vcm/classRegistry.js +106 -0
  17. package/src/vcs/vcm/event/vcsEvent.js +89 -0
  18. package/src/vcs/vcm/globalCollections.js +11 -0
  19. package/src/vcs/vcm/interaction/abstractInteraction.js +149 -0
  20. package/src/vcs/vcm/interaction/coordinateAtPixel.js +102 -0
  21. package/src/vcs/vcm/interaction/eventHandler.js +425 -0
  22. package/src/vcs/vcm/interaction/featureAtPixelInteraction.js +286 -0
  23. package/src/vcs/vcm/interaction/featureProviderInteraction.js +54 -0
  24. package/src/vcs/vcm/interaction/interactionChain.js +124 -0
  25. package/src/vcs/vcm/interaction/interactionType.js +114 -0
  26. package/src/vcs/vcm/layer/buildings.js +17 -0
  27. package/src/vcs/vcm/layer/cesium/cesiumTilesetCesium.js +359 -0
  28. package/src/vcs/vcm/layer/cesium/clusterContext.js +95 -0
  29. package/src/vcs/vcm/layer/cesium/dataSourceCesium.js +171 -0
  30. package/src/vcs/vcm/layer/cesium/openStreetMapCesium.js +29 -0
  31. package/src/vcs/vcm/layer/cesium/pointCloudCesium.js +58 -0
  32. package/src/vcs/vcm/layer/cesium/rasterLayerCesium.js +110 -0
  33. package/src/vcs/vcm/layer/cesium/singleImageCesium.js +49 -0
  34. package/src/vcs/vcm/layer/cesium/terrainCesium.js +80 -0
  35. package/src/vcs/vcm/layer/cesium/tmsCesium.js +54 -0
  36. package/src/vcs/vcm/layer/cesium/vectorCesium.js +255 -0
  37. package/src/vcs/vcm/layer/cesium/vectorContext.js +167 -0
  38. package/src/vcs/vcm/layer/cesium/vectorRasterTileCesium.js +116 -0
  39. package/src/vcs/vcm/layer/cesium/vectorTileImageryProvider.js +246 -0
  40. package/src/vcs/vcm/layer/cesium/wmsCesium.js +71 -0
  41. package/src/vcs/vcm/layer/cesium/wmtsCesium.js +101 -0
  42. package/src/vcs/vcm/layer/cesium/x3dmHelper.js +22 -0
  43. package/src/vcs/vcm/layer/cesiumTileset.js +376 -0
  44. package/src/vcs/vcm/layer/czml.js +141 -0
  45. package/src/vcs/vcm/layer/dataSource.js +259 -0
  46. package/src/vcs/vcm/layer/featureLayer.js +261 -0
  47. package/src/vcs/vcm/layer/featureStore.js +647 -0
  48. package/src/vcs/vcm/layer/featureStoreChanges.js +360 -0
  49. package/src/vcs/vcm/layer/featureStoreState.js +19 -0
  50. package/src/vcs/vcm/layer/featureVisibility.js +435 -0
  51. package/src/vcs/vcm/layer/geojson.js +185 -0
  52. package/src/vcs/vcm/layer/geojsonHelpers.js +450 -0
  53. package/src/vcs/vcm/layer/globalHider.js +157 -0
  54. package/src/vcs/vcm/layer/layer.js +752 -0
  55. package/src/vcs/vcm/layer/layerImplementation.js +102 -0
  56. package/src/vcs/vcm/layer/layerState.js +17 -0
  57. package/src/vcs/vcm/layer/layerSymbols.js +6 -0
  58. package/src/vcs/vcm/layer/oblique/layerOblique.js +76 -0
  59. package/src/vcs/vcm/layer/oblique/obliqueHelpers.js +175 -0
  60. package/src/vcs/vcm/layer/oblique/vectorOblique.js +469 -0
  61. package/src/vcs/vcm/layer/openStreetMap.js +194 -0
  62. package/src/vcs/vcm/layer/openlayers/layerOpenlayers.js +79 -0
  63. package/src/vcs/vcm/layer/openlayers/openStreetMapOpenlayers.js +27 -0
  64. package/src/vcs/vcm/layer/openlayers/rasterLayerOpenlayers.js +121 -0
  65. package/src/vcs/vcm/layer/openlayers/singleImageOpenlayers.js +49 -0
  66. package/src/vcs/vcm/layer/openlayers/tileDebugOpenlayers.js +39 -0
  67. package/src/vcs/vcm/layer/openlayers/tmsOpenlayers.js +62 -0
  68. package/src/vcs/vcm/layer/openlayers/vectorOpenlayers.js +118 -0
  69. package/src/vcs/vcm/layer/openlayers/vectorTileOpenlayers.js +177 -0
  70. package/src/vcs/vcm/layer/openlayers/wmsOpenlayers.js +55 -0
  71. package/src/vcs/vcm/layer/openlayers/wmtsOpenlayers.js +141 -0
  72. package/src/vcs/vcm/layer/pointCloud.js +162 -0
  73. package/src/vcs/vcm/layer/rasterLayer.js +294 -0
  74. package/src/vcs/vcm/layer/singleImage.js +119 -0
  75. package/src/vcs/vcm/layer/terrain.js +122 -0
  76. package/src/vcs/vcm/layer/terrainHelpers.js +123 -0
  77. package/src/vcs/vcm/layer/tileLoadedHelper.js +72 -0
  78. package/src/vcs/vcm/layer/tileProvider/mvtTileProvider.js +104 -0
  79. package/src/vcs/vcm/layer/tileProvider/staticGeojsonTileProvider.js +67 -0
  80. package/src/vcs/vcm/layer/tileProvider/tileProvider.js +584 -0
  81. package/src/vcs/vcm/layer/tileProvider/tileProviderFactory.js +28 -0
  82. package/src/vcs/vcm/layer/tileProvider/urlTemplateTileProvider.js +106 -0
  83. package/src/vcs/vcm/layer/tms.js +121 -0
  84. package/src/vcs/vcm/layer/vector.js +632 -0
  85. package/src/vcs/vcm/layer/vectorHelpers.js +206 -0
  86. package/src/vcs/vcm/layer/vectorProperties.js +1391 -0
  87. package/src/vcs/vcm/layer/vectorSymbols.js +40 -0
  88. package/src/vcs/vcm/layer/vectorTile.js +480 -0
  89. package/src/vcs/vcm/layer/wfs.js +165 -0
  90. package/src/vcs/vcm/layer/wms.js +270 -0
  91. package/src/vcs/vcm/layer/wmsHelpers.js +65 -0
  92. package/src/vcs/vcm/layer/wmts.js +235 -0
  93. package/src/vcs/vcm/maps/baseOLMap.js +257 -0
  94. package/src/vcs/vcm/maps/cameraLimiter.js +219 -0
  95. package/src/vcs/vcm/maps/cesium.js +1192 -0
  96. package/src/vcs/vcm/maps/map.js +511 -0
  97. package/src/vcs/vcm/maps/mapState.js +17 -0
  98. package/src/vcs/vcm/maps/oblique.js +536 -0
  99. package/src/vcs/vcm/maps/openlayers.js +205 -0
  100. package/src/vcs/vcm/object.js +92 -0
  101. package/src/vcs/vcm/oblique/ObliqueCollection.js +572 -0
  102. package/src/vcs/vcm/oblique/ObliqueDataSet.js +357 -0
  103. package/src/vcs/vcm/oblique/ObliqueImage.js +247 -0
  104. package/src/vcs/vcm/oblique/ObliqueImageMeta.js +126 -0
  105. package/src/vcs/vcm/oblique/ObliqueProvider.js +433 -0
  106. package/src/vcs/vcm/oblique/ObliqueView.js +130 -0
  107. package/src/vcs/vcm/oblique/ObliqueViewDirection.js +40 -0
  108. package/src/vcs/vcm/oblique/helpers.js +483 -0
  109. package/src/vcs/vcm/oblique/parseImageJson.js +248 -0
  110. package/src/vcs/vcm/util/clipping/clippingObject.js +386 -0
  111. package/src/vcs/vcm/util/clipping/clippingObjectManager.js +312 -0
  112. package/src/vcs/vcm/util/clipping/clippingPlaneHelper.js +413 -0
  113. package/src/vcs/vcm/util/collection.js +193 -0
  114. package/src/vcs/vcm/util/dateTime.js +60 -0
  115. package/src/vcs/vcm/util/exclusiveManager.js +135 -0
  116. package/src/vcs/vcm/util/extent.js +124 -0
  117. package/src/vcs/vcm/util/featureProvider/abstractFeatureProvider.js +196 -0
  118. package/src/vcs/vcm/util/featureProvider/featureProviderHelpers.js +51 -0
  119. package/src/vcs/vcm/util/featureProvider/featureProviderSymbols.js +11 -0
  120. package/src/vcs/vcm/util/featureProvider/tileProviderFeatureProvider.js +62 -0
  121. package/src/vcs/vcm/util/featureProvider/wmsFeatureProvider.js +280 -0
  122. package/src/vcs/vcm/util/featureconverter/circleToCesium.js +215 -0
  123. package/src/vcs/vcm/util/featureconverter/convert.js +83 -0
  124. package/src/vcs/vcm/util/featureconverter/extent3d.js +154 -0
  125. package/src/vcs/vcm/util/featureconverter/featureconverterHelper.js +591 -0
  126. package/src/vcs/vcm/util/featureconverter/lineStringToCesium.js +171 -0
  127. package/src/vcs/vcm/util/featureconverter/pointToCesium.js +359 -0
  128. package/src/vcs/vcm/util/featureconverter/polygonToCesium.js +229 -0
  129. package/src/vcs/vcm/util/geometryHelpers.js +172 -0
  130. package/src/vcs/vcm/util/indexedCollection.js +158 -0
  131. package/src/vcs/vcm/util/isMobile.js +12 -0
  132. package/src/vcs/vcm/util/layerCollection.js +216 -0
  133. package/src/vcs/vcm/util/locale.js +53 -0
  134. package/src/vcs/vcm/util/mapCollection.js +363 -0
  135. package/src/vcs/vcm/util/math.js +71 -0
  136. package/src/vcs/vcm/util/projection.js +348 -0
  137. package/src/vcs/vcm/util/splitScreen.js +233 -0
  138. package/src/vcs/vcm/util/style/declarativeStyleItem.js +631 -0
  139. package/src/vcs/vcm/util/style/shapesCategory.js +67 -0
  140. package/src/vcs/vcm/util/style/styleFactory.js +48 -0
  141. package/src/vcs/vcm/util/style/styleHelpers.js +555 -0
  142. package/src/vcs/vcm/util/style/styleItem.js +226 -0
  143. package/src/vcs/vcm/util/style/vectorStyleItem.js +927 -0
  144. package/src/vcs/vcm/util/style/writeStyle.js +48 -0
  145. package/src/vcs/vcm/util/urlHelpers.js +16 -0
  146. package/src/vcs/vcm/util/viewpoint.js +333 -0
@@ -0,0 +1,312 @@
1
+ import { check } from '@vcsuite/check';
2
+ import { clearClippingPlanes, setClippingPlanes } from './clippingPlaneHelper.js';
3
+ import ClippingObject from './clippingObject.js';
4
+ import CesiumMap from '../../maps/cesium.js';
5
+
6
+ /**
7
+ * ClippingObjectManager, a singleton Class for managing [ClippingObjects]{@link ClippingObject}. The manager takes care to only apply a
8
+ * single [ClippingObject]{@link ClippingObject} to a target, such as a Cesium3DTileset or Entity.
9
+ * The manager ensures, [ClippingObjects]{@link ClippingObject} which
10
+ * can be manipulated by the user take precedence over other [ClippingObjects]{@link ClippingObject}.
11
+ * [ClippingObjects]{@link ClippingObject} with the same target get
12
+ * overwritten in the order they where added to the manager. Exclusive [ClippingObjects]{@link ClippingObject} are always applied last, even
13
+ * if a default [ClippingObject]{@link ClippingObject} is added after.
14
+ * @class
15
+ * @export
16
+ * @api stable
17
+ */
18
+ class ClippingObjectManager {
19
+ static get className() {
20
+ return 'vcs.vcm.util.clipping.ClippingObjectManager';
21
+ }
22
+
23
+ constructor(layerCollection) {
24
+ /**
25
+ * @type {Set<ClippingObject>}
26
+ * @private
27
+ */
28
+ this._defaultClippingObjects = new Set();
29
+ /**
30
+ * @type {Array<ClippingObject>}
31
+ * @private
32
+ */
33
+ this._exclusiveClippingObjects = null;
34
+ /**
35
+ * @type {Map<(import("@vcmap/cesium").Globe|import("@vcmap/cesium").Entity|import("@vcmap/cesium").Cesium3DTileset), ClippingObject>}
36
+ * @private
37
+ */
38
+ this._targetsMap = new Map();
39
+ /**
40
+ * @type {Map<ClippingObject, Array<Function>>}
41
+ * @private
42
+ */
43
+ this._listenersMap = new Map();
44
+ /**
45
+ * @type {null|Function}
46
+ * @private
47
+ */
48
+ this._exclusiveRemovedCb = null;
49
+ /** @type {boolean} */
50
+ this.initialized = false;
51
+ /**
52
+ * @type {boolean}
53
+ * @private
54
+ */
55
+ this._updateSuspended = false;
56
+ /**
57
+ * @type {boolean}
58
+ * @private
59
+ */
60
+ this._dirty = false;
61
+ this._layerCollection = layerCollection;
62
+ /**
63
+ * @type {import("@vcmap/core").VcsMap|null}
64
+ * @private
65
+ */
66
+ this._activeMap = null;
67
+ /**
68
+ * @type {Function}
69
+ * @private
70
+ */
71
+ this._layerChangedListener = this._layerCollection.stateChanged.addEventListener((layer) => {
72
+ this._layerChanged(layer);
73
+ });
74
+ }
75
+
76
+ /**
77
+ * Suspend updates, changes to managed [ClippingObjects]{@link ClippingObject} will not trigger a reset of targets or plane definitions
78
+ * @type {boolean}
79
+ * @api
80
+ */
81
+ get suspendUpdate() {
82
+ return this._updateSuspended;
83
+ }
84
+
85
+ /**
86
+ * @param {boolean} suspend
87
+ */
88
+ set suspendUpdate(suspend) {
89
+ check(suspend, Boolean);
90
+
91
+ this._updateSuspended = suspend;
92
+ if (!this._updateSuspended && this._dirty) {
93
+ this._dirty = false;
94
+ this._update();
95
+ }
96
+ }
97
+
98
+ /**
99
+ * @param {import("@vcmap/core").Layer} layer
100
+ * @private
101
+ */
102
+ _layerChanged(layer) {
103
+ this.suspendUpdate = true;
104
+ this._defaultClippingObjects.forEach((co) => { co.handleLayerChanged(layer); });
105
+ if (this._exclusiveClippingObjects) {
106
+ this._exclusiveClippingObjects.forEach((co) => { co.handleLayerChanged(layer); });
107
+ }
108
+ this.suspendUpdate = false;
109
+ }
110
+
111
+ /**
112
+ * @param {import("@vcmap/core").VcsMap} map
113
+ */
114
+ mapActivated(map) {
115
+ this.suspendUpdate = true;
116
+ this._defaultClippingObjects.forEach((co) => { co.handleMapChanged(map); });
117
+ if (this._exclusiveClippingObjects) {
118
+ this._exclusiveClippingObjects.forEach((co) => { co.handleMapChanged(map); });
119
+ }
120
+ this.suspendUpdate = false;
121
+ this._activeMap = map;
122
+ }
123
+
124
+ /**
125
+ * Add a default [ClippingObject]{@link ClippingObject} to the manager. The order in which objects are added, determines their priority.
126
+ * In case two objects have the same target, the one added last is applied. Should the last added object be removed,
127
+ * the first one is re-applied. An object may not be added if is already part of the manager, use [hasClippingObject]{@link ClippingObjectManager#hasClippingObject}
128
+ * to test.
129
+ * @api
130
+ * @param {ClippingObject} clippingObject
131
+ * @throws ClippingObject is already managed
132
+ */
133
+ addClippingObject(clippingObject) {
134
+ check(clippingObject, ClippingObject);
135
+
136
+ if (this.hasClippingObject(clippingObject)) {
137
+ throw new Error('ClippingObject already managed, remove it first');
138
+ }
139
+ clippingObject.setLayerCollection(this._layerCollection);
140
+
141
+ this._defaultClippingObjects.add(clippingObject);
142
+ if (this._activeMap instanceof CesiumMap) {
143
+ clippingObject.handleMapChanged(this._activeMap);
144
+ }
145
+
146
+ this._listenersMap.set(clippingObject, [
147
+ clippingObject.targetsUpdated.addEventListener(this._update.bind(this)),
148
+ clippingObject.clippingPlaneUpdated.addEventListener(this._clippingPlaneUpdated.bind(this, clippingObject)),
149
+ ]);
150
+ this._update();
151
+ }
152
+
153
+ /**
154
+ * Remove a default [ClippingObject]{@link ClippingObject} instance from the manager.
155
+ * @api
156
+ * @param {ClippingObject} clippingObject
157
+ */
158
+ removeClippingObject(clippingObject) {
159
+ check(clippingObject, ClippingObject);
160
+
161
+ if (this._defaultClippingObjects.has(clippingObject)) {
162
+ this._defaultClippingObjects.delete(clippingObject);
163
+ this._listenersMap.get(clippingObject).forEach((cb) => { cb(); });
164
+ this._listenersMap.delete(clippingObject);
165
+ this._update();
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Test if a {@link ClippingObject} is part of managers context
171
+ * @param {ClippingObject} clippingObject
172
+ * @returns {boolean}
173
+ * @api
174
+ */
175
+ hasClippingObject(clippingObject) {
176
+ check(clippingObject, ClippingObject);
177
+
178
+ return this._defaultClippingObjects.has(clippingObject) ||
179
+ !!(this._exclusiveClippingObjects && this._exclusiveClippingObjects.includes(clippingObject));
180
+ }
181
+
182
+ /**
183
+ * Sets an Array of [ClippingObjects]{@link ClippingObject} to be added to the managers context. Exclusive objects
184
+ * are intended for [ClippingObjects]{@link ClippingObject} which can be directly manipulated by the user. They
185
+ * are always applied last and will overwrite any managed default [ClippingObject]{@link ClippingObject} with the same targets.
186
+ * The manager will only allow a single context (eg. one widget/plugin) for exclusive objects. Should the current context be switched or cleared, the provided
187
+ * callback is called to inform the setting context of its removal.
188
+ * @param {Array<ClippingObject>} clippingObjects
189
+ * @param {Function} removedCb
190
+ * @throws ClippingObjects is already managed
191
+ * @api
192
+ */
193
+ setExclusiveClippingObjects(clippingObjects, removedCb) {
194
+ check(clippingObjects, [ClippingObject]);
195
+ check(removedCb, Function);
196
+
197
+ if (clippingObjects.find(co => this._defaultClippingObjects.has(co))) {
198
+ throw new Error('Some ClippingObjects are already managed, remove them first');
199
+ }
200
+
201
+ this._clearExclusiveClippingObjects();
202
+ this._exclusiveRemovedCb = removedCb;
203
+ this._exclusiveClippingObjects = clippingObjects;
204
+ this._exclusiveClippingObjects.forEach((clippingObject) => {
205
+ clippingObject.setLayerCollection(this._layerCollection);
206
+
207
+ if (this._activeMap instanceof CesiumMap) {
208
+ clippingObject.handleMapChanged(this._activeMap);
209
+ }
210
+ this._listenersMap.set(clippingObject, [
211
+ clippingObject.targetsUpdated.addEventListener(this._update.bind(this)),
212
+ clippingObject.clippingPlaneUpdated.addEventListener(this._clippingPlaneUpdated.bind(this, clippingObject)),
213
+ ]);
214
+ });
215
+ this._update();
216
+ }
217
+
218
+ /**
219
+ * @param {boolean=} silent
220
+ * @private
221
+ */
222
+ _clearExclusiveClippingObjects(silent) {
223
+ if (this._exclusiveClippingObjects) {
224
+ this._exclusiveClippingObjects.forEach((cp) => {
225
+ this._listenersMap.get(cp).forEach((cb) => { cb(); });
226
+ this._listenersMap.delete(cp);
227
+ });
228
+ this._exclusiveClippingObjects = null;
229
+ }
230
+ if (!silent && this._exclusiveRemovedCb) {
231
+ this._exclusiveRemovedCb();
232
+ }
233
+ this._exclusiveRemovedCb = null;
234
+ }
235
+
236
+ /**
237
+ * Clears the exclusive set of [ClippingObject]{@link ClippingObject}. If called with the silent flag, the
238
+ * removed callback is not called (eg. when removing exclusive clipping objects from the same context).
239
+ * @param {boolean=} silent
240
+ * @api
241
+ */
242
+ clearExclusiveClippingObjects(silent) {
243
+ this._clearExclusiveClippingObjects(silent);
244
+ this._update();
245
+ }
246
+
247
+ /**
248
+ * @private
249
+ */
250
+ _update() {
251
+ if (this._updateSuspended) {
252
+ this._dirty = true;
253
+ return;
254
+ }
255
+ const currentTargets = new Set(this._targetsMap.keys());
256
+
257
+ /**
258
+ * @param {ClippingObject} clippingObject
259
+ */
260
+ const setTargets = (clippingObject) => {
261
+ clippingObject.targets.forEach((target) => {
262
+ this._targetsMap.set(target, clippingObject);
263
+ currentTargets.delete(target);
264
+ });
265
+ };
266
+
267
+ this._targetsMap.clear();
268
+ this._defaultClippingObjects.forEach(setTargets);
269
+ if (this._exclusiveClippingObjects) {
270
+ this._exclusiveClippingObjects.forEach(setTargets);
271
+ }
272
+
273
+ currentTargets.forEach((t) => { clearClippingPlanes(t); });
274
+ this._targetsMap.forEach((clippingObject, target) => {
275
+ if (clippingObject.clippingPlaneCollection) {
276
+ setClippingPlanes(
277
+ target,
278
+ clippingObject.clippingPlaneCollection,
279
+ clippingObject.local,
280
+ );
281
+ }
282
+ });
283
+ }
284
+
285
+ /**
286
+ * @param {ClippingObject} clippingObject
287
+ * @private
288
+ */
289
+ _clippingPlaneUpdated(clippingObject) {
290
+ this._targetsMap.forEach((setClippingObject, target) => {
291
+ if (setClippingObject === clippingObject && clippingObject.clippingPlaneCollection) {
292
+ setClippingPlanes(target, clippingObject.clippingPlaneCollection);
293
+ }
294
+ });
295
+ }
296
+
297
+ /**
298
+ * Destroys this clippingObject Manager
299
+ */
300
+ destroy() {
301
+ this._listenersMap.forEach((listeners) => {
302
+ listeners.forEach((cb) => { cb(); });
303
+ });
304
+ this._layerChangedListener();
305
+ this._listenersMap.clear();
306
+ this._targetsMap.clear();
307
+ this._defaultClippingObjects.clear();
308
+ this._exclusiveClippingObjects = null;
309
+ }
310
+ }
311
+
312
+ export default ClippingObjectManager;