@open-pioneer/map 1.2.0-dev.20260121105545 → 1.3.0-dev-map-loading.20260202141334
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 +14 -1
- package/MapRegistry.js +2 -1
- package/MapRegistry.js.map +1 -1
- package/_virtual/source-info.js +22 -0
- package/_virtual/source-info.js.map +1 -0
- package/layers/AbstractLayer.js +2 -1
- package/layers/AbstractLayer.js.map +1 -1
- package/layers/WMSLayer.js +2 -1
- package/layers/WMSLayer.js.map +1 -1
- package/layers/WMTSLayer.d.ts +2 -2
- package/layers/WMTSLayer.js +28 -4
- package/layers/WMTSLayer.js.map +1 -1
- package/layers/wms/getLegendUrl.js +2 -1
- package/layers/wms/getLegendUrl.js.map +1 -1
- package/layers/wmts/getLegendUrl.js +2 -1
- package/layers/wmts/getLegendUrl.js.map +1 -1
- package/model/LayerCollection.d.ts +2 -2
- package/model/LayerCollection.js +3 -2
- package/model/LayerCollection.js.map +1 -1
- package/model/MapModel.d.ts +8 -1
- package/model/MapModel.js +32 -1
- package/model/MapModel.js.map +1 -1
- package/model/createMapModel.js +2 -1
- package/model/createMapModel.js.map +1 -1
- package/package.json +5 -5
- package/ui/MapContainer.d.ts +19 -1
- package/ui/MapContainer.js +11 -4
- package/ui/MapContainer.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayerCollection.js","sources":["LayerCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n batch,\n effect,\n reactive,\n ReactiveArray,\n reactiveArray,\n reactiveMap,\n reactiveSet\n} from \"@conterra/reactivity-core\";\nimport { createLogger, Resource } from \"@open-pioneer/core\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport { AbstractLayer } from \"../layers/AbstractLayer\";\nimport { AbstractLayerBase } from \"../layers/AbstractLayerBase\";\nimport {\n ATTACH_TO_MAP,\n DETACH_FROM_MAP,\n GET_RAW_LAYERS,\n GET_RAW_SUBLAYERS,\n SET_VISIBLE\n} from \"../layers/shared/internals\";\nimport { assertInternalConstructor, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { AnyLayer, Layer, Sublayer } from \"../layers/unions\";\nimport type { AddLayerOptions } from \"../layers/shared/AddLayerOptions\";\nimport type {\n LayerRetrievalOptions,\n RecursiveRetrievalOptions\n} from \"../layers/shared/LayerRetrievalOptions\";\nimport { MapModel } from \"./MapModel\";\nimport { getRecursiveLayers } from \"../layers/shared/getRecursiveLayers\";\n\nconst LOG = createLogger(\"map:LayerCollection\");\n\ntype LayerType = AbstractLayer & Layer;\ntype LayerBaseType = (AbstractLayerBase & Layer) | (AbstractLayerBase & Sublayer);\n\ninterface OpOrTopmostLayerPos {\n which: \"normal\" | \"topmost\";\n index: number;\n}\n\ninterface BaseLayerPos {\n which: \"base\";\n}\n\ntype LayerPos = OpOrTopmostLayerPos | BaseLayerPos;\n\n/**\n * Contains the layers contained in a {@link MapModel}.\n *\n * @group Map Model\n */\nexport class LayerCollection {\n #map: MapModel;\n\n /** Top level layers (base layers, operational layers). No sublayers. */\n #topLevelLayers = reactiveSet<LayerType>();\n\n /** Index of _all_ layer instances, including sublayers. */\n #layersById = reactiveMap<string, LayerBaseType>();\n\n /** Reverse index of _all_ layers that have an associated OpenLayers layer. */\n #layersByOlLayer: WeakMap<OlBaseLayer, LayerType> = new WeakMap();\n\n /** Currently active base layer. */\n #activeBaseLayer = reactive<LayerType>();\n\n /**\n * Defines the relative order of operational layers.\n * Lower index -> layer is below its successors.\n * Excluding {@link #topMostOperationalLayers}\n */\n #operationalLayerOrder = reactiveArray<LayerType>();\n\n /** Operational layers that are always displayed at the top above all other layers (e.g. a highlight layer) */\n #topMostOperationalLayers = reactiveArray<LayerType>();\n\n #syncHandle: Resource | undefined;\n\n /** @internal */\n constructor(map: MapModel, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n\n this.#map = map;\n this.#syncHandle = effect(() => {\n // Contains base layers, normal operational layers, topmost layers in bottom-to-top order.\n const orderedLayers = this.getLayers({\n sortByDisplayOrder: true,\n includeInternalLayers: true\n });\n\n // Simply reassign all z-indices whenever the order changes.\n let index = 0;\n for (const layer of orderedLayers) {\n LOG.isDebug() && LOG.debug(\"Assigning z-index\", layer.id, index);\n layer.olLayer.setZIndex(index);\n index++;\n }\n });\n }\n\n destroy() {\n for (const layer of this.#layersById.values()) {\n layer.destroy();\n }\n this.#topLevelLayers.clear();\n this.#layersById.clear();\n this.#operationalLayerOrder.splice(0, this.#operationalLayerOrder.length);\n this.#activeBaseLayer.value = undefined;\n this.#syncHandle?.destroy();\n this.#syncHandle = undefined;\n }\n\n /**\n * Adds a new layer to the map.\n *\n * The new layer is automatically registered with this collection.\n *\n * ### Display order\n *\n * By default, the new layer will be shown on _top_ of all normal operational layers.\n * Use the `options` parameter to control the insertion point.\n *\n * ### Ownership\n *\n * The map model takes ownership of the new layer.\n * This means that the layer will be destroyed if the map model is destroyed.\n */\n addLayer(layer: Layer, options?: AddLayerOptions): void {\n batch(() => {\n checkLayerInstance(layer);\n\n layer[ATTACH_TO_MAP](this.#map);\n this.#addLayer(layer, options);\n });\n }\n\n /**\n * Returns all configured base layers.\n */\n getBaseLayers(): Layer[] {\n // Slightly inefficient, but we don't need a separate index for base layers right now.\n return Array.from(this.#topLevelLayers).filter((layer) => layer.isBaseLayer);\n }\n\n /**\n * Returns the currently active base layer.\n */\n getActiveBaseLayer(): Layer | undefined {\n return this.#activeBaseLayer.value;\n }\n\n /**\n * Activates the base layer with the given id.\n * `undefined` can be used to hide all base layers.\n *\n * The associated layer is made visible and all other base layers are hidden.\n *\n * Returns true if the given layer has been successfully activated.\n */\n activateBaseLayer(id: string | undefined): boolean {\n let newBaseLayer = undefined;\n if (id != null) {\n newBaseLayer = this.#layersById.get(id);\n if (!newBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is unknown.`);\n return false;\n }\n if (!(newBaseLayer instanceof AbstractLayer)) {\n LOG.warn(`Cannot activate base layer '${id}: layer has an invalid type.'`);\n return false;\n }\n if (!newBaseLayer.isBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is not a base layer.`);\n return false;\n }\n }\n\n this.#updateBaseLayer(newBaseLayer);\n return true;\n }\n\n /**\n * Returns a list of operational layers, starting from the root of the map's layer hierarchy.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getOperationalLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options).filter((layer) => !layer.isBaseLayer);\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getLayers(options?: LayerRetrievalOptions): Layer[] {\n let allLayers: Layer[];\n\n if (options?.sortByDisplayOrder) {\n const baseLayers = this.getBaseLayers();\n const order = Array.from(this.#operationalLayerOrder);\n const topMost = Array.from(this.#topMostOperationalLayers);\n allLayers = [...baseLayers, ...order, ...topMost];\n } else {\n allLayers = Array.from(this.#topLevelLayers.values());\n }\n\n if (!options?.includeInternalLayers) {\n allLayers = allLayers.filter((l) => !l.internal);\n }\n return allLayers;\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n *\n * @deprecated Use {@link getLayers()}, {@link getOperationalLayers()} or {@link getRecursiveLayers()} instead.\n * This method name is misleading since it does not recurse into child layers.\n */\n getAllLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns a list of all layers in this collection, including all children (recursively).\n *\n * > Note: This includes base layers by default (see `options.filter`).\n * > Use the `\"base\"` or `\"operational\"` short hand values to filter by base layer or operational layers.\n * >\n * > If the layer hierarchy is deeply nested, this function could potentially be expensive.\n */\n getRecursiveLayers({\n filter,\n sortByDisplayOrder,\n includeInternalLayers\n }: Omit<RecursiveRetrievalOptions, \"filter\"> & {\n filter?: \"base\" | \"operational\" | ((layer: AnyLayer) => boolean);\n } = {}): AnyLayer[] {\n let filterFunc;\n if (typeof filter === \"function\") {\n filterFunc = filter;\n } else if (typeof filter === \"string\") {\n const filterType = filter;\n const topLevelFilter = (layer: Layer) => {\n return filterType === \"base\" ? layer.isBaseLayer : !layer.isBaseLayer;\n };\n filterFunc = (layer: AnyLayer) => {\n if (!layer.parent && \"isBaseLayer\" in layer) {\n return topLevelFilter(layer);\n }\n // For nested children, include them all.\n return true;\n };\n }\n\n return getRecursiveLayers({\n from: this,\n filter: filterFunc,\n sortByDisplayOrder,\n includeInternalLayers\n });\n }\n\n getItems(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns the layer identified by the `id` or undefined, if no such layer exists.\n */\n getLayerById(id: string): AnyLayer | undefined {\n return this.#layersById.get(id);\n }\n\n /**\n * Removes a layer identified by the `id` from the map.\n *\n * NOTE: The current implementation only supports removal of _top level_ layers.\n *\n * ### Ownership\n *\n * This function _destroys_ the layer instance and all its children.\n *\n * @deprecated Use {@link removeLayer} instead.\n */\n removeLayerById(id: string): void {\n batch(() => {\n const layer = this.#layersById.get(id);\n if (!layer) {\n LOG.isDebug() && LOG.debug(`Cannot remove layer '${id}': layer is unknown.`);\n return;\n }\n\n checkLayerInstance(layer);\n if (!this.#topLevelLayers.has(layer)) {\n LOG.warn(\n `Cannot remove layer '${layer.id}': only top level layers can be removed at this time.`\n );\n return;\n }\n\n this.#removeLayer(layer);\n layer.destroy();\n });\n }\n\n /**\n * Removes the given top level layer from the map.\n *\n * The layer can be specified directly (as an object) or by an id.\n *\n * Returns the layer instance on success, or `undefined` if the layer was not found.\n *\n * ### Ownership\n *\n * The map releases ownership of this layer.\n * The caller can destroy it or store it for later reuse.\n */\n removeLayer(layer: string | Layer): Layer | undefined {\n return batch(() => {\n let actualLayer;\n if (typeof layer === \"string\") {\n actualLayer = this.#layersById.get(layer);\n if (!actualLayer) {\n return undefined;\n }\n } else {\n actualLayer = layer;\n }\n\n checkLayerInstance(actualLayer);\n if (!this.#topLevelLayers.has(actualLayer)) {\n return undefined;\n }\n\n this.#removeLayer(actualLayer);\n actualLayer[DETACH_FROM_MAP]();\n return actualLayer;\n });\n }\n\n /**\n * Given a raw OpenLayers layer instance, returns the associated {@link Layer} - or undefined\n * if the layer is unknown to this collection.\n */\n getLayerByRawInstance(layer: OlBaseLayer): Layer | undefined {\n return this.#layersByOlLayer?.get(layer);\n }\n\n /**\n * Adds the given layer to the map and all relevant indices.\n */\n #addLayer(layer: LayerType, options: AddLayerOptions | undefined) {\n // Throws; do this before manipulating the data structures\n const pos = this.#getInsertionPos(layer, options);\n this.#indexLayer(layer);\n\n // Everything below this line should not fail.\n if (pos.which === \"base\") {\n if (!this.#activeBaseLayer.value && layer.visible) {\n this.#updateBaseLayer(layer);\n } else {\n layer[SET_VISIBLE](false);\n }\n } else {\n layer[SET_VISIBLE](layer.visible);\n\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 0, layer); // insert new layer at insertion index\n }\n this.#topLevelLayers.add(layer);\n this.#map.olMap.addLayer(layer.olLayer);\n }\n\n #getInsertionPos(layer: LayerType, options: AddLayerOptions | undefined): LayerPos {\n if (layer.isBaseLayer) {\n if (options?.at) {\n throw new Error(\n `Cannot add base layer '${layer.id}' at a specific position: only operational layers can be added at a specific position.`\n );\n }\n return { which: \"base\" };\n }\n\n switch (options?.at) {\n case undefined:\n case null:\n case \"top\":\n return { which: \"normal\", index: this.#operationalLayerOrder.length };\n case \"topmost\":\n return { which: \"topmost\", index: this.#topMostOperationalLayers.length };\n case \"bottom\":\n return { which: \"normal\", index: 0 };\n case \"above\":\n case \"below\": {\n const reference = this.#getReference(options.reference);\n const pos = this.#findOpOrTopmost(reference);\n if (!pos) {\n // reference is not a top level operational layer -> throw error\n const errorMessage = this.#getInsertErrorMessage(layer, reference);\n throw new Error(errorMessage);\n }\n\n if (options.at === \"above\") {\n pos.index++;\n }\n return pos;\n }\n }\n assertNever(options);\n }\n\n #getReference(reference: Layer | string): LayerType {\n let layer: AnyLayer;\n if (typeof reference === \"string\") {\n const refLayer = this.getLayerById(reference);\n if (!refLayer) {\n throw new Error(`Unknown reference layer '${reference}'.`);\n }\n layer = refLayer;\n } else {\n layer = reference;\n }\n checkLayerInstance(layer);\n return layer;\n }\n\n /**\n * Removes the given top level layer from the map and all relevant indices.\n */\n #removeLayer(layer: LayerType) {\n this.#map.olMap.removeLayer(layer.olLayer);\n this.#topLevelLayers.delete(layer);\n if (!layer.isBaseLayer) {\n const pos = this.#findOpOrTopmost(layer);\n if (!pos) {\n throw new Error(`Internal error: layer '${layer.id}' not found.`);\n }\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 1);\n }\n\n this.#unIndexLayer(layer);\n if (this.#activeBaseLayer.value === layer) {\n const newBaseLayer = this.getBaseLayers()[0];\n if (newBaseLayer) {\n checkLayerInstance(newBaseLayer);\n }\n this.#updateBaseLayer(newBaseLayer);\n }\n }\n\n #updateBaseLayer(layer: LayerType | undefined) {\n if (this.#activeBaseLayer.value === layer) {\n return;\n }\n\n if (LOG.isDebug()) {\n const getId = (layer: AbstractLayer | undefined) => {\n return layer ? `'${layer.id}'` : undefined;\n };\n\n LOG.debug(\n `Switching active base layer from ${getId(this.#activeBaseLayer.value)} to ${getId(layer)}`\n );\n }\n\n batch(() => {\n this.#activeBaseLayer.value?.[SET_VISIBLE](false);\n this.#activeBaseLayer.value = layer;\n layer?.[SET_VISIBLE](true);\n });\n }\n\n /**\n * Index the layer and all its children.\n */\n #indexLayer(layer: LayerType) {\n // layer id -> layer (or sublayer)\n const registrations: [string, OlBaseLayer | undefined][] = [];\n const visit = (layer: LayerType | (AbstractLayerBase & Sublayer)) => {\n const id = layer.id;\n const olLayer = \"olLayer\" in layer ? layer.olLayer : undefined;\n if (this.#layersById.has(id)) {\n throw new Error(\n `Layer id '${id}' is not unique. Either assign a unique id yourself ` +\n `or skip configuring 'id' for an automatically generated id.`\n );\n }\n if (olLayer && this.#layersByOlLayer.has(olLayer)) {\n throw new Error(`OlLayer used by layer '${id}' has already been used in map.`);\n }\n\n // Register this layer with the map.\n this.#layersById.set(id, layer);\n if (olLayer) {\n this.#layersByOlLayer.set(olLayer, layer as LayerType); // ol is present --> not a sublayer\n }\n registrations.push([id, olLayer]);\n\n // Recurse into nested children.\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n\n try {\n visit(layer);\n } catch (e) {\n // If any error happens, undo the indexing.\n // This way we don't leave a partially indexed layer tree behind.\n for (const [id, olLayer] of registrations) {\n this.#layersById.delete(id);\n if (olLayer) {\n this.#layersByOlLayer.delete(olLayer);\n }\n }\n throw e;\n }\n }\n\n /**\n * Removes index entries for the given layer and all its children.\n */\n #unIndexLayer(layer: AbstractLayer) {\n const visit = (layer: AbstractLayer | AbstractLayerBase) => {\n if (\"olLayer\" in layer) {\n this.#layersByOlLayer.delete(layer.olLayer);\n }\n this.#layersById.delete(layer.id);\n\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n visit(layer);\n }\n\n #getLayerList(pos: OpOrTopmostLayerPos): ReactiveArray<LayerType> {\n switch (pos.which) {\n case \"topmost\":\n return this.#topMostOperationalLayers;\n case \"normal\":\n return this.#operationalLayerOrder;\n }\n }\n\n #findOpOrTopmost(layer: LayerType): OpOrTopmostLayerPos | undefined {\n let index = this.#operationalLayerOrder.indexOf(layer);\n if (index !== -1) {\n return { which: \"normal\", index };\n }\n\n index = this.#topMostOperationalLayers.indexOf(layer);\n if (index !== -1) {\n return { which: \"topmost\", index };\n }\n return undefined;\n }\n\n #getInsertErrorMessage(layer: LayerType, reference: LayerType) {\n let message: string = `Cannot add layer '${layer.id}'. Reference layer '${reference.id}' is not a top level operational layer.`;\n\n if (reference.isBaseLayer) {\n //is base layer\n message += \" Reference layer is a base layer.\";\n } else if (reference.parent) {\n //is child layer\n message += \" Reference layer is child layer of a group.\";\n }\n\n return message;\n }\n}\n\nfunction checkLayerInstance(object: AnyLayer): asserts object is Layer & AbstractLayer {\n if (!(object instanceof AbstractLayer)) {\n throw new Error(\n `Layer is not a valid layer instance. Use one of the classes provided by the map package instead.`\n );\n }\n}\n\nfunction assertNever(_arg: never): never {\n throw new Error(`Internal error: unhandled option.`);\n}\n"],"names":["layer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LayerCollection.js","sources":["LayerCollection.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n batch,\n effect,\n reactive,\n ReactiveArray,\n reactiveArray,\n reactiveMap,\n reactiveSet\n} from \"@conterra/reactivity-core\";\nimport { createLogger, Resource } from \"@open-pioneer/core\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport { sourceId } from \"open-pioneer:source-info\";\nimport { AbstractLayer } from \"../layers/AbstractLayer\";\nimport { AbstractLayerBase } from \"../layers/AbstractLayerBase\";\nimport type { AddLayerOptions } from \"../layers/shared/AddLayerOptions\";\nimport { getRecursiveLayers } from \"../layers/shared/getRecursiveLayers\";\nimport {\n ATTACH_TO_MAP,\n DETACH_FROM_MAP,\n GET_RAW_LAYERS,\n GET_RAW_SUBLAYERS,\n SET_VISIBLE\n} from \"../layers/shared/internals\";\nimport type {\n LayerRetrievalOptions,\n RecursiveRetrievalOptions\n} from \"../layers/shared/LayerRetrievalOptions\";\nimport { AnyLayer, Layer, Sublayer } from \"../layers/unions\";\nimport { assertInternalConstructor, InternalConstructorTag } from \"../utils/InternalConstructorTag\";\nimport { MapModel } from \"./MapModel\";\n\nconst LOG = createLogger(sourceId);\n\ntype LayerType = AbstractLayer & Layer;\ntype LayerBaseType = (AbstractLayerBase & Layer) | (AbstractLayerBase & Sublayer);\n\ninterface OpOrTopmostLayerPos {\n which: \"normal\" | \"topmost\";\n index: number;\n}\n\ninterface BaseLayerPos {\n which: \"base\";\n}\n\ntype LayerPos = OpOrTopmostLayerPos | BaseLayerPos;\n\n/**\n * Contains the layers contained in a {@link MapModel}.\n *\n * @group Map Model\n */\nexport class LayerCollection {\n #map: MapModel;\n\n /** Top level layers (base layers, operational layers). No sublayers. */\n #topLevelLayers = reactiveSet<LayerType>();\n\n /** Index of _all_ layer instances, including sublayers. */\n #layersById = reactiveMap<string, LayerBaseType>();\n\n /** Reverse index of _all_ layers that have an associated OpenLayers layer. */\n #layersByOlLayer: WeakMap<OlBaseLayer, LayerType> = new WeakMap();\n\n /** Currently active base layer. */\n #activeBaseLayer = reactive<LayerType>();\n\n /**\n * Defines the relative order of operational layers.\n * Lower index -> layer is below its successors.\n * Excluding {@link #topMostOperationalLayers}\n */\n #operationalLayerOrder = reactiveArray<LayerType>();\n\n /** Operational layers that are always displayed at the top above all other layers (e.g. a highlight layer) */\n #topMostOperationalLayers = reactiveArray<LayerType>();\n\n #syncHandle: Resource | undefined;\n\n /** @internal */\n constructor(map: MapModel, tag: InternalConstructorTag) {\n assertInternalConstructor(tag);\n\n this.#map = map;\n this.#syncHandle = effect(() => {\n // Contains base layers, normal operational layers, topmost layers in bottom-to-top order.\n const orderedLayers = this.getLayers({\n sortByDisplayOrder: true,\n includeInternalLayers: true\n });\n\n // Simply reassign all z-indices whenever the order changes.\n let index = 0;\n for (const layer of orderedLayers) {\n LOG.isDebug() && LOG.debug(\"Assigning z-index\", layer.id, index);\n layer.olLayer.setZIndex(index);\n index++;\n }\n });\n }\n\n destroy() {\n for (const layer of this.#layersById.values()) {\n layer.destroy();\n }\n this.#topLevelLayers.clear();\n this.#layersById.clear();\n this.#operationalLayerOrder.splice(0, this.#operationalLayerOrder.length);\n this.#activeBaseLayer.value = undefined;\n this.#syncHandle?.destroy();\n this.#syncHandle = undefined;\n }\n\n /**\n * Adds a new layer to the map.\n *\n * The new layer is automatically registered with this collection.\n *\n * ### Display order\n *\n * By default, the new layer will be shown on _top_ of all normal operational layers.\n * Use the `options` parameter to control the insertion point.\n *\n * ### Ownership\n *\n * The map model takes ownership of the new layer.\n * This means that the layer will be destroyed if the map model is destroyed.\n */\n addLayer(layer: Layer, options?: AddLayerOptions): void {\n batch(() => {\n checkLayerInstance(layer);\n\n layer[ATTACH_TO_MAP](this.#map);\n this.#addLayer(layer, options);\n });\n }\n\n /**\n * Returns all configured base layers.\n */\n getBaseLayers(): Layer[] {\n // Slightly inefficient, but we don't need a separate index for base layers right now.\n return Array.from(this.#topLevelLayers).filter((layer) => layer.isBaseLayer);\n }\n\n /**\n * Returns the currently active base layer.\n */\n getActiveBaseLayer(): Layer | undefined {\n return this.#activeBaseLayer.value;\n }\n\n /**\n * Activates the base layer with the given id.\n * `undefined` can be used to hide all base layers.\n *\n * The associated layer is made visible and all other base layers are hidden.\n *\n * Returns true if the given layer has been successfully activated.\n */\n activateBaseLayer(id: string | undefined): boolean {\n let newBaseLayer = undefined;\n if (id != null) {\n newBaseLayer = this.#layersById.get(id);\n if (!newBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is unknown.`);\n return false;\n }\n if (!(newBaseLayer instanceof AbstractLayer)) {\n LOG.warn(`Cannot activate base layer '${id}: layer has an invalid type.'`);\n return false;\n }\n if (!newBaseLayer.isBaseLayer) {\n LOG.warn(`Cannot activate base layer '${id}': layer is not a base layer.`);\n return false;\n }\n }\n\n this.#updateBaseLayer(newBaseLayer);\n return true;\n }\n\n /**\n * Returns a list of operational layers, starting from the root of the map's layer hierarchy.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getOperationalLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options).filter((layer) => !layer.isBaseLayer);\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n */\n getLayers(options?: LayerRetrievalOptions): Layer[] {\n let allLayers: Layer[];\n\n if (options?.sortByDisplayOrder) {\n const baseLayers = this.getBaseLayers();\n const order = Array.from(this.#operationalLayerOrder);\n const topMost = Array.from(this.#topMostOperationalLayers);\n allLayers = [...baseLayers, ...order, ...topMost];\n } else {\n allLayers = Array.from(this.#topLevelLayers.values());\n }\n\n if (!options?.includeInternalLayers) {\n allLayers = allLayers.filter((l) => !l.internal);\n }\n return allLayers;\n }\n\n /**\n * Returns a list of layers known to this collection. This includes base layers and operational layers.\n * The returned list includes top level layers only. Use {@link getRecursiveLayers()} to retrieve (nested) child layers.\n *\n * @deprecated Use {@link getLayers()}, {@link getOperationalLayers()} or {@link getRecursiveLayers()} instead.\n * This method name is misleading since it does not recurse into child layers.\n */\n getAllLayers(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns a list of all layers in this collection, including all children (recursively).\n *\n * > Note: This includes base layers by default (see `options.filter`).\n * > Use the `\"base\"` or `\"operational\"` short hand values to filter by base layer or operational layers.\n * >\n * > If the layer hierarchy is deeply nested, this function could potentially be expensive.\n */\n getRecursiveLayers({\n filter,\n sortByDisplayOrder,\n includeInternalLayers\n }: Omit<RecursiveRetrievalOptions, \"filter\"> & {\n filter?: \"base\" | \"operational\" | ((layer: AnyLayer) => boolean);\n } = {}): AnyLayer[] {\n let filterFunc;\n if (typeof filter === \"function\") {\n filterFunc = filter;\n } else if (typeof filter === \"string\") {\n const filterType = filter;\n const topLevelFilter = (layer: Layer) => {\n return filterType === \"base\" ? layer.isBaseLayer : !layer.isBaseLayer;\n };\n filterFunc = (layer: AnyLayer) => {\n if (!layer.parent && \"isBaseLayer\" in layer) {\n return topLevelFilter(layer);\n }\n // For nested children, include them all.\n return true;\n };\n }\n\n return getRecursiveLayers({\n from: this,\n filter: filterFunc,\n sortByDisplayOrder,\n includeInternalLayers\n });\n }\n\n getItems(options?: LayerRetrievalOptions): Layer[] {\n return this.getLayers(options);\n }\n\n /**\n * Returns the layer identified by the `id` or undefined, if no such layer exists.\n */\n getLayerById(id: string): AnyLayer | undefined {\n return this.#layersById.get(id);\n }\n\n /**\n * Removes a layer identified by the `id` from the map.\n *\n * NOTE: The current implementation only supports removal of _top level_ layers.\n *\n * ### Ownership\n *\n * This function _destroys_ the layer instance and all its children.\n *\n * @deprecated Use {@link removeLayer} instead.\n */\n removeLayerById(id: string): void {\n batch(() => {\n const layer = this.#layersById.get(id);\n if (!layer) {\n LOG.isDebug() && LOG.debug(`Cannot remove layer '${id}': layer is unknown.`);\n return;\n }\n\n checkLayerInstance(layer);\n if (!this.#topLevelLayers.has(layer)) {\n LOG.warn(\n `Cannot remove layer '${layer.id}': only top level layers can be removed at this time.`\n );\n return;\n }\n\n this.#removeLayer(layer);\n layer.destroy();\n });\n }\n\n /**\n * Removes the given top level layer from the map.\n *\n * The layer can be specified directly (as an object) or by an id.\n *\n * Returns the layer instance on success, or `undefined` if the layer was not found.\n *\n * ### Ownership\n *\n * The map releases ownership of this layer.\n * The caller can destroy it or store it for later reuse.\n */\n removeLayer(layer: string | Layer): Layer | undefined {\n return batch(() => {\n let actualLayer;\n if (typeof layer === \"string\") {\n actualLayer = this.#layersById.get(layer);\n if (!actualLayer) {\n return undefined;\n }\n } else {\n actualLayer = layer;\n }\n\n checkLayerInstance(actualLayer);\n if (!this.#topLevelLayers.has(actualLayer)) {\n return undefined;\n }\n\n this.#removeLayer(actualLayer);\n actualLayer[DETACH_FROM_MAP]();\n return actualLayer;\n });\n }\n\n /**\n * Given a raw OpenLayers layer instance, returns the associated {@link Layer} - or undefined\n * if the layer is unknown to this collection.\n */\n getLayerByRawInstance(layer: OlBaseLayer): Layer | undefined {\n return this.#layersByOlLayer?.get(layer);\n }\n\n /**\n * Adds the given layer to the map and all relevant indices.\n */\n #addLayer(layer: LayerType, options: AddLayerOptions | undefined) {\n // Throws; do this before manipulating the data structures\n const pos = this.#getInsertionPos(layer, options);\n this.#indexLayer(layer);\n\n // Everything below this line should not fail.\n if (pos.which === \"base\") {\n if (!this.#activeBaseLayer.value && layer.visible) {\n this.#updateBaseLayer(layer);\n } else {\n layer[SET_VISIBLE](false);\n }\n } else {\n layer[SET_VISIBLE](layer.visible);\n\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 0, layer); // insert new layer at insertion index\n }\n this.#topLevelLayers.add(layer);\n this.#map.olMap.addLayer(layer.olLayer);\n }\n\n #getInsertionPos(layer: LayerType, options: AddLayerOptions | undefined): LayerPos {\n if (layer.isBaseLayer) {\n if (options?.at) {\n throw new Error(\n `Cannot add base layer '${layer.id}' at a specific position: only operational layers can be added at a specific position.`\n );\n }\n return { which: \"base\" };\n }\n\n switch (options?.at) {\n case undefined:\n case null:\n case \"top\":\n return { which: \"normal\", index: this.#operationalLayerOrder.length };\n case \"topmost\":\n return { which: \"topmost\", index: this.#topMostOperationalLayers.length };\n case \"bottom\":\n return { which: \"normal\", index: 0 };\n case \"above\":\n case \"below\": {\n const reference = this.#getReference(options.reference);\n const pos = this.#findOpOrTopmost(reference);\n if (!pos) {\n // reference is not a top level operational layer -> throw error\n const errorMessage = this.#getInsertErrorMessage(layer, reference);\n throw new Error(errorMessage);\n }\n\n if (options.at === \"above\") {\n pos.index++;\n }\n return pos;\n }\n }\n assertNever(options);\n }\n\n #getReference(reference: Layer | string): LayerType {\n let layer: AnyLayer;\n if (typeof reference === \"string\") {\n const refLayer = this.getLayerById(reference);\n if (!refLayer) {\n throw new Error(`Unknown reference layer '${reference}'.`);\n }\n layer = refLayer;\n } else {\n layer = reference;\n }\n checkLayerInstance(layer);\n return layer;\n }\n\n /**\n * Removes the given top level layer from the map and all relevant indices.\n */\n #removeLayer(layer: LayerType) {\n this.#map.olMap.removeLayer(layer.olLayer);\n this.#topLevelLayers.delete(layer);\n if (!layer.isBaseLayer) {\n const pos = this.#findOpOrTopmost(layer);\n if (!pos) {\n throw new Error(`Internal error: layer '${layer.id}' not found.`);\n }\n const layerList = this.#getLayerList(pos);\n layerList.splice(pos.index, 1);\n }\n\n this.#unIndexLayer(layer);\n if (this.#activeBaseLayer.value === layer) {\n const newBaseLayer = this.getBaseLayers()[0];\n if (newBaseLayer) {\n checkLayerInstance(newBaseLayer);\n }\n this.#updateBaseLayer(newBaseLayer);\n }\n }\n\n #updateBaseLayer(layer: LayerType | undefined) {\n if (this.#activeBaseLayer.value === layer) {\n return;\n }\n\n if (LOG.isDebug()) {\n const getId = (layer: AbstractLayer | undefined) => {\n return layer ? `'${layer.id}'` : undefined;\n };\n\n LOG.debug(\n `Switching active base layer from ${getId(this.#activeBaseLayer.value)} to ${getId(layer)}`\n );\n }\n\n batch(() => {\n this.#activeBaseLayer.value?.[SET_VISIBLE](false);\n this.#activeBaseLayer.value = layer;\n layer?.[SET_VISIBLE](true);\n });\n }\n\n /**\n * Index the layer and all its children.\n */\n #indexLayer(layer: LayerType) {\n // layer id -> layer (or sublayer)\n const registrations: [string, OlBaseLayer | undefined][] = [];\n const visit = (layer: LayerType | (AbstractLayerBase & Sublayer)) => {\n const id = layer.id;\n const olLayer = \"olLayer\" in layer ? layer.olLayer : undefined;\n if (this.#layersById.has(id)) {\n throw new Error(\n `Layer id '${id}' is not unique. Either assign a unique id yourself ` +\n `or skip configuring 'id' for an automatically generated id.`\n );\n }\n if (olLayer && this.#layersByOlLayer.has(olLayer)) {\n throw new Error(`OlLayer used by layer '${id}' has already been used in map.`);\n }\n\n // Register this layer with the map.\n this.#layersById.set(id, layer);\n if (olLayer) {\n this.#layersByOlLayer.set(olLayer, layer as LayerType); // ol is present --> not a sublayer\n }\n registrations.push([id, olLayer]);\n\n // Recurse into nested children.\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n\n try {\n visit(layer);\n } catch (e) {\n // If any error happens, undo the indexing.\n // This way we don't leave a partially indexed layer tree behind.\n for (const [id, olLayer] of registrations) {\n this.#layersById.delete(id);\n if (olLayer) {\n this.#layersByOlLayer.delete(olLayer);\n }\n }\n throw e;\n }\n }\n\n /**\n * Removes index entries for the given layer and all its children.\n */\n #unIndexLayer(layer: AbstractLayer) {\n const visit = (layer: AbstractLayer | AbstractLayerBase) => {\n if (\"olLayer\" in layer) {\n this.#layersByOlLayer.delete(layer.olLayer);\n }\n this.#layersById.delete(layer.id);\n\n for (const childLayer of layer.layers?.[GET_RAW_LAYERS]() ?? []) {\n visit(childLayer);\n }\n\n for (const sublayer of layer.sublayers?.[GET_RAW_SUBLAYERS]() ?? []) {\n visit(sublayer);\n }\n };\n visit(layer);\n }\n\n #getLayerList(pos: OpOrTopmostLayerPos): ReactiveArray<LayerType> {\n switch (pos.which) {\n case \"topmost\":\n return this.#topMostOperationalLayers;\n case \"normal\":\n return this.#operationalLayerOrder;\n }\n }\n\n #findOpOrTopmost(layer: LayerType): OpOrTopmostLayerPos | undefined {\n let index = this.#operationalLayerOrder.indexOf(layer);\n if (index !== -1) {\n return { which: \"normal\", index };\n }\n\n index = this.#topMostOperationalLayers.indexOf(layer);\n if (index !== -1) {\n return { which: \"topmost\", index };\n }\n return undefined;\n }\n\n #getInsertErrorMessage(layer: LayerType, reference: LayerType) {\n let message: string = `Cannot add layer '${layer.id}'. Reference layer '${reference.id}' is not a top level operational layer.`;\n\n if (reference.isBaseLayer) {\n //is base layer\n message += \" Reference layer is a base layer.\";\n } else if (reference.parent) {\n //is child layer\n message += \" Reference layer is child layer of a group.\";\n }\n\n return message;\n }\n}\n\nfunction checkLayerInstance(object: AnyLayer): asserts object is Layer & AbstractLayer {\n if (!(object instanceof AbstractLayer)) {\n throw new Error(\n `Layer is not a valid layer instance. Use one of the classes provided by the map package instead.`\n );\n }\n}\n\nfunction assertNever(_arg: never): never {\n throw new Error(`Internal error: unhandled option.`);\n}\n"],"names":["layer"],"mappings":"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"}
|
package/model/MapModel.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ import { Coordinate } from "ol/coordinate";
|
|
|
7
7
|
import { Geometry } from "ol/geom";
|
|
8
8
|
import { Projection } from "ol/proj";
|
|
9
9
|
import type { StyleLike } from "ol/style/Style";
|
|
10
|
-
import type { BaseFeature } from "../utils/BaseFeature";
|
|
11
10
|
import { LAYER_DEPS, LayerDependencies } from "../layers/shared/internals";
|
|
11
|
+
import type { BaseFeature } from "../utils/BaseFeature";
|
|
12
12
|
import { InternalConstructorTag } from "../utils/InternalConstructorTag";
|
|
13
13
|
import { LayerCollection } from "./LayerCollection";
|
|
14
14
|
import { ExtentConfig } from "./MapConfig";
|
|
@@ -161,6 +161,13 @@ export declare class MapModel {
|
|
|
161
161
|
* > In order to display it, use a format like `1:${scale}`.
|
|
162
162
|
*/
|
|
163
163
|
get scale(): number | undefined;
|
|
164
|
+
/**
|
|
165
|
+
* Returns true if the map is currently loading.
|
|
166
|
+
*
|
|
167
|
+
* This is based on the OpenLayers events `loadstart` and `loadend`,
|
|
168
|
+
* see [Documentation](https://openlayers.org/en/latest/apidoc/module-ol_MapEvent-MapEvent.html#event:loadstart).
|
|
169
|
+
*/
|
|
170
|
+
get loading(): boolean;
|
|
164
171
|
/**
|
|
165
172
|
* Contains all known layers of this map.
|
|
166
173
|
*
|
package/model/MapModel.js
CHANGED
|
@@ -4,12 +4,13 @@ import { createLogger, isAbortError, createManualPromise, createAbortError } fro
|
|
|
4
4
|
import { unByKey } from 'ol/Observable.js';
|
|
5
5
|
import { getCenter } from 'ol/extent.js';
|
|
6
6
|
import { getPointResolution } from 'ol/proj.js';
|
|
7
|
+
import { sourceId$7 as sourceId } from '../_virtual/source-info.js';
|
|
7
8
|
import { LAYER_DEPS } from '../layers/shared/internals.js';
|
|
8
9
|
import { INTERNAL_CONSTRUCTOR_TAG, assertInternalConstructor } from '../utils/InternalConstructorTag.js';
|
|
9
10
|
import { Highlights } from './Highlights.js';
|
|
10
11
|
import { LayerCollection } from './LayerCollection.js';
|
|
11
12
|
|
|
12
|
-
const LOG = createLogger(
|
|
13
|
+
const LOG = createLogger(sourceId);
|
|
13
14
|
const DEFAULT_DPI = 25.4 / 0.28;
|
|
14
15
|
const INCHES_PER_METRE = 39.37;
|
|
15
16
|
class MapModel {
|
|
@@ -20,6 +21,9 @@ class MapModel {
|
|
|
20
21
|
#highlights;
|
|
21
22
|
#layerDeps;
|
|
22
23
|
#destroyed = emitter();
|
|
24
|
+
#loadStartEventHandler;
|
|
25
|
+
#loadEndEventHandler;
|
|
26
|
+
#olLoading = reactive(false);
|
|
23
27
|
#isDestroyed = false;
|
|
24
28
|
#container;
|
|
25
29
|
#initialExtent = reactive();
|
|
@@ -42,6 +46,7 @@ class MapModel {
|
|
|
42
46
|
return () => unByKey(key);
|
|
43
47
|
}
|
|
44
48
|
);
|
|
49
|
+
this.#watchLoadingState();
|
|
45
50
|
this.#initialExtent.value = properties.initialExtent;
|
|
46
51
|
this.#layerDeps = {
|
|
47
52
|
httpService: properties.httpService
|
|
@@ -94,6 +99,10 @@ class MapModel {
|
|
|
94
99
|
} catch (e) {
|
|
95
100
|
LOG.warn(`Unexpected error from event listener during map model destruction:`, e);
|
|
96
101
|
}
|
|
102
|
+
this.#loadStartEventHandler && unByKey(this.#loadStartEventHandler);
|
|
103
|
+
this.#loadStartEventHandler = void 0;
|
|
104
|
+
this.#loadEndEventHandler && unByKey(this.#loadEndEventHandler);
|
|
105
|
+
this.#loadEndEventHandler = void 0;
|
|
97
106
|
this.#abortController.abort();
|
|
98
107
|
this.#displayWaiter?.reject(new Error("Map model was destroyed."));
|
|
99
108
|
this.#layers.destroy();
|
|
@@ -161,6 +170,15 @@ class MapModel {
|
|
|
161
170
|
get scale() {
|
|
162
171
|
return this.#scale.value;
|
|
163
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Returns true if the map is currently loading.
|
|
175
|
+
*
|
|
176
|
+
* This is based on the OpenLayers events `loadstart` and `loadend`,
|
|
177
|
+
* see [Documentation](https://openlayers.org/en/latest/apidoc/module-ol_MapEvent-MapEvent.html#event:loadstart).
|
|
178
|
+
*/
|
|
179
|
+
get loading() {
|
|
180
|
+
return this.#olLoading.value;
|
|
181
|
+
}
|
|
164
182
|
/**
|
|
165
183
|
* Contains all known layers of this map.
|
|
166
184
|
*
|
|
@@ -306,6 +324,19 @@ class MapModel {
|
|
|
306
324
|
throw new Error(`Failed to apply the initial extent.`, { cause: e });
|
|
307
325
|
}
|
|
308
326
|
}
|
|
327
|
+
/**
|
|
328
|
+
* Subscribes to the OpenLayers loading state.
|
|
329
|
+
*/
|
|
330
|
+
#watchLoadingState() {
|
|
331
|
+
this.#loadStartEventHandler = this.#olMap.on("loadstart", () => {
|
|
332
|
+
LOG.debug("Map is loading");
|
|
333
|
+
this.#olLoading.value = true;
|
|
334
|
+
});
|
|
335
|
+
this.#loadEndEventHandler = this.#olMap.on("loadend", () => {
|
|
336
|
+
LOG.debug("Map finished loading");
|
|
337
|
+
this.#olLoading.value = false;
|
|
338
|
+
});
|
|
339
|
+
}
|
|
309
340
|
}
|
|
310
341
|
function createViewBindings(view) {
|
|
311
342
|
return {
|
package/model/MapModel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapModel.js","sources":["MapModel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { computed, reactive, ReadonlyReactive, synchronized } from \"@conterra/reactivity-core\";\nimport { emit, emitter, EventSource } from \"@conterra/reactivity-events\";\nimport type { Resource } from \"@open-pioneer/core\";\nimport {\n createAbortError,\n createLogger,\n createManualPromise,\n isAbortError,\n ManualPromise\n} from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport OlView from \"ol/View\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { EventsKey } from \"ol/events\";\nimport { getCenter } from \"ol/extent\";\nimport { Geometry } from \"ol/geom\";\nimport { getPointResolution, Projection } from \"ol/proj\";\nimport type { StyleLike } from \"ol/style/Style\";\nimport type { BaseFeature } from \"../utils/BaseFeature\";\nimport { LAYER_DEPS, LayerDependencies } from \"../layers/shared/internals\";\nimport {\n assertInternalConstructor,\n INTERNAL_CONSTRUCTOR_TAG,\n InternalConstructorTag\n} from \"../utils/InternalConstructorTag\";\nimport { Highlights } from \"./Highlights\";\nimport { LayerCollection } from \"./LayerCollection\";\nimport { ExtentConfig } from \"./MapConfig\";\n\nconst LOG = createLogger(\"map:MapModel\");\n\nconst DEFAULT_DPI = 25.4 / 0.28;\nconst INCHES_PER_METRE = 39.37;\n\n/**\n * Style options supported when creating a new {@link Highlight}.\n *\n * @group Map Model\n **/\nexport interface HighlightOptions {\n /**\n * Optional styles to override the default styles.\n */\n highlightStyle?: HighlightStyle;\n}\n\n/**\n * Zoom options supported when creating a new {@link Highlight}.\n *\n * @group Map Model\n **/\nexport interface ZoomOptions {\n /**\n * The zoom-level used if there is no valid extend (such as for single points).\n */\n pointZoom?: number;\n\n /**\n * The maximum zoom-level for multiple points, line or polygon results.\n */\n maxZoom?: number;\n\n /**\n * The view padding to make all features visible.\n */\n viewPadding?: MapPadding;\n\n /**\n * The buffer factor around the extent of the zoomed features. E.g. a value of 1.1 will add\n * 10% to specify the size increase of the extent's width and height.\n */\n buffer?: number;\n}\n\n/**\n * Options supported by the map model's {@link MapModel.highlightAndZoom | highlightAndZoom} method.\n *\n * @group Map Model\n **/\nexport interface HighlightZoomOptions extends HighlightOptions, ZoomOptions {}\n\n/**\n * Custom styles when creating a new {@link Highlight}.\n *\n * @group Map Model\n */\nexport type HighlightStyle = {\n Point?: StyleLike;\n LineString?: StyleLike;\n Polygon?: StyleLike;\n MultiPolygon?: StyleLike;\n MultiPoint?: StyleLike;\n MultiLineString?: StyleLike;\n};\n\n/**\n * Map padding, all values are pixels.\n *\n * See https://openlayers.org/en/latest/apidoc/module-ol_View-View.html#padding\n *\n * @group Map Model\n */\nexport interface MapPadding {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n}\n\n/**\n * Represents the additional graphical representations of objects.\n *\n * See also {@link MapModel.highlight}.\n *\n * @group Map Model\n */\nexport interface Highlight extends Resource {\n readonly isActive: boolean;\n}\n\n/**\n * Represents an object in the map.\n *\n * @group Map Model\n */\nexport type DisplayTarget = BaseFeature | Geometry;\n\n/**\n * Represents a map.\n *\n * @group Map Model\n */\nexport class MapModel {\n readonly #id: string;\n readonly #olMap: OlMap;\n readonly #olView: ReadonlyReactive<OlView>;\n readonly #layers = new LayerCollection(this, INTERNAL_CONSTRUCTOR_TAG);\n readonly #highlights: Highlights;\n readonly #layerDeps: LayerDependencies;\n readonly #destroyed = emitter();\n\n #isDestroyed = false;\n #container: ReadonlyReactive<HTMLElement | undefined>;\n #initialExtent = reactive<ExtentConfig>();\n #viewBindings: ReadonlyReactive<ViewBindings>;\n #scale: ReadonlyReactive<number | undefined>;\n\n readonly #abortController = new AbortController();\n #displayStatus: \"waiting\" | \"ready\" | \"error\";\n #displayWaiter: ManualPromise<void> | undefined;\n\n /**\n * @internal\n */\n constructor(\n properties: {\n id: string;\n olMap: OlMap;\n initialExtent: ExtentConfig | undefined;\n httpService: HttpService;\n },\n tag: InternalConstructorTag\n ) {\n assertInternalConstructor(tag);\n this.#id = properties.id;\n this.#olMap = properties.olMap;\n this.#olView = synchronized(\n () => this.#olMap.getView(),\n (cb) => {\n const key = this.#olMap.on(\"change:view\", cb);\n return () => unByKey(key);\n }\n );\n this.#initialExtent.value = properties.initialExtent;\n this.#layerDeps = {\n httpService: properties.httpService\n };\n\n this.#displayStatus = \"waiting\";\n this.#initializeView().then(\n () => {\n this.#displayStatus = \"ready\";\n this.#displayWaiter?.resolve();\n this.#displayWaiter = undefined;\n },\n (error) => {\n if (!isAbortError(error)) {\n LOG.error(`Failed to initialize map`, error);\n }\n\n this.#displayStatus = \"error\";\n this.#displayWaiter?.reject(new Error(`Failed to initialize map.`));\n this.#displayWaiter = undefined;\n }\n );\n\n this.#container = synchronized(\n () => this.#olMap.getTargetElement() ?? undefined,\n (cb) => {\n const key = this.#olMap.on(\"change:target\", cb);\n return () => unByKey(key);\n }\n );\n\n this.#viewBindings = computed(() => createViewBindings(this.#olView.value));\n this.#scale = computed(() => {\n const { projection, resolution, center } = this;\n if (projection == null || resolution == null || center == null) {\n return undefined;\n }\n\n /**\n * Returns the appropriate scale for the given resolution and units, see OpenLayers function getScaleForResolution()\n * https://github.com/openlayers/openlayers/blob/7fa9df03431e9e1bc517e6c414565d9f848a3132/src/ol/control/ScaleLine.js#L454C3-L454C24\n */\n const pointResolution = getPointResolution(projection, resolution, center, \"m\"); //point resolution in meter per pixel\n const scale = Math.round(pointResolution * INCHES_PER_METRE * DEFAULT_DPI);\n return scale;\n });\n\n // expects fully constructed mapModel\n this.#highlights = new Highlights(this, this.#layerDeps);\n }\n\n /**\n * Destroys this objects, including all layers, highlights and the OL map itself.\n */\n destroy() {\n if (this.#isDestroyed) {\n return;\n }\n\n this.#isDestroyed = true;\n try {\n emit(this.#destroyed);\n } catch (e) {\n LOG.warn(`Unexpected error from event listener during map model destruction:`, e);\n }\n\n this.#abortController.abort();\n this.#displayWaiter?.reject(new Error(\"Map model was destroyed.\"));\n this.#layers.destroy();\n this.#highlights.destroy();\n this.#olMap.dispose();\n }\n\n /**\n * Emitted when the map model is destroyed.\n */\n get destroyed(): EventSource<void> {\n return this.#destroyed;\n }\n\n /**\n * The unique id of the map.\n */\n get id(): string {\n return this.#id;\n }\n\n /**\n * The initial map extent.\n *\n * May be undefined before the map is shown.\n * This is guaranteed to be initialized if the promise returned by {@link whenDisplayed} has resolved.\n */\n get initialExtent(): ExtentConfig | undefined {\n return this.#initialExtent.value;\n }\n\n /**\n * Returns the current projection of the map (reactive).\n */\n get projection(): Projection {\n return this.#viewBindings.value.projection;\n }\n\n /**\n * Returns the current center of the map.\n * Same as `olView.getCenter()`, but reactive.\n */\n get center(): Coordinate | undefined {\n return this.#viewBindings.value.center.value;\n }\n\n /**\n * Returns the current resolution of the map.\n * Same as `olView.getResolution()`, but reactive.\n */\n get resolution(): number | undefined {\n return this.#viewBindings.value.resolution.value;\n }\n\n /**\n * Returns the current zoom level of the map.\n * Same as `olView.getZoom()`, but reactive.\n */\n get zoomLevel(): number | undefined {\n return this.#viewBindings.value.zoom.value;\n }\n\n /**\n * Returns the current scale of the map.\n *\n * The scale is a value derived from the current `center`, `resolution` and `projection` of the map.\n * The scale will change when the map is zoomed in our out, but depending on the projection, it may also\n * change when the map is _panned_.\n *\n * > NOTE: Technically, this is the _denominator_ of the current scale.\n * > In order to display it, use a format like `1:${scale}`.\n */\n get scale(): number | undefined {\n return this.#scale.value;\n }\n\n /**\n * Contains all known layers of this map.\n *\n * Note that not all layers in this collection may be active in the OpenLayers map.\n * Also note that not all layers in the OpenLayers map may be contained in this collection.\n */\n get layers(): LayerCollection {\n return this.#layers;\n }\n\n /**\n * The container in which the map is currently being rendered.\n * This is the same as the target element of the underlying OpenLayers map.\n *\n * May be undefined if the map is not being rendered at the moment.\n * May change at runtime.\n */\n get container(): HTMLElement | undefined {\n return this.#container.value;\n }\n\n /**\n * The raw OpenLayers map.\n */\n get olMap(): OlMap {\n return this.#olMap;\n }\n\n /**\n * Returns the current view of the OpenLayers map.\n */\n get olView(): OlView {\n return this.#olView.value;\n }\n\n /**\n * TODO: Can be removed once the LayerFactory is the only supported way of constructing a layer.\n *\n * @internal\n */\n get [LAYER_DEPS](): LayerDependencies {\n return this.#layerDeps;\n }\n\n /**\n * Changes the current scale of the map to the given value.\n *\n * Internally, this computes a new zoom level / resolution based on the scale\n * and the current center.\n * The new resolution is then applied to the current `olView`.\n *\n * See also {@link scale}.\n */\n setScale(newScale: number): void {\n const view = this.olView;\n const projection = this.projection;\n const center = this.center;\n if (!center) {\n return;\n }\n\n const mpu = projection.getMetersPerUnit() ?? 1;\n const resolution = INCHES_PER_METRE * DEFAULT_DPI * mpu;\n const pointResolution = newScale / getPointResolution(projection, resolution, center);\n view.setResolution(pointResolution);\n }\n\n /**\n * Creates a highlight at the given targets.\n *\n * A highlight is a temporary graphic on the map that calls attention to a point or an area.\n *\n * Call `destroy()` on the returned highlight object to remove the highlight again.\n */\n highlight(geometries: DisplayTarget[], options?: HighlightOptions | undefined): Highlight {\n return this.#highlights.addHighlight(geometries, options);\n }\n\n /**\n * Zooms to the given targets.\n */\n zoom(geometries: DisplayTarget[], options?: ZoomOptions | undefined): void {\n this.#highlights.zoomToHighlight(geometries, options);\n }\n\n /**\n * Creates a highlight and zooms to the given targets.\n *\n * See also {@link highlight} and {@link zoom}.\n */\n highlightAndZoom(geometries: DisplayTarget[], options?: HighlightZoomOptions) {\n return this.#highlights.addHighlightAndZoom(geometries, options ?? {});\n }\n\n /**\n * Removes any existing highlights from the map.\n */\n removeHighlights() {\n this.#highlights.clearHighlight();\n }\n\n /**\n * Returns a promise that resolves when the map has mounted in the DOM.\n */\n whenDisplayed(): Promise<void> {\n if (this.#isDestroyed) {\n return Promise.reject(new Error(\"Map model was destroyed.\"));\n }\n if (this.#displayStatus === \"error\") {\n return Promise.reject(new Error(`Failed to initialize map.`));\n }\n if (this.#displayStatus === \"ready\") {\n return Promise.resolve();\n }\n return (this.#displayWaiter ??= createManualPromise()).promise;\n }\n\n /**\n * Waits for the map to be displayed and then initializes the view (if necessary).\n *\n * May simply resolve when done, or throw an error when a problem occurs.\n * AbortError is thrown when cancelled via `this.#abortController`, for example\n * when the map model is destroyed before it has ever been displayed.\n */\n async #initializeView(): Promise<void> {\n try {\n await waitForMapSize(this.olMap, this.#abortController.signal); // may throw on cancel\n } catch (e) {\n if (isAbortError(e)) {\n throw e;\n }\n throw new Error(`Failed to wait for the map to be displayed.`, { cause: e });\n }\n\n try {\n const olMap = this.#olMap;\n const view = olMap.getView();\n\n if (this.#initialExtent.value) {\n // Initial extent was set from the outside. We simply ensure that it gets displayed by the map.\n const extent = this.#initialExtent.value;\n const olExtent = [extent.xMin, extent.yMin, extent.xMax, extent.yMax];\n\n const olCenter = getCenter(olExtent);\n const resolution = view.getResolutionForExtent(olExtent);\n LOG.debug(`Applying initial extent`, extent);\n LOG.debug(` Computed center:`, olCenter);\n LOG.debug(` Computed resolution:`, resolution);\n\n view.setCenter(olCenter);\n view.setResolution(resolution);\n } else {\n // Initial extent was NOT set from the outside.\n // We detect whatever the view is displaying and consider it to be the initial extent.\n const olExtent = view.calculateExtent();\n const [xMin = 0, yMin = 0, xMax = 0, yMax = 0] = olExtent;\n const extent: ExtentConfig = { xMin, yMin, xMax, yMax };\n LOG.debug(`Detected initial extent`, extent);\n\n this.#initialExtent.value = extent;\n }\n } catch (e) {\n throw new Error(`Failed to apply the initial extent.`, { cause: e });\n }\n }\n}\n\ninterface ViewBindings {\n resolution: ReadonlyReactive<number | undefined>;\n center: ReadonlyReactive<Coordinate | undefined>;\n zoom: ReadonlyReactive<number | undefined>;\n projection: Projection; // not reactive (change view to change projection)\n}\n\nfunction createViewBindings(view: OlView): ViewBindings {\n return {\n resolution: synchronized(\n () => view.getResolution(),\n (cb) => {\n const key = view.on(\"change:resolution\", cb);\n return () => unByKey(key);\n }\n ),\n center: synchronized(\n () => view.getCenter(),\n (cb) => {\n const key = view.on(\"change:center\", cb);\n return () => unByKey(key);\n }\n ),\n zoom: synchronized(\n () => view.getZoom(),\n (cb) => {\n const key = view.on(\"change:resolution\", cb);\n return () => unByKey(key);\n }\n ),\n projection: view.getProjection()\n };\n}\n\nfunction waitForMapSize(olMap: OlMap, signal: AbortSignal): Promise<void> {\n const promise = new Promise<void>((resolve, reject) => {\n let eventKey: EventsKey | undefined;\n\n function checkSize() {\n const currentSize = olMap.getSize() ?? [];\n const [width = 0, height = 0] = currentSize;\n if (currentSize && width > 0 && height > 0) {\n finish();\n }\n }\n\n function onAbort() {\n finish(createAbortError());\n }\n\n function finish(error?: Error | undefined) {\n if (eventKey) {\n unByKey(eventKey);\n eventKey = undefined;\n }\n signal.removeEventListener(\"abort\", onAbort);\n\n if (error) {\n reject(error);\n } else {\n resolve(wait(25)); // Give the map some time to render\n }\n }\n\n if (signal.aborted) {\n finish(createAbortError());\n return;\n }\n\n signal.addEventListener(\"abort\", onAbort);\n eventKey = olMap.on(\"change:size\", checkSize);\n });\n return promise;\n}\n\nfunction wait(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MapModel.js","sources":["MapModel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { computed, reactive, ReadonlyReactive, synchronized } from \"@conterra/reactivity-core\";\nimport { emit, emitter, EventSource } from \"@conterra/reactivity-events\";\nimport type { Resource } from \"@open-pioneer/core\";\nimport {\n createAbortError,\n createLogger,\n createManualPromise,\n isAbortError,\n ManualPromise\n} from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport OlView from \"ol/View\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { EventsKey } from \"ol/events\";\nimport { getCenter } from \"ol/extent\";\nimport { Geometry } from \"ol/geom\";\nimport { getPointResolution, Projection } from \"ol/proj\";\nimport type { StyleLike } from \"ol/style/Style\";\nimport { sourceId } from \"open-pioneer:source-info\";\nimport { LAYER_DEPS, LayerDependencies } from \"../layers/shared/internals\";\nimport type { BaseFeature } from \"../utils/BaseFeature\";\nimport {\n assertInternalConstructor,\n INTERNAL_CONSTRUCTOR_TAG,\n InternalConstructorTag\n} from \"../utils/InternalConstructorTag\";\nimport { Highlights } from \"./Highlights\";\nimport { LayerCollection } from \"./LayerCollection\";\nimport { ExtentConfig } from \"./MapConfig\";\n\nconst LOG = createLogger(sourceId);\n\nconst DEFAULT_DPI = 25.4 / 0.28;\nconst INCHES_PER_METRE = 39.37;\n\n/**\n * Style options supported when creating a new {@link Highlight}.\n *\n * @group Map Model\n **/\nexport interface HighlightOptions {\n /**\n * Optional styles to override the default styles.\n */\n highlightStyle?: HighlightStyle;\n}\n\n/**\n * Zoom options supported when creating a new {@link Highlight}.\n *\n * @group Map Model\n **/\nexport interface ZoomOptions {\n /**\n * The zoom-level used if there is no valid extend (such as for single points).\n */\n pointZoom?: number;\n\n /**\n * The maximum zoom-level for multiple points, line or polygon results.\n */\n maxZoom?: number;\n\n /**\n * The view padding to make all features visible.\n */\n viewPadding?: MapPadding;\n\n /**\n * The buffer factor around the extent of the zoomed features. E.g. a value of 1.1 will add\n * 10% to specify the size increase of the extent's width and height.\n */\n buffer?: number;\n}\n\n/**\n * Options supported by the map model's {@link MapModel.highlightAndZoom | highlightAndZoom} method.\n *\n * @group Map Model\n **/\nexport interface HighlightZoomOptions extends HighlightOptions, ZoomOptions {}\n\n/**\n * Custom styles when creating a new {@link Highlight}.\n *\n * @group Map Model\n */\nexport type HighlightStyle = {\n Point?: StyleLike;\n LineString?: StyleLike;\n Polygon?: StyleLike;\n MultiPolygon?: StyleLike;\n MultiPoint?: StyleLike;\n MultiLineString?: StyleLike;\n};\n\n/**\n * Map padding, all values are pixels.\n *\n * See https://openlayers.org/en/latest/apidoc/module-ol_View-View.html#padding\n *\n * @group Map Model\n */\nexport interface MapPadding {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n}\n\n/**\n * Represents the additional graphical representations of objects.\n *\n * See also {@link MapModel.highlight}.\n *\n * @group Map Model\n */\nexport interface Highlight extends Resource {\n readonly isActive: boolean;\n}\n\n/**\n * Represents an object in the map.\n *\n * @group Map Model\n */\nexport type DisplayTarget = BaseFeature | Geometry;\n\n/**\n * Represents a map.\n *\n * @group Map Model\n */\nexport class MapModel {\n readonly #id: string;\n readonly #olMap: OlMap;\n readonly #olView: ReadonlyReactive<OlView>;\n readonly #layers = new LayerCollection(this, INTERNAL_CONSTRUCTOR_TAG);\n readonly #highlights: Highlights;\n readonly #layerDeps: LayerDependencies;\n readonly #destroyed = emitter();\n\n #loadStartEventHandler: EventsKey | undefined;\n #loadEndEventHandler: EventsKey | undefined;\n readonly #olLoading = reactive(false);\n\n #isDestroyed = false;\n #container: ReadonlyReactive<HTMLElement | undefined>;\n #initialExtent = reactive<ExtentConfig>();\n #viewBindings: ReadonlyReactive<ViewBindings>;\n #scale: ReadonlyReactive<number | undefined>;\n\n readonly #abortController = new AbortController();\n #displayStatus: \"waiting\" | \"ready\" | \"error\";\n #displayWaiter: ManualPromise<void> | undefined;\n\n /**\n * @internal\n */\n constructor(\n properties: {\n id: string;\n olMap: OlMap;\n initialExtent: ExtentConfig | undefined;\n httpService: HttpService;\n },\n tag: InternalConstructorTag\n ) {\n assertInternalConstructor(tag);\n\n this.#id = properties.id;\n this.#olMap = properties.olMap;\n this.#olView = synchronized(\n () => this.#olMap.getView(),\n (cb) => {\n const key = this.#olMap.on(\"change:view\", cb);\n return () => unByKey(key);\n }\n );\n\n // NOTE: As early as possible (before any async actions) so we don't miss any events.\n this.#watchLoadingState();\n\n this.#initialExtent.value = properties.initialExtent;\n this.#layerDeps = {\n httpService: properties.httpService\n };\n\n this.#displayStatus = \"waiting\";\n this.#initializeView().then(\n () => {\n this.#displayStatus = \"ready\";\n this.#displayWaiter?.resolve();\n this.#displayWaiter = undefined;\n },\n (error) => {\n if (!isAbortError(error)) {\n LOG.error(`Failed to initialize map`, error);\n }\n\n this.#displayStatus = \"error\";\n this.#displayWaiter?.reject(new Error(`Failed to initialize map.`));\n this.#displayWaiter = undefined;\n }\n );\n\n this.#container = synchronized(\n () => this.#olMap.getTargetElement() ?? undefined,\n (cb) => {\n const key = this.#olMap.on(\"change:target\", cb);\n return () => unByKey(key);\n }\n );\n\n this.#viewBindings = computed(() => createViewBindings(this.#olView.value));\n this.#scale = computed(() => {\n const { projection, resolution, center } = this;\n if (projection == null || resolution == null || center == null) {\n return undefined;\n }\n\n /**\n * Returns the appropriate scale for the given resolution and units, see OpenLayers function getScaleForResolution()\n * https://github.com/openlayers/openlayers/blob/7fa9df03431e9e1bc517e6c414565d9f848a3132/src/ol/control/ScaleLine.js#L454C3-L454C24\n */\n const pointResolution = getPointResolution(projection, resolution, center, \"m\"); //point resolution in meter per pixel\n const scale = Math.round(pointResolution * INCHES_PER_METRE * DEFAULT_DPI);\n return scale;\n });\n\n // expects fully constructed mapModel\n this.#highlights = new Highlights(this, this.#layerDeps);\n }\n\n /**\n * Destroys this objects, including all layers, highlights and the OL map itself.\n */\n destroy() {\n if (this.#isDestroyed) {\n return;\n }\n\n this.#isDestroyed = true;\n try {\n emit(this.#destroyed);\n } catch (e) {\n LOG.warn(`Unexpected error from event listener during map model destruction:`, e);\n }\n\n this.#loadStartEventHandler && unByKey(this.#loadStartEventHandler);\n this.#loadStartEventHandler = undefined;\n this.#loadEndEventHandler && unByKey(this.#loadEndEventHandler);\n this.#loadEndEventHandler = undefined;\n\n this.#abortController.abort();\n this.#displayWaiter?.reject(new Error(\"Map model was destroyed.\"));\n this.#layers.destroy();\n this.#highlights.destroy();\n this.#olMap.dispose();\n }\n\n /**\n * Emitted when the map model is destroyed.\n */\n get destroyed(): EventSource<void> {\n return this.#destroyed;\n }\n\n /**\n * The unique id of the map.\n */\n get id(): string {\n return this.#id;\n }\n\n /**\n * The initial map extent.\n *\n * May be undefined before the map is shown.\n * This is guaranteed to be initialized if the promise returned by {@link whenDisplayed} has resolved.\n */\n get initialExtent(): ExtentConfig | undefined {\n return this.#initialExtent.value;\n }\n\n /**\n * Returns the current projection of the map (reactive).\n */\n get projection(): Projection {\n return this.#viewBindings.value.projection;\n }\n\n /**\n * Returns the current center of the map.\n * Same as `olView.getCenter()`, but reactive.\n */\n get center(): Coordinate | undefined {\n return this.#viewBindings.value.center.value;\n }\n\n /**\n * Returns the current resolution of the map.\n * Same as `olView.getResolution()`, but reactive.\n */\n get resolution(): number | undefined {\n return this.#viewBindings.value.resolution.value;\n }\n\n /**\n * Returns the current zoom level of the map.\n * Same as `olView.getZoom()`, but reactive.\n */\n get zoomLevel(): number | undefined {\n return this.#viewBindings.value.zoom.value;\n }\n\n /**\n * Returns the current scale of the map.\n *\n * The scale is a value derived from the current `center`, `resolution` and `projection` of the map.\n * The scale will change when the map is zoomed in our out, but depending on the projection, it may also\n * change when the map is _panned_.\n *\n * > NOTE: Technically, this is the _denominator_ of the current scale.\n * > In order to display it, use a format like `1:${scale}`.\n */\n get scale(): number | undefined {\n return this.#scale.value;\n }\n\n /**\n * Returns true if the map is currently loading.\n *\n * This is based on the OpenLayers events `loadstart` and `loadend`,\n * see [Documentation](https://openlayers.org/en/latest/apidoc/module-ol_MapEvent-MapEvent.html#event:loadstart).\n */\n get loading(): boolean {\n return this.#olLoading.value;\n }\n\n /**\n * Contains all known layers of this map.\n *\n * Note that not all layers in this collection may be active in the OpenLayers map.\n * Also note that not all layers in the OpenLayers map may be contained in this collection.\n */\n get layers(): LayerCollection {\n return this.#layers;\n }\n\n /**\n * The container in which the map is currently being rendered.\n * This is the same as the target element of the underlying OpenLayers map.\n *\n * May be undefined if the map is not being rendered at the moment.\n * May change at runtime.\n */\n get container(): HTMLElement | undefined {\n return this.#container.value;\n }\n\n /**\n * The raw OpenLayers map.\n */\n get olMap(): OlMap {\n return this.#olMap;\n }\n\n /**\n * Returns the current view of the OpenLayers map.\n */\n get olView(): OlView {\n return this.#olView.value;\n }\n\n /**\n * TODO: Can be removed once the LayerFactory is the only supported way of constructing a layer.\n *\n * @internal\n */\n get [LAYER_DEPS](): LayerDependencies {\n return this.#layerDeps;\n }\n\n /**\n * Changes the current scale of the map to the given value.\n *\n * Internally, this computes a new zoom level / resolution based on the scale\n * and the current center.\n * The new resolution is then applied to the current `olView`.\n *\n * See also {@link scale}.\n */\n setScale(newScale: number): void {\n const view = this.olView;\n const projection = this.projection;\n const center = this.center;\n if (!center) {\n return;\n }\n\n const mpu = projection.getMetersPerUnit() ?? 1;\n const resolution = INCHES_PER_METRE * DEFAULT_DPI * mpu;\n const pointResolution = newScale / getPointResolution(projection, resolution, center);\n view.setResolution(pointResolution);\n }\n\n /**\n * Creates a highlight at the given targets.\n *\n * A highlight is a temporary graphic on the map that calls attention to a point or an area.\n *\n * Call `destroy()` on the returned highlight object to remove the highlight again.\n */\n highlight(geometries: DisplayTarget[], options?: HighlightOptions | undefined): Highlight {\n return this.#highlights.addHighlight(geometries, options);\n }\n\n /**\n * Zooms to the given targets.\n */\n zoom(geometries: DisplayTarget[], options?: ZoomOptions | undefined): void {\n this.#highlights.zoomToHighlight(geometries, options);\n }\n\n /**\n * Creates a highlight and zooms to the given targets.\n *\n * See also {@link highlight} and {@link zoom}.\n */\n highlightAndZoom(geometries: DisplayTarget[], options?: HighlightZoomOptions) {\n return this.#highlights.addHighlightAndZoom(geometries, options ?? {});\n }\n\n /**\n * Removes any existing highlights from the map.\n */\n removeHighlights() {\n this.#highlights.clearHighlight();\n }\n\n /**\n * Returns a promise that resolves when the map has mounted in the DOM.\n */\n whenDisplayed(): Promise<void> {\n if (this.#isDestroyed) {\n return Promise.reject(new Error(\"Map model was destroyed.\"));\n }\n if (this.#displayStatus === \"error\") {\n return Promise.reject(new Error(`Failed to initialize map.`));\n }\n if (this.#displayStatus === \"ready\") {\n return Promise.resolve();\n }\n return (this.#displayWaiter ??= createManualPromise()).promise;\n }\n\n /**\n * Waits for the map to be displayed and then initializes the view (if necessary).\n *\n * May simply resolve when done, or throw an error when a problem occurs.\n * AbortError is thrown when cancelled via `this.#abortController`, for example\n * when the map model is destroyed before it has ever been displayed.\n */\n async #initializeView(): Promise<void> {\n try {\n await waitForMapSize(this.olMap, this.#abortController.signal); // may throw on cancel\n } catch (e) {\n if (isAbortError(e)) {\n throw e;\n }\n throw new Error(`Failed to wait for the map to be displayed.`, { cause: e });\n }\n\n try {\n const olMap = this.#olMap;\n const view = olMap.getView();\n\n if (this.#initialExtent.value) {\n // Initial extent was set from the outside. We simply ensure that it gets displayed by the map.\n const extent = this.#initialExtent.value;\n const olExtent = [extent.xMin, extent.yMin, extent.xMax, extent.yMax];\n\n const olCenter = getCenter(olExtent);\n const resolution = view.getResolutionForExtent(olExtent);\n LOG.debug(`Applying initial extent`, extent);\n LOG.debug(` Computed center:`, olCenter);\n LOG.debug(` Computed resolution:`, resolution);\n\n view.setCenter(olCenter);\n view.setResolution(resolution);\n } else {\n // Initial extent was NOT set from the outside.\n // We detect whatever the view is displaying and consider it to be the initial extent.\n const olExtent = view.calculateExtent();\n const [xMin = 0, yMin = 0, xMax = 0, yMax = 0] = olExtent;\n const extent: ExtentConfig = { xMin, yMin, xMax, yMax };\n LOG.debug(`Detected initial extent`, extent);\n\n this.#initialExtent.value = extent;\n }\n } catch (e) {\n throw new Error(`Failed to apply the initial extent.`, { cause: e });\n }\n }\n\n /**\n * Subscribes to the OpenLayers loading state.\n */\n #watchLoadingState() {\n this.#loadStartEventHandler = this.#olMap.on(\"loadstart\", () => {\n LOG.debug(\"Map is loading\");\n this.#olLoading.value = true;\n });\n this.#loadEndEventHandler = this.#olMap.on(\"loadend\", () => {\n LOG.debug(\"Map finished loading\");\n this.#olLoading.value = false;\n });\n }\n}\n\ninterface ViewBindings {\n resolution: ReadonlyReactive<number | undefined>;\n center: ReadonlyReactive<Coordinate | undefined>;\n zoom: ReadonlyReactive<number | undefined>;\n projection: Projection; // not reactive (change view to change projection)\n}\n\nfunction createViewBindings(view: OlView): ViewBindings {\n return {\n resolution: synchronized(\n () => view.getResolution(),\n (cb) => {\n const key = view.on(\"change:resolution\", cb);\n return () => unByKey(key);\n }\n ),\n center: synchronized(\n () => view.getCenter(),\n (cb) => {\n const key = view.on(\"change:center\", cb);\n return () => unByKey(key);\n }\n ),\n zoom: synchronized(\n () => view.getZoom(),\n (cb) => {\n const key = view.on(\"change:resolution\", cb);\n return () => unByKey(key);\n }\n ),\n projection: view.getProjection()\n };\n}\n\nfunction waitForMapSize(olMap: OlMap, signal: AbortSignal): Promise<void> {\n const promise = new Promise<void>((resolve, reject) => {\n let eventKey: EventsKey | undefined;\n\n function checkSize() {\n const currentSize = olMap.getSize() ?? [];\n const [width = 0, height = 0] = currentSize;\n if (currentSize && width > 0 && height > 0) {\n finish();\n }\n }\n\n function onAbort() {\n finish(createAbortError());\n }\n\n function finish(error?: Error | undefined) {\n if (eventKey) {\n unByKey(eventKey);\n eventKey = undefined;\n }\n signal.removeEventListener(\"abort\", onAbort);\n\n if (error) {\n reject(error);\n } else {\n resolve(wait(25)); // Give the map some time to render\n }\n }\n\n if (signal.aborted) {\n finish(createAbortError());\n return;\n }\n\n signal.addEventListener(\"abort\", onAbort);\n eventKey = olMap.on(\"change:size\", checkSize);\n });\n return promise;\n}\n\nfunction wait(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n"],"names":[],"mappings":"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"}
|
package/model/createMapModel.js
CHANGED
|
@@ -8,6 +8,7 @@ import { defaults, DragZoom } from 'ol/interaction.js';
|
|
|
8
8
|
import TileLayer from 'ol/layer/Tile.js';
|
|
9
9
|
import { get } from 'ol/proj.js';
|
|
10
10
|
import OSM from 'ol/source/OSM.js';
|
|
11
|
+
import { sourceId$8 as sourceId } from '../_virtual/source-info.js';
|
|
11
12
|
import { INTERNAL_CONSTRUCTOR_TAG } from '../utils/InternalConstructorTag.js';
|
|
12
13
|
import { patchOpenLayersClassesForTesting } from '../utils/ol-test-support.js';
|
|
13
14
|
import { registerProjections } from '../utils/projections.js';
|
|
@@ -17,7 +18,7 @@ registerProjections({
|
|
|
17
18
|
"EPSG:25832": "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs",
|
|
18
19
|
"EPSG:25833": "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs"
|
|
19
20
|
});
|
|
20
|
-
const LOG = createLogger(
|
|
21
|
+
const LOG = createLogger(sourceId);
|
|
21
22
|
async function createMapModel(mapId, mapConfig, intl, httpService) {
|
|
22
23
|
return await new MapModelFactory(mapId, mapConfig, intl, httpService).createMapModel();
|
|
23
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMapModel.js","sources":["createMapModel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { batch } from \"@conterra/reactivity-core\";\nimport { createLogger } from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { MapBrowserEvent } from \"ol\";\nimport OlMap, { MapOptions } from \"ol/Map\";\nimport View, { ViewOptions } from \"ol/View\";\nimport Attribution from \"ol/control/Attribution\";\nimport { getCenter } from \"ol/extent\";\nimport { DragZoom, defaults as defaultInteractions } from \"ol/interaction\";\nimport TileLayer from \"ol/layer/Tile\";\nimport { Projection, get as getProjection } from \"ol/proj\";\nimport OSM from \"ol/source/OSM\";\nimport { INTERNAL_CONSTRUCTOR_TAG } from \"../utils/InternalConstructorTag\";\nimport { patchOpenLayersClassesForTesting } from \"../utils/ol-test-support\";\nimport { registerProjections } from \"../utils/projections\";\nimport { MapConfig } from \"./MapConfig\";\nimport { MapModel } from \"./MapModel\";\n\n/**\n * Register custom projection to the global proj4js definitions. User can select `EPSG:25832`\n * and `EPSG:25833` from the predefined projections without calling `registerProjections`.\n */\nregisterProjections({\n \"EPSG:25832\":\n \"+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs\",\n \"EPSG:25833\":\n \"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs\"\n});\nconst LOG = createLogger(\"map:createMapModel\");\n\nexport async function createMapModel(\n mapId: string,\n mapConfig: MapConfig,\n intl: PackageIntl,\n httpService: HttpService\n): Promise<MapModel> {\n return await new MapModelFactory(mapId, mapConfig, intl, httpService).createMapModel();\n}\n\nclass MapModelFactory {\n private mapId: string;\n private mapConfig: MapConfig;\n private intl: PackageIntl;\n private httpService: HttpService;\n\n constructor(mapId: string, mapConfig: MapConfig, intl: PackageIntl, httpService: HttpService) {\n this.mapId = mapId;\n this.mapConfig = mapConfig;\n this.intl = intl;\n this.httpService = httpService;\n }\n\n async createMapModel() {\n const mapId = this.mapId;\n const mapConfig = this.mapConfig;\n const { view: viewOption, ...rawOlOptions } = mapConfig.advanced ?? {};\n const mapOptions: MapOptions = {\n ...rawOlOptions\n };\n\n if (!mapOptions.controls) {\n mapOptions.controls = [createDefaultAttribution(this.intl)];\n }\n\n if (!mapOptions.interactions) {\n const shiftCtrlKeysOnly = (\n mapBrowserEvent: MapBrowserEvent<KeyboardEvent | WheelEvent | PointerEvent>\n ) => {\n const originalEvent = mapBrowserEvent.originalEvent;\n return (originalEvent.metaKey || originalEvent.ctrlKey) && originalEvent.shiftKey;\n };\n\n // setting altShiftDragRotate to false disables or excludes DragRotate interaction\n mapOptions.interactions = defaultInteractions({\n dragPan: true,\n altShiftDragRotate: false,\n pinchRotate: false,\n mouseWheelZoom: true\n }).extend([new DragZoom({ out: true, condition: shiftCtrlKeysOnly })]);\n }\n\n const view = (await viewOption) ?? {};\n this.initializeViewOptions(view);\n mapOptions.view = view instanceof View ? view : new View(view);\n\n if (!mapOptions.layers && !mapConfig.layers) {\n mapOptions.layers = [\n new TileLayer({\n source: new OSM()\n })\n ];\n }\n\n const initialView = mapConfig.initialView;\n const initialExtent = initialView?.kind === \"extent\" ? initialView.extent : undefined;\n\n LOG.debug(`Constructing OpenLayers map with options`, mapOptions);\n\n if (import.meta.env.VITEST) {\n patchOpenLayersClassesForTesting();\n }\n\n const olMap = new OlMap(mapOptions);\n const mapModel = new MapModel(\n {\n id: mapId,\n olMap,\n initialExtent,\n httpService: this.httpService\n },\n INTERNAL_CONSTRUCTOR_TAG\n );\n\n return batch(() => {\n try {\n if (mapConfig.layers) {\n for (const layerConfig of mapConfig.layers) {\n mapModel.layers.addLayer(layerConfig);\n }\n }\n return mapModel;\n } catch (e) {\n mapModel.destroy();\n throw e;\n }\n });\n }\n\n private initializeViewOptions(view: View | ViewOptions) {\n const mapId = this.mapId;\n const mapConfig = this.mapConfig;\n if (view instanceof View) {\n const warn = (prop: string) => {\n LOG.warn(\n `The advanced configuration for map id '${mapId}' has provided a fully constructed view instance: ${prop} cannot be applied.\\n` +\n `Use ViewOptions instead of a View instance.`\n );\n };\n\n if (mapConfig.projection != null) {\n warn(\"projection\");\n }\n if (mapConfig.initialView != null) {\n warn(\"initialView\");\n }\n return;\n }\n\n const projection = (view.projection = this.initializeProjection(mapConfig.projection));\n const initialView = mapConfig.initialView;\n if (initialView) {\n switch (initialView.kind) {\n case \"position\":\n view.zoom = initialView.zoom;\n view.center = [initialView.center.x, initialView.center.y];\n break;\n case \"extent\": {\n /*\n OpenLayers does not support configuration of the initial map extent.\n The only relevant options here are center, zoom (and resolution).\n We must set those values because otherwise OpenLayers will not initialize layer sources.\n\n The actual initial extent is applied once tha map has loaded and its size is known.\n */\n const extent = initialView.extent;\n view.zoom = 0;\n view.center = [\n extent.xMin + (extent.xMax - extent.xMin) / 2,\n extent.yMin + (extent.yMax - extent.yMin) / 2\n ];\n break;\n }\n }\n } else {\n this.setViewDefaults(view, projection);\n }\n }\n\n private setViewDefaults(view: ViewOptions, projection: Projection) {\n if (view.center == null) {\n const extent = projection.getExtent(); // can be null\n if (!extent) {\n LOG.warn(\n `Cannot set default center coordinate because the current projection has no associated extent.\\n` +\n `Try to configure 'initialView' explicity.`\n );\n } else {\n view.center = getCenter(extent);\n }\n }\n\n if (view.zoom == null || view.resolution == null) {\n view.zoom = 0;\n }\n }\n\n private initializeProjection(projectionOption: MapConfig[\"projection\"]) {\n if (projectionOption == null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return getProjection(\"EPSG:3857\")!; // default OpenLayers projection\n }\n\n const projection = getProjection(projectionOption);\n if (!projection) {\n throw new Error(`Failed to retrieve projection for code '${projectionOption}'.`);\n }\n return projection;\n }\n}\n\nfunction createDefaultAttribution(intl: PackageIntl): Attribution {\n const attr = new Attribution({ collapsible: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const element = (attr as any).element as HTMLElement | undefined;\n if (element) {\n element.role = \"region\";\n element.ariaLabel = intl.formatMessage({ id: \"attribution.label\" });\n }\n return attr;\n}\n"],"names":["defaultInteractions","getProjection"],"mappings":";;;;;;;;;;;;;;;AAyBA,mBAAA,CAAoB;AAAA,EAChB,YAAA,EACI,oFAAA;AAAA,EACJ,YAAA,EACI;AACR,CAAC,CAAA;AACD,MAAM,GAAA,GAAM,aAAa,oBAAoB,CAAA;AAE7C,eAAsB,cAAA,CAClB,KAAA,EACA,SAAA,EACA,IAAA,EACA,WAAA,EACiB;AACjB,EAAA,OAAO,MAAM,IAAI,eAAA,CAAgB,KAAA,EAAO,WAAW,IAAA,EAAM,WAAW,EAAE,cAAA,EAAe;AACzF;AAEA,MAAM,eAAA,CAAgB;AAAA,EACV,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EAER,WAAA,CAAY,KAAA,EAAe,SAAA,EAAsB,IAAA,EAAmB,WAAA,EAA0B;AAC1F,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACvB;AAAA,EAEA,MAAM,cAAA,GAAiB;AACnB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,MAAM,EAAE,MAAM,UAAA,EAAY,GAAG,cAAa,GAAI,SAAA,CAAU,YAAY,EAAC;AACrE,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC3B,GAAG;AAAA,KACP;AAEA,IAAA,IAAI,CAAC,WAAW,QAAA,EAAU;AACtB,MAAA,UAAA,CAAW,QAAA,GAAW,CAAC,wBAAA,CAAyB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,CAAC,WAAW,YAAA,EAAc;AAC1B,MAAA,MAAM,iBAAA,GAAoB,CACtB,eAAA,KACC;AACD,QAAA,MAAM,gBAAgB,eAAA,CAAgB,aAAA;AACtC,QAAA,OAAA,CAAQ,aAAA,CAAc,OAAA,IAAW,aAAA,CAAc,OAAA,KAAY,aAAA,CAAc,QAAA;AAAA,MAC7E,CAAA;AAGA,MAAA,UAAA,CAAW,eAAeA,QAAA,CAAoB;AAAA,QAC1C,OAAA,EAAS,IAAA;AAAA,QACT,kBAAA,EAAoB,KAAA;AAAA,QACpB,WAAA,EAAa,KAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OACnB,CAAA,CAAE,MAAA,CAAO,CAAC,IAAI,QAAA,CAAS,EAAE,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,iBAAA,EAAmB,CAAC,CAAC,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,IAAA,GAAQ,MAAM,UAAA,IAAe,EAAC;AACpC,IAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAC/B,IAAA,UAAA,CAAW,OAAO,IAAA,YAAgB,IAAA,GAAO,IAAA,GAAO,IAAI,KAAK,IAAI,CAAA;AAE7D,IAAA,IAAI,CAAC,UAAA,CAAW,MAAA,IAAU,CAAC,UAAU,MAAA,EAAQ;AACzC,MAAA,UAAA,CAAW,MAAA,GAAS;AAAA,QAChB,IAAI,SAAA,CAAU;AAAA,UACV,MAAA,EAAQ,IAAI,GAAA;AAAI,SACnB;AAAA,OACL;AAAA,IACJ;AAEA,IAAA,MAAM,cAAc,SAAA,CAAU,WAAA;AAC9B,IAAA,MAAM,aAAA,GAAgB,WAAA,EAAa,IAAA,KAAS,QAAA,GAAW,YAAY,MAAA,GAAS,MAAA;AAE5E,IAAA,GAAA,CAAI,KAAA,CAAM,4CAA4C,UAAU,CAAA;AAEhE,IAAA,IAAI,MAAA,CAAA,IAAA,CAAY,IAAI,MAAA,EAAQ;AACxB,MAAA,gCAAA,EAAiC;AAAA,IACrC;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,UAAU,CAAA;AAClC,IAAA,MAAM,WAAW,IAAI,QAAA;AAAA,MACjB;AAAA,QACI,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA;AAAA,QACA,aAAA;AAAA,QACA,aAAa,IAAA,CAAK;AAAA,OACtB;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,OAAO,MAAM,MAAM;AACf,MAAA,IAAI;AACA,QAAA,IAAI,UAAU,MAAA,EAAQ;AAClB,UAAA,KAAA,MAAW,WAAA,IAAe,UAAU,MAAA,EAAQ;AACxC,YAAA,QAAA,CAAS,MAAA,CAAO,SAAS,WAAW,CAAA;AAAA,UACxC;AAAA,QACJ;AACA,QAAA,OAAO,QAAA;AAAA,MACX,SAAS,CAAA,EAAG;AACR,QAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,QAAA,MAAM,CAAA;AAAA,MACV;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,sBAAsB,IAAA,EAA0B;AACpD,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACtB,MAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB;AAC3B,QAAA,GAAA,CAAI,IAAA;AAAA,UACA,CAAA,uCAAA,EAA0C,KAAK,CAAA,kDAAA,EAAqD,IAAI,CAAA;AAAA,2CAAA;AAAA,SAE5G;AAAA,MACJ,CAAA;AAEA,MAAA,IAAI,SAAA,CAAU,cAAc,IAAA,EAAM;AAC9B,QAAA,IAAA,CAAK,YAAY,CAAA;AAAA,MACrB;AACA,MAAA,IAAI,SAAA,CAAU,eAAe,IAAA,EAAM;AAC/B,QAAA,IAAA,CAAK,aAAa,CAAA;AAAA,MACtB;AACA,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,aAAc,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,oBAAA,CAAqB,UAAU,UAAU,CAAA;AACpF,IAAA,MAAM,cAAc,SAAA,CAAU,WAAA;AAC9B,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,QAAQ,YAAY,IAAA;AAAM,QACtB,KAAK,UAAA;AACD,UAAA,IAAA,CAAK,OAAO,WAAA,CAAY,IAAA;AACxB,UAAA,IAAA,CAAK,SAAS,CAAC,WAAA,CAAY,OAAO,CAAA,EAAG,WAAA,CAAY,OAAO,CAAC,CAAA;AACzD,UAAA;AAAA,QACJ,KAAK,QAAA,EAAU;AAQX,UAAA,MAAM,SAAS,WAAA,CAAY,MAAA;AAC3B,UAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,UAAA,IAAA,CAAK,MAAA,GAAS;AAAA,YACV,MAAA,CAAO,IAAA,GAAA,CAAQ,MAAA,CAAO,IAAA,GAAO,OAAO,IAAA,IAAQ,CAAA;AAAA,YAC5C,MAAA,CAAO,IAAA,GAAA,CAAQ,MAAA,CAAO,IAAA,GAAO,OAAO,IAAA,IAAQ;AAAA,WAChD;AACA,UAAA;AAAA,QACJ;AAAA;AACJ,IACJ,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,UAAU,CAAA;AAAA,IACzC;AAAA,EACJ;AAAA,EAEQ,eAAA,CAAgB,MAAmB,UAAA,EAAwB;AAC/D,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACrB,MAAA,MAAM,MAAA,GAAS,WAAW,SAAA,EAAU;AACpC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,GAAA,CAAI,IAAA;AAAA,UACA,CAAA;AAAA,yCAAA;AAAA,SAEJ;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,MAAA,GAAS,UAAU,MAAM,CAAA;AAAA,MAClC;AAAA,IACJ;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,IAAQ,IAAA,CAAK,cAAc,IAAA,EAAM;AAC9C,MAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AAAA,IAChB;AAAA,EACJ;AAAA,EAEQ,qBAAqB,gBAAA,EAA2C;AACpE,IAAA,IAAI,oBAAoB,IAAA,EAAM;AAE1B,MAAA,OAAOC,IAAc,WAAW,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,UAAA,GAAaA,IAAc,gBAAgB,CAAA;AACjD,IAAA,IAAI,CAAC,UAAA,EAAY;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,gBAAgB,CAAA,EAAA,CAAI,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,UAAA;AAAA,EACX;AACJ;AAEA,SAAS,yBAAyB,IAAA,EAAgC;AAC9D,EAAA,MAAM,OAAO,IAAI,WAAA,CAAY,EAAE,WAAA,EAAa,OAAO,CAAA;AAEnD,EAAA,MAAM,UAAW,IAAA,CAAa,OAAA;AAC9B,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AACf,IAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,aAAA,CAAc,EAAE,EAAA,EAAI,qBAAqB,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,IAAA;AACX;;;;"}
|
|
1
|
+
{"version":3,"file":"createMapModel.js","sources":["createMapModel.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { batch } from \"@conterra/reactivity-core\";\nimport { createLogger } from \"@open-pioneer/core\";\nimport { HttpService } from \"@open-pioneer/http\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport { MapBrowserEvent } from \"ol\";\nimport OlMap, { MapOptions } from \"ol/Map\";\nimport View, { ViewOptions } from \"ol/View\";\nimport Attribution from \"ol/control/Attribution\";\nimport { getCenter } from \"ol/extent\";\nimport { DragZoom, defaults as defaultInteractions } from \"ol/interaction\";\nimport TileLayer from \"ol/layer/Tile\";\nimport { Projection, get as getProjection } from \"ol/proj\";\nimport OSM from \"ol/source/OSM\";\nimport { sourceId } from \"open-pioneer:source-info\";\nimport { INTERNAL_CONSTRUCTOR_TAG } from \"../utils/InternalConstructorTag\";\nimport { patchOpenLayersClassesForTesting } from \"../utils/ol-test-support\";\nimport { registerProjections } from \"../utils/projections\";\nimport { MapConfig } from \"./MapConfig\";\nimport { MapModel } from \"./MapModel\";\n\n/**\n * Register custom projection to the global proj4js definitions. User can select `EPSG:25832`\n * and `EPSG:25833` from the predefined projections without calling `registerProjections`.\n */\nregisterProjections({\n \"EPSG:25832\":\n \"+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs\",\n \"EPSG:25833\":\n \"+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs\"\n});\nconst LOG = createLogger(sourceId);\n\nexport async function createMapModel(\n mapId: string,\n mapConfig: MapConfig,\n intl: PackageIntl,\n httpService: HttpService\n): Promise<MapModel> {\n return await new MapModelFactory(mapId, mapConfig, intl, httpService).createMapModel();\n}\n\nclass MapModelFactory {\n private mapId: string;\n private mapConfig: MapConfig;\n private intl: PackageIntl;\n private httpService: HttpService;\n\n constructor(mapId: string, mapConfig: MapConfig, intl: PackageIntl, httpService: HttpService) {\n this.mapId = mapId;\n this.mapConfig = mapConfig;\n this.intl = intl;\n this.httpService = httpService;\n }\n\n async createMapModel() {\n const mapId = this.mapId;\n const mapConfig = this.mapConfig;\n const { view: viewOption, ...rawOlOptions } = mapConfig.advanced ?? {};\n const mapOptions: MapOptions = {\n ...rawOlOptions\n };\n\n if (!mapOptions.controls) {\n mapOptions.controls = [createDefaultAttribution(this.intl)];\n }\n\n if (!mapOptions.interactions) {\n const shiftCtrlKeysOnly = (\n mapBrowserEvent: MapBrowserEvent<KeyboardEvent | WheelEvent | PointerEvent>\n ) => {\n const originalEvent = mapBrowserEvent.originalEvent;\n return (originalEvent.metaKey || originalEvent.ctrlKey) && originalEvent.shiftKey;\n };\n\n // setting altShiftDragRotate to false disables or excludes DragRotate interaction\n mapOptions.interactions = defaultInteractions({\n dragPan: true,\n altShiftDragRotate: false,\n pinchRotate: false,\n mouseWheelZoom: true\n }).extend([new DragZoom({ out: true, condition: shiftCtrlKeysOnly })]);\n }\n\n const view = (await viewOption) ?? {};\n this.initializeViewOptions(view);\n mapOptions.view = view instanceof View ? view : new View(view);\n\n if (!mapOptions.layers && !mapConfig.layers) {\n mapOptions.layers = [\n new TileLayer({\n source: new OSM()\n })\n ];\n }\n\n const initialView = mapConfig.initialView;\n const initialExtent = initialView?.kind === \"extent\" ? initialView.extent : undefined;\n\n LOG.debug(`Constructing OpenLayers map with options`, mapOptions);\n\n if (import.meta.env.VITEST) {\n patchOpenLayersClassesForTesting();\n }\n\n const olMap = new OlMap(mapOptions);\n const mapModel = new MapModel(\n {\n id: mapId,\n olMap,\n initialExtent,\n httpService: this.httpService\n },\n INTERNAL_CONSTRUCTOR_TAG\n );\n\n return batch(() => {\n try {\n if (mapConfig.layers) {\n for (const layerConfig of mapConfig.layers) {\n mapModel.layers.addLayer(layerConfig);\n }\n }\n return mapModel;\n } catch (e) {\n mapModel.destroy();\n throw e;\n }\n });\n }\n\n private initializeViewOptions(view: View | ViewOptions) {\n const mapId = this.mapId;\n const mapConfig = this.mapConfig;\n if (view instanceof View) {\n const warn = (prop: string) => {\n LOG.warn(\n `The advanced configuration for map id '${mapId}' has provided a fully constructed view instance: ${prop} cannot be applied.\\n` +\n `Use ViewOptions instead of a View instance.`\n );\n };\n\n if (mapConfig.projection != null) {\n warn(\"projection\");\n }\n if (mapConfig.initialView != null) {\n warn(\"initialView\");\n }\n return;\n }\n\n const projection = (view.projection = this.initializeProjection(mapConfig.projection));\n const initialView = mapConfig.initialView;\n if (initialView) {\n switch (initialView.kind) {\n case \"position\":\n view.zoom = initialView.zoom;\n view.center = [initialView.center.x, initialView.center.y];\n break;\n case \"extent\": {\n /*\n OpenLayers does not support configuration of the initial map extent.\n The only relevant options here are center, zoom (and resolution).\n We must set those values because otherwise OpenLayers will not initialize layer sources.\n\n The actual initial extent is applied once tha map has loaded and its size is known.\n */\n const extent = initialView.extent;\n view.zoom = 0;\n view.center = [\n extent.xMin + (extent.xMax - extent.xMin) / 2,\n extent.yMin + (extent.yMax - extent.yMin) / 2\n ];\n break;\n }\n }\n } else {\n this.setViewDefaults(view, projection);\n }\n }\n\n private setViewDefaults(view: ViewOptions, projection: Projection) {\n if (view.center == null) {\n const extent = projection.getExtent(); // can be null\n if (!extent) {\n LOG.warn(\n `Cannot set default center coordinate because the current projection has no associated extent.\\n` +\n `Try to configure 'initialView' explicity.`\n );\n } else {\n view.center = getCenter(extent);\n }\n }\n\n if (view.zoom == null || view.resolution == null) {\n view.zoom = 0;\n }\n }\n\n private initializeProjection(projectionOption: MapConfig[\"projection\"]) {\n if (projectionOption == null) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return getProjection(\"EPSG:3857\")!; // default OpenLayers projection\n }\n\n const projection = getProjection(projectionOption);\n if (!projection) {\n throw new Error(`Failed to retrieve projection for code '${projectionOption}'.`);\n }\n return projection;\n }\n}\n\nfunction createDefaultAttribution(intl: PackageIntl): Attribution {\n const attr = new Attribution({ collapsible: false });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const element = (attr as any).element as HTMLElement | undefined;\n if (element) {\n element.role = \"region\";\n element.ariaLabel = intl.formatMessage({ id: \"attribution.label\" });\n }\n return attr;\n}\n"],"names":["defaultInteractions","getProjection"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@open-pioneer/map",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.3.0-dev-map-loading.20260202141334",
|
|
5
5
|
"description": "This package integrates OpenLayers maps into an open pioneer trails application.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"open-pioneer-trails"
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@chakra-ui/react": "^3.31.0",
|
|
18
|
-
"@open-pioneer/core": "4.4.0
|
|
19
|
-
"@open-pioneer/http": "4.4.0
|
|
20
|
-
"@open-pioneer/react-utils": "4.4.0
|
|
21
|
-
"@open-pioneer/runtime": "4.4.0
|
|
18
|
+
"@open-pioneer/core": "^4.4.0",
|
|
19
|
+
"@open-pioneer/http": "^4.4.0",
|
|
20
|
+
"@open-pioneer/react-utils": "^4.4.0",
|
|
21
|
+
"@open-pioneer/runtime": "^4.4.0",
|
|
22
22
|
"ol": "^10.7.0",
|
|
23
23
|
"proj4": "^2.20.2",
|
|
24
24
|
"react": "^19.2.3",
|
package/ui/MapContainer.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CommonComponentProps } from "@open-pioneer/react-utils";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
|
-
import { MapModelProps } from "./hooks/useMapModel";
|
|
4
3
|
import { MapPadding } from "../model/MapModel";
|
|
4
|
+
import { MapModelProps } from "./hooks/useMapModel";
|
|
5
5
|
/**
|
|
6
6
|
* @group UI Components and Hooks
|
|
7
7
|
*/
|
|
@@ -46,6 +46,24 @@ export interface MapContainerProps extends CommonComponentProps, MapModelProps {
|
|
|
46
46
|
* This property is directly applied to the map's container div element.
|
|
47
47
|
*/
|
|
48
48
|
"aria-label"?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Arbitrary html properties that will be applied to the map container's _root_ element.
|
|
51
|
+
* This is the element that contains the map container and any UI elements (like map anchors, for example).
|
|
52
|
+
*
|
|
53
|
+
* Use these at your own risk since they may be overwritten by the map container root itself.
|
|
54
|
+
*
|
|
55
|
+
* Use cases: setting custom data attributes, registering custom event handlers, ...
|
|
56
|
+
*/
|
|
57
|
+
rootProps?: Record<string, unknown>;
|
|
58
|
+
/**
|
|
59
|
+
* Arbitrary html properties that will be applied to the map container's element.
|
|
60
|
+
* This is the element that _renders_ the OpenLayers map.
|
|
61
|
+
*
|
|
62
|
+
* Use these at your own risk since they may be overwritten by the map container itself.
|
|
63
|
+
*
|
|
64
|
+
* Use cases: setting custom data attributes, registering custom event handlers, ...
|
|
65
|
+
*/
|
|
66
|
+
containerProps?: Record<string, unknown>;
|
|
49
67
|
}
|
|
50
68
|
/**
|
|
51
69
|
* Displays the map with the given id.
|
package/ui/MapContainer.js
CHANGED
|
@@ -2,11 +2,12 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { chakra } from '@chakra-ui/react';
|
|
3
3
|
import { createLogger } from '@open-pioneer/core';
|
|
4
4
|
import { useCommonComponentProps } from '@open-pioneer/react-utils';
|
|
5
|
+
import { sourceId$9 as sourceId } from '../_virtual/source-info.js';
|
|
5
6
|
import { useRef, useState, useEffect, useMemo } from 'react';
|
|
6
7
|
import { MapContainerContextProvider } from './MapContainerContext.js';
|
|
7
8
|
import { useMapModelValue } from './hooks/useMapModel.js';
|
|
8
9
|
|
|
9
|
-
const LOG = createLogger(
|
|
10
|
+
const LOG = createLogger(sourceId);
|
|
10
11
|
function MapContainer(props) {
|
|
11
12
|
const {
|
|
12
13
|
viewPadding,
|
|
@@ -14,9 +15,14 @@ function MapContainer(props) {
|
|
|
14
15
|
children,
|
|
15
16
|
role = "application",
|
|
16
17
|
"aria-label": ariaLabel,
|
|
17
|
-
"aria-labelledby": ariaLabelledBy
|
|
18
|
+
"aria-labelledby": ariaLabelledBy,
|
|
19
|
+
rootProps,
|
|
20
|
+
containerProps
|
|
18
21
|
} = props;
|
|
19
|
-
const { containerProps } = useCommonComponentProps(
|
|
22
|
+
const { containerProps: rootContainerProps } = useCommonComponentProps(
|
|
23
|
+
"map-container-root",
|
|
24
|
+
props
|
|
25
|
+
);
|
|
20
26
|
const mapContainer = useRef(null);
|
|
21
27
|
const mapAnchorsHost = useRef(null);
|
|
22
28
|
const map = useMapModelValue(props);
|
|
@@ -41,10 +47,11 @@ function MapContainer(props) {
|
|
|
41
47
|
"--map-padding-right": `${viewPadding?.right ?? 0}px`
|
|
42
48
|
};
|
|
43
49
|
}, [viewPadding]);
|
|
44
|
-
return /* @__PURE__ */ jsxs(chakra.div, { ...
|
|
50
|
+
return /* @__PURE__ */ jsxs(chakra.div, { ...rootProps, ...rootContainerProps, css: styleProps, children: [
|
|
45
51
|
/* @__PURE__ */ jsx(
|
|
46
52
|
chakra.div,
|
|
47
53
|
{
|
|
54
|
+
...containerProps,
|
|
48
55
|
className: "map-container",
|
|
49
56
|
ref: mapContainer,
|
|
50
57
|
role,
|