@vcmap/core 6.0.0-rc.9 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +4 -1
  2. package/dist/cesium.d.ts +117 -0
  3. package/dist/index.d.ts +14 -6
  4. package/dist/index.js +12 -4
  5. package/dist/index.js.map +1 -1
  6. package/dist/ol.d.ts +1 -0
  7. package/dist/src/cesium/cesium3DTileFeature.d.ts +2 -1
  8. package/dist/src/cesium/cesium3DTileFeature.js +13 -1
  9. package/dist/src/cesium/cesium3DTileFeature.js.map +1 -1
  10. package/dist/src/cesium/cesium3DTilePointFeature.js +2 -0
  11. package/dist/src/cesium/cesium3DTilePointFeature.js.map +1 -1
  12. package/dist/src/cesium/entity.js +3 -0
  13. package/dist/src/cesium/entity.js.map +1 -1
  14. package/dist/src/interaction/featureAtPixelInteraction.d.ts +4 -12
  15. package/dist/src/interaction/featureAtPixelInteraction.js +6 -27
  16. package/dist/src/interaction/featureAtPixelInteraction.js.map +1 -1
  17. package/dist/src/layer/cesium/openStreetMapCesiumImpl.js +2 -4
  18. package/dist/src/layer/cesium/openStreetMapCesiumImpl.js.map +1 -1
  19. package/dist/src/layer/cesium/rasterLayerCesiumImpl.d.ts +4 -0
  20. package/dist/src/layer/cesium/rasterLayerCesiumImpl.js +15 -0
  21. package/dist/src/layer/cesium/rasterLayerCesiumImpl.js.map +1 -1
  22. package/dist/src/layer/cesium/singleImageCesiumImpl.js +2 -6
  23. package/dist/src/layer/cesium/singleImageCesiumImpl.js.map +1 -1
  24. package/dist/src/layer/cesium/terrainCesiumImpl.js +3 -0
  25. package/dist/src/layer/cesium/terrainCesiumImpl.js.map +1 -1
  26. package/dist/src/layer/cesium/tmsCesiumImpl.js +1 -4
  27. package/dist/src/layer/cesium/tmsCesiumImpl.js.map +1 -1
  28. package/dist/src/layer/cesium/vcsTile/vcsChildTile.d.ts +12 -0
  29. package/dist/src/layer/cesium/vcsTile/vcsChildTile.js +18 -0
  30. package/dist/src/layer/cesium/vcsTile/vcsChildTile.js.map +1 -0
  31. package/dist/src/layer/cesium/vcsTile/vcsDebugTile.d.ts +21 -0
  32. package/dist/src/layer/cesium/vcsTile/vcsDebugTile.js +89 -0
  33. package/dist/src/layer/cesium/vcsTile/vcsDebugTile.js.map +1 -0
  34. package/dist/src/layer/cesium/vcsTile/vcsNoDataTile.d.ts +11 -0
  35. package/dist/src/layer/cesium/vcsTile/vcsNoDataTile.js +17 -0
  36. package/dist/src/layer/cesium/vcsTile/vcsNoDataTile.js.map +1 -0
  37. package/dist/src/layer/cesium/vcsTile/vcsQuadtreeTileProvider.d.ts +39 -0
  38. package/dist/src/layer/cesium/vcsTile/vcsQuadtreeTileProvider.js +192 -0
  39. package/dist/src/layer/cesium/vcsTile/vcsQuadtreeTileProvider.js.map +1 -0
  40. package/dist/src/layer/cesium/vcsTile/vcsTileHelpers.d.ts +52 -0
  41. package/dist/src/layer/cesium/vcsTile/vcsTileHelpers.js +73 -0
  42. package/dist/src/layer/cesium/vcsTile/vcsTileHelpers.js.map +1 -0
  43. package/dist/src/layer/cesium/vcsTile/vcsVectorTile.d.ts +23 -0
  44. package/dist/src/layer/cesium/vcsTile/vcsVectorTile.js +87 -0
  45. package/dist/src/layer/cesium/vcsTile/vcsVectorTile.js.map +1 -0
  46. package/dist/src/layer/cesium/vectorCesiumImpl.js +1 -1
  47. package/dist/src/layer/cesium/vectorCesiumImpl.js.map +1 -1
  48. package/dist/src/layer/cesium/vectorTileCesiumImpl.d.ts +19 -0
  49. package/dist/src/layer/cesium/vectorTileCesiumImpl.js +63 -0
  50. package/dist/src/layer/cesium/vectorTileCesiumImpl.js.map +1 -0
  51. package/dist/src/layer/cesium/wmsCesiumImpl.js +1 -4
  52. package/dist/src/layer/cesium/wmsCesiumImpl.js.map +1 -1
  53. package/dist/src/layer/cesium/wmtsCesiumImpl.js +1 -4
  54. package/dist/src/layer/cesium/wmtsCesiumImpl.js.map +1 -1
  55. package/dist/src/layer/layer.d.ts +5 -0
  56. package/dist/src/layer/layer.js +5 -0
  57. package/dist/src/layer/layer.js.map +1 -1
  58. package/dist/src/layer/openStreetMapLayer.d.ts +32 -2
  59. package/dist/src/layer/openStreetMapLayer.js +35 -1
  60. package/dist/src/layer/openStreetMapLayer.js.map +1 -1
  61. package/dist/src/layer/openlayers/openStreetMapOpenlayersImpl.js +2 -0
  62. package/dist/src/layer/openlayers/openStreetMapOpenlayersImpl.js.map +1 -1
  63. package/dist/src/layer/openlayers/rasterLayerOpenlayersImpl.d.ts +2 -0
  64. package/dist/src/layer/openlayers/rasterLayerOpenlayersImpl.js +4 -0
  65. package/dist/src/layer/openlayers/rasterLayerOpenlayersImpl.js.map +1 -1
  66. package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js +2 -0
  67. package/dist/src/layer/openlayers/singleImageOpenlayersImpl.js.map +1 -1
  68. package/dist/src/layer/openlayers/tmsOpenlayersImpl.js +2 -0
  69. package/dist/src/layer/openlayers/tmsOpenlayersImpl.js.map +1 -1
  70. package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.d.ts +1 -7
  71. package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js +3 -35
  72. package/dist/src/layer/openlayers/vectorTileOpenlayersImpl.js.map +1 -1
  73. package/dist/src/layer/openlayers/wmsOpenlayersImpl.js +4 -0
  74. package/dist/src/layer/openlayers/wmsOpenlayersImpl.js.map +1 -1
  75. package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js +2 -0
  76. package/dist/src/layer/openlayers/wmtsOpenlayersImpl.js.map +1 -1
  77. package/dist/src/layer/pointCloudLayer.d.ts +0 -1
  78. package/dist/src/layer/pointCloudLayer.js +2 -3
  79. package/dist/src/layer/pointCloudLayer.js.map +1 -1
  80. package/dist/src/layer/rasterLayer.d.ts +44 -3
  81. package/dist/src/layer/rasterLayer.js +43 -0
  82. package/dist/src/layer/rasterLayer.js.map +1 -1
  83. package/dist/src/layer/tileProvider/mvtTileProvider.d.ts +0 -5
  84. package/dist/src/layer/tileProvider/mvtTileProvider.js +0 -12
  85. package/dist/src/layer/tileProvider/mvtTileProvider.js.map +1 -1
  86. package/dist/src/layer/tileProvider/staticFeatureTileProvider.d.ts +14 -0
  87. package/dist/src/layer/tileProvider/staticFeatureTileProvider.js +44 -0
  88. package/dist/src/layer/tileProvider/staticFeatureTileProvider.js.map +1 -0
  89. package/dist/src/layer/tileProvider/tileProvider.d.ts +8 -2
  90. package/dist/src/layer/tileProvider/tileProvider.js +17 -1
  91. package/dist/src/layer/tileProvider/tileProvider.js.map +1 -1
  92. package/dist/src/layer/vectorLayer.d.ts +1 -1
  93. package/dist/src/layer/vectorLayer.js.map +1 -1
  94. package/dist/src/layer/vectorTileLayer.d.ts +13 -3
  95. package/dist/src/layer/vectorTileLayer.js +43 -13
  96. package/dist/src/layer/vectorTileLayer.js.map +1 -1
  97. package/dist/src/map/cesiumMap.d.ts +8 -1
  98. package/dist/src/map/cesiumMap.js +17 -6
  99. package/dist/src/map/cesiumMap.js.map +1 -1
  100. package/dist/src/ol/feature.js +7 -0
  101. package/dist/src/ol/feature.js.map +1 -1
  102. package/dist/src/style/declarativeStyleItem.js +2 -68
  103. package/dist/src/style/declarativeStyleItem.js.map +1 -1
  104. package/dist/src/util/displayQuality/displayQuality.d.ts +1 -0
  105. package/dist/src/util/displayQuality/displayQuality.js +12 -1
  106. package/dist/src/util/displayQuality/displayQuality.js.map +1 -1
  107. package/dist/src/util/editor/createFeatureSession.d.ts +8 -4
  108. package/dist/src/util/editor/createFeatureSession.js +35 -11
  109. package/dist/src/util/editor/createFeatureSession.js.map +1 -1
  110. package/dist/src/util/editor/editGeometrySession.d.ts +2 -1
  111. package/dist/src/util/editor/editGeometrySession.js +33 -12
  112. package/dist/src/util/editor/editGeometrySession.js.map +1 -1
  113. package/dist/src/util/editor/editorHelpers.d.ts +1 -0
  114. package/dist/src/util/editor/editorHelpers.js +6 -0
  115. package/dist/src/util/editor/editorHelpers.js.map +1 -1
  116. package/dist/src/util/editor/editorSessionHelpers.d.ts +1 -6
  117. package/dist/src/util/editor/editorSessionHelpers.js +5 -16
  118. package/dist/src/util/editor/editorSessionHelpers.js.map +1 -1
  119. package/dist/src/util/editor/interactions/editGeometryMouseOverInteraction.js +3 -2
  120. package/dist/src/util/editor/interactions/editGeometryMouseOverInteraction.js.map +1 -1
  121. package/dist/src/util/editor/interactions/removeVertexInteraction.d.ts +1 -1
  122. package/dist/src/util/editor/interactions/removeVertexInteraction.js +2 -2
  123. package/dist/src/util/editor/interactions/removeVertexInteraction.js.map +1 -1
  124. package/dist/src/util/editor/interactions/segmentLengthInteraction.d.ts +16 -0
  125. package/dist/src/util/editor/interactions/segmentLengthInteraction.js +167 -0
  126. package/dist/src/util/editor/interactions/segmentLengthInteraction.js.map +1 -0
  127. package/dist/src/util/editor/interactions/translateVertexInteraction.js +2 -6
  128. package/dist/src/util/editor/interactions/translateVertexInteraction.js.map +1 -1
  129. package/dist/src/util/editor/interactions/translationSnapping.js +3 -2
  130. package/dist/src/util/editor/interactions/translationSnapping.js.map +1 -1
  131. package/dist/src/util/featureconverter/clampedPrimitive.d.ts +2 -2
  132. package/dist/src/util/featureconverter/clampedPrimitive.js +24 -2
  133. package/dist/src/util/featureconverter/clampedPrimitive.js.map +1 -1
  134. package/dist/src/util/featureconverter/convert.js +12 -3
  135. package/dist/src/util/featureconverter/convert.js.map +1 -1
  136. package/dist/src/util/geometryHelpers.d.ts +9 -1
  137. package/dist/src/util/geometryHelpers.js +54 -4
  138. package/dist/src/util/geometryHelpers.js.map +1 -1
  139. package/dist/src/util/math.d.ts +12 -0
  140. package/dist/src/util/math.js +21 -0
  141. package/dist/src/util/math.js.map +1 -1
  142. package/dist/src/util/projection.js +1 -1
  143. package/dist/src/util/projection.js.map +1 -1
  144. package/dist/src/vcsModule.d.ts +12 -12
  145. package/dist/src/vcsModule.js +8 -8
  146. package/dist/src/vcsModule.js.map +1 -1
  147. package/dist/tests/unit/helpers/cesiumHelpers.d.ts +2 -2
  148. package/dist/tests/unit/helpers/cesiumHelpers.js +2 -1
  149. package/dist/tests/unit/helpers/cesiumHelpers.js.map +1 -1
  150. package/index.ts +26 -2
  151. package/package.json +3 -3
  152. package/src/cesium/cesium.d.ts +117 -0
  153. package/src/cesium/cesium3DTileFeature.ts +20 -1
  154. package/src/cesium/cesium3DTilePointFeature.ts +3 -0
  155. package/src/cesium/entity.ts +7 -0
  156. package/src/interaction/featureAtPixelInteraction.ts +8 -39
  157. package/src/layer/cesium/openStreetMapCesiumImpl.ts +2 -4
  158. package/src/layer/cesium/rasterLayerCesiumImpl.ts +19 -0
  159. package/src/layer/cesium/singleImageCesiumImpl.ts +2 -6
  160. package/src/layer/cesium/terrainCesiumImpl.ts +3 -0
  161. package/src/layer/cesium/tmsCesiumImpl.ts +1 -4
  162. package/src/layer/cesium/vcsTile/vcsChildTile.ts +31 -0
  163. package/src/layer/cesium/vcsTile/vcsDebugTile.ts +154 -0
  164. package/src/layer/cesium/vcsTile/vcsNoDataTile.ts +30 -0
  165. package/src/layer/cesium/vcsTile/vcsQuadtreeTileProvider.ts +290 -0
  166. package/src/layer/cesium/vcsTile/vcsTileHelpers.ts +134 -0
  167. package/src/layer/cesium/vcsTile/vcsVectorTile.ts +149 -0
  168. package/src/layer/cesium/vectorCesiumImpl.ts +1 -1
  169. package/src/layer/cesium/vectorTileCesiumImpl.ts +91 -0
  170. package/src/layer/cesium/wmsCesiumImpl.ts +1 -4
  171. package/src/layer/cesium/wmtsCesiumImpl.ts +1 -4
  172. package/src/layer/layer.ts +5 -0
  173. package/src/layer/openStreetMapLayer.ts +64 -2
  174. package/src/layer/openlayers/openStreetMapOpenlayersImpl.ts +2 -0
  175. package/src/layer/openlayers/rasterLayerOpenlayersImpl.ts +6 -0
  176. package/src/layer/openlayers/singleImageOpenlayersImpl.ts +2 -0
  177. package/src/layer/openlayers/tmsOpenlayersImpl.ts +2 -0
  178. package/src/layer/openlayers/vectorTileOpenlayersImpl.ts +3 -37
  179. package/src/layer/openlayers/wmsOpenlayersImpl.ts +4 -0
  180. package/src/layer/openlayers/wmtsOpenlayersImpl.ts +2 -0
  181. package/src/layer/pointCloudLayer.ts +2 -3
  182. package/src/layer/rasterLayer.ts +81 -2
  183. package/src/layer/tileProvider/mvtTileProvider.ts +0 -18
  184. package/src/layer/tileProvider/staticFeatureTileProvider.ts +61 -0
  185. package/src/layer/tileProvider/tileProvider.ts +27 -2
  186. package/src/layer/vectorLayer.ts +1 -1
  187. package/src/layer/vectorTileLayer.ts +72 -17
  188. package/src/map/cesiumMap.ts +28 -6
  189. package/src/ol/feature.ts +10 -0
  190. package/src/ol/ol.d.ts +1 -0
  191. package/src/style/declarativeStyleItem.ts +2 -72
  192. package/src/util/displayQuality/displayQuality.ts +13 -1
  193. package/src/util/editor/createFeatureSession.ts +51 -13
  194. package/src/util/editor/editGeometrySession.ts +41 -10
  195. package/src/util/editor/editorHelpers.ts +13 -0
  196. package/src/util/editor/editorSessionHelpers.ts +6 -20
  197. package/src/util/editor/interactions/editGeometryMouseOverInteraction.ts +4 -4
  198. package/src/util/editor/interactions/removeVertexInteraction.ts +3 -4
  199. package/src/util/editor/interactions/segmentLengthInteraction.ts +227 -0
  200. package/src/util/editor/interactions/translateVertexInteraction.ts +3 -10
  201. package/src/util/editor/interactions/translationSnapping.ts +4 -4
  202. package/src/util/featureconverter/clampedPrimitive.ts +53 -5
  203. package/src/util/featureconverter/convert.ts +18 -2
  204. package/src/util/geometryHelpers.ts +63 -4
  205. package/src/util/math.ts +28 -0
  206. package/src/util/projection.ts +1 -1
  207. package/src/vcsModule.ts +20 -20
@@ -6,6 +6,7 @@ import CesiumTilesetLayer, {
6
6
  } from './cesiumTilesetLayer.js';
7
7
  import DeclarativeStyleItem, {
8
8
  DeclarativeStyleItemOptions,
9
+ defaultDeclarativeStyle,
9
10
  } from '../style/declarativeStyleItem.js';
10
11
  import VectorStyleItem, {
11
12
  VectorStyleItemOptions,
@@ -20,8 +21,6 @@ export type PointCloudOptions = CesiumTilesetOptions & {
20
21
  pointSize?: number | string;
21
22
  };
22
23
 
23
- export const defaultPointCloudStyle = new DeclarativeStyleItem({});
24
-
25
24
  /**
26
25
  * represents a specific PointCloudLayer layer for cesium.
27
26
  * <h3>Config Parameter</h3>
@@ -71,7 +70,7 @@ class PointCloudLayer extends CesiumTilesetLayer {
71
70
  ): StyleItem {
72
71
  return super.getStyleOrDefaultStyle(
73
72
  styleOptions,
74
- defaultStyle || defaultPointCloudStyle,
73
+ defaultStyle || defaultDeclarativeStyle,
75
74
  );
76
75
  }
77
76
 
@@ -3,6 +3,7 @@ import {
3
3
  WebMercatorTilingScheme,
4
4
  GeographicTilingScheme,
5
5
  Cartographic,
6
+ ImageryLayer,
6
7
  } from '@vcmap-cesium/engine';
7
8
  import {
8
9
  getBottomLeft,
@@ -30,15 +31,26 @@ import VcsMap from '../map/vcsMap.js';
30
31
 
31
32
  export type RasterLayerOptions = LayerOptions & {
32
33
  /**
33
- * minLevel to show (if not specified, calculated from extent)
34
+ * minLevel of the datasource (if not specified, calculated from extent)
34
35
  * @default 0
35
36
  */
36
37
  minLevel?: number;
37
38
  /**
38
- * maxLevel to show
39
+ * maxlevel the datasource can provide the data.
39
40
  * @default 18
40
41
  */
41
42
  maxLevel?: number;
43
+
44
+ /**
45
+ * configures the visible level in the rendered map. Maps to Openlayers `minZoom` and Cesium `minimiumTerrainLevel`
46
+ */
47
+ minRenderingLevel?: number;
48
+
49
+ /**
50
+ * configures the visible level in the rendered map. Maps to Openlayers `maxZoom` and Cesium `maximumTerrainLevel`
51
+ */
52
+ maxRenderingLevel?: number;
53
+
42
54
  tilingSchema?: TilingScheme;
43
55
  /**
44
56
  * opacity between 0 and 1
@@ -49,15 +61,24 @@ export type RasterLayerOptions = LayerOptions & {
49
61
  * either 'left' or 'right', none if omitted
50
62
  */
51
63
  splitDirection?: string;
64
+
65
+ /**
66
+ * can be used to forward options to the cesium ImageryLayer
67
+ * @see https://cesium.com/learn/cesiumjs/ref-doc/ImageryLayer.html#.ConstructorOptions
68
+ */
69
+ imageryLayerOptions?: ImageryLayer.ConstructorOptions;
52
70
  };
53
71
 
54
72
  export type RasterLayerImplementationOptions = LayerImplementationOptions & {
55
73
  minLevel: number;
56
74
  maxLevel: number;
75
+ minRenderingLevel?: number;
76
+ maxRenderingLevel?: number;
57
77
  tilingSchema: TilingScheme;
58
78
  opacity: number;
59
79
  extent?: Extent;
60
80
  splitDirection: SplitDirection;
81
+ imageryLayerOptions?: ImageryLayer.ConstructorOptions;
61
82
  };
62
83
 
63
84
  export interface RasterLayerImplementation {
@@ -166,9 +187,12 @@ class RasterLayer<
166
187
  ...Layer.getDefaultOptions(),
167
188
  minLevel: 0,
168
189
  maxLevel: 18,
190
+ minRenderingLevel: undefined,
191
+ maxRenderingLevel: undefined,
169
192
  tilingSchema: TilingScheme.GEOGRAPHIC,
170
193
  opacity: 1,
171
194
  splitDirection: undefined,
195
+ imageryLayerOptions: undefined,
172
196
  };
173
197
  }
174
198
 
@@ -176,19 +200,47 @@ class RasterLayer<
176
200
 
177
201
  /**
178
202
  * The {@link TilingScheme} of this layer
203
+ * Changes require calling layer.redraw() to take effect.
179
204
  */
180
205
  tilingSchema: TilingScheme;
181
206
 
207
+ /**
208
+ * The maximum level to load.
209
+ * Changes require calling layer.redraw() to take effect.
210
+ */
182
211
  maxLevel: number;
183
212
 
184
213
  private _minLevel: number;
185
214
 
215
+ /**
216
+ * The minimum level to load.
217
+ * Changes require calling layer.redraw() to take effect.
218
+ */
186
219
  minLevel: number;
187
220
 
221
+ /**
222
+ * defines the visible level in the rendered map, maps to Openlayers `minZoom` and Cesium `minimiumTerrainLevel`.
223
+ * Changes requires calling layer.redraw() to take effect.
224
+ */
225
+ minRenderingLevel: number | undefined;
226
+
227
+ /**
228
+ * defines the visible level in the rendered map, maps to Openlayers `minZoom` and Cesium `minimiumTerrainLevel`.
229
+ * Changes requires calling layer.redraw() to take effect.
230
+ */
231
+ maxRenderingLevel: number | undefined;
232
+
188
233
  private _opacity: number;
189
234
 
190
235
  private _splitDirection: SplitDirection = SplitDirection.NONE;
191
236
 
237
+ /**
238
+ * can be used to forward options to the cesium ImageryLayer
239
+ * @see https://cesium.com/learn/cesiumjs/ref-doc/ImageryLayer.html#.ConstructorOptions
240
+ * Changes requires calling layer.redraw() to take effect.
241
+ */
242
+ imageryLayerOptions: ImageryLayer.ConstructorOptions | undefined;
243
+
192
244
  /**
193
245
  * raised if the split direction changes, is passed the split direction as its only argument
194
246
  */
@@ -216,6 +268,16 @@ class RasterLayer<
216
268
  this.maxLevel,
217
269
  this._minLevel,
218
270
  );
271
+
272
+ this.minRenderingLevel = parseInteger(
273
+ options.minRenderingLevel,
274
+ defaultOptions.minRenderingLevel,
275
+ );
276
+ this.maxRenderingLevel = parseInteger(
277
+ options.maxRenderingLevel,
278
+ defaultOptions.maxRenderingLevel,
279
+ );
280
+
219
281
  this._opacity = parseNumberRange(
220
282
  options.opacity,
221
283
  defaultOptions.opacity as number,
@@ -229,6 +291,8 @@ class RasterLayer<
229
291
  ? SplitDirection.LEFT
230
292
  : SplitDirection.RIGHT;
231
293
  }
294
+
295
+ this.imageryLayerOptions = structuredClone(options.imageryLayerOptions);
232
296
  }
233
297
 
234
298
  /**
@@ -270,9 +334,12 @@ class RasterLayer<
270
334
  ...super.getImplementationOptions(),
271
335
  minLevel: this.minLevel,
272
336
  maxLevel: this.maxLevel,
337
+ minRenderingLevel: this.minRenderingLevel,
338
+ maxRenderingLevel: this.maxRenderingLevel,
273
339
  tilingSchema: this.tilingSchema,
274
340
  opacity: this.opacity,
275
341
  splitDirection: this._splitDirection,
342
+ imageryLayerOptions: this.imageryLayerOptions,
276
343
  };
277
344
 
278
345
  if (this.extent?.isValid()) {
@@ -297,6 +364,14 @@ class RasterLayer<
297
364
  config.maxLevel = this.maxLevel;
298
365
  }
299
366
 
367
+ if (this.minRenderingLevel !== defaultOptions.minRenderingLevel) {
368
+ config.minRenderingLevel = this.minRenderingLevel;
369
+ }
370
+
371
+ if (this.maxRenderingLevel !== defaultOptions.maxRenderingLevel) {
372
+ config.maxRenderingLevel = this.maxRenderingLevel;
373
+ }
374
+
300
375
  if (this.tilingSchema !== defaultOptions.tilingSchema) {
301
376
  config.tilingSchema = this.tilingSchema;
302
377
  }
@@ -310,6 +385,10 @@ class RasterLayer<
310
385
  this._splitDirection === SplitDirection.RIGHT ? 'right' : 'left';
311
386
  }
312
387
 
388
+ if (this.imageryLayerOptions !== defaultOptions.imageryLayerOptions) {
389
+ config.imageryLayerOptions = structuredClone(this.imageryLayerOptions);
390
+ }
391
+
313
392
  return config;
314
393
  }
315
394
 
@@ -15,10 +15,6 @@ export type MVTTileProviderOptions = TileProviderOptions & {
15
15
  * url to pbf tiled datasource {x}, {y}, {z} are placeholders for x, y, zoom
16
16
  */
17
17
  url: string;
18
- /**
19
- * if property exists will be used to set the ID of the feature
20
- */
21
- idProperty?: string;
22
18
  };
23
19
 
24
20
  /**
@@ -33,14 +29,11 @@ class MVTTileProvider extends TileProvider {
33
29
  return {
34
30
  ...TileProvider.getDefaultOptions(),
35
31
  url: '',
36
- idProperty: undefined,
37
32
  };
38
33
  }
39
34
 
40
35
  url: string;
41
36
 
42
- idProperty: string | undefined;
43
-
44
37
  private _MVTFormat = new MVT<Feature>({ featureClass: Feature });
45
38
 
46
39
  constructor(options: MVTTileProviderOptions) {
@@ -48,7 +41,6 @@ class MVTTileProvider extends TileProvider {
48
41
  super(options);
49
42
 
50
43
  this.url = options.url || defaultOptions.url;
51
- this.idProperty = options.idProperty || defaultOptions.idProperty;
52
44
  }
53
45
 
54
46
  get locale(): string {
@@ -84,12 +76,6 @@ class MVTTileProvider extends TileProvider {
84
76
  const sx = (extent[2] - extent[0]) / 4096;
85
77
  const sy = -((extent[3] - extent[1]) / 4096);
86
78
  features.forEach((feature) => {
87
- const idToUse = this.idProperty
88
- ? (feature.get(this.idProperty) as string)
89
- : null;
90
- if (idToUse != null) {
91
- feature.setId(String(idToUse));
92
- }
93
79
  const geom = feature.getGeometry() as Geometry;
94
80
  const flatCoordinates = geom.getFlatCoordinates();
95
81
  const flatCoordinatesLength = flatCoordinates.length;
@@ -112,10 +98,6 @@ class MVTTileProvider extends TileProvider {
112
98
  if (this.url) {
113
99
  config.url = this.url;
114
100
  }
115
-
116
- if (this.idProperty) {
117
- config.idProperty = this.idProperty;
118
- }
119
101
  return config as MVTTileProviderOptions;
120
102
  }
121
103
  }
@@ -0,0 +1,61 @@
1
+ import { Feature } from 'ol';
2
+ import TileProvider, { TileProviderOptions } from './tileProvider.js';
3
+
4
+ export type StaticFeatureTileProviderOptions = Omit<
5
+ TileProviderOptions,
6
+ 'baseLevels'
7
+ > & {
8
+ features: Feature[];
9
+ };
10
+
11
+ export default class StaticFeatureTileProvider extends TileProvider {
12
+ static get className(): string {
13
+ return 'StaticFeatureTileProvider';
14
+ }
15
+
16
+ static getDefaultOptions(): StaticFeatureTileProviderOptions {
17
+ return {
18
+ ...TileProvider.getDefaultOptions(),
19
+ features: [],
20
+ };
21
+ }
22
+
23
+ private _features: Feature[];
24
+
25
+ constructor(options: StaticFeatureTileProviderOptions) {
26
+ const defaultOptions = StaticFeatureTileProvider.getDefaultOptions();
27
+ super({ ...options, baseLevels: [0] });
28
+ this._features = options.features || defaultOptions.features;
29
+ }
30
+
31
+ // eslint-disable-next-line no-unused-vars
32
+ loader(
33
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
34
+ _x: number,
35
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
36
+ _y: number,
37
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
38
+ _z: number,
39
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
40
+ _headers?: Record<string, string>,
41
+ ): Promise<Feature[]> {
42
+ return Promise.resolve(this._features);
43
+ }
44
+
45
+ toJSON(): StaticFeatureTileProviderOptions {
46
+ const config: TileProviderOptions = super.toJSON();
47
+
48
+ delete config.baseLevels;
49
+ const staticFeatureConfig: StaticFeatureTileProviderOptions = {
50
+ ...structuredClone(config),
51
+ features: this._features,
52
+ };
53
+
54
+ return staticFeatureConfig;
55
+ }
56
+
57
+ destroy(): void {
58
+ this._features = [];
59
+ super.destroy();
60
+ }
61
+ }
@@ -40,7 +40,8 @@ export type TileProviderRtree = RBush<TileProviderRTreeEntry>;
40
40
  /**
41
41
  * resolutions to levels
42
42
  */
43
- export const mercatorResolutionsToLevel = new Array(25);
43
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
44
+ export const mercatorResolutionsToLevel: Array<number> = new Array(25);
44
45
  for (let i = 0; i < mercatorResolutionsToLevel.length; i++) {
45
46
  mercatorResolutionsToLevel[i] = (20037508.3427892 * 2) / 256 / 2 ** (i + 1);
46
47
  }
@@ -85,6 +86,11 @@ export type TileProviderOptions = VcsObjectOptions & {
85
86
  * allows aggregation of tiles if requested minLevel is lower than provided baseLevels ( if true, allows for aggregating up to two levels (16 child tiles) into a tile)
86
87
  */
87
88
  allowTileAggregation?: boolean;
89
+
90
+ /**
91
+ * if property exists will be used to set the ID of the feature
92
+ */
93
+ idProperty?: string;
88
94
  };
89
95
 
90
96
  export type TileLoadedEvent = {
@@ -109,6 +115,7 @@ class TileProvider extends VcsObject {
109
115
  baseLevels: [15],
110
116
  trackFeaturesToTiles: true,
111
117
  allowTileAggregation: true,
118
+ idProperty: undefined,
112
119
  };
113
120
  }
114
121
 
@@ -147,6 +154,8 @@ class TileProvider extends VcsObject {
147
154
 
148
155
  private _locale = 'en';
149
156
 
157
+ private _idProperty: string | undefined;
158
+
150
159
  constructor(options: TileProviderOptions) {
151
160
  super(options);
152
161
  const defaultOptions = TileProvider.getDefaultOptions();
@@ -176,6 +185,8 @@ class TileProvider extends VcsObject {
176
185
  options.allowTileAggregation,
177
186
  defaultOptions.allowTileAggregation,
178
187
  );
188
+
189
+ this._idProperty = options.idProperty || defaultOptions.idProperty;
179
190
  }
180
191
 
181
192
  /**
@@ -185,6 +196,10 @@ class TileProvider extends VcsObject {
185
196
  return this._tileCacheSize;
186
197
  }
187
198
 
199
+ get idProperty(): string | undefined {
200
+ return this._idProperty;
201
+ }
202
+
188
203
  get locale(): string {
189
204
  return this._locale;
190
205
  }
@@ -258,6 +273,12 @@ class TileProvider extends VcsObject {
258
273
  const rtreePromise: Promise<TileProviderRtree> = featuresPromise
259
274
  .then((features) => {
260
275
  features.forEach((feature) => {
276
+ const idToUse = this.idProperty
277
+ ? (feature.get(this.idProperty) as string)
278
+ : null;
279
+ if (idToUse != null) {
280
+ feature.setId(String(idToUse));
281
+ }
261
282
  if (!feature.getId()) {
262
283
  feature.setId(uuidv4());
263
284
  }
@@ -584,7 +605,7 @@ class TileProvider extends VcsObject {
584
605
  * return fetch.get(url)
585
606
  * .then(response => response.json())
586
607
  * .then((data) => {
587
- * const { features } = GeoJSONparseGeoJSON(data.data, { dynamicStyle: true });
608
+ * const { features } = parseGeoJSON(data.data, { dynamicStyle: true });
588
609
  * return features;
589
610
  * });
590
611
  */
@@ -625,6 +646,10 @@ class TileProvider extends VcsObject {
625
646
  config.allowTileAggregation = this.allowTileAggregation;
626
647
  }
627
648
 
649
+ if (this.idProperty) {
650
+ config.idProperty = this.idProperty;
651
+ }
652
+
628
653
  return config;
629
654
  }
630
655
 
@@ -288,7 +288,7 @@ class VectorLayer
288
288
  | DeclarativeStyleItemOptions
289
289
  | VectorStyleItemOptions
290
290
  | StyleItem,
291
- defaultStyle?: VectorStyleItem,
291
+ defaultStyle?: StyleItem,
292
292
  ): StyleItem {
293
293
  return super.getStyleOrDefaultStyle(
294
294
  styleOptions,
@@ -1,8 +1,11 @@
1
1
  import Style, { type StyleFunction } from 'ol/style/Style.js';
2
2
  import type { Feature } from 'ol/index.js';
3
3
  import type { Size } from 'ol/size.js';
4
-
5
- import { parseBoolean, parseInteger } from '@vcsuite/parsers';
4
+ import {
5
+ parseBoolean,
6
+ parseStringLiteral,
7
+ parseInteger,
8
+ } from '@vcsuite/parsers';
6
9
  import CesiumMap from '../map/cesiumMap.js';
7
10
  import VectorRasterTileCesiumImpl from './cesium/vectorRasterTileCesiumImpl.js';
8
11
  import OpenlayersMap from '../map/openlayersMap.js';
@@ -45,6 +48,7 @@ import GlobalHider from './globalHider.js';
45
48
  import Extent from '../util/extent.js';
46
49
  import VcsMap from '../map/vcsMap.js';
47
50
  import StyleItem from '../style/styleItem.js';
51
+ import VectorTileCesiumImpl from './cesium/vectorTileCesiumImpl.js';
48
52
 
49
53
  /**
50
54
  * synchronizes featureVisibility Symbols on the feature;
@@ -55,24 +59,38 @@ function synchronizeFeatureVisibility(
55
59
  feature: Feature,
56
60
  ): void {
57
61
  const featureId = feature.getId() as string | number;
62
+ let changed = false;
58
63
  if (featureVisibility.hiddenObjects[featureId]) {
59
64
  feature[hidden] = true;
65
+ changed = true;
60
66
  } else if (feature[hidden]) {
61
67
  delete feature[hidden];
68
+ changed = true;
62
69
  }
63
70
  if (featureVisibility.highlightedObjects[featureId]) {
64
71
  feature[highlighted] =
65
72
  featureVisibility.highlightedObjects[featureId].style;
73
+ changed = true;
66
74
  } else if (feature[highlighted]) {
67
75
  delete feature[highlighted];
76
+ changed = true;
68
77
  }
69
78
  if (globalHider?.hiddenObjects[featureId]) {
70
79
  feature[globalHidden] = true;
80
+ changed = true;
71
81
  } else if (feature[globalHidden]) {
72
82
  delete feature[globalHidden];
83
+ changed = true;
84
+ }
85
+
86
+ if (changed) {
87
+ feature.changed();
73
88
  }
74
89
  }
75
90
 
91
+ const vectorTileRenderers = ['image', 'primitive'] as const;
92
+ export type VectorTileRenderer = (typeof vectorTileRenderers)[number];
93
+
76
94
  export type VectorTileOptions = FeatureLayerOptions & {
77
95
  tileProvider?: TileProviderOptions | TileProvider;
78
96
  highlightStyle?: VectorStyleItemOptions | VectorStyleItem;
@@ -89,6 +107,8 @@ export type VectorTileOptions = FeatureLayerOptions & {
89
107
  * used to forward declutter option to openlayers VectorTileLayer
90
108
  */
91
109
  declutter?: boolean;
110
+ debug?: boolean;
111
+ renderer?: VectorTileRenderer;
92
112
  };
93
113
 
94
114
  export type VectorTileImplementationOptions =
@@ -99,10 +119,12 @@ export type VectorTileImplementationOptions =
99
119
  maxLevel: number;
100
120
  extent?: Extent;
101
121
  declutter: boolean;
122
+ vectorProperties: VectorProperties;
123
+ debug?: boolean;
102
124
  };
103
125
 
104
126
  export interface VectorTileImplementation extends FeatureLayerImplementation {
105
- updateTiles(tiles: string[]): void;
127
+ updateTiles(tiles: string[], featureVisibilityChange: boolean): void;
106
128
  }
107
129
 
108
130
  /**
@@ -110,7 +132,7 @@ export interface VectorTileImplementation extends FeatureLayerImplementation {
110
132
  * @group Layer
111
133
  */
112
134
  class VectorTileLayer extends FeatureLayer<
113
- VectorTileOpenlayersImpl | VectorRasterTileCesiumImpl
135
+ VectorTileOpenlayersImpl | VectorRasterTileCesiumImpl | VectorTileCesiumImpl
114
136
  > {
115
137
  static get className(): string {
116
138
  return 'VectorTileLayer';
@@ -127,6 +149,8 @@ class VectorTileLayer extends FeatureLayer<
127
149
  minLevel: undefined,
128
150
  maxLevel: undefined,
129
151
  declutter: true,
152
+ debug: false,
153
+ renderer: 'image',
130
154
  };
131
155
  }
132
156
 
@@ -160,6 +184,10 @@ class VectorTileLayer extends FeatureLayer<
160
184
  */
161
185
  private _styleZIndex = 0;
162
186
 
187
+ private _debug = false;
188
+
189
+ private _renderer: VectorTileRenderer;
190
+
163
191
  /**
164
192
  * @param options
165
193
  */
@@ -197,6 +225,12 @@ class VectorTileLayer extends FeatureLayer<
197
225
  this._maxLevel = parseInteger(options.maxLevel, defaultOptions.maxLevel);
198
226
  this._minLevel = parseInteger(options.minLevel, defaultOptions.minLevel);
199
227
  this._declutter = parseBoolean(options.declutter, defaultOptions.declutter);
228
+ this._debug = parseBoolean(options.debug, defaultOptions.debug);
229
+ this._renderer = parseStringLiteral(
230
+ options.renderer,
231
+ vectorTileRenderers,
232
+ defaultOptions.renderer,
233
+ );
200
234
  }
201
235
 
202
236
  /**
@@ -224,12 +258,16 @@ class VectorTileLayer extends FeatureLayer<
224
258
  // eslint-disable-next-line no-void
225
259
  void this.reload();
226
260
  });
227
- this.featureProvider = new TileProviderFeatureProvider(this.name, {
228
- // XXX this overwrites
229
- style: this.style,
230
- tileProvider: this.tileProvider,
231
- vectorProperties: this.vectorProperties,
232
- });
261
+
262
+ if (this._renderer === 'image') {
263
+ // primitives dont need a feature provider
264
+ this.featureProvider = new TileProviderFeatureProvider(this.name, {
265
+ // XXX this overwrites
266
+ style: this.style,
267
+ tileProvider: this.tileProvider,
268
+ vectorProperties: this.vectorProperties,
269
+ });
270
+ }
233
271
  }
234
272
  await super.initialize();
235
273
  }
@@ -306,11 +344,12 @@ class VectorTileLayer extends FeatureLayer<
306
344
  } else if (action === FeatureVisibilityAction.SHOW) {
307
345
  delete feature[hidden];
308
346
  }
347
+ feature.changed();
309
348
  }
310
349
  });
311
350
  }
312
351
  });
313
- this.updateTiles([...tileIdsChanged]);
352
+ this._updateTiles([...tileIdsChanged], true);
314
353
  }),
315
354
  ];
316
355
 
@@ -338,24 +377,32 @@ class VectorTileLayer extends FeatureLayer<
338
377
  } else if (action === FeatureVisibilityAction.SHOW) {
339
378
  delete feature[globalHidden];
340
379
  }
380
+ feature.changed();
341
381
  }
342
382
  });
343
383
  }
344
384
  });
345
- this.updateTiles([...tileIdsChanged]);
385
+ this._updateTiles([...tileIdsChanged], true);
346
386
  }),
347
387
  );
348
388
  }
349
389
  }
350
390
 
391
+ private _updateTiles(
392
+ tileIds: string[],
393
+ featureVisibilityChange?: boolean,
394
+ ): void {
395
+ this.getImplementations().forEach((impl) => {
396
+ impl.updateTiles(tileIds, !!featureVisibilityChange);
397
+ });
398
+ }
399
+
351
400
  /**
352
401
  * rerenders the specified tiles
353
402
  * rendering happens async
354
403
  */
355
404
  updateTiles(tileIds: string[]): void {
356
- this.getImplementations().forEach((impl) => {
357
- impl.updateTiles(tileIds);
358
- });
405
+ this._updateTiles(tileIds);
359
406
  }
360
407
 
361
408
  /**
@@ -388,15 +435,23 @@ class VectorTileLayer extends FeatureLayer<
388
435
  maxLevel: this._maxLevel,
389
436
  extent: this.extent ?? new Extent(),
390
437
  declutter: this._declutter,
438
+ vectorProperties: this.vectorProperties,
439
+ debug: this._debug,
391
440
  };
392
441
  }
393
442
 
394
443
  createImplementationsForMap(
395
444
  map: VcsMap,
396
- ): (VectorRasterTileCesiumImpl | VectorTileOpenlayersImpl)[] {
445
+ ): (
446
+ | VectorTileCesiumImpl
447
+ | VectorRasterTileCesiumImpl
448
+ | VectorTileOpenlayersImpl
449
+ )[] {
397
450
  if (map instanceof CesiumMap) {
398
451
  return [
399
- new VectorRasterTileCesiumImpl(map, this.getImplementationOptions()),
452
+ this._renderer === 'image'
453
+ ? new VectorRasterTileCesiumImpl(map, this.getImplementationOptions())
454
+ : new VectorTileCesiumImpl(map, this.getImplementationOptions()),
400
455
  ];
401
456
  }
402
457