@open-pioneer/map 1.4.0 → 1.5.0-dev.20260910103330

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.
package/README.md CHANGED
@@ -325,7 +325,6 @@ layerFactory.create({
325
325
  // Any properties supported by the layer type
326
326
  title: "OSM",
327
327
  id: "osm",
328
- isBaseLayer: true,
329
328
  olLayer: new TileLayer({
330
329
  source: new OSM()
331
330
  })
@@ -348,7 +347,7 @@ import OSM from "ol/source/OSM";
348
347
  export class MapConfigProviderImpl implements MapConfigProvider {
349
348
  async getMapConfig({ layerFactory }: MapConfigProviderOptions): Promise<MapConfig> {
350
349
  return {
351
- layers: [
350
+ baseLayers: [
352
351
  layerFactory.create({
353
352
  // minimal layer configuration
354
353
  type: SimpleLayer,
@@ -356,7 +355,9 @@ export class MapConfigProviderImpl implements MapConfigProvider {
356
355
  olLayer: new TileLayer({
357
356
  source: new OSM()
358
357
  })
359
- }),
358
+ })
359
+ ],
360
+ layers: [
360
361
  layerFactory.create({
361
362
  // layer configuration with optional properties
362
363
  type: SimpleLayer,
@@ -369,7 +370,6 @@ export class MapConfigProviderImpl implements MapConfigProvider {
369
370
  foo: "bar"
370
371
  },
371
372
  description: "additional description",
372
- isBaseLayer: false,
373
373
  visible: false
374
374
  })
375
375
  ]
@@ -442,7 +442,6 @@ export class MapConfigProviderImpl implements MapConfigProvider {
442
442
  // check layer availability by requesting the provided URL
443
443
  healthCheck:
444
444
  "https://sgx.geodatenzentrum.de/wmts_topplus_open/1.0.0/WMTSCapabilities.xml",
445
- isBaseLayer: false,
446
445
  visible: true
447
446
  }),
448
447
  layerFactory.create({
@@ -461,7 +460,6 @@ export class MapConfigProviderImpl implements MapConfigProvider {
461
460
  await wait(3000);
462
461
  return "error";
463
462
  },
464
- isBaseLayer: false,
465
463
  visible: false
466
464
  })
467
465
  ]
@@ -604,12 +602,11 @@ export class MapConfigProviderImpl implements MapConfigProvider {
604
602
  zoom: 14
605
603
  },
606
604
  projection: "EPSG:31466",
607
- layers: [
605
+ baseLayers: [
608
606
  layerFactory.create({
609
607
  type: SimpleLayer,
610
608
  id: "topplus_open",
611
609
  title: "TopPlus Open",
612
- isBaseLayer: true,
613
610
  visible: true,
614
611
  olLayer: new TileLayer({
615
612
  source: createWMTSSource("web")
@@ -3,7 +3,7 @@ import OlSource from "ol/source/Source";
3
3
  import { MapModel } from "../model/MapModel";
4
4
  import { InternalConstructorTag } from "../utils/InternalConstructorTag";
5
5
  import { AbstractLayerBase } from "./AbstractLayerBase";
6
- import { ATTACH_TO_MAP, GET_DEPS, LayerDependencies, SET_METADATA_LOAD_INFO, SET_VISIBLE } from "./shared/internals";
6
+ import { ATTACH_TO_MAP, DECLARED_AS_BASE_LAYER, GET_DEPS, LayerDependencies, SET_METADATA_LOAD_INFO, SET_VISIBLE } from "./shared/internals";
7
7
  import { SimpleLayerConfig } from "./SimpleLayer";
8
8
  import { LayerTypes } from "./unions";
9
9
  /**
@@ -124,4 +124,9 @@ export declare abstract class AbstractLayer extends AbstractLayerBase {
124
124
  [SET_VISIBLE](newVisibility: boolean): void;
125
125
  /** @internal */
126
126
  [GET_DEPS](): LayerDependencies;
127
+ /**
128
+ * Always returns original, configured `isBaseLayer` value from LayerConfig instead of computed value from `get isBaseLayer()`
129
+ *
130
+ * @internal */
131
+ get [DECLARED_AS_BASE_LAYER](): boolean | undefined;
127
132
  }
@@ -4,7 +4,7 @@ import OlLayer from 'ol/layer/Layer.js';
4
4
  import { unByKey } from 'ol/Observable.js';
5
5
  import { sourceId } from '../_virtual/source-info.js';
6
6
  import { AbstractLayerBase } from './AbstractLayerBase.js';
7
- import { getLayerDependencies, SET_VISIBLE, ATTACH_TO_MAP, SET_METADATA_LOAD_INFO, GET_DEPS, LAYER_DEPS } from './shared/internals.js';
7
+ import { getLayerDependencies, SET_VISIBLE, ATTACH_TO_MAP, SET_METADATA_LOAD_INFO, GET_DEPS, LAYER_DEPS, DECLARED_AS_BASE_LAYER } from './shared/internals.js';
8
8
 
9
9
  const LOG = createLogger(sourceId);
10
10
  class AbstractLayer extends AbstractLayerBase {
@@ -14,8 +14,10 @@ class AbstractLayer extends AbstractLayerBase {
14
14
  #deps;
15
15
  #olLayer;
16
16
  #olSource;
17
- #isBaseLayer;
17
+ #declaredAsBaseLayer;
18
+ //original value from LayerConfig, only used internally
18
19
  #healthCheck;
20
+ #isBaseLayer;
19
21
  #visible;
20
22
  #minResolution;
21
23
  #maxResolution;
@@ -35,8 +37,13 @@ class AbstractLayer extends AbstractLayerBase {
35
37
  this.#deps = getLayerDependencies(deps, internalTag);
36
38
  this.#olLayer = config.olLayer;
37
39
  this.#olSource = synchronizedOlSource(this.#olLayer);
38
- this.#isBaseLayer = config.isBaseLayer ?? false;
40
+ this.#declaredAsBaseLayer = config.isBaseLayer;
39
41
  this.#healthCheck = config.healthCheck;
42
+ this.#isBaseLayer = computed(() => {
43
+ const effective = this.nullableMap?.layers.getBaseLayers().includes(this);
44
+ const declared = this.#declaredAsBaseLayer;
45
+ return effective || declared || false;
46
+ });
40
47
  this.#visible = synchronized(
41
48
  () => this.#olLayer.getVisible(),
42
49
  (cb) => {
@@ -149,7 +156,7 @@ class AbstractLayer extends AbstractLayerBase {
149
156
  * Only one base layer can be visible at a time.
150
157
  */
151
158
  get isBaseLayer() {
152
- return this.#isBaseLayer;
159
+ return this.#isBaseLayer.value;
153
160
  }
154
161
  /**
155
162
  * The combined load state of a layer.
@@ -275,6 +282,13 @@ class AbstractLayer extends AbstractLayerBase {
275
282
  + "Use the LayerFactory to create an instance or add the layer to the map first.`
276
283
  );
277
284
  }
285
+ /**
286
+ * Always returns original, configured `isBaseLayer` value from LayerConfig instead of computed value from `get isBaseLayer()`
287
+ *
288
+ * @internal */
289
+ get [DECLARED_AS_BASE_LAYER]() {
290
+ return this.#declaredAsBaseLayer;
291
+ }
278
292
  }
279
293
  async function doHealthCheck(layer, healthCheck) {
280
294
  if (healthCheck == null) {
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractLayer.js","sources":["AbstractLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n computed,\n constant,\n reactive,\n Reactive,\n ReadonlyReactive,\n synchronized\n} from \"@conterra/reactivity-core\";\nimport { createLogger } from \"@open-pioneer/core\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport OlLayer from \"ol/layer/Layer\";\nimport { unByKey } from \"ol/Observable\";\nimport OlSource from \"ol/source/Source\";\nimport { sourceId } from \"open-pioneer:source-info\";\nimport { MapModel } from \"../model/MapModel\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AbstractLayerBase } from \"./AbstractLayerBase\";\nimport {\n ATTACH_TO_MAP,\n GET_DEPS,\n getLayerDependencies,\n LAYER_DEPS,\n LayerDependencies,\n SET_METADATA_LOAD_INFO,\n SET_VISIBLE\n} from \"./shared/internals\";\nimport { HealthCheckFunction, LayerConfig } from \"./shared/LayerConfig\";\n// oxlint-disable-next-line @typescript-eslint/no-unused-vars\nimport { SimpleLayer, SimpleLayerConfig } from \"./SimpleLayer\";\nimport { Layer, LayerTypes } from \"./unions\";\n\nconst LOG = createLogger(sourceId);\n\n/**\n * The load state of a layer.\n *\n * @group Layer Utilities\n **/\nexport type LayerLoadState = \"not-loaded\" | \"loading\" | \"loaded\" | \"error\";\n\n/**\n * Load state of a single layer, bundling the state with its error.\n *\n * @internal\n */\nexport type LayerLoadInfo = \"not-loaded\" | \"loading\" | \"loaded\" | { kind: \"error\"; error: Error };\n\n/**\n * Represents an operational layer in the map.\n *\n * These layers always have an associated OpenLayers layer.\n *\n * Instances of this interface cannot be constructed directly; use a real layer\n * class such as {@link SimpleLayer} instead.\n *\n * @group Layers\n */\nexport abstract class AbstractLayer extends AbstractLayerBase {\n // Layer dependencies are present when the LayerFactory API was used to construct the layer.\n // They may currently be undefined for compatibility reasons (in which case they will be used\n // from the map, once connected).\n #deps: LayerDependencies | undefined;\n #olLayer: OlBaseLayer;\n #olSource: ReadonlyReactive<OlSource | undefined>;\n #isBaseLayer: boolean;\n #healthCheck?: string | HealthCheckFunction;\n\n #visible: ReadonlyReactive<boolean>;\n #minResolution: ReadonlyReactive<number>;\n #maxResolution: ReadonlyReactive<number>;\n #minZoom: ReadonlyReactive<number>;\n #maxZoom: ReadonlyReactive<number>;\n\n #sourceState: ReadonlyReactive<ReadonlyReactive<LayerLoadState> | undefined>;\n #sourceInfo: ReadonlyReactive<LayerLoadInfo>;\n #healthInfo: Reactive<LayerLoadInfo>;\n #healthCheckStarted = false;\n #metadataInfo: Reactive<LayerLoadInfo>;\n #loadInfo = computed(() =>\n combineLoadInfos(this.#sourceInfo.value, this.#healthInfo.value, this.#metadataInfo.value)\n );\n #visibleInScale: ReadonlyReactive<boolean>;\n\n constructor(\n config: SimpleLayerConfig & {\n /** The initial load state (default: not-loaded). */\n initialLoadInfo?: LayerLoadInfo;\n },\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n super(config);\n this.#deps = getLayerDependencies(deps, internalTag);\n this.#olLayer = config.olLayer;\n this.#olSource = synchronizedOlSource(this.#olLayer);\n this.#isBaseLayer = config.isBaseLayer ?? false;\n this.#healthCheck = config.healthCheck;\n this.#visible = synchronized(\n () => this.#olLayer.getVisible(),\n (cb) => {\n const key = this.#olLayer.on(\"change:visible\", cb);\n return () => unByKey(key);\n }\n );\n this.#minResolution = synchronized(\n () => this.#olLayer.getMinResolution(),\n (cb) => {\n const key = this.#olLayer.on(\"change:minResolution\", cb);\n return () => unByKey(key);\n }\n );\n this.#maxResolution = synchronized(\n () => this.#olLayer.getMaxResolution(),\n (cb) => {\n const key = this.#olLayer.on(\"change:maxResolution\", cb);\n return () => unByKey(key);\n }\n );\n this.#minZoom = synchronized(\n () => this.#olLayer.getMinZoom(),\n (cb) => {\n const key = this.#olLayer.on(\"change:minZoom\", cb);\n return () => unByKey(key);\n }\n );\n this.#maxZoom = synchronized(\n () => this.#olLayer.getMaxZoom(),\n (cb) => {\n const key = this.#olLayer.on(\"change:maxZoom\", cb);\n return () => unByKey(key);\n }\n );\n this.#sourceState = computed(() => {\n const olSource = this.olSource;\n if (!olSource) {\n return undefined;\n }\n\n return synchronized(\n () => getSourceState(olSource),\n (cb) => {\n const key = olSource.on(\"change\", cb);\n return () => unByKey(key);\n }\n );\n });\n this.#sourceInfo = computed(() => makeSourceInfo(this.id, this.#sourceState.value?.value));\n this.#healthInfo = reactive<LayerLoadInfo>(\"not-loaded\");\n this.#metadataInfo = reactive<LayerLoadInfo>(config.initialLoadInfo ?? \"not-loaded\");\n\n this[SET_VISIBLE](config.visible ?? true); // apply initial visibility\n\n this.#visibleInScale = computed(() => {\n const map = this.nullableMap; // handle case where not in the map yet\n if (!map) {\n return true; // or false? doesn't really matter\n }\n\n const zoom = map.zoomLevel;\n const resolution = map.resolution;\n if (zoom == null || resolution == null) {\n return false;\n }\n\n const parent = this.parent;\n if (parent && parent.type === \"group\" && !parent.visibleInScale) {\n return false;\n }\n\n if (resolution < this.minResolution || resolution >= this.maxResolution) {\n return false;\n }\n\n return zoom > this.minZoom && zoom <= this.maxZoom;\n });\n\n if (config.maxResolution) {\n this.#olLayer.setMaxResolution(config.maxResolution);\n }\n if (config.minResolution) {\n this.#olLayer.setMinResolution(config.minResolution);\n }\n\n if (config.maxZoom) {\n this.#olLayer.setMaxZoom(config.maxZoom);\n }\n if (config.minZoom) {\n this.#olLayer.setMinZoom(config.minZoom);\n }\n }\n\n override destroy() {\n if (this.isDestroyed) {\n return;\n }\n\n this.olLayer.dispose();\n super.destroy();\n }\n\n /**\n * Identifies the type of this layer.\n */\n abstract override readonly type: LayerTypes;\n\n override get visible(): boolean {\n return this.#visible.value;\n }\n\n /**\n * The raw OpenLayers layer.\n */\n get olLayer(): OlBaseLayer {\n return this.#olLayer;\n }\n\n /**\n * The current source of the {@link olLayer}.\n */\n get olSource(): OlSource | undefined {\n return this.#olSource.value;\n }\n\n /**\n * True if this layer is a base layer.\n *\n * Only one base layer can be visible at a time.\n */\n get isBaseLayer(): boolean {\n return this.#isBaseLayer;\n }\n\n /**\n * The combined load state of a layer.\n *\n * Aggregates the OpenLayers source state, health check and metadata state.\n * Priority for the state: `error` > `loading` > `not-loaded` > `loaded`.\n */\n get loadState(): LayerLoadState {\n return loadInfoState(this.#loadInfo.value);\n }\n\n /**\n * The error (if any) that prevented this layer from loading.\n *\n * Combines errors from the OpenLayers source, the health check and the\n * metadata request (health > metadata > source).\n */\n get loadError(): Error | undefined {\n return errorOf(this.#loadInfo.value);\n }\n\n /**\n * The minimum resolution (inclusive) at which this layer will be visible.\n */\n get minResolution() {\n return this.#minResolution.value;\n }\n\n /**\n * The maximum resolution (exclusive) below which this layer will be visible.\n */\n get maxResolution() {\n return this.#maxResolution.value;\n }\n\n /**\n * The minimum view zoom level (exclusive) above which this layer will be visible.\n */\n get minZoom() {\n return this.#minZoom.value;\n }\n\n /**\n * The maximum view zoom level (inclusive) at which this layer will be visible.\n */\n get maxZoom() {\n return this.#maxZoom.value;\n }\n\n /**\n * Whether the layer is visible in the current map scale or not.\n */\n get visibleInScale(): boolean {\n return this.#visibleInScale.value;\n }\n\n /**\n * The minimum resolution (inclusive) at which this layer will be visible.\n */\n setMinResolution(value: number): void {\n this.#olLayer.setMinResolution(value);\n }\n\n /**\n * The maximum resolution (exclusive) below which this layer will be visible.\n */\n setMaxResolution(value: number): void {\n this.#olLayer.setMaxResolution(value);\n }\n\n /**\n * The minimum view zoom level (exclusive) above which this layer will be visible.\n */\n setMinZoom(value: number): void {\n this.#olLayer.setMinZoom(value);\n }\n\n /**\n * The maximum view zoom level (inclusive) at which this layer will be visible.\n */\n setMaxZoom(value: number): void {\n this.#olLayer.setMaxZoom(value);\n }\n\n /**\n * Called by the map model when the layer is added to the map.\n *\n * @internal\n */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n\n // Custom health check is not needed when OpenLayers already reports an error state.\n if (!this.#healthCheckStarted && errorOf(this.#sourceInfo.value) == null) {\n this.#healthCheckStarted = true;\n doHealthCheck(this, this.#healthCheck).then((loadInfo) => {\n this.#healthInfo.value = loadInfo;\n });\n }\n }\n\n /**\n * Updates the load state of the layer's metadata request.\n *\n * @internal\n */\n [SET_METADATA_LOAD_INFO](loadInfo: LayerLoadInfo): void {\n this.#metadataInfo.value = loadInfo;\n }\n\n override setVisible(newVisibility: boolean): void {\n if (this.isBaseLayer) {\n LOG.warn(\n `Cannot change visibility of base layer '${this.id}': use activateBaseLayer() on the map's LayerCollection instead.`\n );\n return;\n }\n\n this[SET_VISIBLE](newVisibility);\n }\n\n /** @internal */\n [SET_VISIBLE](newVisibility: boolean): void {\n if (this.#olLayer.getVisible() !== newVisibility) {\n this.#olLayer.setVisible(newVisibility);\n }\n }\n\n /** @internal */\n [GET_DEPS](): LayerDependencies {\n const deps = this.#deps;\n if (deps) {\n return deps;\n }\n\n const map = this.nullableMap;\n if (map) {\n return map[LAYER_DEPS];\n }\n throw new Error(\n `Layer '${this.id}' has not been attached to a map yet. \"\n + \"Use the LayerFactory to create an instance or add the layer to the map first.`\n );\n }\n}\n\nasync function doHealthCheck(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"]\n): Promise<LayerLoadInfo> {\n if (healthCheck == null) {\n return \"loaded\";\n }\n\n let healthCheckFn: HealthCheckFunction;\n if (typeof healthCheck === \"function\") {\n healthCheckFn = healthCheck;\n } else if (typeof healthCheck === \"string\") {\n healthCheckFn = async () => {\n const httpService = layer[GET_DEPS]().httpService;\n const response = await httpService.fetch(healthCheck);\n if (response.ok) {\n return \"loaded\";\n }\n LOG.warn(\n `Health check failed for layer '${layer.id}' (http status ${response.status})`\n );\n return \"error\";\n };\n } else {\n LOG.error(\n `Unexpected object for 'healthCheck' parameter of layer '${layer.id}'`,\n healthCheck\n );\n return {\n kind: \"error\",\n error: new Error(`Invalid 'healthCheck' configuration for layer '${layer.id}'`)\n };\n }\n\n try {\n const state = await healthCheckFn(layer as Layer);\n if (state === \"error\") {\n return {\n kind: \"error\",\n error: new Error(`Health check failed for layer '${layer.id}'`)\n };\n }\n return state;\n } catch (e) {\n LOG.warn(`Health check failed for layer '${layer.id}'`, e);\n return {\n kind: \"error\",\n error: e instanceof Error ? e : new Error(String(e))\n };\n }\n}\n\nconst LOAD_STATE_SEVERITY: Record<LayerLoadState, number> = {\n \"not-loaded\": 0,\n loaded: 1,\n loading: 2,\n error: 3\n};\n\n/** Returns the higher severity of two load states: error > loading > not-loaded > loaded. */\nfunction higherSeverity(a: LayerLoadState, b: LayerLoadState): LayerLoadState {\n return LOAD_STATE_SEVERITY[a] >= LOAD_STATE_SEVERITY[b] ? a : b;\n}\n\nfunction combineLoadInfos(\n source: LayerLoadInfo,\n health: LayerLoadInfo,\n metadata: LayerLoadInfo\n): LayerLoadInfo {\n // If several channels are in error, report the most relevant one (health > metadata > source).\n const error = errorOf(health) ?? errorOf(metadata) ?? errorOf(source);\n if (error) {\n return { kind: \"error\", error };\n }\n return higherSeverity(loadInfoState(source), loadInfoState(metadata)) as LayerLoadInfo;\n}\n\nfunction errorOf(info: LayerLoadInfo): Error | undefined {\n return typeof info === \"object\" ? info.error : undefined;\n}\n\nfunction loadInfoState(info: LayerLoadInfo): LayerLoadState {\n return typeof info === \"object\" ? \"error\" : info;\n}\n\n// OpenLayers sources carry no error detail, so synthesize one.\nfunction makeSourceInfo(id: string, state: LayerLoadState | undefined): LayerLoadInfo {\n if (state == null) {\n // no state -> no source -> just pretend its loaded\n return \"loaded\";\n }\n if (state === \"error\") {\n return {\n kind: \"error\",\n error: new Error(`Source of layer '${id}' is in error state`)\n };\n }\n return state;\n}\n\nfunction synchronizedOlSource(layer: OlBaseLayer): ReadonlyReactive<OlSource | undefined> {\n if (!(layer instanceof OlLayer)) {\n // GroupLayer etc.\n return constant(undefined);\n }\n\n return synchronized(\n () => layer.getSource() ?? undefined,\n (cb) => {\n const key = layer.on(\"change:source\", cb);\n return () => unByKey(key);\n }\n );\n}\n\nfunction getSourceState(olSource: OlSource) {\n const state = olSource.getState();\n switch (state) {\n case undefined:\n return \"loaded\";\n case \"undefined\":\n return \"not-loaded\";\n case \"loading\":\n return \"loading\";\n case \"ready\":\n return \"loaded\";\n case \"error\":\n return \"error\";\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAkCA,MAAM,GAAA,GAAM,aAAa,QAAQ,CAAA;AA0B1B,MAAe,sBAAsB,iBAAA,CAAkB;AAAA;AAAA;AAAA;AAAA,EAI1D,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EAEA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EAEA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,mBAAA,GAAsB,KAAA;AAAA,EACtB,aAAA;AAAA,EACA,SAAA,GAAY,QAAA;AAAA,IAAS,MACjB,gBAAA,CAAiB,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,KAAK,WAAA,CAAY,KAAA,EAAO,IAAA,CAAK,aAAA,CAAc,KAAK;AAAA,GAC7F;AAAA,EACA,eAAA;AAAA,EAEA,WAAA,CACI,MAAA,EAIA,IAAA,EACA,WAAA,EACF;AACE,IAAA,KAAA,CAAM,MAAM,CAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,oBAAA,CAAqB,IAAA,EAAM,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,oBAAA,CAAqB,IAAA,CAAK,QAAQ,CAAA;AACnD,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,WAAA,IAAe,KAAA;AAC1C,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,WAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA;AAAA,MACZ,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW;AAAA,MAC/B,CAAC,EAAA,KAAO;AACJ,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,kBAAkB,EAAE,CAAA;AACjD,QAAA,OAAO,MAAM,QAAQ,GAAG,CAAA;AAAA,MAC5B;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAA;AAAA,MAClB,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,EAAiB;AAAA,MACrC,CAAC,EAAA,KAAO;AACJ,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAwB,EAAE,CAAA;AACvD,QAAA,OAAO,MAAM,QAAQ,GAAG,CAAA;AAAA,MAC5B;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAA;AAAA,MAClB,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,EAAiB;AAAA,MACrC,CAAC,EAAA,KAAO;AACJ,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,wBAAwB,EAAE,CAAA;AACvD,QAAA,OAAO,MAAM,QAAQ,GAAG,CAAA;AAAA,MAC5B;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA;AAAA,MACZ,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW;AAAA,MAC/B,CAAC,EAAA,KAAO;AACJ,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,kBAAkB,EAAE,CAAA;AACjD,QAAA,OAAO,MAAM,QAAQ,GAAG,CAAA;AAAA,MAC5B;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,YAAA;AAAA,MACZ,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW;AAAA,MAC/B,CAAC,EAAA,KAAO;AACJ,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,kBAAkB,EAAE,CAAA;AACjD,QAAA,OAAO,MAAM,QAAQ,GAAG,CAAA;AAAA,MAC5B;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,SAAS,MAAM;AAC/B,MAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,MAAA,IAAI,CAAC,QAAA,EAAU;AACX,QAAA,OAAO,MAAA;AAAA,MACX;AAEA,MAAA,OAAO,YAAA;AAAA,QACH,MAAM,eAAe,QAAQ,CAAA;AAAA,QAC7B,CAAC,EAAA,KAAO;AACJ,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,EAAE,CAAA;AACpC,UAAA,OAAO,MAAM,QAAQ,GAAG,CAAA;AAAA,QAC5B;AAAA,OACJ;AAAA,IACJ,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,MAAM,cAAA,CAAe,IAAA,CAAK,IAAI,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,KAAK,CAAC,CAAA;AACzF,IAAA,IAAA,CAAK,WAAA,GAAc,SAAwB,YAAY,CAAA;AACvD,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA,CAAwB,MAAA,CAAO,eAAA,IAAmB,YAAY,CAAA;AAEnF,IAAA,IAAA,CAAK,WAAW,CAAA,CAAE,MAAA,CAAO,OAAA,IAAW,IAAI,CAAA;AAExC,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAS,MAAM;AAClC,MAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,MAAA,IAAI,CAAC,GAAA,EAAK;AACN,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,MAAM,OAAO,GAAA,CAAI,SAAA;AACjB,MAAA,MAAM,aAAa,GAAA,CAAI,UAAA;AACvB,MAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,UAAA,IAAc,IAAA,EAAM;AACpC,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,IAAI,UAAU,MAAA,CAAO,IAAA,KAAS,OAAA,IAAW,CAAC,OAAO,cAAA,EAAgB;AAC7D,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,IAAI,UAAA,GAAa,IAAA,CAAK,aAAA,IAAiB,UAAA,IAAc,KAAK,aAAA,EAAe;AACrE,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,OAAO,IAAA,GAAO,IAAA,CAAK,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,OAAA;AAAA,IAC/C,CAAC,CAAA;AAED,IAAA,IAAI,OAAO,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,MAAA,CAAO,aAAa,CAAA;AAAA,IACvD;AACA,IAAA,IAAI,OAAO,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,MAAA,CAAO,aAAa,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IAC3C;AAAA,EACJ;AAAA,EAES,OAAA,GAAU;AACf,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AACrB,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAClB;AAAA,EAOA,IAAa,OAAA,GAAmB;AAC5B,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAiC;AACjC,IAAA,OAAO,KAAK,SAAA,CAAU,KAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,WAAA,GAAuB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAA,GAA4B;AAC5B,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAA,GAA+B;AAC/B,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAAgB;AAChB,IAAA,OAAO,KAAK,cAAA,CAAe,KAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,aAAA,GAAgB;AAChB,IAAA,OAAO,KAAK,cAAA,CAAe,KAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAU;AACV,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAU;AACV,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAA,GAA0B;AAC1B,IAAA,OAAO,KAAK,eAAA,CAAgB,KAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,KAAA,EAAqB;AAClC,IAAA,IAAA,CAAK,QAAA,CAAS,iBAAiB,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,KAAA,EAAqB;AAClC,IAAA,IAAA,CAAK,QAAA,CAAS,iBAAiB,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAU,aAAa,CAAA,CAAE,GAAA,EAAqB;AAC1C,IAAA,KAAA,CAAM,aAAa,EAAE,GAAG,CAAA;AAGxB,IAAA,IAAI,CAAC,KAAK,mBAAA,IAAuB,OAAA,CAAQ,KAAK,WAAA,CAAY,KAAK,KAAK,IAAA,EAAM;AACtE,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,aAAA,CAAc,MAAM,IAAA,CAAK,YAAY,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,KAAa;AACtD,QAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,QAAA;AAAA,MAC7B,CAAC,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,CAAC,sBAAsB,CAAA,CAAE,QAAA,EAA+B;AACpD,IAAA,IAAA,CAAK,cAAc,KAAA,GAAQ,QAAA;AAAA,EAC/B;AAAA,EAES,WAAW,aAAA,EAA8B;AAC9C,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,GAAA,CAAI,IAAA;AAAA,QACA,CAAA,wCAAA,EAA2C,KAAK,EAAE,CAAA,gEAAA;AAAA,OACtD;AACA,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAW,EAAE,aAAa,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,CAAC,WAAW,CAAA,CAAE,aAAA,EAA8B;AACxC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW,KAAM,aAAA,EAAe;AAC9C,MAAA,IAAA,CAAK,QAAA,CAAS,WAAW,aAAa,CAAA;AAAA,IAC1C;AAAA,EACJ;AAAA;AAAA,EAGA,CAAC,QAAQ,CAAA,GAAuB;AAC5B,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AACjB,IAAA,IAAI,GAAA,EAAK;AACL,MAAA,OAAO,IAAI,UAAU,CAAA;AAAA,IACzB;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACN,CAAA,OAAA,EAAU,KAAK,EAAE,CAAA;AAAA,4FAAA;AAAA,KAErB;AAAA,EACJ;AACJ;AAEA,eAAe,aAAA,CACX,OACA,WAAA,EACsB;AACtB,EAAA,IAAI,eAAe,IAAA,EAAM;AACrB,IAAA,OAAO,QAAA;AAAA,EACX;AAEA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACnC,IAAA,aAAA,GAAgB,WAAA;AAAA,EACpB,CAAA,MAAA,IAAW,OAAO,WAAA,KAAgB,QAAA,EAAU;AACxC,IAAA,aAAA,GAAgB,YAAY;AACxB,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,QAAQ,CAAA,EAAE,CAAE,WAAA;AACtC,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,KAAA,CAAM,WAAW,CAAA;AACpD,MAAA,IAAI,SAAS,EAAA,EAAI;AACb,QAAA,OAAO,QAAA;AAAA,MACX;AACA,MAAA,GAAA,CAAI,IAAA;AAAA,QACA,CAAA,+BAAA,EAAkC,KAAA,CAAM,EAAE,CAAA,eAAA,EAAkB,SAAS,MAAM,CAAA,CAAA;AAAA,OAC/E;AACA,MAAA,OAAO,OAAA;AAAA,IACX,CAAA;AAAA,EACJ,CAAA,MAAO;AACH,IAAA,GAAA,CAAI,KAAA;AAAA,MACA,CAAA,wDAAA,EAA2D,MAAM,EAAE,CAAA,CAAA,CAAA;AAAA,MACnE;AAAA,KACJ;AACA,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,KAAA,CAAM,EAAE,CAAA,CAAA,CAAG;AAAA,KAClF;AAAA,EACJ;AAEA,EAAA,IAAI;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,KAAc,CAAA;AAChD,IAAA,IAAI,UAAU,OAAA,EAAS;AACnB,MAAA,OAAO;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,OAAO,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAA,CAAM,EAAE,CAAA,CAAA,CAAG;AAAA,OAClE;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX,SAAS,CAAA,EAAG;AACR,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,+BAAA,EAAkC,KAAA,CAAM,EAAE,KAAK,CAAC,CAAA;AACzD,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,aAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC;AAAA,KACvD;AAAA,EACJ;AACJ;AAEA,MAAM,mBAAA,GAAsD;AAAA,EACxD,YAAA,EAAc,CAAA;AAAA,EACd,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO;AACX,CAAA;AAGA,SAAS,cAAA,CAAe,GAAmB,CAAA,EAAmC;AAC1E,EAAA,OAAO,oBAAoB,CAAC,CAAA,IAAK,mBAAA,CAAoB,CAAC,IAAI,CAAA,GAAI,CAAA;AAClE;AAEA,SAAS,gBAAA,CACL,MAAA,EACA,MAAA,EACA,QAAA,EACa;AAEb,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM,CAAA,IAAK,QAAQ,QAAQ,CAAA,IAAK,QAAQ,MAAM,CAAA;AACpE,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAAA,EAClC;AACA,EAAA,OAAO,eAAe,aAAA,CAAc,MAAM,CAAA,EAAG,aAAA,CAAc,QAAQ,CAAC,CAAA;AACxE;AAEA,SAAS,QAAQ,IAAA,EAAwC;AACrD,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,MAAA;AACnD;AAEA,SAAS,cAAc,IAAA,EAAqC;AACxD,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,OAAA,GAAU,IAAA;AAChD;AAGA,SAAS,cAAA,CAAe,IAAY,KAAA,EAAkD;AAClF,EAAA,IAAI,SAAS,IAAA,EAAM;AAEf,IAAA,OAAO,QAAA;AAAA,EACX;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,EAAE,CAAA,mBAAA,CAAqB;AAAA,KAChE;AAAA,EACJ;AACA,EAAA,OAAO,KAAA;AACX;AAEA,SAAS,qBAAqB,KAAA,EAA4D;AACtF,EAAA,IAAI,EAAE,iBAAiB,OAAA,CAAA,EAAU;AAE7B,IAAA,OAAO,SAAS,MAAS,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,YAAA;AAAA,IACH,MAAM,KAAA,CAAM,SAAA,EAAU,IAAK,MAAA;AAAA,IAC3B,CAAC,EAAA,KAAO;AACJ,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,CAAG,eAAA,EAAiB,EAAE,CAAA;AACxC,MAAA,OAAO,MAAM,QAAQ,GAAG,CAAA;AAAA,IAC5B;AAAA,GACJ;AACJ;AAEA,SAAS,eAAe,QAAA,EAAoB;AACxC,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAA,EAAS;AAChC,EAAA,QAAQ,KAAA;AAAO,IACX,KAAK,MAAA;AACD,MAAA,OAAO,QAAA;AAAA,IACX,KAAK,WAAA;AACD,MAAA,OAAO,YAAA;AAAA,IACX,KAAK,SAAA;AACD,MAAA,OAAO,SAAA;AAAA,IACX,KAAK,OAAA;AACD,MAAA,OAAO,QAAA;AAAA,IACX,KAAK,OAAA;AACD,MAAA,OAAO,OAAA;AAAA;AAEnB;;;;"}
1
+ {"version":3,"file":"AbstractLayer.js","sources":["AbstractLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n computed,\n constant,\n reactive,\n Reactive,\n ReadonlyReactive,\n synchronized\n} from \"@conterra/reactivity-core\";\nimport { createLogger } from \"@open-pioneer/core\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport OlLayer from \"ol/layer/Layer\";\nimport { unByKey } from \"ol/Observable\";\nimport OlSource from \"ol/source/Source\";\nimport { sourceId } from \"open-pioneer:source-info\";\nimport { MapModel } from \"../model/MapModel\";\nimport { InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AbstractLayerBase } from \"./AbstractLayerBase\";\nimport {\n ATTACH_TO_MAP,\n DECLARED_AS_BASE_LAYER,\n GET_DEPS,\n getLayerDependencies,\n LAYER_DEPS,\n LayerDependencies,\n SET_METADATA_LOAD_INFO,\n SET_VISIBLE\n} from \"./shared/internals\";\nimport { HealthCheckFunction, LayerConfig } from \"./shared/LayerConfig\";\n// oxlint-disable-next-line @typescript-eslint/no-unused-vars\nimport { SimpleLayer, SimpleLayerConfig } from \"./SimpleLayer\";\nimport { Layer, LayerTypes } from \"./unions\";\n\nconst LOG = createLogger(sourceId);\n\n/**\n * The load state of a layer.\n *\n * @group Layer Utilities\n **/\nexport type LayerLoadState = \"not-loaded\" | \"loading\" | \"loaded\" | \"error\";\n\n/**\n * Load state of a single layer, bundling the state with its error.\n *\n * @internal\n */\nexport type LayerLoadInfo = \"not-loaded\" | \"loading\" | \"loaded\" | { kind: \"error\"; error: Error };\n\n/**\n * Represents an operational layer in the map.\n *\n * These layers always have an associated OpenLayers layer.\n *\n * Instances of this interface cannot be constructed directly; use a real layer\n * class such as {@link SimpleLayer} instead.\n *\n * @group Layers\n */\nexport abstract class AbstractLayer extends AbstractLayerBase {\n // Layer dependencies are present when the LayerFactory API was used to construct the layer.\n // They may currently be undefined for compatibility reasons (in which case they will be used\n // from the map, once connected).\n #deps: LayerDependencies | undefined;\n #olLayer: OlBaseLayer;\n #olSource: ReadonlyReactive<OlSource | undefined>;\n #declaredAsBaseLayer: boolean | undefined; //original value from LayerConfig, only used internally\n #healthCheck?: string | HealthCheckFunction;\n\n #isBaseLayer: ReadonlyReactive<boolean>;\n #visible: ReadonlyReactive<boolean>;\n #minResolution: ReadonlyReactive<number>;\n #maxResolution: ReadonlyReactive<number>;\n #minZoom: ReadonlyReactive<number>;\n #maxZoom: ReadonlyReactive<number>;\n\n #sourceState: ReadonlyReactive<ReadonlyReactive<LayerLoadState> | undefined>;\n #sourceInfo: ReadonlyReactive<LayerLoadInfo>;\n #healthInfo: Reactive<LayerLoadInfo>;\n #healthCheckStarted = false;\n #metadataInfo: Reactive<LayerLoadInfo>;\n #loadInfo = computed(() =>\n combineLoadInfos(this.#sourceInfo.value, this.#healthInfo.value, this.#metadataInfo.value)\n );\n #visibleInScale: ReadonlyReactive<boolean>;\n\n constructor(\n config: SimpleLayerConfig & {\n /** The initial load state (default: not-loaded). */\n initialLoadInfo?: LayerLoadInfo;\n },\n deps?: LayerDependencies,\n internalTag?: InternalConstructorTag\n ) {\n super(config);\n this.#deps = getLayerDependencies(deps, internalTag);\n this.#olLayer = config.olLayer;\n this.#olSource = synchronizedOlSource(this.#olLayer);\n this.#declaredAsBaseLayer = config.isBaseLayer;\n this.#healthCheck = config.healthCheck;\n this.#isBaseLayer = computed(() => {\n const effective = this.nullableMap?.layers.getBaseLayers().includes(this as Layer);\n const declared = this.#declaredAsBaseLayer; // <-- Legacy\n return effective || declared || false;\n });\n this.#visible = synchronized(\n () => this.#olLayer.getVisible(),\n (cb) => {\n const key = this.#olLayer.on(\"change:visible\", cb);\n return () => unByKey(key);\n }\n );\n this.#minResolution = synchronized(\n () => this.#olLayer.getMinResolution(),\n (cb) => {\n const key = this.#olLayer.on(\"change:minResolution\", cb);\n return () => unByKey(key);\n }\n );\n this.#maxResolution = synchronized(\n () => this.#olLayer.getMaxResolution(),\n (cb) => {\n const key = this.#olLayer.on(\"change:maxResolution\", cb);\n return () => unByKey(key);\n }\n );\n this.#minZoom = synchronized(\n () => this.#olLayer.getMinZoom(),\n (cb) => {\n const key = this.#olLayer.on(\"change:minZoom\", cb);\n return () => unByKey(key);\n }\n );\n this.#maxZoom = synchronized(\n () => this.#olLayer.getMaxZoom(),\n (cb) => {\n const key = this.#olLayer.on(\"change:maxZoom\", cb);\n return () => unByKey(key);\n }\n );\n this.#sourceState = computed(() => {\n const olSource = this.olSource;\n if (!olSource) {\n return undefined;\n }\n\n return synchronized(\n () => getSourceState(olSource),\n (cb) => {\n const key = olSource.on(\"change\", cb);\n return () => unByKey(key);\n }\n );\n });\n this.#sourceInfo = computed(() => makeSourceInfo(this.id, this.#sourceState.value?.value));\n this.#healthInfo = reactive<LayerLoadInfo>(\"not-loaded\");\n this.#metadataInfo = reactive<LayerLoadInfo>(config.initialLoadInfo ?? \"not-loaded\");\n\n this[SET_VISIBLE](config.visible ?? true); // apply initial visibility\n\n this.#visibleInScale = computed(() => {\n const map = this.nullableMap; // handle case where not in the map yet\n if (!map) {\n return true; // or false? doesn't really matter\n }\n\n const zoom = map.zoomLevel;\n const resolution = map.resolution;\n if (zoom == null || resolution == null) {\n return false;\n }\n\n const parent = this.parent;\n if (parent && parent.type === \"group\" && !parent.visibleInScale) {\n return false;\n }\n\n if (resolution < this.minResolution || resolution >= this.maxResolution) {\n return false;\n }\n\n return zoom > this.minZoom && zoom <= this.maxZoom;\n });\n\n if (config.maxResolution) {\n this.#olLayer.setMaxResolution(config.maxResolution);\n }\n if (config.minResolution) {\n this.#olLayer.setMinResolution(config.minResolution);\n }\n\n if (config.maxZoom) {\n this.#olLayer.setMaxZoom(config.maxZoom);\n }\n if (config.minZoom) {\n this.#olLayer.setMinZoom(config.minZoom);\n }\n }\n\n override destroy() {\n if (this.isDestroyed) {\n return;\n }\n\n this.olLayer.dispose();\n super.destroy();\n }\n\n /**\n * Identifies the type of this layer.\n */\n abstract override readonly type: LayerTypes;\n\n override get visible(): boolean {\n return this.#visible.value;\n }\n\n /**\n * The raw OpenLayers layer.\n */\n get olLayer(): OlBaseLayer {\n return this.#olLayer;\n }\n\n /**\n * The current source of the {@link olLayer}.\n */\n get olSource(): OlSource | undefined {\n return this.#olSource.value;\n }\n\n /**\n * True if this layer is a base layer.\n *\n * Only one base layer can be visible at a time.\n */\n get isBaseLayer(): boolean {\n return this.#isBaseLayer.value;\n }\n\n /**\n * The combined load state of a layer.\n *\n * Aggregates the OpenLayers source state, health check and metadata state.\n * Priority for the state: `error` > `loading` > `not-loaded` > `loaded`.\n */\n get loadState(): LayerLoadState {\n return loadInfoState(this.#loadInfo.value);\n }\n\n /**\n * The error (if any) that prevented this layer from loading.\n *\n * Combines errors from the OpenLayers source, the health check and the\n * metadata request (health > metadata > source).\n */\n get loadError(): Error | undefined {\n return errorOf(this.#loadInfo.value);\n }\n\n /**\n * The minimum resolution (inclusive) at which this layer will be visible.\n */\n get minResolution() {\n return this.#minResolution.value;\n }\n\n /**\n * The maximum resolution (exclusive) below which this layer will be visible.\n */\n get maxResolution() {\n return this.#maxResolution.value;\n }\n\n /**\n * The minimum view zoom level (exclusive) above which this layer will be visible.\n */\n get minZoom() {\n return this.#minZoom.value;\n }\n\n /**\n * The maximum view zoom level (inclusive) at which this layer will be visible.\n */\n get maxZoom() {\n return this.#maxZoom.value;\n }\n\n /**\n * Whether the layer is visible in the current map scale or not.\n */\n get visibleInScale(): boolean {\n return this.#visibleInScale.value;\n }\n\n /**\n * The minimum resolution (inclusive) at which this layer will be visible.\n */\n setMinResolution(value: number): void {\n this.#olLayer.setMinResolution(value);\n }\n\n /**\n * The maximum resolution (exclusive) below which this layer will be visible.\n */\n setMaxResolution(value: number): void {\n this.#olLayer.setMaxResolution(value);\n }\n\n /**\n * The minimum view zoom level (exclusive) above which this layer will be visible.\n */\n setMinZoom(value: number): void {\n this.#olLayer.setMinZoom(value);\n }\n\n /**\n * The maximum view zoom level (inclusive) at which this layer will be visible.\n */\n setMaxZoom(value: number): void {\n this.#olLayer.setMaxZoom(value);\n }\n\n /**\n * Called by the map model when the layer is added to the map.\n *\n * @internal\n */\n override [ATTACH_TO_MAP](map: MapModel): void {\n super[ATTACH_TO_MAP](map);\n\n // Custom health check is not needed when OpenLayers already reports an error state.\n if (!this.#healthCheckStarted && errorOf(this.#sourceInfo.value) == null) {\n this.#healthCheckStarted = true;\n doHealthCheck(this, this.#healthCheck).then((loadInfo) => {\n this.#healthInfo.value = loadInfo;\n });\n }\n }\n\n /**\n * Updates the load state of the layer's metadata request.\n *\n * @internal\n */\n [SET_METADATA_LOAD_INFO](loadInfo: LayerLoadInfo): void {\n this.#metadataInfo.value = loadInfo;\n }\n\n override setVisible(newVisibility: boolean): void {\n if (this.isBaseLayer) {\n LOG.warn(\n `Cannot change visibility of base layer '${this.id}': use activateBaseLayer() on the map's LayerCollection instead.`\n );\n return;\n }\n\n this[SET_VISIBLE](newVisibility);\n }\n\n /** @internal */\n [SET_VISIBLE](newVisibility: boolean): void {\n if (this.#olLayer.getVisible() !== newVisibility) {\n this.#olLayer.setVisible(newVisibility);\n }\n }\n\n /** @internal */\n [GET_DEPS](): LayerDependencies {\n const deps = this.#deps;\n if (deps) {\n return deps;\n }\n\n const map = this.nullableMap;\n if (map) {\n return map[LAYER_DEPS];\n }\n throw new Error(\n `Layer '${this.id}' has not been attached to a map yet. \"\n + \"Use the LayerFactory to create an instance or add the layer to the map first.`\n );\n }\n\n /**\n * Always returns original, configured `isBaseLayer` value from LayerConfig instead of computed value from `get isBaseLayer()`\n *\n * @internal */\n get [DECLARED_AS_BASE_LAYER](): boolean | undefined {\n return this.#declaredAsBaseLayer;\n }\n}\n\nasync function doHealthCheck(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"]\n): Promise<LayerLoadInfo> {\n if (healthCheck == null) {\n return \"loaded\";\n }\n\n let healthCheckFn: HealthCheckFunction;\n if (typeof healthCheck === \"function\") {\n healthCheckFn = healthCheck;\n } else if (typeof healthCheck === \"string\") {\n healthCheckFn = async () => {\n const httpService = layer[GET_DEPS]().httpService;\n const response = await httpService.fetch(healthCheck);\n if (response.ok) {\n return \"loaded\";\n }\n LOG.warn(\n `Health check failed for layer '${layer.id}' (http status ${response.status})`\n );\n return \"error\";\n };\n } else {\n LOG.error(\n `Unexpected object for 'healthCheck' parameter of layer '${layer.id}'`,\n healthCheck\n );\n return {\n kind: \"error\",\n error: new Error(`Invalid 'healthCheck' configuration for layer '${layer.id}'`)\n };\n }\n\n try {\n const state = await healthCheckFn(layer as Layer);\n if (state === \"error\") {\n return {\n kind: \"error\",\n error: new Error(`Health check failed for layer '${layer.id}'`)\n };\n }\n return state;\n } catch (e) {\n LOG.warn(`Health check failed for layer '${layer.id}'`, e);\n return {\n kind: \"error\",\n error: e instanceof Error ? e : new Error(String(e))\n };\n }\n}\n\nconst LOAD_STATE_SEVERITY: Record<LayerLoadState, number> = {\n \"not-loaded\": 0,\n loaded: 1,\n loading: 2,\n error: 3\n};\n\n/** Returns the higher severity of two load states: error > loading > not-loaded > loaded. */\nfunction higherSeverity(a: LayerLoadState, b: LayerLoadState): LayerLoadState {\n return LOAD_STATE_SEVERITY[a] >= LOAD_STATE_SEVERITY[b] ? a : b;\n}\n\nfunction combineLoadInfos(\n source: LayerLoadInfo,\n health: LayerLoadInfo,\n metadata: LayerLoadInfo\n): LayerLoadInfo {\n // If several channels are in error, report the most relevant one (health > metadata > source).\n const error = errorOf(health) ?? errorOf(metadata) ?? errorOf(source);\n if (error) {\n return { kind: \"error\", error };\n }\n return higherSeverity(loadInfoState(source), loadInfoState(metadata)) as LayerLoadInfo;\n}\n\nfunction errorOf(info: LayerLoadInfo): Error | undefined {\n return typeof info === \"object\" ? info.error : undefined;\n}\n\nfunction loadInfoState(info: LayerLoadInfo): LayerLoadState {\n return typeof info === \"object\" ? \"error\" : info;\n}\n\n// OpenLayers sources carry no error detail, so synthesize one.\nfunction makeSourceInfo(id: string, state: LayerLoadState | undefined): LayerLoadInfo {\n if (state == null) {\n // no state -> no source -> just pretend its loaded\n return \"loaded\";\n }\n if (state === \"error\") {\n return {\n kind: \"error\",\n error: new Error(`Source of layer '${id}' is in error state`)\n };\n }\n return state;\n}\n\nfunction synchronizedOlSource(layer: OlBaseLayer): ReadonlyReactive<OlSource | undefined> {\n if (!(layer instanceof OlLayer)) {\n // GroupLayer etc.\n return constant(undefined);\n }\n\n return synchronized(\n () => layer.getSource() ?? undefined,\n (cb) => {\n const key = layer.on(\"change:source\", cb);\n return () => unByKey(key);\n }\n );\n}\n\nfunction getSourceState(olSource: OlSource) {\n const state = olSource.getState();\n switch (state) {\n case undefined:\n return \"loaded\";\n case \"undefined\":\n return \"not-loaded\";\n case \"loading\":\n return \"loading\";\n case \"ready\":\n return \"loaded\";\n case \"error\":\n return \"error\";\n }\n}\n"],"names":[],"mappings":"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"}
@@ -19,14 +19,15 @@ export interface AddLayerOptionsBase {
19
19
  * - "above": Insert the new layer _above_ the specified `reference` layer.
20
20
  * - "below": Insert the new layer _below_ the specified `reference` layer.
21
21
  * - "topmost": Insert a new layer that is always displayed on top of all layers that were added at `top` (e.g. a highlight layer).
22
+ * - "base": Insert a new layer as a base layer.
22
23
  */
23
- at: "top" | "bottom" | "above" | "below" | "topmost";
24
+ at: "top" | "bottom" | "above" | "below" | "topmost" | "base";
24
25
  }
25
26
  /**
26
27
  * @group Layer Utilities
27
28
  */
28
29
  export interface AddLayerOptionsTopBottom extends AddLayerOptionsBase {
29
- at: "top" | "bottom" | "topmost";
30
+ at: "top" | "bottom" | "topmost" | "base";
30
31
  }
31
32
  /**
32
33
  * @group Layer Utilities
@@ -48,6 +48,8 @@ export interface LayerConfig extends LayerBaseConfig {
48
48
  * Only one base layer can be active at a time.
49
49
  *
50
50
  * Defaults to `false`.
51
+ *
52
+ * Note: Prefer using the `MapConfig.baseLayers` property over this property.
51
53
  */
52
54
  isBaseLayer?: boolean;
53
55
  /**
@@ -43,3 +43,4 @@ export declare const ATTACH_TO_PARENT: unique symbol;
43
43
  export declare const SET_LEGEND: unique symbol;
44
44
  export declare const LAYER_DEPS: unique symbol;
45
45
  export declare const SET_METADATA_LOAD_INFO: unique symbol;
46
+ export declare const DECLARED_AS_BASE_LAYER: unique symbol;
@@ -27,6 +27,7 @@ const ATTACH_TO_PARENT = /* @__PURE__ */ Symbol("ATTACH_TO_PARENT");
27
27
  const SET_LEGEND = /* @__PURE__ */ Symbol("SET_LEGEND");
28
28
  const LAYER_DEPS = /* @__PURE__ */ Symbol("LAYER_DEPS");
29
29
  const SET_METADATA_LOAD_INFO = /* @__PURE__ */ Symbol("SET_METADATA_LOAD_INFO");
30
+ const DECLARED_AS_BASE_LAYER = /* @__PURE__ */ Symbol("DECLARED_AS_BASE_LAYER");
30
31
 
31
- export { ATTACH_TO_GROUP, ATTACH_TO_MAP, ATTACH_TO_PARENT, DETACH_FROM_GROUP, DETACH_FROM_MAP, GET_DEPS, GET_PARENT, GET_RAW_LAYERS, GET_RAW_SUBLAYERS, LAYER_DEPS, SET_LEGEND, SET_METADATA_LOAD_INFO, SET_VISIBLE, getLayerDependencies };
32
+ export { ATTACH_TO_GROUP, ATTACH_TO_MAP, ATTACH_TO_PARENT, DECLARED_AS_BASE_LAYER, DETACH_FROM_GROUP, DETACH_FROM_MAP, GET_DEPS, GET_PARENT, GET_RAW_LAYERS, GET_RAW_SUBLAYERS, LAYER_DEPS, SET_LEGEND, SET_METADATA_LOAD_INFO, SET_VISIBLE, getLayerDependencies };
32
33
  //# sourceMappingURL=internals.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"internals.js","sources":["internals.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { HttpService } from \"@open-pioneer/http\";\nimport {\n InternalConstructorTag,\n INTERNAL_CONSTRUCTOR_TAG\n} from \"../../utils/InternalConstructorTag\";\nimport { Layer } from \"../unions\";\nimport { LayerConfig } from \"./LayerConfig\";\n\n/**\n * Options passed from the layer factory to the layer constructor.\n *\n * @internal\n */\nexport interface LayerDependencies {\n httpService: HttpService;\n}\n\n/**\n * Interface implemented by layer classes (the prototype, not the instance).\n *\n * - `Config`: the options supported or required as construction parameters.\n * - `LayerType`: the type of the resulting layer instance.\n *\n * @internal\n */\nexport interface LayerConstructor<Config extends LayerConfig, LayerType extends Layer> {\n prototype: LayerType;\n new (config: Config, deps: LayerDependencies, tag: InternalConstructorTag): LayerType;\n}\n\n/**\n * Helper function to verify that the correct tag was used.\n *\n * Returns the layer dependencies passed by the layer factory or returns undefined.\n *\n * Throws an error if an invalid tag was provided.\n */\nexport function getLayerDependencies(\n deps: LayerDependencies | undefined,\n tag: InternalConstructorTag | undefined\n): LayerDependencies | undefined {\n if (tag == null) {\n // no tag -> used old constructor overload\n return undefined;\n }\n if (tag !== INTERNAL_CONSTRUCTOR_TAG) {\n throw new Error(\n \"Attempt to call an internal layer constructor. Use the LayerFactory service instead.\"\n );\n }\n if (!deps) {\n // If the correct tag was used, then the dependencies must have been passed by the factory\n throw new Error(\"Internal error: layer dependencies are missing\");\n }\n return deps;\n}\n\n// use symbols for internal functions\nexport const SET_VISIBLE = Symbol(\"SET_VISIBLE\");\nexport const DETACH_FROM_MAP = Symbol(\"DETACH_FROM_MAP\");\nexport const ATTACH_TO_MAP = Symbol(\"ATTACH_TO_MAP\");\nexport const ATTACH_TO_GROUP = Symbol(\"ATTACH_TO_GROUP\");\nexport const DETACH_FROM_GROUP = Symbol(\"DETACH_FROM_GROUP\");\nexport const GET_RAW_LAYERS = Symbol(\"GET_RAW_LAYERS\");\nexport const GET_PARENT = Symbol(\"GET_PARENT\");\nexport const GET_DEPS = Symbol(\"GET_DEPS\");\nexport const GET_RAW_SUBLAYERS = Symbol(\"GET_RAW_SUBLAYERS\");\nexport const ATTACH_TO_PARENT = Symbol(\"ATTACH_TO_PARENT\");\nexport const SET_LEGEND = Symbol(\"SET_LEGEND\");\nexport const LAYER_DEPS = Symbol(\"LAYER_DEPS\");\nexport const SET_METADATA_LOAD_INFO = Symbol(\"SET_METADATA_LOAD_INFO\");\n"],"names":[],"mappings":";;AAwCO,SAAS,oBAAA,CACZ,MACA,GAAA,EAC6B;AAC7B,EAAA,IAAI,OAAO,IAAA,EAAM;AAEb,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,IAAI,QAAQ,wBAAA,EAA0B;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AAEP,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,IAAA;AACX;AAGO,MAAM,WAAA,0BAAqB,aAAa;AACxC,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,aAAA,0BAAuB,eAAe;AAC5C,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,cAAA,0BAAwB,gBAAgB;AAC9C,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,QAAA,0BAAkB,UAAU;AAClC,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,gBAAA,0BAA0B,kBAAkB;AAClD,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,sBAAA,0BAAgC,wBAAwB;;;;"}
1
+ {"version":3,"file":"internals.js","sources":["internals.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { HttpService } from \"@open-pioneer/http\";\nimport {\n InternalConstructorTag,\n INTERNAL_CONSTRUCTOR_TAG\n} from \"../../utils/InternalConstructorTag\";\nimport { Layer } from \"../unions\";\nimport { LayerConfig } from \"./LayerConfig\";\n\n/**\n * Options passed from the layer factory to the layer constructor.\n *\n * @internal\n */\nexport interface LayerDependencies {\n httpService: HttpService;\n}\n\n/**\n * Interface implemented by layer classes (the prototype, not the instance).\n *\n * - `Config`: the options supported or required as construction parameters.\n * - `LayerType`: the type of the resulting layer instance.\n *\n * @internal\n */\nexport interface LayerConstructor<Config extends LayerConfig, LayerType extends Layer> {\n prototype: LayerType;\n new (config: Config, deps: LayerDependencies, tag: InternalConstructorTag): LayerType;\n}\n\n/**\n * Helper function to verify that the correct tag was used.\n *\n * Returns the layer dependencies passed by the layer factory or returns undefined.\n *\n * Throws an error if an invalid tag was provided.\n */\nexport function getLayerDependencies(\n deps: LayerDependencies | undefined,\n tag: InternalConstructorTag | undefined\n): LayerDependencies | undefined {\n if (tag == null) {\n // no tag -> used old constructor overload\n return undefined;\n }\n if (tag !== INTERNAL_CONSTRUCTOR_TAG) {\n throw new Error(\n \"Attempt to call an internal layer constructor. Use the LayerFactory service instead.\"\n );\n }\n if (!deps) {\n // If the correct tag was used, then the dependencies must have been passed by the factory\n throw new Error(\"Internal error: layer dependencies are missing\");\n }\n return deps;\n}\n\n// use symbols for internal functions\nexport const SET_VISIBLE = Symbol(\"SET_VISIBLE\");\nexport const DETACH_FROM_MAP = Symbol(\"DETACH_FROM_MAP\");\nexport const ATTACH_TO_MAP = Symbol(\"ATTACH_TO_MAP\");\nexport const ATTACH_TO_GROUP = Symbol(\"ATTACH_TO_GROUP\");\nexport const DETACH_FROM_GROUP = Symbol(\"DETACH_FROM_GROUP\");\nexport const GET_RAW_LAYERS = Symbol(\"GET_RAW_LAYERS\");\nexport const GET_PARENT = Symbol(\"GET_PARENT\");\nexport const GET_DEPS = Symbol(\"GET_DEPS\");\nexport const GET_RAW_SUBLAYERS = Symbol(\"GET_RAW_SUBLAYERS\");\nexport const ATTACH_TO_PARENT = Symbol(\"ATTACH_TO_PARENT\");\nexport const SET_LEGEND = Symbol(\"SET_LEGEND\");\nexport const LAYER_DEPS = Symbol(\"LAYER_DEPS\");\nexport const SET_METADATA_LOAD_INFO = Symbol(\"SET_METADATA_LOAD_INFO\");\nexport const DECLARED_AS_BASE_LAYER = Symbol(\"DECLARED_AS_BASE_LAYER\");\n"],"names":[],"mappings":";;AAwCO,SAAS,oBAAA,CACZ,MACA,GAAA,EAC6B;AAC7B,EAAA,IAAI,OAAO,IAAA,EAAM;AAEb,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,IAAI,QAAQ,wBAAA,EAA0B;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,IAAI,CAAC,IAAA,EAAM;AAEP,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,IAAA;AACX;AAGO,MAAM,WAAA,0BAAqB,aAAa;AACxC,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,aAAA,0BAAuB,eAAe;AAC5C,MAAM,eAAA,0BAAyB,iBAAiB;AAChD,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,cAAA,0BAAwB,gBAAgB;AAC9C,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,QAAA,0BAAkB,UAAU;AAClC,MAAM,iBAAA,0BAA2B,mBAAmB;AACpD,MAAM,gBAAA,0BAA0B,kBAAkB;AAClD,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,UAAA,0BAAoB,YAAY;AACtC,MAAM,sBAAA,0BAAgC,wBAAwB;AAC9D,MAAM,sBAAA,0BAAgC,wBAAwB;;;;"}
@@ -3,7 +3,7 @@ import { createLogger } from '@open-pioneer/core';
3
3
  import { sourceId$1 as sourceId } from '../_virtual/source-info.js';
4
4
  import { AbstractLayer } from '../layers/AbstractLayer.js';
5
5
  import { getRecursiveLayers } from '../layers/shared/getRecursiveLayers.js';
6
- import { ATTACH_TO_MAP, DETACH_FROM_MAP, SET_VISIBLE, GET_RAW_LAYERS, GET_RAW_SUBLAYERS } from '../layers/shared/internals.js';
6
+ import { DECLARED_AS_BASE_LAYER, ATTACH_TO_MAP, DETACH_FROM_MAP, SET_VISIBLE, GET_RAW_LAYERS, GET_RAW_SUBLAYERS } from '../layers/shared/internals.js';
7
7
  import { assertInternalConstructor } from '../utils/InternalConstructorTag.js';
8
8
 
9
9
  const LOG = createLogger(sourceId);
@@ -25,6 +25,8 @@ class LayerCollection {
25
25
  #operationalLayerOrder = reactiveArray();
26
26
  /** Operational layers that are always displayed at the top above all other layers (e.g. a highlight layer) */
27
27
  #topMostOperationalLayers = reactiveArray();
28
+ /** All base layers */
29
+ #baseLayers = reactiveArray();
28
30
  #syncHandle;
29
31
  /** @internal */
30
32
  constructor(map, tag) {
@@ -72,6 +74,10 @@ class LayerCollection {
72
74
  addLayer(layer, options) {
73
75
  batch(() => {
74
76
  checkLayerInstance(layer);
77
+ checkIncorrectAddLayerOptions(layer, options);
78
+ if (layer[DECLARED_AS_BASE_LAYER]) {
79
+ options = options ? { ...options, at: "base" } : { at: "base" };
80
+ }
75
81
  layer[ATTACH_TO_MAP](this.#map);
76
82
  this.#addLayer(layer, options);
77
83
  });
@@ -80,7 +86,7 @@ class LayerCollection {
80
86
  * Returns all configured base layers.
81
87
  */
82
88
  getBaseLayers() {
83
- return Array.from(this.#topLevelLayers).filter((layer) => layer.isBaseLayer);
89
+ return Array.from(this.#baseLayers);
84
90
  }
85
91
  /**
86
92
  * Returns the currently active base layer.
@@ -121,7 +127,7 @@ class LayerCollection {
121
127
  * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.
122
128
  */
123
129
  getOperationalLayers(options) {
124
- return this.getLayers(options).filter((layer) => !layer.isBaseLayer);
130
+ return this.getLayers(options).filter((layer) => !this.#baseLayers.includes(layer));
125
131
  }
126
132
  /**
127
133
  * Returns a list of layers known to this collection. This includes base layers and operational layers.
@@ -278,21 +284,13 @@ class LayerCollection {
278
284
  }
279
285
  } else {
280
286
  layer[SET_VISIBLE](layer.visible);
281
- const layerList = this.#getLayerList(pos);
282
- layerList.splice(pos.index, 0, layer);
283
287
  }
288
+ const layerList = this.#getLayerList(pos);
289
+ layerList.splice(pos.index, 0, layer);
284
290
  this.#topLevelLayers.add(layer);
285
291
  this.#map.olMap.addLayer(layer.olLayer);
286
292
  }
287
293
  #getInsertionPos(layer, options) {
288
- if (layer.isBaseLayer) {
289
- if (options?.at) {
290
- throw new Error(
291
- `Cannot add base layer '${layer.id}' at a specific position: only operational layers can be added at a specific position.`
292
- );
293
- }
294
- return { which: "base" };
295
- }
296
294
  switch (options?.at) {
297
295
  case void 0:
298
296
  case null:
@@ -300,13 +298,15 @@ class LayerCollection {
300
298
  return { which: "normal", index: this.#operationalLayerOrder.length };
301
299
  case "topmost":
302
300
  return { which: "topmost", index: this.#topMostOperationalLayers.length };
301
+ case "base":
302
+ return { which: "base", index: this.#baseLayers.length };
303
303
  case "bottom":
304
304
  return { which: "normal", index: 0 };
305
305
  case "above":
306
306
  case "below": {
307
307
  const reference = this.#getReference(options.reference);
308
- const pos = this.#findOpOrTopmost(reference);
309
- if (!pos) {
308
+ const pos = this.#findLayerPos(reference);
309
+ if (!pos || pos.which === "base") {
310
310
  const errorMessage = this.#getInsertErrorMessage(layer, reference);
311
311
  throw new Error(errorMessage);
312
312
  }
@@ -338,14 +338,12 @@ class LayerCollection {
338
338
  #removeLayer(layer) {
339
339
  this.#map.olMap.removeLayer(layer.olLayer);
340
340
  this.#topLevelLayers.delete(layer);
341
- if (!layer.isBaseLayer) {
342
- const pos = this.#findOpOrTopmost(layer);
343
- if (!pos) {
344
- throw new Error(`Internal error: layer '${layer.id}' not found.`);
345
- }
346
- const layerList = this.#getLayerList(pos);
347
- layerList.splice(pos.index, 1);
341
+ const pos = this.#findLayerPos(layer);
342
+ if (!pos) {
343
+ throw new Error(`Internal error: layer '${layer.id}' not found.`);
348
344
  }
345
+ const layerList = this.#getLayerList(pos);
346
+ layerList.splice(pos.index, 1);
349
347
  this.#unIndexLayer(layer);
350
348
  if (this.#activeBaseLayer.value === layer) {
351
349
  const newBaseLayer = this.getBaseLayers()[0];
@@ -437,9 +435,11 @@ class LayerCollection {
437
435
  return this.#topMostOperationalLayers;
438
436
  case "normal":
439
437
  return this.#operationalLayerOrder;
438
+ case "base":
439
+ return this.#baseLayers;
440
440
  }
441
441
  }
442
- #findOpOrTopmost(layer) {
442
+ #findLayerPos(layer) {
443
443
  let index = this.#operationalLayerOrder.indexOf(layer);
444
444
  if (index !== -1) {
445
445
  return { which: "normal", index };
@@ -448,6 +448,10 @@ class LayerCollection {
448
448
  if (index !== -1) {
449
449
  return { which: "topmost", index };
450
450
  }
451
+ index = this.#baseLayers.indexOf(layer);
452
+ if (index !== -1) {
453
+ return { which: "base", index };
454
+ }
451
455
  return void 0;
452
456
  }
453
457
  #getInsertErrorMessage(layer, reference) {
@@ -460,6 +464,17 @@ class LayerCollection {
460
464
  return message;
461
465
  }
462
466
  }
467
+ function checkIncorrectAddLayerOptions(layer, options) {
468
+ if (layer[DECLARED_AS_BASE_LAYER]) {
469
+ if (options?.at === "topmost") {
470
+ throw new Error(`Cannot add base layer '${layer.id}' as a topmost layer.`);
471
+ } else if (options?.at && options.at !== "base") {
472
+ throw new Error(
473
+ `Cannot add base layer '${layer.id}' at a specific position: only operational layers can be added at a specific position.`
474
+ );
475
+ }
476
+ }
477
+ }
463
478
  function checkLayerInstance(object) {
464
479
  if (!(object instanceof AbstractLayer)) {
465
480
  throw new Error(