@vcmap/core 6.3.0-rc.1 → 6.3.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 (159) hide show
  1. package/dist/cesium.d.ts +12 -0
  2. package/dist/index.d.ts +10 -2
  3. package/dist/index.js +9 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/ol.d.ts +13 -2
  6. package/dist/src/cesium/cesium3DTileFeature.d.ts +1 -0
  7. package/dist/src/cesium/cesium3DTileFeature.js +16 -3
  8. package/dist/src/cesium/cesium3DTileFeature.js.map +1 -1
  9. package/dist/src/cesium/cesium3DTilePointFeature.js +2 -1
  10. package/dist/src/cesium/cesium3DTilePointFeature.js.map +1 -1
  11. package/dist/src/classRegistry.d.ts +7 -1
  12. package/dist/src/classRegistry.js.map +1 -1
  13. package/dist/src/featureProvider/abstractAttributeProvider.d.ts +62 -0
  14. package/dist/src/featureProvider/abstractAttributeProvider.js +129 -0
  15. package/dist/src/featureProvider/abstractAttributeProvider.js.map +1 -0
  16. package/dist/src/featureProvider/abstractFeatureProvider.d.ts +9 -18
  17. package/dist/src/featureProvider/abstractFeatureProvider.js +7 -38
  18. package/dist/src/featureProvider/abstractFeatureProvider.js.map +1 -1
  19. package/dist/src/featureProvider/compositeFeatureProvider.d.ts +27 -0
  20. package/dist/src/featureProvider/compositeFeatureProvider.js +53 -0
  21. package/dist/src/featureProvider/compositeFeatureProvider.js.map +1 -0
  22. package/dist/src/featureProvider/csvAttributeProvider.d.ts +41 -0
  23. package/dist/src/featureProvider/csvAttributeProvider.js +126 -0
  24. package/dist/src/featureProvider/csvAttributeProvider.js.map +1 -0
  25. package/dist/src/featureProvider/featureProviderFactory.d.ts +3 -0
  26. package/dist/src/featureProvider/featureProviderFactory.js +17 -0
  27. package/dist/src/featureProvider/featureProviderFactory.js.map +1 -0
  28. package/dist/src/featureProvider/i3sAttributeProvider.d.ts +7 -0
  29. package/dist/src/featureProvider/i3sAttributeProvider.js +43 -0
  30. package/dist/src/featureProvider/i3sAttributeProvider.js.map +1 -0
  31. package/dist/src/featureProvider/jsonAttributeProvider.d.ts +26 -0
  32. package/dist/src/featureProvider/jsonAttributeProvider.js +73 -0
  33. package/dist/src/featureProvider/jsonAttributeProvider.js.map +1 -0
  34. package/dist/src/featureProvider/tileProviderFeatureProvider.d.ts +4 -6
  35. package/dist/src/featureProvider/tileProviderFeatureProvider.js +9 -11
  36. package/dist/src/featureProvider/tileProviderFeatureProvider.js.map +1 -1
  37. package/dist/src/featureProvider/urlIdAttributeProvider.d.ts +28 -0
  38. package/dist/src/featureProvider/urlIdAttributeProvider.js +50 -0
  39. package/dist/src/featureProvider/urlIdAttributeProvider.js.map +1 -0
  40. package/dist/src/featureProvider/wmsFeatureProvider.d.ts +12 -3
  41. package/dist/src/featureProvider/wmsFeatureProvider.js +17 -6
  42. package/dist/src/featureProvider/wmsFeatureProvider.js.map +1 -1
  43. package/dist/src/interaction/featureAtPixelInteraction.d.ts +15 -3
  44. package/dist/src/interaction/featureAtPixelInteraction.js +41 -1
  45. package/dist/src/interaction/featureAtPixelInteraction.js.map +1 -1
  46. package/dist/src/interaction/featureProviderInteraction.js +42 -26
  47. package/dist/src/interaction/featureProviderInteraction.js.map +1 -1
  48. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.d.ts +14 -5
  49. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js +243 -128
  50. package/dist/src/layer/cesium/cesiumTilesetCesiumImpl.js.map +1 -1
  51. package/dist/src/layer/cesium/i3sCesiumImpl.d.ts +33 -0
  52. package/dist/src/layer/cesium/i3sCesiumImpl.js +107 -0
  53. package/dist/src/layer/cesium/i3sCesiumImpl.js.map +1 -0
  54. package/dist/src/layer/cesium/vcsTile/vcsQuadtreeTileProvider.js +2 -1
  55. package/dist/src/layer/cesium/vcsTile/vcsQuadtreeTileProvider.js.map +1 -1
  56. package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js +7 -6
  57. package/dist/src/layer/cesium/vectorRasterTileCesiumImpl.js.map +1 -1
  58. package/dist/src/layer/cesium/vectorTileImageryProvider.js +2 -2
  59. package/dist/src/layer/cesium/vectorTileImageryProvider.js.map +1 -1
  60. package/dist/src/layer/cesiumTilesetLayer.d.ts +9 -0
  61. package/dist/src/layer/cesiumTilesetLayer.js +26 -1
  62. package/dist/src/layer/cesiumTilesetLayer.js.map +1 -1
  63. package/dist/src/layer/i3sLayer.d.ts +80 -0
  64. package/dist/src/layer/i3sLayer.js +242 -0
  65. package/dist/src/layer/i3sLayer.js.map +1 -0
  66. package/dist/src/layer/layer.d.ts +8 -3
  67. package/dist/src/layer/layer.js +7 -1
  68. package/dist/src/layer/layer.js.map +1 -1
  69. package/dist/src/layer/layerSymbols.d.ts +4 -0
  70. package/dist/src/layer/layerSymbols.js +4 -0
  71. package/dist/src/layer/layerSymbols.js.map +1 -1
  72. package/dist/src/layer/panoramaDatasetLayer.d.ts +2 -0
  73. package/dist/src/layer/panoramaDatasetLayer.js +33 -13
  74. package/dist/src/layer/panoramaDatasetLayer.js.map +1 -1
  75. package/dist/src/layer/tileProvider/flatGeobufTileProvider.js +3 -2
  76. package/dist/src/layer/tileProvider/flatGeobufTileProvider.js.map +1 -1
  77. package/dist/src/layer/tileProvider/mvtTileProvider.js +3 -2
  78. package/dist/src/layer/tileProvider/mvtTileProvider.js.map +1 -1
  79. package/dist/src/layer/tileProvider/tileProvider.d.ts +6 -0
  80. package/dist/src/layer/tileProvider/tileProvider.js +12 -1
  81. package/dist/src/layer/tileProvider/tileProvider.js.map +1 -1
  82. package/dist/src/layer/vectorLayer.js +2 -2
  83. package/dist/src/layer/vectorLayer.js.map +1 -1
  84. package/dist/src/layer/vectorProperties.js +10 -1
  85. package/dist/src/layer/vectorProperties.js.map +1 -1
  86. package/dist/src/layer/vectorTileLayer.d.ts +14 -5
  87. package/dist/src/layer/vectorTileLayer.js +78 -26
  88. package/dist/src/layer/vectorTileLayer.js.map +1 -1
  89. package/dist/src/layer/wmsLayer.d.ts +3 -0
  90. package/dist/src/layer/wmsLayer.js +62 -32
  91. package/dist/src/layer/wmsLayer.js.map +1 -1
  92. package/dist/src/map/baseCesiumMap.d.ts +4 -4
  93. package/dist/src/map/baseCesiumMap.js +12 -0
  94. package/dist/src/map/baseCesiumMap.js.map +1 -1
  95. package/dist/src/map/cesiumMap.js +0 -11
  96. package/dist/src/map/cesiumMap.js.map +1 -1
  97. package/dist/src/map/obliqueMap.js +11 -4
  98. package/dist/src/map/obliqueMap.js.map +1 -1
  99. package/dist/src/map/panoramaMap.js +1 -1
  100. package/dist/src/panorama/panoramaImage.js +6 -5
  101. package/dist/src/panorama/panoramaImage.js.map +1 -1
  102. package/dist/src/style/declarativeStyleItem.js +7 -8
  103. package/dist/src/style/declarativeStyleItem.js.map +1 -1
  104. package/dist/src/util/fetch.d.ts +7 -0
  105. package/dist/src/util/fetch.js +7 -0
  106. package/dist/src/util/fetch.js.map +1 -1
  107. package/dist/src/vcsApp.d.ts +2 -3
  108. package/dist/src/vcsApp.js.map +1 -1
  109. package/dist/src/vcsModuleHelpers.d.ts +5 -2
  110. package/dist/src/vcsModuleHelpers.js +27 -1
  111. package/dist/src/vcsModuleHelpers.js.map +1 -1
  112. package/dist/tests/unit/helpers/cesiumHelpers.js +7 -1
  113. package/dist/tests/unit/helpers/cesiumHelpers.js.map +1 -1
  114. package/index.ts +27 -0
  115. package/package.json +2 -2
  116. package/src/cesium/cesium.d.ts +12 -0
  117. package/src/cesium/cesium3DTileFeature.ts +25 -3
  118. package/src/cesium/cesium3DTilePointFeature.ts +3 -1
  119. package/src/classRegistry.ts +8 -3
  120. package/src/featureProvider/abstractAttributeProvider.ts +201 -0
  121. package/src/featureProvider/abstractFeatureProvider.ts +27 -47
  122. package/src/featureProvider/compositeFeatureProvider.ts +103 -0
  123. package/src/featureProvider/csvAttributeProvider.ts +186 -0
  124. package/src/featureProvider/featureProviderFactory.ts +31 -0
  125. package/src/featureProvider/i3sAttributeProvider.ts +60 -0
  126. package/src/featureProvider/jsonAttributeProvider.ts +109 -0
  127. package/src/featureProvider/tileProviderFeatureProvider.ts +13 -14
  128. package/src/featureProvider/urlIdAttributeProvider.ts +82 -0
  129. package/src/featureProvider/wmsFeatureProvider.ts +24 -7
  130. package/src/global.d.ts +2 -0
  131. package/src/interaction/featureAtPixelInteraction.ts +53 -3
  132. package/src/interaction/featureProviderInteraction.ts +59 -38
  133. package/src/layer/cesium/cesiumTilesetCesiumImpl.ts +296 -157
  134. package/src/layer/cesium/i3sCesiumImpl.ts +141 -0
  135. package/src/layer/cesium/vcsTile/vcsQuadtreeTileProvider.ts +4 -3
  136. package/src/layer/cesium/vectorRasterTileCesiumImpl.ts +7 -6
  137. package/src/layer/cesium/vectorTileImageryProvider.ts +2 -2
  138. package/src/layer/cesiumTilesetLayer.ts +51 -1
  139. package/src/layer/i3sLayer.ts +343 -0
  140. package/src/layer/layer.ts +30 -3
  141. package/src/layer/layerSymbols.ts +5 -0
  142. package/src/layer/panoramaDatasetLayer.ts +44 -13
  143. package/src/layer/tileProvider/flatGeobufTileProvider.ts +3 -2
  144. package/src/layer/tileProvider/mvtTileProvider.ts +3 -2
  145. package/src/layer/tileProvider/tileProvider.ts +13 -1
  146. package/src/layer/vectorLayer.ts +4 -2
  147. package/src/layer/vectorProperties.ts +10 -1
  148. package/src/layer/vectorTileLayer.ts +135 -47
  149. package/src/layer/wmsLayer.ts +77 -44
  150. package/src/map/baseCesiumMap.ts +29 -5
  151. package/src/map/cesiumMap.ts +0 -15
  152. package/src/map/obliqueMap.ts +13 -6
  153. package/src/map/panoramaMap.ts +1 -1
  154. package/src/ol/ol.d.ts +13 -2
  155. package/src/panorama/panoramaImage.ts +8 -5
  156. package/src/style/declarativeStyleItem.ts +7 -9
  157. package/src/util/fetch.ts +7 -0
  158. package/src/vcsApp.ts +7 -8
  159. package/src/vcsModuleHelpers.ts +62 -4
@@ -423,10 +423,6 @@ class CesiumMap extends BaseCesiumMap {
423
423
  dataSourceCollection: new DataSourceCollection(),
424
424
  });
425
425
 
426
- cesiumWidget.scene.frameState.creditDisplay.update = (): void => {};
427
- cesiumWidget.scene.frameState.creditDisplay.beginFrame = (): void => {};
428
- cesiumWidget.scene.frameState.creditDisplay.endFrame = (): void => {};
429
-
430
426
  const { clock } = cesiumWidget;
431
427
  clock.shouldAnimate = true;
432
428
  this._listeners.push(
@@ -447,17 +443,6 @@ class CesiumMap extends BaseCesiumMap {
447
443
 
448
444
  cesiumWidget.scene.globe.enableLighting = this.enableLightning;
449
445
 
450
- // hide default cesium credits container
451
- const creditsContainer = document.getElementsByClassName(
452
- 'cesium-widget-credits',
453
- );
454
- if (creditsContainer) {
455
- for (let i = 0; i < creditsContainer.length; i++) {
456
- const element = creditsContainer[i] as HTMLElement;
457
- element.style.display = 'none';
458
- }
459
- }
460
-
461
446
  this.initialized = true;
462
447
  this._initializeCesiumWidget(cesiumWidget);
463
448
 
@@ -2,7 +2,6 @@ import { boundingExtent, containsXY } from 'ol/extent.js';
2
2
  import { getTransform, transform, transformExtent } from 'ol/proj.js';
3
3
  import type { Map as OLMap } from 'ol';
4
4
  import type { Coordinate } from 'ol/coordinate.js';
5
-
6
5
  import { check } from '@vcsuite/check';
7
6
  import { parseBoolean, parseNumber } from '@vcsuite/parsers';
8
7
  import Extent from '../util/extent.js';
@@ -427,15 +426,23 @@ class ObliqueMap extends BaseOLMap {
427
426
  const visibleMapUnits = resolution * size.height;
428
427
  const visibleMeters = visibleMapUnits * metersPerUnit;
429
428
  const height = Math.abs(visibleMeters / 2 / Math.tan(fovy / 2));
430
-
431
- const avgHeight = groundPosition[2] || image.averageHeight;
432
- const cameraHeight = height + avgHeight;
429
+ let pitch = -90;
430
+ if (image.projectionCenter) {
431
+ const verticalDistance = image.projectionCenter.z - image.averageHeight;
432
+ const horizontalDistance = Math.sqrt(
433
+ (image.projectionCenter.x - image.centerPointOnGround[0]) ** 2 +
434
+ (image.projectionCenter.y - image.centerPointOnGround[1]) ** 2,
435
+ );
436
+ if (horizontalDistance > 0) {
437
+ pitch =
438
+ -Math.atan(verticalDistance / horizontalDistance) * (180 / Math.PI);
439
+ }
440
+ }
433
441
 
434
442
  return new Viewpoint({
435
- cameraPosition: [groundPosition[0], groundPosition[1], cameraHeight],
436
443
  groundPosition,
437
444
  heading: defaultHeadings[image.viewDirection],
438
- pitch: -90,
445
+ pitch,
439
446
  roll: 0,
440
447
  distance: height,
441
448
  });
@@ -165,7 +165,7 @@ export default class PanoramaMap extends BaseCesiumMap {
165
165
  cesiumWidget.scene.primitives.destroyPrimitives = false;
166
166
 
167
167
  cesiumWidget.scene.highDynamicRange = true;
168
- cesiumWidget.scene.gamma = 1.8;
168
+ cesiumWidget.scene.gamma = 2.2;
169
169
 
170
170
  this.initialized = true;
171
171
  this._initializeCesiumWidget(cesiumWidget);
package/src/ol/ol.d.ts CHANGED
@@ -3,7 +3,14 @@
3
3
  * Type overrides for types extended by the @vcmap/core API
4
4
  */
5
5
  import type CanvasImmediateRenderer from 'ol/render/canvas/Immediate.js';
6
- import type { Billboard, Color, Entity, Label } from '@vcmap-cesium/engine';
6
+ import type {
7
+ Billboard,
8
+ Cartesian3,
9
+ Color,
10
+ Entity,
11
+ I3SNode,
12
+ Label,
13
+ } from '@vcmap-cesium/engine';
7
14
  import type { StyleLike } from 'ol/style/Style.js';
8
15
  import type { vectorStyleSymbol } from '../style/vectorStyleItem.js';
9
16
  import type VectorStyleItem from '../style/vectorStyleItem.js';
@@ -19,7 +26,7 @@ import type {
19
26
  panoramaFeature,
20
27
  primitives,
21
28
  } from '../layer/vectorSymbols.js';
22
- import type { vcsLayerName } from '../layer/layerSymbols.js';
29
+ import type { i3sData, vcsLayerName } from '../layer/layerSymbols.js';
23
30
  import type {
24
31
  isProvidedFeature,
25
32
  isProvidedClusterFeature,
@@ -50,6 +57,7 @@ import type { vectorClusterGroupName } from '../vectorCluster/vectorClusterSymbo
50
57
  import type { PrimitiveType } from '../util/featureconverter/convert.js';
51
58
 
52
59
  import { PanoramaDatasetFeatureProperties } from '../layer/panoramaDatasetLayer.js';
60
+ import { attributeProviderName } from '../featureProvider/abstractAttributeProvider.js';
53
61
 
54
62
  declare module 'ol/geom.js' {
55
63
  interface Geometry {
@@ -110,6 +118,8 @@ declare module 'ol/index.js' {
110
118
  [featureArcStruct]?: ArcStruct;
111
119
  [isProvidedFeature]?: boolean;
112
120
  [isProvidedClusterFeature]?: boolean;
121
+ /** Is set in `featureAtPixelInteraction` to be used in `i3sAttributeProvider`; both properties are required to get I3S features */
122
+ [i3sData]?: { i3sNode: I3SNode; cartesianPosition?: Cartesian3 };
113
123
  [globalHidden]?: boolean;
114
124
  [hidden]?: boolean;
115
125
  [highlighted]?: VectorStyleItem;
@@ -125,6 +135,7 @@ declare module 'ol/index.js' {
125
135
  [vectorClusterGroupName]?: string;
126
136
  [primitives]?: (PrimitiveType | Label | Billboard | Entity)[];
127
137
  [panoramaFeature]?: PanoramaDatasetFeatureProperties;
138
+ [attributeProviderName]?: string;
128
139
  }
129
140
 
130
141
  class CanvasTileRenderer extends CanvasImmediateRenderer {
@@ -312,7 +312,7 @@ function parseRgbUrl(imageUrl: string): {
312
312
  if (!fileName || !fileName.endsWith('_rgb.tif')) {
313
313
  throw new Error('Invalid image url');
314
314
  }
315
- const name = fileName.slice(0, -8);
315
+ const name = decodeURIComponent(fileName.slice(0, -8));
316
316
 
317
317
  return {
318
318
  name,
@@ -367,11 +367,14 @@ export async function createPanoramaImage(
367
367
  );
368
368
 
369
369
  let getIntensityImages: (() => Promise<GeoTIFFImage[]>) | undefined;
370
- if (intensityImage || (hasIntensity && absoluteRootUrl)) {
370
+ if (intensityImage || (hasIntensity && absoluteRootUrl && name)) {
371
371
  getIntensityImages = async (): Promise<GeoTIFFImage[]> => {
372
372
  const usedIntensityImage =
373
373
  intensityImage ??
374
- (await fromUrl(new URL(`${name}_intensity.tif`, absoluteRootUrl).href));
374
+ (await fromUrl(
375
+ new URL(`${encodeURIComponent(name!)}_intensity.tif`, absoluteRootUrl)
376
+ .href,
377
+ ));
375
378
 
376
379
  const {
377
380
  images: intensity,
@@ -398,10 +401,10 @@ export async function createPanoramaImage(
398
401
  | undefined;
399
402
 
400
403
  let usedDepthImage = depthImage;
401
- if (!usedDepthImage && hasDepth && absoluteRootUrl) {
404
+ if (!usedDepthImage && hasDepth && absoluteRootUrl && name) {
402
405
  try {
403
406
  usedDepthImage = await fromUrl(
404
- new URL(`${name}_depth.tif`, absoluteRootUrl).href,
407
+ new URL(`${encodeURIComponent(name)}_depth.tif`, absoluteRootUrl).href,
405
408
  );
406
409
  } catch (e) {
407
410
  getLogger('PanoramaImage').warning(
@@ -55,8 +55,6 @@ export type DeclarativeStyleItemOptions = StyleItemOptions & {
55
55
  declarativeStyle?: DeclarativeStyleOptions;
56
56
  };
57
57
 
58
- const scratchColor = new Color();
59
-
60
58
  const defaultText = new OLText({
61
59
  font: '30px sans-serif',
62
60
  fill: new Fill({ color: whiteColor }),
@@ -205,7 +203,7 @@ class DeclarativeStyleItem extends StyleItem {
205
203
  private _stylePolygon(feature: Feature): Style {
206
204
  const style = new Style({});
207
205
  const color = this.cesiumStyle.color
208
- ? this.cesiumStyle.color.evaluate<Color>(feature, scratchColor)
206
+ ? this.cesiumStyle.color.evaluate<Color>(feature, new Color())
209
207
  : Color.WHITE;
210
208
  if (color) {
211
209
  style.setFill(
@@ -223,7 +221,7 @@ class DeclarativeStyleItem extends StyleItem {
223
221
  const style = new Style({});
224
222
  const isExtruded = !!feature.get('olcs_extrudedHeight');
225
223
  const color = this.cesiumStyle.color
226
- ? this.cesiumStyle.color.evaluate<Color>(feature, scratchColor)
224
+ ? this.cesiumStyle.color.evaluate<Color>(feature, new Color())
227
225
  : Color.WHITE;
228
226
  if (color) {
229
227
  if (isExtruded) {
@@ -269,7 +267,7 @@ class DeclarativeStyleItem extends StyleItem {
269
267
  if (this.cesiumStyle.labelColor) {
270
268
  const textColor = this.cesiumStyle.labelColor.evaluateColor(
271
269
  feature,
272
- scratchColor,
270
+ new Color(),
273
271
  );
274
272
  if (textColor) {
275
273
  textStyle.getFill()!.setColor(cesiumColorToColor(textColor));
@@ -279,7 +277,7 @@ class DeclarativeStyleItem extends StyleItem {
279
277
  const outlineColor =
280
278
  this.cesiumStyle.labelOutlineColor.evaluate<Color>(
281
279
  feature,
282
- scratchColor,
280
+ new Color(),
283
281
  );
284
282
  if (outlineColor) {
285
283
  const outlineWidth = this.cesiumStyle.labelOutlineWidth
@@ -314,7 +312,7 @@ class DeclarativeStyleItem extends StyleItem {
314
312
  }
315
313
  } else {
316
314
  const color =
317
- this.cesiumStyle.color?.evaluate<Color>(feature, scratchColor) ??
315
+ this.cesiumStyle.color?.evaluate<Color>(feature, new Color()) ??
318
316
  Color.WHITE;
319
317
 
320
318
  let radius = 4;
@@ -330,7 +328,7 @@ class DeclarativeStyleItem extends StyleItem {
330
328
  if (this.cesiumStyle.pointOutlineColor) {
331
329
  pointOutlineColor = this.cesiumStyle.pointOutlineColor.evaluateColor(
332
330
  feature,
333
- scratchColor,
331
+ new Color(),
334
332
  );
335
333
  }
336
334
  radius += width / 2;
@@ -372,7 +370,7 @@ class DeclarativeStyleItem extends StyleItem {
372
370
  if (this.cesiumStyle.strokeColor) {
373
371
  const strokeColor = this.cesiumStyle.strokeColor.evaluateColor(
374
372
  feature,
375
- scratchColor,
373
+ new Color(),
376
374
  );
377
375
  if (strokeColor) {
378
376
  const strokeWidth = this.cesiumStyle.strokeWidth
package/src/util/fetch.ts CHANGED
@@ -38,6 +38,13 @@ export async function requestObjectUrl(
38
38
  return URL.createObjectURL(blob);
39
39
  }
40
40
 
41
+ /**
42
+ * Get a RequestInit object for the given url, adding optional headers. If the url is in the
43
+ * TrustedServers {@see https://cesium.com/learn/cesiumjs/ref-doc/TrustedServers.html?classFilter=Trusted}
44
+ * credentials will be included in the request.
45
+ * @param url
46
+ * @param headers
47
+ */
41
48
  export function getInitForUrl(
42
49
  url: string,
43
50
  headers?: Record<string, string>,
package/src/vcsApp.ts CHANGED
@@ -29,7 +29,11 @@ import VcsEvent from './vcsEvent.js';
29
29
  import { setDefaultProjectionOptions } from './util/projection.js';
30
30
  import ObliqueMap from './map/obliqueMap.js';
31
31
  import OverrideClassRegistry from './overrideClassRegistry.js';
32
- import type { AbstractCtor, CtorType } from './classRegistry.js';
32
+ import type {
33
+ AbstractCtor,
34
+ CtorType,
35
+ FeatureProviderClass,
36
+ } from './classRegistry.js';
33
37
  import ClassRegistry, {
34
38
  categoryClassRegistry,
35
39
  featureProviderClassRegistry,
@@ -44,7 +48,6 @@ import { moduleIdSymbol } from './moduleIdSymbol.js';
44
48
  import type LayerCollection from './util/layerCollection.js';
45
49
  import type Category from './category/category.js';
46
50
  import type TileProvider from './layer/tileProvider/tileProvider.js';
47
- import type AbstractFeatureProvider from './featureProvider/abstractFeatureProvider.js';
48
51
  import type { HiddenObject } from './util/hiddenObjects.js';
49
52
  import { createHiddenObjectsCollection } from './util/hiddenObjects.js';
50
53
  import type { FlightInstanceOptions } from './util/flight/flightInstance.js';
@@ -155,9 +158,7 @@ class VcsApp {
155
158
  typeof TileProvider
156
159
  >;
157
160
 
158
- private _featureProviderClassRegistry: OverrideClassRegistry<
159
- typeof AbstractFeatureProvider
160
- >;
161
+ private _featureProviderClassRegistry: OverrideClassRegistry<FeatureProviderClass>;
161
162
 
162
163
  /**
163
164
  * @param options
@@ -402,9 +403,7 @@ class VcsApp {
402
403
  return this._tileProviderClassRegistry;
403
404
  }
404
405
 
405
- get featureProviderClassRegistry(): OverrideClassRegistry<
406
- typeof AbstractFeatureProvider
407
- > {
406
+ get featureProviderClassRegistry(): OverrideClassRegistry<FeatureProviderClass> {
408
407
  return this._featureProviderClassRegistry;
409
408
  }
410
409
 
@@ -11,8 +11,19 @@ import type {
11
11
  StyleItemOptions,
12
12
  } from './style/styleItem.js';
13
13
  import type { TileProviderOptions } from './layer/tileProvider/tileProvider.js';
14
- import type { AbstractFeatureProviderOptions } from './featureProvider/abstractFeatureProvider.js';
14
+ import type {
15
+ // eslint-disable-next-line import/no-named-default
16
+ default as AbstractFeatureProvider,
17
+ AbstractFeatureProviderOptions,
18
+ } from './featureProvider/abstractFeatureProvider.js';
15
19
  import type VcsApp from './vcsApp.js';
20
+ import type { CompositeFeatureProviderOptions } from './featureProvider/compositeFeatureProvider.js';
21
+ import CompositeFeatureProvider from './featureProvider/compositeFeatureProvider.js';
22
+ import type {
23
+ // eslint-disable-next-line import/no-named-default
24
+ default as AbstractAttributeProvider,
25
+ AbstractAttributeProviderOptions,
26
+ } from './featureProvider/abstractAttributeProvider.js';
16
27
 
17
28
  function getLogger(): Logger {
18
29
  return getLoggerByName('init');
@@ -22,7 +33,7 @@ export type ModuleLayerOptions = LayerOptions & {
22
33
  style?: string | StyleItemOptions;
23
34
  highlightStyle?: string | StyleItemOptions;
24
35
  tileProvider?: TileProviderOptions;
25
- featureProvider?: AbstractFeatureProviderOptions;
36
+ attributeProvider?: AbstractAttributeProviderOptions;
26
37
  };
27
38
 
28
39
  export function deserializeMap(
@@ -48,6 +59,44 @@ export function deserializeViewpoint(
48
59
  return null;
49
60
  }
50
61
 
62
+ export function deserializeFeatureProvider(
63
+ vcsApp: VcsApp,
64
+ options:
65
+ | AbstractFeatureProviderOptions
66
+ | CompositeFeatureProviderOptions
67
+ | AbstractAttributeProviderOptions,
68
+ ): AbstractAttributeProvider | AbstractFeatureProvider | null {
69
+ if (options.type === CompositeFeatureProvider.className) {
70
+ const {
71
+ featureProviders: featureProviderOptions,
72
+ attributeProviders: attributeProviderOptions,
73
+ } = options as CompositeFeatureProviderOptions;
74
+
75
+ const featureProviders = featureProviderOptions
76
+ .map((fpConfig) => deserializeFeatureProvider(vcsApp, fpConfig))
77
+ .filter((fp): fp is AbstractFeatureProvider => !!fp);
78
+
79
+ const attributeProviders = attributeProviderOptions
80
+ .map((apConfig) => deserializeFeatureProvider(vcsApp, apConfig))
81
+ .filter((ap): ap is AbstractAttributeProvider => !!ap);
82
+
83
+ return new CompositeFeatureProvider({
84
+ ...options,
85
+ featureProviders,
86
+ attributeProviders,
87
+ });
88
+ }
89
+
90
+ if (options.type) {
91
+ return getObjectFromClassRegistry(
92
+ vcsApp.featureProviderClassRegistry,
93
+ options,
94
+ );
95
+ }
96
+
97
+ return null;
98
+ }
99
+
51
100
  export function deserializeLayer(
52
101
  vcsApp: VcsApp,
53
102
  layerConfig: ModuleLayerOptions,
@@ -83,10 +132,18 @@ export function deserializeLayer(
83
132
  );
84
133
  }
85
134
 
135
+ let attributeProvider;
136
+ if (layerConfig.attributeProvider) {
137
+ attributeProvider = deserializeFeatureProvider(
138
+ vcsApp,
139
+ layerConfig.attributeProvider,
140
+ ) as AbstractAttributeProvider | null;
141
+ }
142
+
86
143
  let featureProvider;
87
144
  if (layerConfig.featureProvider) {
88
- featureProvider = getObjectFromClassRegistry(
89
- vcsApp.featureProviderClassRegistry,
145
+ featureProvider = deserializeFeatureProvider(
146
+ vcsApp,
90
147
  layerConfig.featureProvider,
91
148
  );
92
149
  }
@@ -97,6 +154,7 @@ export function deserializeLayer(
97
154
  highlightStyle,
98
155
  tileProvider,
99
156
  featureProvider,
157
+ attributeProvider,
100
158
  });
101
159
  }
102
160