@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,1391 @@
1
+ import deepEqual from 'fast-deep-equal';
2
+ import { HeightReference, ClassificationType, NearFarScalar, Cartesian3 } from '@vcmap/cesium';
3
+ import { check, checkMaybe } from '@vcsuite/check';
4
+ import { parseBoolean, parseEnumKey, parseNumber, parseInteger } from '@vcsuite/parsers';
5
+ import { getLogger as getLoggerByName } from '@vcsuite/logger';
6
+ import VcsEvent from '../event/vcsEvent.js';
7
+
8
+ /**
9
+ * @returns {import("@vcsuite/logger").Logger}
10
+ */
11
+ function getLogger() {
12
+ return getLoggerByName('vcs.vcm.layer.VectorProperties');
13
+ }
14
+
15
+ /**
16
+ * @typedef {Object} VectorPropertiesOptions
17
+ * @property {string|undefined} [altitudeMode=relativeToGround] - (3D) Either "relativeToGround", "clampToGround" or 'absolute'
18
+ * @property {boolean|undefined} [allowPicking=true] - if the features are pickable
19
+ * @property {string|undefined} [classificationType=undefined] - (3D) the cesium classification type for this layer. one of 'both', 'terrain' or 'cesium3DTile'
20
+ * @property {Array<number>|undefined} [scaleByDistance=undefined] - (3D) Array with 4 numbers by which features are being scaled based on distance see <a href="https://cesium.com/docs/cesiumjs-ref-doc/Billboard.html#scaleByDistance"> here </a>
21
+ * @property {Array<number>|undefined} [eyeOffset=undefined] - (3D) Array with 3 numbers see for explanation: <a href="https://cesium.com/docs/cesiumjs-ref-doc/Billboard.html#eyeOffset"> here </a>
22
+ * @property {number|undefined} [heightAboveGround=0] - (3D) can be used with altitudeMode relativeToGround
23
+ * @property {number|undefined} [skirt=0] - (3D) default skirt value to use for extruded features
24
+ * @property {number|undefined} [groundLevel=undefined] - (3D) ground height level of the objects
25
+ * @property {number|undefined} [extrudedHeight=0] - (3D) - default layer extruded Height
26
+ * @property {number|undefined} [storeysAboveGround=0] - (3D)
27
+ * @property {number|undefined} [storeysBelowGround=0] - (3D)
28
+ * @property {Array<number>|number|undefined} [storeyHeightsAboveGround=[]] - (3D)
29
+ * @property {Array<number>|number|undefined} [storeyHeightsBelowGround=[]] - (3D)
30
+ * @property {number|undefined} [storeyHeight=undefined] - vcs:undocumented @deprecated 3.8 default storey height to use for extruded features to draw storey lines
31
+ * @property {string|undefined} modelUrl
32
+ * @property {number} [modelScaleX=1]
33
+ * @property {number} [modelScaleY=1]
34
+ * @property {number} [modelScaleZ=1]
35
+ * @property {number} [modelHeading=0] - in degrees
36
+ * @property {number} [modelPitch=0] - in degrees
37
+ * @property {number} [modelRoll=0] - in degrees
38
+ * @property {Object|undefined} modelOptions - Model options are merged with the model definition from model url, scale and orientation and accepts any option passed to a Cesium.Model.
39
+ * @property {string|undefined} baseUrl - a base URL to resolve relative model URLs against.
40
+ * @api
41
+ */
42
+
43
+ /**
44
+ * @typedef {Object} VectorPropertiesModelOptions
45
+ * @property {string} url
46
+ * @property {Array<number>} scale
47
+ * @property {number} heading
48
+ * @property {number} pitch
49
+ * @property {number} roll
50
+ * @api
51
+ */
52
+
53
+ /**
54
+ * @enum {import("@vcmap/cesium").HeightReference}
55
+ * @const
56
+ */
57
+ export const AltitudeModeCesium = {
58
+ clampToGround: HeightReference.CLAMP_TO_GROUND,
59
+ absolute: HeightReference.NONE,
60
+ relativeToGround: HeightReference.RELATIVE_TO_GROUND,
61
+ };
62
+
63
+ /**
64
+ * @enum {import("@vcmap/cesium").ClassificationType}
65
+ * @const
66
+ */
67
+ export const ClassificationTypeCesium = {
68
+ both: ClassificationType.BOTH,
69
+ cesium3DTile: ClassificationType.CESIUM_3D_TILE,
70
+ terrain: ClassificationType.TERRAIN,
71
+ };
72
+
73
+ /**
74
+ * @param {Array<number>} value
75
+ * @param {import("@vcmap/cesium").NearFarScalar|undefined} defaultValue
76
+ * @returns {import("@vcmap/cesium").NearFarScalar|undefined}
77
+ */
78
+ export function parseNearFarScalar(value, defaultValue) {
79
+ if (Array.isArray(value)) {
80
+ const valid = value
81
+ .map(entry => parseNumber(entry, null))
82
+ .filter(entry => entry != null);
83
+ if (valid.length === 4) {
84
+ return new NearFarScalar(valid[0], valid[1], valid[2], valid[3]);
85
+ }
86
+ }
87
+ return defaultValue;
88
+ }
89
+
90
+ /**
91
+ * @param {Array<number>} value
92
+ * @param {import("@vcmap/cesium").Cartesian3|undefined} defaultValue
93
+ * @returns {import("@vcmap/cesium").Cartesian3|undefined}
94
+ */
95
+ export function parseCartesian3(value, defaultValue) {
96
+ if (Array.isArray(value)) {
97
+ const valid = value
98
+ .map(entry => parseNumber(entry, null))
99
+ .filter(entry => entry != null);
100
+ if (valid.length === 3) {
101
+ return new Cartesian3(valid[0], valid[1], valid[2]);
102
+ }
103
+ }
104
+ return defaultValue;
105
+ }
106
+
107
+ /**
108
+ * returns a storeyHeight array
109
+ * @param {Array<number>|number} storeyHeights
110
+ * @param {Array<number>|number} defaultStoreyHeights
111
+ * @returns {Array<number>}
112
+ */
113
+ export function parseStoreyHeights(storeyHeights, defaultStoreyHeights) {
114
+ if (Array.isArray(storeyHeights)) {
115
+ return storeyHeights
116
+ .map(value => parseNumber(value, null))
117
+ .filter(value => value !== null && value > 0);
118
+ } else {
119
+ const numberValue = parseNumber(storeyHeights, null);
120
+ if (numberValue && numberValue > 0) {
121
+ return [numberValue];
122
+ }
123
+ }
124
+ if (!Array.isArray(defaultStoreyHeights)) {
125
+ return [defaultStoreyHeights];
126
+ }
127
+ return defaultStoreyHeights;
128
+ }
129
+
130
+ /**
131
+ * @param {import("@vcmap/cesium").HeightReference} altitudeMode
132
+ * @returns {string}
133
+ */
134
+ export function getAltitudeModeOptions(altitudeMode) {
135
+ return Object.keys(AltitudeModeCesium)
136
+ .find(key => AltitudeModeCesium[key] === altitudeMode);
137
+ }
138
+
139
+ /**
140
+ * @param {import("@vcmap/cesium").ClassificationType} classificationType
141
+ * @returns {string}
142
+ */
143
+ export function getClassificationTypeOptions(classificationType) {
144
+ return Object.keys(ClassificationTypeCesium)
145
+ .find(key => ClassificationTypeCesium[key] === classificationType);
146
+ }
147
+
148
+ /**
149
+ * @param {import("@vcmap/cesium").NearFarScalar} nearFarScalar
150
+ * @returns {Array<number>|undefined}
151
+ */
152
+ export function getNearFarValueOptions(nearFarScalar) {
153
+ return nearFarScalar ? NearFarScalar.pack(nearFarScalar, []) : undefined;
154
+ }
155
+
156
+ /**
157
+ * @param {import("@vcmap/cesium").Cartesian3} cartesian3
158
+ * @returns {Array<number>|undefined}
159
+ */
160
+ export function getCartesian3Options(cartesian3) {
161
+ return cartesian3 ? Cartesian3.pack(cartesian3, []) : undefined;
162
+ }
163
+
164
+ /**
165
+ * Properties Collection for Vector Features
166
+ * @class
167
+ * @export
168
+ * @api stable
169
+ */
170
+ class VectorProperties {
171
+ /**
172
+ * Returns the default options for VectorProperties
173
+ * @returns {VectorPropertiesOptions}
174
+ * @api
175
+ */
176
+ static getDefaultOptions() {
177
+ // implementation detail, be careful, defaultValues are not used everywhere, check in constructor and elsewhere
178
+ return {
179
+ altitudeMode: 'clampToGround',
180
+ allowPicking: true,
181
+ classificationType: undefined,
182
+ scaleByDistance: undefined,
183
+ eyeOffset: undefined,
184
+ heightAboveGround: 0,
185
+ skirt: 0,
186
+ groundLevel: undefined,
187
+ extrudedHeight: 0,
188
+ storeysAboveGround: 0,
189
+ storeysBelowGround: 0,
190
+ storeyHeightsAboveGround: [],
191
+ storeyHeightsBelowGround: [],
192
+ storeyHeight: undefined,
193
+ modelUrl: undefined,
194
+ modelScaleX: 1,
195
+ modelScaleY: 1,
196
+ modelScaleZ: 1,
197
+ modelHeading: 0,
198
+ modelPitch: 0,
199
+ modelRoll: 0,
200
+ modelOptions: undefined,
201
+ baseUrl: undefined,
202
+ };
203
+ }
204
+
205
+ /**
206
+ * @param {VectorPropertiesOptions} options
207
+ */
208
+ constructor(options) {
209
+ const defaultValues = VectorProperties.getDefaultOptions();
210
+ /**
211
+ * @type {import("@vcmap/cesium").HeightReference}
212
+ * @private
213
+ */
214
+ this._altitudeMode = parseEnumKey(options.altitudeMode, AltitudeModeCesium, HeightReference.CLAMP_TO_GROUND);
215
+
216
+ /**
217
+ * @type {boolean}
218
+ * @private
219
+ */
220
+ this._allowPicking = parseBoolean(options.allowPicking, defaultValues.allowPicking);
221
+
222
+ /**
223
+ * @type {import("@vcmap/cesium").ClassificationType|undefined}
224
+ * @private
225
+ */
226
+ this._classificationType = parseEnumKey(options.classificationType, ClassificationTypeCesium, undefined);
227
+
228
+
229
+ /**
230
+ * @type {import("@vcmap/cesium").NearFarScalar|undefined}
231
+ * @private
232
+ */
233
+ this._scaleByDistance = parseNearFarScalar(options.scaleByDistance, undefined);
234
+
235
+ /**
236
+ * @type {import("@vcmap/cesium").Cartesian3|undefined}
237
+ * @private
238
+ */
239
+ this._eyeOffset = parseCartesian3(options.eyeOffset, undefined);
240
+
241
+ /**
242
+ * @type {number}
243
+ * @private
244
+ */
245
+ this._heightAboveGround = parseNumber(options.heightAboveGround, defaultValues.heightAboveGround);
246
+
247
+ /**
248
+ * @type {number}
249
+ * @private
250
+ */
251
+ this._skirt = parseNumber(options.skirt, defaultValues.skirt);
252
+
253
+ /**
254
+ * @type {number|undefined}
255
+ * @private
256
+ */
257
+ this._groundLevel = parseNumber(options.groundLevel, defaultValues.groundLevel);
258
+
259
+ /**
260
+ * @type {number}
261
+ * @private
262
+ */
263
+ this._extrudedHeight = parseNumber(options.extrudedHeight, defaultValues.extrudedHeight);
264
+
265
+ /**
266
+ * @type {number}
267
+ * @private
268
+ */
269
+ this._storeysAboveGround = parseInteger(options.storeysAboveGround, defaultValues.storeysAboveGround);
270
+
271
+ /**
272
+ * @type {number}
273
+ * @private
274
+ */
275
+ this._storeysBelowGround = parseInteger(options.storeysBelowGround, defaultValues.storeysBelowGround);
276
+
277
+ /**
278
+ * @type {Array<number>}
279
+ * @private
280
+ */
281
+ this._storeyHeightsAboveGround =
282
+ parseStoreyHeights(options.storeyHeightsAboveGround, defaultValues.storeyHeightsAboveGround);
283
+
284
+ /**
285
+ * @type {Array<number>}
286
+ * @private
287
+ */
288
+ this._storeyHeightsBelowGround =
289
+ parseStoreyHeights(options.storeyHeightsBelowGround, defaultValues.storeyHeightsBelowGround);
290
+
291
+ /**
292
+ * @type {number|undefined}
293
+ * @private
294
+ * @deprecated v3.8
295
+ */
296
+ this._storeyHeight = parseNumber(options.storeyHeight, defaultValues.storeyHeight);
297
+
298
+ /**
299
+ * @type {string}
300
+ * @private
301
+ */
302
+ this._modelUrl = options.modelUrl || defaultValues.modelUrl;
303
+
304
+ /**
305
+ * @type {number}
306
+ * @private
307
+ */
308
+ this._modelScaleX = parseNumber(options.modelScaleX, defaultValues.modelScaleX);
309
+ /**
310
+ * @type {number}
311
+ * @private
312
+ */
313
+ this._modelScaleY = parseNumber(options.modelScaleY, defaultValues.modelScaleY);
314
+ /**
315
+ * @type {number}
316
+ * @private
317
+ */
318
+ this._modelScaleZ = parseNumber(options.modelScaleZ, defaultValues.modelScaleZ);
319
+
320
+ /**
321
+ * @type {number}
322
+ * @private
323
+ */
324
+ this._modelHeading = parseNumber(options.modelHeading, defaultValues.modelHeading);
325
+
326
+ /**
327
+ * @type {number}
328
+ * @private
329
+ */
330
+ this._modelPitch = parseNumber(options.modelPitch, defaultValues.modelPitch);
331
+
332
+ /**
333
+ * @type {number}
334
+ * @private
335
+ */
336
+ this._modelRoll = parseNumber(options.modelRoll, defaultValues.modelRoll);
337
+
338
+ /**
339
+ * @type {string}
340
+ * @private
341
+ */
342
+ this._baseUrl = options.baseUrl || defaultValues.baseUrl;
343
+
344
+ /**
345
+ * @type {Object|undefined}
346
+ * @private
347
+ */
348
+ this._modelOptions = options.modelOptions || defaultValues.modelOptions;
349
+
350
+ /**
351
+ * Event raised when properties change. is passed an array of keys for the changed properties.
352
+ * @type {VcsEvent<Array<string>>}
353
+ * @readonly
354
+ * @api
355
+ */
356
+ this.propertyChanged = new VcsEvent();
357
+ }
358
+
359
+ /**
360
+ * @type {import("@vcmap/cesium").HeightReference}
361
+ * @api
362
+ */
363
+ get altitudeMode() {
364
+ return this._altitudeMode;
365
+ }
366
+
367
+ /**
368
+ * @param {import("@vcmap/cesium").HeightReference} altitudeMode
369
+ */
370
+ set altitudeMode(altitudeMode) {
371
+ if (altitudeMode !== this._altitudeMode) {
372
+ check(altitudeMode, Object.values(HeightReference));
373
+ this._altitudeMode = altitudeMode;
374
+ this.propertyChanged.raiseEvent(['altitudeMode']);
375
+ }
376
+ }
377
+
378
+ /**
379
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
380
+ * @returns {import("@vcmap/cesium").HeightReference}
381
+ * @api
382
+ */
383
+ getAltitudeMode(feature) {
384
+ const featureValue = feature.get('olcs_altitudeMode');
385
+ return parseEnumKey(featureValue, AltitudeModeCesium, this._altitudeMode);
386
+ }
387
+
388
+ /**
389
+ * @type {boolean}
390
+ * @api
391
+ */
392
+ get allowPicking() {
393
+ return this._allowPicking;
394
+ }
395
+
396
+ /**
397
+ * @param {boolean} allowPicking
398
+ */
399
+ set allowPicking(allowPicking) {
400
+ if (allowPicking !== this._allowPicking) {
401
+ check(allowPicking, Boolean);
402
+ this._allowPicking = allowPicking;
403
+ this.propertyChanged.raiseEvent(['allowPicking']);
404
+ }
405
+ }
406
+
407
+ /**
408
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
409
+ * @returns {boolean}
410
+ * @api
411
+ */
412
+ getAllowPicking(feature) {
413
+ const allowPicking = feature.get('olcs_allowPicking');
414
+ return parseBoolean(allowPicking, this._allowPicking);
415
+ }
416
+
417
+
418
+ /**
419
+ * @type {import("@vcmap/cesium").ClassificationType|undefined}
420
+ * @api
421
+ */
422
+ get classificationType() {
423
+ return this._classificationType;
424
+ }
425
+
426
+ /**
427
+ * @param {import("@vcmap/cesium").ClassificationType|undefined} classificationType
428
+ */
429
+ set classificationType(classificationType) {
430
+ if (classificationType !== this._classificationType) {
431
+ checkMaybe(classificationType, Object.values(ClassificationType));
432
+ this._classificationType = classificationType;
433
+ this.propertyChanged.raiseEvent(['classificationType']);
434
+ }
435
+ }
436
+
437
+ /**
438
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
439
+ * @returns {import("@vcmap/cesium").ClassificationType|undefined}
440
+ * @api
441
+ */
442
+ getClassificationType(feature) {
443
+ const classificationType = feature.get('olcs_classificationType');
444
+ return parseEnumKey(classificationType, ClassificationTypeCesium, this.classificationType);
445
+ }
446
+
447
+ /**
448
+ * @type {import("@vcmap/cesium").NearFarScalar|undefined}
449
+ * @api
450
+ */
451
+ get scaleByDistance() {
452
+ return this._scaleByDistance;
453
+ }
454
+
455
+ /**
456
+ * @param {import("@vcmap/cesium").NearFarScalar|undefined} value
457
+ */
458
+ set scaleByDistance(value) {
459
+ if (!NearFarScalar.equals(value, this._scaleByDistance)) {
460
+ checkMaybe(value, NearFarScalar);
461
+ this._scaleByDistance = value;
462
+ this.propertyChanged.raiseEvent(['scaleByDistance']);
463
+ }
464
+ }
465
+
466
+ /**
467
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
468
+ * @returns {import("@vcmap/cesium").NearFarScalar|undefined}
469
+ * @api
470
+ */
471
+ getScaleByDistance(feature) {
472
+ const featureValue = feature.get('olcs_scaleByDistance');
473
+ return parseNearFarScalar(featureValue, this.scaleByDistance);
474
+ }
475
+
476
+ /**
477
+ * @type {import("@vcmap/cesium").Cartesian3|undefined}
478
+ * @api
479
+ */
480
+ get eyeOffset() {
481
+ return this._eyeOffset;
482
+ }
483
+
484
+ /**
485
+ * @param {import("@vcmap/cesium").Cartesian3|undefined} value
486
+ */
487
+ set eyeOffset(value) {
488
+ if (!Cartesian3.equals(this.eyeOffset, value)) {
489
+ checkMaybe(value, Cartesian3);
490
+ this._eyeOffset = value;
491
+ this.propertyChanged.raiseEvent(['eyeOffset']);
492
+ }
493
+ }
494
+
495
+ /**
496
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
497
+ * @returns {import("@vcmap/cesium").Cartesian3}
498
+ * @api
499
+ */
500
+ getEyeOffset(feature) {
501
+ const featureValue = feature.get('olcs_eyeOffset');
502
+ if (!featureValue) {
503
+ const zCoordinateEyeOffset = feature.get('olcs_zCoordinateEyeOffset');
504
+ if (zCoordinateEyeOffset) {
505
+ getLogger().deprecate('zCoordinateEyeOffset', 'use eyeOffset and provide [0,0,value]');
506
+ return new Cartesian3(0, 0, parseNumber(zCoordinateEyeOffset, 0));
507
+ }
508
+ }
509
+ return parseCartesian3(featureValue, this.eyeOffset);
510
+ }
511
+
512
+ /**
513
+ * @type {number}
514
+ * @api
515
+ */
516
+ get heightAboveGround() {
517
+ return this._heightAboveGround;
518
+ }
519
+
520
+ /**
521
+ * @param {number} value
522
+ */
523
+ set heightAboveGround(value) {
524
+ if (value !== this._heightAboveGround) {
525
+ check(value, Number);
526
+ this._heightAboveGround = value;
527
+ this.propertyChanged.raiseEvent(['heightAboveGround']);
528
+ }
529
+ }
530
+
531
+ /**
532
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
533
+ * @returns {number}
534
+ * @api
535
+ */
536
+ getHeightAboveGround(feature) {
537
+ const featureValue = feature.get('olcs_heightAboveGround');
538
+ return parseNumber(featureValue, this.heightAboveGround);
539
+ }
540
+
541
+ /**
542
+ * @type {number}
543
+ * @api
544
+ */
545
+ get skirt() {
546
+ return this._skirt;
547
+ }
548
+
549
+ /**
550
+ * @param {number} value
551
+ */
552
+ set skirt(value) {
553
+ if (value !== this._skirt) {
554
+ check(value, Number);
555
+ this._skirt = value;
556
+ this.propertyChanged.raiseEvent(['skirt']);
557
+ }
558
+ }
559
+
560
+ /**
561
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
562
+ * @returns {number}
563
+ * @api
564
+ */
565
+ getSkirt(feature) {
566
+ const featureValue = feature.get('olcs_skirt');
567
+ return parseNumber(featureValue, this.skirt);
568
+ }
569
+
570
+ /**
571
+ * @type {number|undefined}
572
+ * @api
573
+ */
574
+ get groundLevel() {
575
+ return this._groundLevel;
576
+ }
577
+
578
+ /**
579
+ * @param {number|undefined} value
580
+ */
581
+ set groundLevel(value) {
582
+ if (value !== this._groundLevel) {
583
+ checkMaybe(value, Number);
584
+ this._groundLevel = value;
585
+ this.propertyChanged.raiseEvent(['groundLevel']);
586
+ }
587
+ }
588
+
589
+ /**
590
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
591
+ * @returns {number|undefined}
592
+ * @api
593
+ */
594
+ getGroundLevel(feature) {
595
+ const featureValue = feature.get('olcs_groundLevel');
596
+ return parseNumber(featureValue, this.groundLevel);
597
+ }
598
+
599
+ /**
600
+ * @type {number}
601
+ * @api
602
+ */
603
+ get extrudedHeight() {
604
+ return this._extrudedHeight;
605
+ }
606
+
607
+ /**
608
+ * @param {number} value
609
+ */
610
+ set extrudedHeight(value) {
611
+ if (value !== this._extrudedHeight) {
612
+ check(value, Number);
613
+ this._extrudedHeight = value;
614
+ this.propertyChanged.raiseEvent(['extrudedHeight']);
615
+ }
616
+ }
617
+
618
+ /**
619
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
620
+ * @returns {number}
621
+ * @api
622
+ */
623
+ getExtrudedHeight(feature) {
624
+ const featureValue = feature.get('olcs_extrudedHeight');
625
+ return parseNumber(featureValue, this.extrudedHeight);
626
+ }
627
+
628
+ /**
629
+ * @type {number}
630
+ * @api
631
+ */
632
+ get storeysAboveGround() {
633
+ return this._storeysAboveGround;
634
+ }
635
+
636
+ /**
637
+ * @param {number} value
638
+ */
639
+ set storeysAboveGround(value) {
640
+ if (value !== this._storeysAboveGround) {
641
+ check(value, Number);
642
+ this._storeysAboveGround = Math.trunc(value);
643
+ this.propertyChanged.raiseEvent(['storeysAboveGround']);
644
+ }
645
+ }
646
+
647
+ /**
648
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
649
+ * @returns {number}
650
+ * @api
651
+ */
652
+ getStoreysAboveGround(feature) {
653
+ const featureValue = feature.get('olcs_storeysAboveGround');
654
+ return parseInteger(featureValue, this.storeysAboveGround);
655
+ }
656
+
657
+ /**
658
+ * @type {number}
659
+ * @api
660
+ */
661
+ get storeysBelowGround() {
662
+ return this._storeysBelowGround;
663
+ }
664
+
665
+ /**
666
+ * @param {number} value
667
+ */
668
+ set storeysBelowGround(value) {
669
+ if (value !== this._storeysBelowGround) {
670
+ check(value, Number);
671
+ this._storeysBelowGround = Math.trunc(value);
672
+ this.propertyChanged.raiseEvent(['storeysBelowGround']);
673
+ }
674
+ }
675
+
676
+ /**
677
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
678
+ * @returns {number}
679
+ * @api
680
+ */
681
+ getStoreysBelowGround(feature) {
682
+ const featureValue = feature.get('olcs_storeysBelowGround');
683
+ return parseInteger(featureValue, this.storeysBelowGround);
684
+ }
685
+
686
+ /**
687
+ * @type {Array<number>}
688
+ * @api
689
+ */
690
+ get storeyHeightsAboveGround() {
691
+ return this._storeyHeightsAboveGround.slice();
692
+ }
693
+
694
+ /**
695
+ * @param {Array<number>} value
696
+ */
697
+ set storeyHeightsAboveGround(value) {
698
+ if (!deepEqual(value, this._storeyHeightsAboveGround)) {
699
+ check(value, [Number]);
700
+ this._storeyHeightsAboveGround = value;
701
+ this.propertyChanged.raiseEvent(['storeyHeightsAboveGround']);
702
+ }
703
+ }
704
+
705
+ /**
706
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
707
+ * @returns {Array<number>}
708
+ * @api
709
+ */
710
+ getStoreyHeightsAboveGround(feature) {
711
+ const featureValue = feature.get('olcs_storeyHeightsAboveGround');
712
+ return parseStoreyHeights(featureValue, this.storeyHeightsAboveGround);
713
+ }
714
+
715
+ /**
716
+ * @type {Array<number>}
717
+ * @api
718
+ */
719
+ get storeyHeightsBelowGround() {
720
+ return this._storeyHeightsBelowGround.slice();
721
+ }
722
+
723
+ /**
724
+ * @param {Array<number>} value
725
+ */
726
+ set storeyHeightsBelowGround(value) {
727
+ if (!deepEqual(value, this._storeyHeightsBelowGround)) {
728
+ check(value, [Number]);
729
+ this._storeyHeightsBelowGround = value;
730
+ this.propertyChanged.raiseEvent(['storeyHeightsBelowGround']);
731
+ }
732
+ }
733
+
734
+ /**
735
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
736
+ * @returns {Array<number>}
737
+ * @api
738
+ */
739
+ getStoreyHeightsBelowGround(feature) {
740
+ const featureValue = feature.get('olcs_storeyHeightsBelowGround');
741
+ return parseStoreyHeights(featureValue, this.storeyHeightsBelowGround);
742
+ }
743
+
744
+ /**
745
+ * @type {number|undefined}
746
+ * @deprecated v3.8
747
+ */
748
+ get storeyHeight() {
749
+ return this._storeyHeight;
750
+ }
751
+
752
+ /**
753
+ * @param {number|undefined} value
754
+ * @deprecated v3.8
755
+ */
756
+ set storeyHeight(value) {
757
+ if (value !== this._storeyHeight) {
758
+ getLogger().deprecate('storeyHeight', 'use storeyHeightAboveGround');
759
+ check(value, Number);
760
+ this._storeyHeight = value;
761
+ this.propertyChanged.raiseEvent(['storeyHeight']);
762
+ }
763
+ }
764
+
765
+ /**
766
+ * @api
767
+ * @type {string}
768
+ */
769
+ get modelUrl() {
770
+ return this._modelUrl;
771
+ }
772
+
773
+ /**
774
+ * @param {string} value
775
+ */
776
+ set modelUrl(value) {
777
+ check(value, String);
778
+
779
+ if (this._modelUrl !== value) {
780
+ this._modelUrl = value;
781
+ this.propertyChanged.raiseEvent(['modelUrl']);
782
+ }
783
+ }
784
+
785
+ /**
786
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
787
+ * @returns {string}
788
+ * @api
789
+ */
790
+ getModelUrl(feature) {
791
+ const featureValue = feature.get('olcs_modelUrl');
792
+ return featureValue !== undefined ? featureValue : this.modelUrl;
793
+ }
794
+
795
+ /**
796
+ * @api
797
+ * @type {number}
798
+ */
799
+ get modelScaleX() {
800
+ return this._modelScaleX;
801
+ }
802
+
803
+ /**
804
+ * @param {number} value
805
+ */
806
+ set modelScaleX(value) {
807
+ check(value, Number);
808
+
809
+ if (this._modelScaleX !== value) {
810
+ this._modelScaleX = value;
811
+ this.propertyChanged.raiseEvent(['modelScaleX']);
812
+ }
813
+ }
814
+
815
+ /**
816
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
817
+ * @returns {number}
818
+ * @api
819
+ */
820
+ getModelScaleX(feature) {
821
+ const featureValue = feature.get('olcs_modelScaleX');
822
+ return parseNumber(featureValue, this.modelScaleX);
823
+ }
824
+
825
+ /**
826
+ * @api
827
+ * @type {number}
828
+ */
829
+ get modelScaleY() {
830
+ return this._modelScaleY;
831
+ }
832
+
833
+ /**
834
+ * @param {number} value
835
+ */
836
+ set modelScaleY(value) {
837
+ check(value, Number);
838
+
839
+ if (this._modelScaleY !== value) {
840
+ this._modelScaleY = value;
841
+ this.propertyChanged.raiseEvent(['modelScaleY']);
842
+ }
843
+ }
844
+
845
+ /**
846
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
847
+ * @returns {number}
848
+ * @api
849
+ */
850
+ getModelScaleY(feature) {
851
+ const featureValue = feature.get('olcs_modelScaleY');
852
+ return parseNumber(featureValue, this.modelScaleY);
853
+ }
854
+
855
+ /**
856
+ * @api
857
+ * @type {number}
858
+ */
859
+ get modelScaleZ() {
860
+ return this._modelScaleZ;
861
+ }
862
+
863
+ /**
864
+ * @param {number} value
865
+ */
866
+ set modelScaleZ(value) {
867
+ check(value, Number);
868
+
869
+ if (this._modelScaleZ !== value) {
870
+ this._modelScaleZ = value;
871
+ this.propertyChanged.raiseEvent(['modelScaleZ']);
872
+ }
873
+ }
874
+
875
+ /**
876
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
877
+ * @returns {number}
878
+ * @api
879
+ */
880
+ getModelScaleZ(feature) {
881
+ const featureValue = feature.get('olcs_modelScaleZ');
882
+ return parseNumber(featureValue, this.modelScaleZ);
883
+ }
884
+
885
+ /**
886
+ * @api
887
+ * @type {number}
888
+ */
889
+ get modelHeading() {
890
+ return this._modelHeading;
891
+ }
892
+
893
+ /**
894
+ * @param {number} value
895
+ */
896
+ set modelHeading(value) {
897
+ check(value, Number);
898
+
899
+ if (this._modelHeading !== value) {
900
+ this._modelHeading = value;
901
+ this.propertyChanged.raiseEvent(['modelHeading']);
902
+ }
903
+ }
904
+
905
+ /**
906
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
907
+ * @returns {number}
908
+ * @api
909
+ */
910
+ getModelHeading(feature) {
911
+ const featureValue = feature.get('olcs_modelHeading');
912
+ return parseNumber(featureValue, this.modelHeading);
913
+ }
914
+
915
+ /**
916
+ * @api
917
+ * @type {number}
918
+ */
919
+ get modelPitch() {
920
+ return this._modelPitch;
921
+ }
922
+
923
+ /**
924
+ * @param {number} value
925
+ */
926
+ set modelPitch(value) {
927
+ check(value, Number);
928
+
929
+ if (this._modelPitch !== value) {
930
+ this._modelPitch = value;
931
+ this.propertyChanged.raiseEvent(['modelPitch']);
932
+ }
933
+ }
934
+
935
+ /**
936
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
937
+ * @returns {number}
938
+ * @api
939
+ */
940
+ getModelPitch(feature) {
941
+ const featureValue = feature.get('olcs_modelPitch');
942
+ return parseNumber(featureValue, this.modelPitch);
943
+ }
944
+
945
+ /**
946
+ * @api
947
+ * @type {number}
948
+ */
949
+ get modelRoll() {
950
+ return this._modelRoll;
951
+ }
952
+
953
+ /**
954
+ * @param {number} value
955
+ */
956
+ set modelRoll(value) {
957
+ check(value, Number);
958
+
959
+ if (this._modelRoll !== value) {
960
+ this._modelRoll = value;
961
+ this.propertyChanged.raiseEvent(['modelRoll']);
962
+ }
963
+ }
964
+
965
+ /**
966
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
967
+ * @returns {number}
968
+ * @api
969
+ */
970
+ getModelRoll(feature) {
971
+ const featureValue = feature.get('olcs_modelRoll');
972
+ return parseNumber(featureValue, this.modelRoll);
973
+ }
974
+
975
+ /**
976
+ * Model options are merged with the model definition from model url, scale and orientation and accepts any option
977
+ * passed to a Cesium.Model.
978
+ * @type {Object|undefined}
979
+ * @api
980
+ */
981
+ get modelOptions() {
982
+ return this._modelOptions;
983
+ }
984
+
985
+ /**
986
+ * @param {Object|undefined} modelOptions
987
+ */
988
+ set modelOptions(modelOptions) {
989
+ checkMaybe(modelOptions, Object);
990
+
991
+ if (this._modelOptions !== modelOptions) {
992
+ this._modelOptions = modelOptions;
993
+ this.propertyChanged.raiseEvent(['modelOptions']);
994
+ }
995
+ }
996
+
997
+ /**
998
+ * Get the features or the properties modelOptions. Returns an empty Object if both are undefined
999
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
1000
+ * @returns {Object}
1001
+ * @api
1002
+ */
1003
+ getModelOptions(feature) {
1004
+ const featureValue = feature.get('olcs_modelOptions');
1005
+ if (featureValue) {
1006
+ return featureValue;
1007
+ }
1008
+ if (this.modelOptions) {
1009
+ return this.modelOptions;
1010
+ }
1011
+ return {};
1012
+ }
1013
+
1014
+ /**
1015
+ * @api
1016
+ * @type {string}
1017
+ */
1018
+ get baseUrl() {
1019
+ return this._baseUrl;
1020
+ }
1021
+
1022
+ /**
1023
+ * @param {string} value
1024
+ */
1025
+ set baseUrl(value) {
1026
+ check(value, String);
1027
+
1028
+ if (this._baseUrl !== value) {
1029
+ this._baseUrl = value;
1030
+ this.propertyChanged.raiseEvent(['baseUrl']);
1031
+ }
1032
+ }
1033
+
1034
+ /**
1035
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
1036
+ * @returns {string}
1037
+ * @api
1038
+ */
1039
+ getBaseUrl(feature) {
1040
+ const featureValue = feature.get('olcs_baseUrl');
1041
+ return featureValue !== undefined ? featureValue : this.baseUrl;
1042
+ }
1043
+
1044
+ /**
1045
+ * @param {import("ol").Feature<import("ol/geom/Geometry").default>} feature
1046
+ * @returns {VectorPropertiesModelOptions|null}
1047
+ * @api
1048
+ */
1049
+ getModel(feature) {
1050
+ let url = this.getModelUrl(feature);
1051
+ if (!url) {
1052
+ return null;
1053
+ }
1054
+
1055
+ const baseUrl = this.getBaseUrl(feature);
1056
+ if (baseUrl) {
1057
+ url = (new URL(url, baseUrl)).toString();
1058
+ }
1059
+
1060
+ return {
1061
+ url,
1062
+ scale: [this.getModelScaleX(feature), this.getModelScaleY(feature), this.getModelScaleZ(feature)],
1063
+ heading: this.getModelHeading(feature),
1064
+ pitch: this.getModelPitch(feature),
1065
+ roll: this.getModelRoll(feature),
1066
+ };
1067
+ }
1068
+
1069
+ /**
1070
+ * resets values, either given, or default Value raises propertyChanged event once;
1071
+ * @param {VcsMeta} vcsMeta
1072
+ */
1073
+ setVcsMeta(vcsMeta) {
1074
+ const options = VectorProperties.getDefaultOptions();
1075
+ // special case, setVCSMeta should not restore the altitudeMode default
1076
+ if (!vcsMeta.altitudeMode) {
1077
+ vcsMeta.altitudeMode = getAltitudeModeOptions(this.altitudeMode);
1078
+ }
1079
+ Object.assign(options, vcsMeta);
1080
+ this.setValues(options);
1081
+ }
1082
+
1083
+ /**
1084
+ * sets given values only raises propertyChanged event if a value has been set;
1085
+ * @param {VectorPropertiesOptions} options
1086
+ */
1087
+ setValues(options) {
1088
+ const defaultValues = VectorProperties.getDefaultOptions();
1089
+ const changedProperties = [];
1090
+ // check if key exists in options, to also set undefined values
1091
+ if ('altitudeMode' in options) {
1092
+ const defaultAltitudeMode = parseEnumKey(defaultValues.altitudeMode, AltitudeModeCesium, undefined);
1093
+ const parsedAltitudeMode = parseEnumKey(options.altitudeMode, AltitudeModeCesium, defaultAltitudeMode);
1094
+ if (this._altitudeMode !== parsedAltitudeMode) {
1095
+ this._altitudeMode = parsedAltitudeMode;
1096
+ changedProperties.push('altitudeMode');
1097
+ }
1098
+ }
1099
+
1100
+ if ('allowPicking' in options) {
1101
+ const parsedAllowPicking = parseBoolean(options.allowPicking, defaultValues.allowPicking);
1102
+ if (this._allowPicking !== parsedAllowPicking) {
1103
+ this._allowPicking = parsedAllowPicking;
1104
+ changedProperties.push('allowPicking');
1105
+ }
1106
+ }
1107
+
1108
+ if ('classificationType' in options) {
1109
+ const defaultClassificationType =
1110
+ parseEnumKey(defaultValues.classificationType, ClassificationTypeCesium, undefined);
1111
+ const parsedClassificationType =
1112
+ parseEnumKey(options.classificationType, ClassificationTypeCesium, defaultClassificationType);
1113
+ if (this._classificationType !== parsedClassificationType) {
1114
+ this._classificationType = parsedClassificationType;
1115
+ changedProperties.push('classificationType');
1116
+ }
1117
+ }
1118
+
1119
+ if ('scaleByDistance' in options) {
1120
+ const parsedScaleByDistance = parseNearFarScalar(options.scaleByDistance, undefined);
1121
+ if (!NearFarScalar.equals(parsedScaleByDistance, this._scaleByDistance)) {
1122
+ this._scaleByDistance = parsedScaleByDistance;
1123
+ changedProperties.push('scaleByDistance');
1124
+ }
1125
+ }
1126
+
1127
+ if ('eyeOffset' in options) {
1128
+ const parsedEyeOffset = parseCartesian3(options.eyeOffset, undefined);
1129
+ if (!Cartesian3.equals(parsedEyeOffset, this._eyeOffset)) {
1130
+ this._eyeOffset = parsedEyeOffset;
1131
+ changedProperties.push('eyeOffset');
1132
+ }
1133
+ }
1134
+
1135
+ if ('heightAboveGround' in options) {
1136
+ const parsedHeightAboveGround = parseNumber(options.heightAboveGround, defaultValues.heightAboveGround);
1137
+ if (parsedHeightAboveGround !== this._heightAboveGround) {
1138
+ this._heightAboveGround = parsedHeightAboveGround;
1139
+ changedProperties.push('heightAboveGround');
1140
+ }
1141
+ }
1142
+
1143
+ if ('skirt' in options) {
1144
+ const parsedSkirt = parseNumber(options.skirt, defaultValues.skirt);
1145
+ if (parsedSkirt !== this._skirt) {
1146
+ this._skirt = parsedSkirt;
1147
+ changedProperties.push('skirt');
1148
+ }
1149
+ }
1150
+
1151
+ if ('groundLevel' in options) {
1152
+ const parsedGroundLevel = parseNumber(options.groundLevel, defaultValues.groundLevel);
1153
+ if (parsedGroundLevel !== this._groundLevel) {
1154
+ this._groundLevel = parsedGroundLevel;
1155
+ changedProperties.push('groundLevel');
1156
+ }
1157
+ }
1158
+
1159
+ if ('extrudedHeight' in options) {
1160
+ const parsedExtrudedHeight = parseNumber(options.extrudedHeight, defaultValues.extrudedHeight);
1161
+ if (parsedExtrudedHeight !== this._extrudedHeight) {
1162
+ this._extrudedHeight = parsedExtrudedHeight;
1163
+ changedProperties.push('extrudedHeight');
1164
+ }
1165
+ }
1166
+ if ('storeysAboveGround' in options) {
1167
+ const parsedStoreysAboveGround = parseInteger(options.storeysAboveGround, defaultValues.storeysAboveGround);
1168
+ if (parsedStoreysAboveGround !== this._storeysAboveGround) {
1169
+ this._storeysAboveGround = parsedStoreysAboveGround;
1170
+ changedProperties.push('storeysAboveGround');
1171
+ }
1172
+ }
1173
+ if ('storeysBelowGround' in options) {
1174
+ const parsedStoreysBelowGround = parseInteger(options.storeysBelowGround, defaultValues.storeysBelowGround);
1175
+ if (parsedStoreysBelowGround !== this._storeysBelowGround) {
1176
+ this._storeysBelowGround = parsedStoreysBelowGround;
1177
+ changedProperties.push('storeysBelowGround');
1178
+ }
1179
+ }
1180
+
1181
+ if ('storeyHeightsAboveGround' in options) {
1182
+ const parsedStoreyHeightsAboveGround =
1183
+ parseStoreyHeights(options.storeyHeightsAboveGround, defaultValues.storeyHeightsAboveGround);
1184
+ if (!deepEqual(parsedStoreyHeightsAboveGround, this._storeyHeightsAboveGround)) {
1185
+ this._storeyHeightsAboveGround = parsedStoreyHeightsAboveGround;
1186
+ changedProperties.push('storeyHeightsAboveGround');
1187
+ }
1188
+ }
1189
+
1190
+ if ('storeyHeightsBelowGround' in options) {
1191
+ const parsedStoreyHeightsBelowGround =
1192
+ parseStoreyHeights(options.storeyHeightsBelowGround, defaultValues.storeyHeightsBelowGround);
1193
+ if (!deepEqual(parsedStoreyHeightsBelowGround, this._storeyHeightsBelowGround)) {
1194
+ this._storeyHeightsBelowGround = parsedStoreyHeightsBelowGround;
1195
+ changedProperties.push('storeyHeightsBelowGround');
1196
+ }
1197
+ }
1198
+
1199
+ if ('storeyHeight' in options) {
1200
+ const parsedStoreyHeight = parseNumber(options.storeyHeight, defaultValues.storeyHeight);
1201
+ if (parsedStoreyHeight !== this._storeyHeight) {
1202
+ getLogger().deprecate('storeyHeight', 'use storeyHeightAboveGround');
1203
+ this._storeyHeight = parsedStoreyHeight;
1204
+ changedProperties.push('storeyHeight');
1205
+ }
1206
+ }
1207
+
1208
+ if ('modelUrl' in options) {
1209
+ if (options.modelUrl !== this._modelUrl) {
1210
+ this._modelUrl = options.modelUrl;
1211
+ changedProperties.push('modelUrl');
1212
+ }
1213
+ }
1214
+
1215
+ if ('modelScaleX' in options) {
1216
+ const parsedModelScaleX = parseNumber(options.modelScaleX, defaultValues.modelScaleX);
1217
+ if (parsedModelScaleX !== this._modelScaleX) {
1218
+ this._modelScaleX = parsedModelScaleX;
1219
+ changedProperties.push('modelScaleX');
1220
+ }
1221
+ }
1222
+
1223
+ if ('modelScaleY' in options) {
1224
+ const parsedModelScaleY = parseNumber(options.modelScaleY, defaultValues.modelScaleY);
1225
+ if (parsedModelScaleY !== this._modelScaleY) {
1226
+ this._modelScaleY = parsedModelScaleY;
1227
+ changedProperties.push('modelScaleY');
1228
+ }
1229
+ }
1230
+
1231
+ if ('modelScaleZ' in options) {
1232
+ const parsedModelScaleZ = parseNumber(options.modelScaleZ, defaultValues.modelScaleZ);
1233
+ if (parsedModelScaleZ !== this._modelScaleZ) {
1234
+ this._modelScaleZ = parsedModelScaleZ;
1235
+ changedProperties.push('modelScaleZ');
1236
+ }
1237
+ }
1238
+
1239
+ if ('modelHeading' in options) {
1240
+ const parsedModelHeading = parseNumber(options.modelHeading, defaultValues.modelHeading);
1241
+ if (parsedModelHeading !== this._modelHeading) {
1242
+ this._modelHeading = parsedModelHeading;
1243
+ changedProperties.push('modelHeading');
1244
+ }
1245
+ }
1246
+
1247
+ if ('modelPitch' in options) {
1248
+ const parsedModelPitch = parseNumber(options.modelPitch, defaultValues.modelPitch);
1249
+ if (parsedModelPitch !== this._modelPitch) {
1250
+ this._modelPitch = parsedModelPitch;
1251
+ changedProperties.push('modelPitch');
1252
+ }
1253
+ }
1254
+
1255
+ if ('modelRoll' in options) {
1256
+ const parsedModelRoll = parseNumber(options.modelRoll, defaultValues.modelRoll);
1257
+ if (parsedModelRoll !== this._modelRoll) {
1258
+ this._modelRoll = parsedModelRoll;
1259
+ changedProperties.push('modelRoll');
1260
+ }
1261
+ }
1262
+
1263
+ if ('baseUrl' in options) {
1264
+ if (options.baseUrl !== this._baseUrl) {
1265
+ this._baseUrl = options.baseUrl;
1266
+ changedProperties.push('baseUrl');
1267
+ }
1268
+ }
1269
+
1270
+ if (changedProperties.length) {
1271
+ this.propertyChanged.raiseEvent(changedProperties);
1272
+ }
1273
+ }
1274
+
1275
+ /**
1276
+ * @returns {VectorPropertiesOptions}
1277
+ */
1278
+ getValues() {
1279
+ /** @type {VectorPropertiesOptions} */
1280
+ const values = {
1281
+ altitudeMode: getAltitudeModeOptions(this.altitudeMode),
1282
+ allowPicking: this.allowPicking,
1283
+ classificationType: getClassificationTypeOptions(this.classificationType),
1284
+ scaleByDistance: getNearFarValueOptions(this.scaleByDistance),
1285
+ eyeOffset: getCartesian3Options(this.eyeOffset),
1286
+ heightAboveGround: this.heightAboveGround,
1287
+ skirt: this.skirt,
1288
+ groundLevel: this.groundLevel,
1289
+ extrudedHeight: this.extrudedHeight,
1290
+ storeysAboveGround: this.storeysAboveGround,
1291
+ storeysBelowGround: this.storeysBelowGround,
1292
+ storeyHeightsAboveGround: this.storeyHeightsAboveGround,
1293
+ storeyHeightsBelowGround: this.storeyHeightsBelowGround,
1294
+ storeyHeight: this.storeyHeight,
1295
+ modelUrl: this.modelUrl,
1296
+ modelScaleX: this.modelScaleX,
1297
+ modelScaleY: this.modelScaleY,
1298
+ modelScaleZ: this.modelScaleZ,
1299
+ modelHeading: this.modelHeading,
1300
+ modelPitch: this.modelPitch,
1301
+ modelRoll: this.modelRoll,
1302
+ baseUrl: this.baseUrl,
1303
+ };
1304
+ return values;
1305
+ }
1306
+
1307
+ /**
1308
+ * @param {VectorPropertiesOptions=} defaultOptions
1309
+ * @returns {VcsMeta}
1310
+ */
1311
+ getVcsMeta(defaultOptions) {
1312
+ const defaultValues = defaultOptions || VectorProperties.getDefaultOptions();
1313
+ /** @type {VcsMeta} */
1314
+ const vcsMeta = {};
1315
+ if (getAltitudeModeOptions(this.altitudeMode) !== defaultValues.altitudeMode) {
1316
+ vcsMeta.altitudeMode = getAltitudeModeOptions(this.altitudeMode);
1317
+ }
1318
+ if (this.allowPicking !== defaultValues.allowPicking) {
1319
+ vcsMeta.allowPicking = this.allowPicking;
1320
+ }
1321
+ if (getClassificationTypeOptions(this.classificationType) !== defaultValues.classificationType) {
1322
+ vcsMeta.classificationType = getClassificationTypeOptions(this.classificationType);
1323
+ }
1324
+ if (!deepEqual(getNearFarValueOptions(this.scaleByDistance), defaultValues.scaleByDistance)) {
1325
+ vcsMeta.scaleByDistance = getNearFarValueOptions(this.scaleByDistance);
1326
+ }
1327
+ if (!deepEqual(getCartesian3Options(this.eyeOffset), defaultValues.eyeOffset)) {
1328
+ vcsMeta.eyeOffset = getCartesian3Options(this.eyeOffset);
1329
+ }
1330
+ if (this.heightAboveGround !== defaultValues.heightAboveGround) {
1331
+ vcsMeta.heightAboveGround = this.heightAboveGround;
1332
+ }
1333
+ if (this.skirt !== defaultValues.skirt) {
1334
+ vcsMeta.skirt = this.skirt;
1335
+ }
1336
+ if (this.groundLevel !== defaultValues.groundLevel) {
1337
+ vcsMeta.groundLevel = this.groundLevel;
1338
+ }
1339
+ if (this.extrudedHeight !== defaultValues.extrudedHeight) {
1340
+ vcsMeta.extrudedHeight = this.extrudedHeight;
1341
+ }
1342
+ if (this.storeysAboveGround !== defaultValues.storeysAboveGround) {
1343
+ vcsMeta.storeysAboveGround = this.storeysAboveGround;
1344
+ }
1345
+ if (this.storeysBelowGround !== defaultValues.storeysBelowGround) {
1346
+ vcsMeta.storeysBelowGround = this.storeysBelowGround;
1347
+ }
1348
+ if (!deepEqual(this.storeyHeightsAboveGround, defaultValues.storeyHeightsAboveGround)) {
1349
+ vcsMeta.storeyHeightsAboveGround = this.storeyHeightsAboveGround;
1350
+ }
1351
+ if (!deepEqual(this.storeyHeightsBelowGround, defaultValues.storeyHeightsBelowGround)) {
1352
+ vcsMeta.storeyHeightsBelowGround = this.storeyHeightsBelowGround;
1353
+ }
1354
+ if (this.storeyHeight !== defaultValues.storeyHeight) {
1355
+ vcsMeta.storeyHeight = this.storeyHeight;
1356
+ }
1357
+ if (this.modelUrl !== defaultValues.modelUrl) {
1358
+ vcsMeta.modelUrl = this.modelUrl;
1359
+ }
1360
+ if (this.modelScaleX !== defaultValues.modelScaleX) {
1361
+ vcsMeta.modelScaleX = this.modelScaleX;
1362
+ }
1363
+ if (this.modelScaleY !== defaultValues.modelScaleY) {
1364
+ vcsMeta.modelScaleY = this.modelScaleY;
1365
+ }
1366
+ if (this.modelScaleZ !== defaultValues.modelScaleZ) {
1367
+ vcsMeta.modelScaleZ = this.modelScaleZ;
1368
+ }
1369
+ if (this.modelHeading !== defaultValues.modelHeading) {
1370
+ vcsMeta.modelHeading = this.modelHeading;
1371
+ }
1372
+ if (this.modelPitch !== defaultValues.modelPitch) {
1373
+ vcsMeta.modelPitch = this.modelPitch;
1374
+ }
1375
+ if (this.modelRoll !== defaultValues.modelRoll) {
1376
+ vcsMeta.modelRoll = this.modelRoll;
1377
+ }
1378
+ if (this.baseUrl !== defaultValues.baseUrl) {
1379
+ vcsMeta.baseUrl = this.baseUrl;
1380
+ }
1381
+ return vcsMeta;
1382
+ }
1383
+
1384
+ /**
1385
+ * destroys the vectorProperties and removes all listeners
1386
+ */
1387
+ destroy() {
1388
+ this.propertyChanged.destroy();
1389
+ }
1390
+ }
1391
+ export default VectorProperties;