@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/CHANGELOG.md +533 -489
- package/README.md +5 -8
- package/layers/AbstractLayer.d.ts +6 -1
- package/layers/AbstractLayer.js +18 -4
- package/layers/AbstractLayer.js.map +1 -1
- package/layers/shared/AddLayerOptions.d.ts +3 -2
- package/layers/shared/LayerConfig.d.ts +2 -0
- package/layers/shared/internals.d.ts +1 -0
- package/layers/shared/internals.js +2 -1
- package/layers/shared/internals.js.map +1 -1
- package/model/LayerCollection.js +38 -23
- package/model/LayerCollection.js.map +1 -1
- package/model/MapConfig.d.ts +16 -0
- package/model/createMapModel.js +55 -0
- package/model/createMapModel.js.map +1 -1
- package/package.json +16 -12
- package/ui/MapContainer.js.map +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/layers/AbstractLayer.js
CHANGED
|
@@ -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
|
-
#
|
|
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.#
|
|
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":"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"}
|
|
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
|
|
@@ -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;;;;"}
|
package/model/LayerCollection.js
CHANGED
|
@@ -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.#
|
|
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
|
|
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.#
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
#
|
|
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(
|