@open-pioneer/map 0.2.0 → 0.3.0
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 +23 -10
- package/README.md +2 -2
- package/api/MapModel.d.ts +17 -1
- package/api/index.d.ts +1 -1
- package/api/layers/WMSLayer.d.ts +16 -4
- package/api/layers/WMSLayer.js.map +1 -1
- package/api/layers/WMTSLayer.d.ts +27 -0
- package/api/layers/WMTSLayer.js +6 -0
- package/api/layers/WMTSLayer.js.map +1 -0
- package/api/layers/base.d.ts +7 -2
- package/api/layers/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/model/AbstractLayer.js.map +1 -1
- package/model/AbstractLayerBase.d.ts +1 -0
- package/model/AbstractLayerBase.js.map +1 -1
- package/model/Highlights.js +28 -5
- package/model/Highlights.js.map +1 -1
- package/model/layers/SimpleLayerImpl.d.ts +1 -0
- package/model/layers/SimpleLayerImpl.js +3 -0
- package/model/layers/SimpleLayerImpl.js.map +1 -1
- package/model/layers/WMSLayerImpl.d.ts +11 -3
- package/model/layers/WMSLayerImpl.js +96 -9
- package/model/layers/WMSLayerImpl.js.map +1 -1
- package/model/layers/WMTSLayerImpl.d.ts +19 -0
- package/model/layers/WMTSLayerImpl.js +154 -0
- package/model/layers/WMTSLayerImpl.js.map +1 -0
- package/package.json +4 -4
- package/ui/MapAnchor.d.ts +1 -1
- package/ui/MapAnchor.js.map +1 -1
- package/ui/MapContainer.d.ts +1 -11
- package/ui/MapContainer.js.map +1 -1
- package/ui/MapContext.d.ts +1 -1
- package/ui/MapContext.js.map +1 -1
- package/util/capabilities-utils.d.ts +2 -0
- package/util/capabilities-utils.js +11 -0
- package/util/capabilities-utils.js.map +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,32 +1,45 @@
|
|
|
1
1
|
# @open-pioneer/map
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ee7c2d4: Update runtime version.
|
|
8
|
+
- 0456500: Add interface `BaseFeature` to Map API.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- a582e5e: Add property `viewPadding` to `HighlightOptions`.
|
|
13
|
+
- Updated dependencies [762e7b9]
|
|
14
|
+
- @open-pioneer/react-utils@0.2.1
|
|
15
|
+
|
|
3
16
|
## 0.2.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
6
19
|
|
|
7
|
-
-
|
|
20
|
+
- 70349a8: Update to new core packages major versions
|
|
8
21
|
|
|
9
22
|
### Patch Changes
|
|
10
23
|
|
|
11
|
-
-
|
|
12
|
-
|
|
24
|
+
- Updated dependencies [70349a8]
|
|
25
|
+
- @open-pioneer/react-utils@0.2.0
|
|
13
26
|
|
|
14
27
|
## 0.1.1
|
|
15
28
|
|
|
16
29
|
### Patch Changes
|
|
17
30
|
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
31
|
+
- 08bffbc: MapModel API has got new methods for zooming/highlighting
|
|
32
|
+
- a58546b: Use `HttpService` for default health checks made by the map model.
|
|
33
|
+
- a58546b: Use `HttpService` when loading images in WMSLayer.
|
|
34
|
+
- 0c4ce04: Add OGC API Tiles (vector tiles) support
|
|
22
35
|
|
|
23
36
|
## 0.1.0
|
|
24
37
|
|
|
25
38
|
### Minor Changes
|
|
26
39
|
|
|
27
|
-
-
|
|
40
|
+
- bb2f27a: Initial release.
|
|
28
41
|
|
|
29
42
|
### Patch Changes
|
|
30
43
|
|
|
31
|
-
-
|
|
32
|
-
|
|
44
|
+
- Updated dependencies [182da1c]
|
|
45
|
+
- @open-pioneer/react-utils@0.1.0
|
package/README.md
CHANGED
|
@@ -698,12 +698,12 @@ We expect to implement more classes in the future.
|
|
|
698
698
|
Example: Center map to given coordinates using the map model and set layer visibility using the layer instance.
|
|
699
699
|
|
|
700
700
|
```ts
|
|
701
|
-
import { ServiceOptions
|
|
701
|
+
import { ServiceOptions } from "@open-pioneer/runtime";
|
|
702
702
|
import { MAP_ID } from "./MapConfigProviderImpl";
|
|
703
703
|
import type { MapRegistry } from "@open-pioneer/map";
|
|
704
704
|
|
|
705
705
|
interface References {
|
|
706
|
-
mapRegistry:
|
|
706
|
+
mapRegistry: MapRegistry;
|
|
707
707
|
}
|
|
708
708
|
|
|
709
709
|
export class TestService {
|
package/api/MapModel.d.ts
CHANGED
|
@@ -24,14 +24,30 @@ export interface HighlightOptions {
|
|
|
24
24
|
*/
|
|
25
25
|
pointZoom?: number;
|
|
26
26
|
/**
|
|
27
|
-
* The maximum zoom-level for line or polygon results.
|
|
27
|
+
* The maximum zoom-level for multiple points, line or polygon results.
|
|
28
28
|
*/
|
|
29
29
|
maxZoom?: number;
|
|
30
|
+
/**
|
|
31
|
+
* The view padding to make all features visible.
|
|
32
|
+
*/
|
|
33
|
+
viewPadding?: MapPadding;
|
|
30
34
|
}
|
|
31
35
|
export interface HighlightStyle {
|
|
32
36
|
Point?: StyleLike;
|
|
33
37
|
LineString?: StyleLike;
|
|
34
38
|
Polygon?: StyleLike;
|
|
39
|
+
MultiPolygon?: StyleLike;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Map padding, all values are pixels.
|
|
43
|
+
*
|
|
44
|
+
* See https://openlayers.org/en/latest/apidoc/module-ol_View-View.html#padding
|
|
45
|
+
*/
|
|
46
|
+
export interface MapPadding {
|
|
47
|
+
left?: number;
|
|
48
|
+
right?: number;
|
|
49
|
+
top?: number;
|
|
50
|
+
bottom?: number;
|
|
35
51
|
}
|
|
36
52
|
/**
|
|
37
53
|
* Represents a map.
|
package/api/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { getProjection, registerProjections, type ProjectionDefinition } from ".
|
|
|
7
7
|
export { BkgTopPlusOpen, type BkgTopPlusOpenProps } from "../layers/BkgTopPlusOpen";
|
|
8
8
|
export { useCenter, useProjection, useResolution, useScale } from "../ui/hooks";
|
|
9
9
|
export { MapAnchor, type MapAnchorProps, type MapAnchorPosition } from "../ui/MapAnchor";
|
|
10
|
-
export { MapContainer, type MapContainerProps
|
|
10
|
+
export { MapContainer, type MapContainerProps } from "../ui/MapContainer";
|
|
11
11
|
export { useMapModel, type UseMapModelResult, type UseMapModelLoading, type UseMapModelResolved, type UseMapModelRejected } from "../ui/useMapModel";
|
|
12
12
|
export { calculateBufferedExtent } from "../util/geometry-utils";
|
|
13
13
|
export { TOPMOST_LAYER_Z } from "../model/LayerCollectionImpl";
|
package/api/layers/WMSLayer.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Options as WMSSourceOptions } from "ol/source/ImageWMS";
|
|
2
|
-
import type { LayerBaseConfig, Layer, SublayersCollection, LayerConfig } from "./base";
|
|
2
|
+
import type { LayerBaseConfig, Layer, SublayersCollection, Sublayer, LayerConfig } from "./base";
|
|
3
3
|
/**
|
|
4
4
|
* Configuration options to construct a WMS layer.
|
|
5
5
|
*/
|
|
@@ -20,17 +20,29 @@ export interface WMSLayerConfig extends LayerConfig {
|
|
|
20
20
|
* Configuration options to construct the sublayers of a WMS layer.
|
|
21
21
|
*/
|
|
22
22
|
export interface WMSSublayerConfig extends LayerBaseConfig {
|
|
23
|
-
/**
|
|
24
|
-
|
|
23
|
+
/**
|
|
24
|
+
* The name of the WMS sublayer in the service's capabilities.
|
|
25
|
+
* Not mandatory, e.g. for WMS group layer. See [WMS spec](https://www.ogc.org/standard/wms/).
|
|
26
|
+
*/
|
|
27
|
+
name?: string;
|
|
25
28
|
/** Configuration for nested sublayers. */
|
|
26
29
|
sublayers?: WMSSublayerConfig[];
|
|
27
30
|
}
|
|
28
31
|
/** Represents a WMS layer. */
|
|
29
32
|
export interface WMSLayer extends Layer {
|
|
30
|
-
readonly sublayers: SublayersCollection
|
|
33
|
+
readonly sublayers: SublayersCollection<WMSSublayer>;
|
|
31
34
|
/** The URL of the WMS service that was used during layer construction. */
|
|
32
35
|
readonly url: string;
|
|
33
36
|
}
|
|
37
|
+
/** Represents a WMS sublayer */
|
|
38
|
+
export interface WMSSublayer extends Sublayer {
|
|
39
|
+
/**
|
|
40
|
+
* The name of the WMS sublayer in the service's capabilities.
|
|
41
|
+
*
|
|
42
|
+
* Is optional as a WMS group layer in a WMS service does not need to have a name.
|
|
43
|
+
*/
|
|
44
|
+
readonly name: string | undefined;
|
|
45
|
+
}
|
|
34
46
|
/**
|
|
35
47
|
* Constructor for {@link WMSLayer}.
|
|
36
48
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WMSLayer.js","sources":["WMSLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\nimport { WMSLayerImpl } from \"../../model/layers/WMSLayerImpl\";\nimport type { LayerBaseConfig, Layer, SublayersCollection, LayerConfig } from \"./base\";\n\n/**\n * Configuration options to construct a WMS layer.\n */\nexport interface WMSLayerConfig extends LayerConfig {\n /** URL of the WMS service. */\n url: string;\n\n /** Configures the layer's sublayers. */\n sublayers?: WMSSublayerConfig[];\n\n /**\n * Additional source options for the layer's WMS source.\n *\n * NOTE: These options are intended for advanced configuration:\n * the WMS Layer manages some of the OpenLayers source options itself.\n */\n sourceOptions?: Partial<WMSSourceOptions>;\n}\n\n/**\n * Configuration options to construct the sublayers of a WMS layer.\n */\nexport interface WMSSublayerConfig extends LayerBaseConfig {\n
|
|
1
|
+
{"version":3,"file":"WMSLayer.js","sources":["WMSLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\nimport { WMSLayerImpl } from \"../../model/layers/WMSLayerImpl\";\nimport type { LayerBaseConfig, Layer, SublayersCollection, Sublayer, LayerConfig } from \"./base\";\n\n/**\n * Configuration options to construct a WMS layer.\n */\nexport interface WMSLayerConfig extends LayerConfig {\n /** URL of the WMS service. */\n url: string;\n\n /** Configures the layer's sublayers. */\n sublayers?: WMSSublayerConfig[];\n\n /**\n * Additional source options for the layer's WMS source.\n *\n * NOTE: These options are intended for advanced configuration:\n * the WMS Layer manages some of the OpenLayers source options itself.\n */\n sourceOptions?: Partial<WMSSourceOptions>;\n}\n\n/**\n * Configuration options to construct the sublayers of a WMS layer.\n */\nexport interface WMSSublayerConfig extends LayerBaseConfig {\n /**\n * The name of the WMS sublayer in the service's capabilities.\n * Not mandatory, e.g. for WMS group layer. See [WMS spec](https://www.ogc.org/standard/wms/).\n */\n name?: string;\n\n /** Configuration for nested sublayers. */\n sublayers?: WMSSublayerConfig[];\n}\n\n/** Represents a WMS layer. */\nexport interface WMSLayer extends Layer {\n readonly sublayers: SublayersCollection<WMSSublayer>;\n\n /** The URL of the WMS service that was used during layer construction. */\n readonly url: string;\n}\n\n/** Represents a WMS sublayer */\nexport interface WMSSublayer extends Sublayer {\n /**\n * The name of the WMS sublayer in the service's capabilities.\n *\n * Is optional as a WMS group layer in a WMS service does not need to have a name.\n */\n readonly name: string | undefined;\n}\n\n/**\n * Constructor for {@link WMSLayer}.\n */\nexport interface WMSLayerConstructor {\n prototype: WMSLayer;\n\n /** Creates a new {@link WMSLayer}. */\n new (config: WMSLayerConfig): WMSLayer;\n}\n\nexport const WMSLayer: WMSLayerConstructor = WMSLayerImpl;\n"],"names":[],"mappings":";;AAmEO,MAAM,QAAgC,GAAA;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Layer, LayerConfig } from "./base";
|
|
2
|
+
export interface WMTSLayerConfig extends LayerConfig {
|
|
3
|
+
/** URL of the WMTS service. */
|
|
4
|
+
url: string;
|
|
5
|
+
/** The name of the WMTS layer in the service's capabilities. */
|
|
6
|
+
name: string;
|
|
7
|
+
/** The name of the tile matrix set in the service's capabilities. */
|
|
8
|
+
matrixSet: string;
|
|
9
|
+
/**Optional license note or source references*/
|
|
10
|
+
attributions?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface WMTSLayer extends Layer {
|
|
13
|
+
/** URL of the WMTS service. */
|
|
14
|
+
readonly url: string;
|
|
15
|
+
/** The name of the WMTS layer in the service's capabilities. */
|
|
16
|
+
readonly name: string;
|
|
17
|
+
/** The name of the tile matrix set in the service's capabilities. */
|
|
18
|
+
readonly matrixSet: string;
|
|
19
|
+
/**Optional license note or source references*/
|
|
20
|
+
readonly attributions?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface WMTSLayerConstructor {
|
|
23
|
+
prototype: WMTSLayer;
|
|
24
|
+
/** Creates a new {@link WMTSLayer}. */
|
|
25
|
+
new (config: WMTSLayerConfig): WMTSLayer;
|
|
26
|
+
}
|
|
27
|
+
export declare const WMTSLayer: WMTSLayerConstructor;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WMTSLayer.js","sources":["WMTSLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Layer, LayerConfig } from \"./base\";\nimport { WMTSLayerImpl } from \"../../model/layers/WMTSLayerImpl\";\nexport interface WMTSLayerConfig extends LayerConfig {\n /** URL of the WMTS service. */\n url: string;\n\n /** The name of the WMTS layer in the service's capabilities. */\n name: string;\n\n /** The name of the tile matrix set in the service's capabilities. */\n matrixSet: string;\n\n /**Optional license note or source references*/\n attributions?: string;\n}\nexport interface WMTSLayer extends Layer {\n /** URL of the WMTS service. */\n readonly url: string;\n\n /** The name of the WMTS layer in the service's capabilities. */\n readonly name: string;\n\n /** The name of the tile matrix set in the service's capabilities. */\n readonly matrixSet: string;\n\n /**Optional license note or source references*/\n readonly attributions?: string;\n}\nexport interface WMTSLayerConstructor {\n prototype: WMTSLayer;\n\n /** Creates a new {@link WMTSLayer}. */\n new (config: WMTSLayerConfig): WMTSLayer;\n}\n\nexport const WMTSLayer: WMTSLayerConstructor = WMTSLayerImpl;\n"],"names":[],"mappings":";;AAqCO,MAAM,SAAkC,GAAA;;;;"}
|
package/api/layers/base.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { LayerRetrievalOptions } from "../shared";
|
|
|
6
6
|
export interface LayerBaseEvents {
|
|
7
7
|
"changed": void;
|
|
8
8
|
"changed:title": void;
|
|
9
|
+
"changed:legend": void;
|
|
9
10
|
"changed:description": void;
|
|
10
11
|
"changed:visible": void;
|
|
11
12
|
"changed:attributes": void;
|
|
@@ -72,6 +73,10 @@ export interface LayerBase<AdditionalEvents = {}> extends EventSource<LayerBaseE
|
|
|
72
73
|
* Future versions may completely remove invisible layers from the OpenLayer's map under some circumstances.
|
|
73
74
|
*/
|
|
74
75
|
readonly visible: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* LegendURL from the service capabilties, if available
|
|
78
|
+
*/
|
|
79
|
+
readonly legend: string | undefined;
|
|
75
80
|
/**
|
|
76
81
|
* The collection of child sublayers for this layer.
|
|
77
82
|
*
|
|
@@ -170,9 +175,9 @@ export interface SublayersCollectionEvents {
|
|
|
170
175
|
/**
|
|
171
176
|
* Contains the sublayers that belong to a {@link Layer} or {@link Sublayer}.
|
|
172
177
|
*/
|
|
173
|
-
export interface SublayersCollection extends EventSource<SublayersCollectionEvents> {
|
|
178
|
+
export interface SublayersCollection<SublayerType = Sublayer> extends EventSource<SublayersCollectionEvents> {
|
|
174
179
|
/**
|
|
175
180
|
* Returns the child sublayers in this collection.
|
|
176
181
|
*/
|
|
177
|
-
getSublayers(options?: LayerRetrievalOptions):
|
|
182
|
+
getSublayers(options?: LayerRetrievalOptions): SublayerType[];
|
|
178
183
|
}
|
package/api/layers/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { SimpleLayer } from './api/layers/SimpleLayer.js';
|
|
2
2
|
export { WMSLayer } from './api/layers/WMSLayer.js';
|
|
3
|
+
export { WMTSLayer } from './api/layers/WMTSLayer.js';
|
|
3
4
|
export { getProjection, registerProjections } from './projections.js';
|
|
4
5
|
export { BkgTopPlusOpen } from './layers/BkgTopPlusOpen.js';
|
|
5
6
|
export { useCenter, useProjection, useResolution, useScale } from './ui/hooks.js';
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractLayer.js","sources":["AbstractLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Resource, createLogger } from \"@open-pioneer/core\";\nimport { unByKey } from \"ol/Observable\";\nimport { EventsKey } from \"ol/events\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport OlLayer from \"ol/layer/Layer\";\nimport OlSource from \"ol/source/Source\";\nimport { HealthCheckFunction, Layer, LayerConfig, LayerLoadState, SimpleLayerConfig } from \"../api\";\nimport { AbstractLayerBase } from \"./AbstractLayerBase\";\nimport { MapModelImpl } from \"./MapModelImpl\";\n\nconst LOG = createLogger(\"map:AbstractLayer\");\n\n/**\n * Base class for normal layer types.\n *\n * These layers always have an associated OpenLayers layer.\n */\nexport abstract class AbstractLayer<AdditionalEvents = {}>\n extends AbstractLayerBase<AdditionalEvents>\n implements Layer\n{\n #olLayer: OlBaseLayer;\n #isBaseLayer: boolean;\n #healthCheck?: string | HealthCheckFunction;\n #visible: boolean;\n\n #loadState: LayerLoadState;\n #stateWatchResource: Resource | undefined;\n\n constructor(config: SimpleLayerConfig) {\n super(config);\n this.#olLayer = config.olLayer;\n this.#isBaseLayer = config.isBaseLayer ?? false;\n this.#healthCheck = config.healthCheck;\n\n this.#visible = config.visible ?? true;\n this.#loadState = getSourceState(getSource(this.#olLayer));\n }\n\n get visible(): boolean {\n return this.#visible;\n }\n\n get olLayer(): OlBaseLayer {\n return this.#olLayer;\n }\n\n get isBaseLayer(): boolean {\n return this.#isBaseLayer;\n }\n\n get loadState(): LayerLoadState {\n return this.#loadState;\n }\n\n destroy() {\n if (this.__destroyed) {\n return;\n }\n\n this.#stateWatchResource?.destroy();\n this.olLayer.dispose();\n super.destroy();\n }\n\n /**\n * Called by the map model when the layer is added to the map.\n */\n __attach(map: MapModelImpl): void {\n super.__attachToMap(map);\n\n const { initial: initialState, resource: stateWatchResource } = watchLoadState(\n this,\n this.#healthCheck,\n (state) => {\n this.#setLoadState(state);\n }\n );\n this.#stateWatchResource = stateWatchResource;\n this.#setLoadState(initialState);\n }\n\n setVisible(newVisibility: boolean): void {\n if (this.isBaseLayer) {\n LOG.warn(\n `Cannot change visibility of base layer '${this.id}': use activateBaseLayer() on the map's LayerCollection instead.`\n );\n return;\n }\n\n this.__setVisible(newVisibility);\n }\n\n __setVisible(newVisibility: boolean): void {\n let changed = false;\n if (this.#visible !== newVisibility) {\n this.#visible = newVisibility;\n changed = true;\n }\n\n // Improvement: actual map sync?\n if (this.#olLayer.getVisible() != this.#visible) {\n this.#olLayer.setVisible(newVisibility);\n }\n changed && this.__emitChangeEvent(\"changed:visible\");\n }\n\n #setLoadState(loadState: LayerLoadState) {\n if (loadState !== this.#loadState) {\n this.#loadState = loadState;\n this.__emitChangeEvent(\"changed:loadState\");\n }\n }\n}\n\nfunction watchLoadState(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"],\n onChange: (newState: LayerLoadState) => void\n): { initial: LayerLoadState; resource: Resource } {\n const olLayer = layer.olLayer;\n\n if (!(olLayer instanceof OlLayer)) {\n // Some layers don't have a source (such as group)\n return {\n initial: \"loaded\",\n resource: {\n destroy() {\n void 0;\n }\n }\n };\n }\n\n let currentSource = getSource(olLayer);\n const currentOlLayerState = getSourceState(currentSource);\n\n let currentLoadState: LayerLoadState = currentOlLayerState;\n let currentHealthState = \"loading\"; // initial state loading until health check finished\n\n // custom health check not needed when OL already returning an error state\n if (currentOlLayerState !== \"error\") {\n // health check only once during initialization\n doHealthCheck(layer, healthCheck).then((state: LayerLoadState) => {\n currentHealthState = state;\n updateState();\n });\n }\n\n const updateState = () => {\n const olLayerState = getSourceState(currentSource);\n const nextLoadState: LayerLoadState =\n currentHealthState === \"error\" ? \"error\" : olLayerState;\n\n if (currentLoadState !== nextLoadState) {\n currentLoadState = nextLoadState;\n onChange(currentLoadState);\n }\n };\n\n let stateHandle: EventsKey | undefined;\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n\n const sourceHandle = olLayer.on(\"change:source\", () => {\n // unsubscribe from old source\n stateHandle && unByKey(stateHandle);\n stateHandle = undefined;\n\n // subscribe to new source and update state\n currentSource = getSource(olLayer);\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n updateState();\n });\n return {\n initial: currentLoadState,\n resource: {\n destroy() {\n stateHandle && unByKey(stateHandle);\n unByKey(sourceHandle);\n }\n }\n };\n}\n\nasync function doHealthCheck(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"]\n): Promise<LayerLoadState> {\n if (healthCheck == null) {\n return \"loaded\";\n }\n\n let healthCheckFn: HealthCheckFunction;\n if (typeof healthCheck === \"function\") {\n healthCheckFn = healthCheck;\n } else if (typeof healthCheck === \"string\") {\n healthCheckFn = async () => {\n const httpService = layer.map.__sharedDependencies.httpService;\n const response = await httpService.fetch(healthCheck);\n if (response.ok) {\n return \"loaded\";\n }\n LOG.warn(\n `Health check failed for layer '${layer.id}' (http status ${response.status})`\n );\n return \"error\";\n };\n } else {\n LOG.error(\n `Unexpected object for 'healthCheck' parameter of layer '${layer.id}'`,\n healthCheck\n );\n return \"error\";\n }\n\n try {\n return await healthCheckFn(layer);\n } catch (e) {\n LOG.warn(`Health check failed for layer '${layer.id}'`, e);\n return \"error\";\n }\n}\n\nfunction getSource(olLayer: OlLayer | OlBaseLayer) {\n if (!(olLayer instanceof OlLayer)) {\n return undefined;\n }\n return (olLayer?.getSource() as OlSource | null) ?? undefined;\n}\n\nfunction getSourceState(olSource: OlSource | undefined) {\n const state = olSource?.getState();\n switch (state) {\n case undefined:\n return \"loaded\";\n case \"undefined\":\n return \"not-loaded\";\n case \"loading\":\n return \"loading\";\n case \"ready\":\n return \"loaded\";\n case \"error\":\n return \"error\";\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AbstractLayer.js","sources":["AbstractLayer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Resource, createLogger } from \"@open-pioneer/core\";\nimport { unByKey } from \"ol/Observable\";\nimport { EventsKey } from \"ol/events\";\nimport OlBaseLayer from \"ol/layer/Base\";\nimport OlLayer from \"ol/layer/Layer\";\nimport OlSource from \"ol/source/Source\";\nimport { HealthCheckFunction, Layer, LayerConfig, LayerLoadState, SimpleLayerConfig } from \"../api\";\nimport { AbstractLayerBase } from \"./AbstractLayerBase\";\nimport { MapModelImpl } from \"./MapModelImpl\";\n\nconst LOG = createLogger(\"map:AbstractLayer\");\n\n/**\n * Base class for normal layer types.\n *\n * These layers always have an associated OpenLayers layer.\n */\nexport abstract class AbstractLayer<AdditionalEvents = {}>\n extends AbstractLayerBase<AdditionalEvents>\n implements Layer\n{\n #olLayer: OlBaseLayer;\n #isBaseLayer: boolean;\n #healthCheck?: string | HealthCheckFunction;\n #visible: boolean;\n\n #loadState: LayerLoadState;\n #stateWatchResource: Resource | undefined;\n\n constructor(config: SimpleLayerConfig) {\n super(config);\n this.#olLayer = config.olLayer;\n this.#isBaseLayer = config.isBaseLayer ?? false;\n this.#healthCheck = config.healthCheck;\n\n this.#visible = config.visible ?? true;\n this.#loadState = getSourceState(getSource(this.#olLayer));\n }\n\n get visible(): boolean {\n return this.#visible;\n }\n\n get olLayer(): OlBaseLayer {\n return this.#olLayer;\n }\n\n get isBaseLayer(): boolean {\n return this.#isBaseLayer;\n }\n\n get loadState(): LayerLoadState {\n return this.#loadState;\n }\n\n destroy() {\n if (this.__destroyed) {\n return;\n }\n\n this.#stateWatchResource?.destroy();\n this.olLayer.dispose();\n super.destroy();\n }\n\n /**\n * Called by the map model when the layer is added to the map.\n */\n __attach(map: MapModelImpl): void {\n super.__attachToMap(map);\n\n const { initial: initialState, resource: stateWatchResource } = watchLoadState(\n this,\n this.#healthCheck,\n (state) => {\n this.#setLoadState(state);\n }\n );\n this.#stateWatchResource = stateWatchResource;\n this.#setLoadState(initialState);\n }\n\n setVisible(newVisibility: boolean): void {\n if (this.isBaseLayer) {\n LOG.warn(\n `Cannot change visibility of base layer '${this.id}': use activateBaseLayer() on the map's LayerCollection instead.`\n );\n return;\n }\n\n this.__setVisible(newVisibility);\n }\n\n __setVisible(newVisibility: boolean): void {\n let changed = false;\n if (this.#visible !== newVisibility) {\n this.#visible = newVisibility;\n changed = true;\n }\n\n // Improvement: actual map sync?\n if (this.#olLayer.getVisible() != this.#visible) {\n this.#olLayer.setVisible(newVisibility);\n }\n changed && this.__emitChangeEvent(\"changed:visible\");\n }\n\n #setLoadState(loadState: LayerLoadState) {\n if (loadState !== this.#loadState) {\n this.#loadState = loadState;\n this.__emitChangeEvent(\"changed:loadState\");\n }\n }\n}\n\nfunction watchLoadState(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"],\n onChange: (newState: LayerLoadState) => void\n): { initial: LayerLoadState; resource: Resource } {\n const olLayer = layer.olLayer;\n\n if (!(olLayer instanceof OlLayer)) {\n // Some layers don't have a source (such as group)\n return {\n initial: \"loaded\",\n resource: {\n destroy() {\n void 0;\n }\n }\n };\n }\n\n let currentSource = getSource(olLayer);\n const currentOlLayerState = getSourceState(currentSource);\n\n let currentLoadState: LayerLoadState = currentOlLayerState;\n let currentHealthState = \"loading\"; // initial state loading until health check finished\n\n // custom health check not needed when OpenLayers already returning an error state\n if (currentOlLayerState !== \"error\") {\n // health check only once during initialization\n doHealthCheck(layer, healthCheck).then((state: LayerLoadState) => {\n currentHealthState = state;\n updateState();\n });\n }\n\n const updateState = () => {\n const olLayerState = getSourceState(currentSource);\n const nextLoadState: LayerLoadState =\n currentHealthState === \"error\" ? \"error\" : olLayerState;\n\n if (currentLoadState !== nextLoadState) {\n currentLoadState = nextLoadState;\n onChange(currentLoadState);\n }\n };\n\n let stateHandle: EventsKey | undefined;\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n\n const sourceHandle = olLayer.on(\"change:source\", () => {\n // unsubscribe from old source\n stateHandle && unByKey(stateHandle);\n stateHandle = undefined;\n\n // subscribe to new source and update state\n currentSource = getSource(olLayer);\n stateHandle = currentSource?.on(\"change\", () => {\n updateState();\n });\n updateState();\n });\n return {\n initial: currentLoadState,\n resource: {\n destroy() {\n stateHandle && unByKey(stateHandle);\n unByKey(sourceHandle);\n }\n }\n };\n}\n\nasync function doHealthCheck(\n layer: AbstractLayer,\n healthCheck: LayerConfig[\"healthCheck\"]\n): Promise<LayerLoadState> {\n if (healthCheck == null) {\n return \"loaded\";\n }\n\n let healthCheckFn: HealthCheckFunction;\n if (typeof healthCheck === \"function\") {\n healthCheckFn = healthCheck;\n } else if (typeof healthCheck === \"string\") {\n healthCheckFn = async () => {\n const httpService = layer.map.__sharedDependencies.httpService;\n const response = await httpService.fetch(healthCheck);\n if (response.ok) {\n return \"loaded\";\n }\n LOG.warn(\n `Health check failed for layer '${layer.id}' (http status ${response.status})`\n );\n return \"error\";\n };\n } else {\n LOG.error(\n `Unexpected object for 'healthCheck' parameter of layer '${layer.id}'`,\n healthCheck\n );\n return \"error\";\n }\n\n try {\n return await healthCheckFn(layer);\n } catch (e) {\n LOG.warn(`Health check failed for layer '${layer.id}'`, e);\n return \"error\";\n }\n}\n\nfunction getSource(olLayer: OlLayer | OlBaseLayer) {\n if (!(olLayer instanceof OlLayer)) {\n return undefined;\n }\n return (olLayer?.getSource() as OlSource | null) ?? undefined;\n}\n\nfunction getSourceState(olSource: OlSource | undefined) {\n const state = olSource?.getState();\n switch (state) {\n case undefined:\n return \"loaded\";\n case \"undefined\":\n return \"not-loaded\";\n case \"loading\":\n return \"loading\";\n case \"ready\":\n return \"loaded\";\n case \"error\":\n return \"error\";\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ export declare abstract class AbstractLayerBase<AdditionalEvents = {}> extends E
|
|
|
23
23
|
get attributes(): Record<string | symbol, unknown>;
|
|
24
24
|
abstract get visible(): boolean;
|
|
25
25
|
abstract get sublayers(): SublayersCollectionImpl<Sublayer & AbstractLayerBase> | undefined;
|
|
26
|
+
abstract get legend(): string | undefined;
|
|
26
27
|
destroy(): void;
|
|
27
28
|
/**
|
|
28
29
|
* Attaches the layer to its owning map.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractLayerBase.js","sources":["AbstractLayerBase.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { EventEmitter, EventNames, createLogger } from \"@open-pioneer/core\";\nimport { v4 as uuid4v } from \"uuid\";\nimport { LayerBase, LayerBaseEvents, Sublayer } from \"../api\";\nimport { MapModelImpl } from \"./MapModelImpl\";\nimport { SublayersCollectionImpl } from \"./SublayersCollectionImpl\";\n\nconst LOG = createLogger(\"map:AbstractLayerModel\");\n\nexport interface AbstractLayerBaseOptions {\n id?: string;\n title: string;\n description?: string;\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Base class for \"normal\" layers and sublayers alike to implement common properties\n * such as id, title and attributes.\n */\nexport abstract class AbstractLayerBase<AdditionalEvents = {}>\n extends EventEmitter<LayerBaseEvents & AdditionalEvents>\n implements LayerBase\n{\n #map: MapModelImpl | undefined;\n\n #id: string;\n #title: string;\n #description: string;\n #attributes: Record<string | symbol, unknown>;\n #destroyed = false;\n\n constructor(config: AbstractLayerBaseOptions) {\n super();\n this.#id = config.id ?? uuid4v();\n this.#attributes = config.attributes ?? {};\n this.#title = config.title;\n this.#description = config.description ?? \"\";\n }\n\n protected get __destroyed(): boolean {\n return this.#destroyed;\n }\n\n get map(): MapModelImpl {\n const map = this.#map;\n if (!map) {\n throw new Error(`Layer '${this.id}' has not been attached to a map yet.`);\n }\n return map;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get title(): string {\n return this.#title;\n }\n\n get description(): string {\n return this.#description;\n }\n\n get attributes(): Record<string | symbol, unknown> {\n return this.#attributes;\n }\n\n abstract get visible(): boolean;\n\n abstract get sublayers(): SublayersCollectionImpl<Sublayer & AbstractLayerBase> | undefined;\n\n destroy() {\n if (this.#destroyed) {\n return;\n }\n\n this.#destroyed = true;\n this.sublayers?.destroy();\n try {\n this.emit(\"destroy\");\n } catch (e) {\n LOG.warn(`Unexpected error from event listener during layer destruction:`, e);\n }\n }\n\n /**\n * Attaches the layer to its owning map.\n */\n protected __attachToMap(map: MapModelImpl): void {\n if (this.#map) {\n throw new Error(\n `Layer '${this.id}' has already been attached to the map '${this.map.id}'`\n );\n }\n this.#map = map;\n }\n\n setTitle(newTitle: string): void {\n if (newTitle !== this.#title) {\n this.#title = newTitle;\n this.__emitChangeEvent(\"changed:title\");\n }\n }\n\n setDescription(newDescription: string): void {\n if (newDescription !== this.#description) {\n this.#description = newDescription;\n this.__emitChangeEvent(\"changed:description\");\n }\n }\n\n updateAttributes(newAttributes: Record<string | symbol, unknown>): void {\n const attributes = this.#attributes;\n const keys = Reflect.ownKeys(newAttributes);\n\n let changed = false;\n for (const key of keys) {\n const existing = attributes[key];\n const value = newAttributes[key];\n if (existing !== value) {\n attributes[key] = value;\n changed = true;\n }\n }\n\n if (changed) {\n this.__emitChangeEvent(\"changed:attributes\");\n }\n }\n\n deleteAttribute(deleteAttribute: string | symbol): void {\n const attributes = this.#attributes;\n if (attributes[deleteAttribute]) {\n delete attributes[deleteAttribute];\n this.__emitChangeEvent(\"changed:attributes\");\n }\n }\n\n abstract setVisible(newVisibility: boolean): void;\n\n protected __emitChangeEvent<Name extends EventNames<LayerBaseEvents & AdditionalEvents>>(\n event: Name\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).emit(event);\n this.emit(\"changed\");\n }\n}\n"],"names":["uuid4v"],"mappings":";;;AAQA,MAAM,GAAA,GAAM,aAAa,wBAAwB,CAAA,CAAA;AAa1C,MAAe,0BACV,YAEZ,CAAA;AAAA,EACI,IAAA,CAAA;AAAA,EAEA,GAAA,CAAA;AAAA,EACA,MAAA,CAAA;AAAA,EACA,YAAA,CAAA;AAAA,EACA,WAAA,CAAA;AAAA,EACA,UAAa,GAAA,KAAA,CAAA;AAAA,EAEb,YAAY,MAAkC,EAAA;AAC1C,IAAM,KAAA,EAAA,CAAA;AACN,IAAK,IAAA,CAAA,GAAA,GAAM,MAAO,CAAA,EAAA,IAAMA,EAAO,EAAA,CAAA;AAC/B,IAAK,IAAA,CAAA,WAAA,GAAc,MAAO,CAAA,UAAA,IAAc,EAAC,CAAA;AACzC,IAAA,IAAA,CAAK,SAAS,MAAO,CAAA,KAAA,CAAA;AACrB,IAAK,IAAA,CAAA,YAAA,GAAe,OAAO,WAAe,IAAA,EAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,IAAc,WAAuB,GAAA;AACjC,IAAA,OAAO,IAAK,CAAA,UAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,GAAoB,GAAA;AACpB,IAAA,MAAM,MAAM,IAAK,CAAA,IAAA,CAAA;AACjB,IAAA,IAAI,CAAC,GAAK,EAAA;AACN,MAAA,MAAM,IAAI,KAAA,CAAM,CAAU,OAAA,EAAA,IAAA,CAAK,EAAE,CAAuC,qCAAA,CAAA,CAAA,CAAA;AAAA,KAC5E;AACA,IAAO,OAAA,GAAA,CAAA;AAAA,GACX;AAAA,EAEA,IAAI,EAAa,GAAA;AACb,IAAA,OAAO,IAAK,CAAA,GAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,KAAgB,GAAA;AAChB,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,WAAsB,GAAA;AACtB,IAAA,OAAO,IAAK,CAAA,YAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,UAA+C,GAAA;AAC/C,IAAA,OAAO,IAAK,CAAA,WAAA,CAAA;AAAA,GAChB;AAAA,
|
|
1
|
+
{"version":3,"file":"AbstractLayerBase.js","sources":["AbstractLayerBase.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { EventEmitter, EventNames, createLogger } from \"@open-pioneer/core\";\nimport { v4 as uuid4v } from \"uuid\";\nimport { LayerBase, LayerBaseEvents, Sublayer } from \"../api\";\nimport { MapModelImpl } from \"./MapModelImpl\";\nimport { SublayersCollectionImpl } from \"./SublayersCollectionImpl\";\n\nconst LOG = createLogger(\"map:AbstractLayerModel\");\n\nexport interface AbstractLayerBaseOptions {\n id?: string;\n title: string;\n description?: string;\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Base class for \"normal\" layers and sublayers alike to implement common properties\n * such as id, title and attributes.\n */\nexport abstract class AbstractLayerBase<AdditionalEvents = {}>\n extends EventEmitter<LayerBaseEvents & AdditionalEvents>\n implements LayerBase\n{\n #map: MapModelImpl | undefined;\n\n #id: string;\n #title: string;\n #description: string;\n #attributes: Record<string | symbol, unknown>;\n #destroyed = false;\n\n constructor(config: AbstractLayerBaseOptions) {\n super();\n this.#id = config.id ?? uuid4v();\n this.#attributes = config.attributes ?? {};\n this.#title = config.title;\n this.#description = config.description ?? \"\";\n }\n\n protected get __destroyed(): boolean {\n return this.#destroyed;\n }\n\n get map(): MapModelImpl {\n const map = this.#map;\n if (!map) {\n throw new Error(`Layer '${this.id}' has not been attached to a map yet.`);\n }\n return map;\n }\n\n get id(): string {\n return this.#id;\n }\n\n get title(): string {\n return this.#title;\n }\n\n get description(): string {\n return this.#description;\n }\n\n get attributes(): Record<string | symbol, unknown> {\n return this.#attributes;\n }\n\n abstract get visible(): boolean;\n\n abstract get sublayers(): SublayersCollectionImpl<Sublayer & AbstractLayerBase> | undefined;\n\n abstract get legend(): string | undefined;\n\n destroy() {\n if (this.#destroyed) {\n return;\n }\n\n this.#destroyed = true;\n this.sublayers?.destroy();\n try {\n this.emit(\"destroy\");\n } catch (e) {\n LOG.warn(`Unexpected error from event listener during layer destruction:`, e);\n }\n }\n\n /**\n * Attaches the layer to its owning map.\n */\n protected __attachToMap(map: MapModelImpl): void {\n if (this.#map) {\n throw new Error(\n `Layer '${this.id}' has already been attached to the map '${this.map.id}'`\n );\n }\n this.#map = map;\n }\n\n setTitle(newTitle: string): void {\n if (newTitle !== this.#title) {\n this.#title = newTitle;\n this.__emitChangeEvent(\"changed:title\");\n }\n }\n\n setDescription(newDescription: string): void {\n if (newDescription !== this.#description) {\n this.#description = newDescription;\n this.__emitChangeEvent(\"changed:description\");\n }\n }\n\n updateAttributes(newAttributes: Record<string | symbol, unknown>): void {\n const attributes = this.#attributes;\n const keys = Reflect.ownKeys(newAttributes);\n\n let changed = false;\n for (const key of keys) {\n const existing = attributes[key];\n const value = newAttributes[key];\n if (existing !== value) {\n attributes[key] = value;\n changed = true;\n }\n }\n\n if (changed) {\n this.__emitChangeEvent(\"changed:attributes\");\n }\n }\n\n deleteAttribute(deleteAttribute: string | symbol): void {\n const attributes = this.#attributes;\n if (attributes[deleteAttribute]) {\n delete attributes[deleteAttribute];\n this.__emitChangeEvent(\"changed:attributes\");\n }\n }\n\n abstract setVisible(newVisibility: boolean): void;\n\n protected __emitChangeEvent<Name extends EventNames<LayerBaseEvents & AdditionalEvents>>(\n event: Name\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).emit(event);\n this.emit(\"changed\");\n }\n}\n"],"names":["uuid4v"],"mappings":"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"}
|
package/model/Highlights.js
CHANGED
|
@@ -6,10 +6,10 @@ import { Style, Icon, Stroke, Fill } from 'ol/style';
|
|
|
6
6
|
import { toFunction } from 'ol/style/Style';
|
|
7
7
|
import mapMarkerUrl from '../assets/images/mapMarker.png?url';
|
|
8
8
|
import { TOPMOST_LAYER_Z } from './LayerCollectionImpl.js';
|
|
9
|
-
import { calculateBufferedExtent } from '../util/geometry-utils.js';
|
|
10
9
|
|
|
11
10
|
const DEFAULT_OL_POINT_ZOOM_LEVEL = 17;
|
|
12
11
|
const DEFAULT_OL_MAX_ZOOM_LEVEL = 20;
|
|
12
|
+
const DEFAULT_VIEW_PADDING = { top: 50, right: 20, bottom: 10, left: 20 };
|
|
13
13
|
class Highlights {
|
|
14
14
|
olMap;
|
|
15
15
|
currentHighlight;
|
|
@@ -44,7 +44,14 @@ class Highlights {
|
|
|
44
44
|
const isPoint = getArea(extent) === 0;
|
|
45
45
|
const zoomScale = isPoint ? options?.pointZoom ?? DEFAULT_OL_POINT_ZOOM_LEVEL : options?.maxZoom ?? DEFAULT_OL_MAX_ZOOM_LEVEL;
|
|
46
46
|
setCenter(this.olMap, center);
|
|
47
|
-
|
|
47
|
+
const {
|
|
48
|
+
top = 0,
|
|
49
|
+
right = 0,
|
|
50
|
+
bottom = 0,
|
|
51
|
+
left = 0
|
|
52
|
+
} = options?.viewPadding ?? DEFAULT_VIEW_PADDING;
|
|
53
|
+
const padding = [top, right, bottom, left];
|
|
54
|
+
zoomTo(this.olMap, extent, zoomScale, padding);
|
|
48
55
|
this.createAndAddLayer(geometries, options?.highlightStyle);
|
|
49
56
|
}
|
|
50
57
|
createAndAddLayer(geometries, highlightStyle) {
|
|
@@ -71,10 +78,9 @@ class Highlights {
|
|
|
71
78
|
function setCenter(olMap, coordinates) {
|
|
72
79
|
coordinates && coordinates.length && olMap.getView().setCenter(coordinates);
|
|
73
80
|
}
|
|
74
|
-
function zoomTo(olMap, extent, zoomLevel) {
|
|
81
|
+
function zoomTo(olMap, extent, zoomLevel, padding) {
|
|
75
82
|
if (extent) {
|
|
76
|
-
|
|
77
|
-
bufferedExtent && olMap.getView().fit(bufferedExtent, { maxZoom: zoomLevel });
|
|
83
|
+
olMap.getView().fit(extent, { maxZoom: zoomLevel, padding });
|
|
78
84
|
} else {
|
|
79
85
|
zoomLevel && olMap.getView().setZoom(zoomLevel);
|
|
80
86
|
}
|
|
@@ -121,6 +127,23 @@ const defaultHighlightStyle = {
|
|
|
121
127
|
color: "rgba(224,255,255,0.35)"
|
|
122
128
|
})
|
|
123
129
|
})
|
|
130
|
+
],
|
|
131
|
+
"MultiPolygon": [
|
|
132
|
+
new Style({
|
|
133
|
+
stroke: new Stroke({
|
|
134
|
+
color: "#fff",
|
|
135
|
+
width: 5
|
|
136
|
+
})
|
|
137
|
+
}),
|
|
138
|
+
new Style({
|
|
139
|
+
stroke: new Stroke({
|
|
140
|
+
color: "#00ffff",
|
|
141
|
+
width: 3
|
|
142
|
+
}),
|
|
143
|
+
fill: new Fill({
|
|
144
|
+
color: "rgba(224,255,255,0.35)"
|
|
145
|
+
})
|
|
146
|
+
})
|
|
124
147
|
]
|
|
125
148
|
};
|
|
126
149
|
|
package/model/Highlights.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Highlights.js","sources":["Highlights.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Feature } from \"ol\";\nimport OlMap from \"ol/Map\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { Extent, createEmpty, extend, getArea, getCenter } from \"ol/extent\";\nimport { Geometry, LineString, Point, Polygon } from \"ol/geom\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport VectorSource from \"ol/source/Vector\";\nimport { Fill, Icon, Stroke, Style } from \"ol/style\";\nimport { toFunction as toStyleFunction } from \"ol/style/Style\";\nimport { HighlightOptions, HighlightStyle } from \"../api/MapModel\";\nimport mapMarkerUrl from \"../assets/images/mapMarker.png?url\";\nimport { FeatureLike } from \"ol/Feature\";\nimport { TOPMOST_LAYER_Z } from \"./LayerCollectionImpl\";\nimport { Layer as OlLayer } from \"ol/layer\";\nimport { calculateBufferedExtent } from \"../util/geometry-utils\";\n\nconst DEFAULT_OL_POINT_ZOOM_LEVEL = 17;\nconst DEFAULT_OL_MAX_ZOOM_LEVEL = 20;\n\nexport class Highlights {\n private olMap: OlMap;\n private currentHighlight: OlLayer | undefined;\n\n constructor(olMap: OlMap) {\n this.olMap = olMap;\n }\n\n destroy() {\n this.clearHighlight();\n }\n\n /**\n * This method shows the position of a text search result zoomed to and marked or highlighted in the map.\n */\n addHighlightOrMarkerAndZoom(\n geometries: Point[] | LineString[] | Polygon[],\n options: HighlightOptions\n ) {\n // Cleanup existing highlight\n this.clearHighlight();\n\n if (!geometries || !geometries.length) {\n return;\n }\n this.zoomAndAddMarkers(geometries, options);\n }\n\n clearHighlight() {\n if (this.currentHighlight) {\n this.olMap.removeLayer(this.currentHighlight);\n this.currentHighlight = undefined;\n }\n }\n\n private zoomAndAddMarkers(geometries: Geometry[], options: HighlightOptions | undefined) {\n let extent = createEmpty();\n for (const geom of geometries) {\n extent = extend(extent, geom.getExtent());\n }\n\n const center = getCenter(extent);\n const isPoint = getArea(extent) === 0;\n const zoomScale = isPoint\n ? options?.pointZoom ?? DEFAULT_OL_POINT_ZOOM_LEVEL\n : options?.maxZoom ?? DEFAULT_OL_MAX_ZOOM_LEVEL;\n setCenter(this.olMap, center);\n zoomTo(this.olMap, extent, zoomScale);\n this.createAndAddLayer(geometries, options?.highlightStyle);\n }\n\n private createAndAddLayer(geometries: Geometry[], highlightStyle: HighlightStyle | undefined) {\n const features = geometries.map((geometry) => {\n return new Feature({\n type: geometry.getType(),\n geometry: geometry\n });\n });\n const layer = new VectorLayer({\n className: \"highlight-layer\",\n source: new VectorSource({\n features: features\n }),\n style: function (feature, resolution) {\n return resolveStyle(feature, resolution, highlightStyle);\n }\n });\n // Ensure layer is rendered on top of operational layers\n layer.setZIndex(TOPMOST_LAYER_Z);\n this.olMap.addLayer(layer);\n this.currentHighlight = layer;\n }\n}\n\nfunction setCenter(olMap: OlMap, coordinates: Coordinate | undefined) {\n coordinates && coordinates.length && olMap.getView().setCenter(coordinates);\n}\n\nfunction zoomTo(olMap: OlMap, extent: Extent | undefined, zoomLevel: number | undefined) {\n if (extent) {\n const bufferedExtent: Extent | undefined = calculateBufferedExtent(extent);\n bufferedExtent && olMap.getView().fit(bufferedExtent, { maxZoom: zoomLevel });\n } else {\n zoomLevel && olMap.getView().setZoom(zoomLevel);\n }\n}\n\n/** Returns the appropriate style from the user's highlightStyle or falls back to the default style. */\nfunction resolveStyle(\n feature: FeatureLike,\n resolution: number,\n highlightStyle: HighlightStyle | undefined\n) {\n const type: keyof typeof defaultHighlightStyle = feature.get(\"type\");\n const style = toStyleFunction(highlightStyle?.[type] ?? defaultHighlightStyle[type]);\n return style(feature, resolution);\n}\n\nconst defaultHighlightStyle = {\n \"Point\": new Style({\n image: new Icon({\n anchor: [0.5, 1],\n src: mapMarkerUrl\n })\n }),\n \"LineString\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n })\n })\n ],\n \"Polygon\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n }),\n fill: new Fill({\n color: \"rgba(224,255,255,0.35)\"\n })\n })\n ]\n};\n"],"names":["toStyleFunction"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Highlights.js","sources":["Highlights.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Feature } from \"ol\";\nimport OlMap from \"ol/Map\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { Extent, createEmpty, extend, getArea, getCenter } from \"ol/extent\";\nimport { Geometry, LineString, Point, Polygon } from \"ol/geom\";\nimport VectorLayer from \"ol/layer/Vector\";\nimport VectorSource from \"ol/source/Vector\";\nimport { Fill, Icon, Stroke, Style } from \"ol/style\";\nimport { toFunction as toStyleFunction } from \"ol/style/Style\";\nimport { HighlightOptions, HighlightStyle } from \"../api/MapModel\";\nimport mapMarkerUrl from \"../assets/images/mapMarker.png?url\";\nimport { FeatureLike } from \"ol/Feature\";\nimport { TOPMOST_LAYER_Z } from \"./LayerCollectionImpl\";\nimport { Layer as OlLayer } from \"ol/layer\";\n\nconst DEFAULT_OL_POINT_ZOOM_LEVEL = 17;\nconst DEFAULT_OL_MAX_ZOOM_LEVEL = 20;\nconst DEFAULT_VIEW_PADDING = { top: 50, right: 20, bottom: 10, left: 20 };\n\nexport class Highlights {\n private olMap: OlMap;\n private currentHighlight: OlLayer | undefined;\n\n constructor(olMap: OlMap) {\n this.olMap = olMap;\n }\n\n destroy() {\n this.clearHighlight();\n }\n\n /**\n * This method shows the position of a text search result zoomed to and marked or highlighted in the map.\n */\n addHighlightOrMarkerAndZoom(\n geometries: Point[] | LineString[] | Polygon[],\n options: HighlightOptions\n ) {\n // Cleanup existing highlight\n this.clearHighlight();\n\n if (!geometries || !geometries.length) {\n return;\n }\n this.zoomAndAddMarkers(geometries, options);\n }\n\n clearHighlight() {\n if (this.currentHighlight) {\n this.olMap.removeLayer(this.currentHighlight);\n this.currentHighlight = undefined;\n }\n }\n\n private zoomAndAddMarkers(geometries: Geometry[], options: HighlightOptions | undefined) {\n let extent = createEmpty();\n for (const geom of geometries) {\n extent = extend(extent, geom.getExtent());\n }\n\n const center = getCenter(extent);\n const isPoint = getArea(extent) === 0;\n const zoomScale = isPoint\n ? options?.pointZoom ?? DEFAULT_OL_POINT_ZOOM_LEVEL\n : options?.maxZoom ?? DEFAULT_OL_MAX_ZOOM_LEVEL;\n setCenter(this.olMap, center);\n\n const {\n top = 0,\n right = 0,\n bottom = 0,\n left = 0\n } = options?.viewPadding ?? DEFAULT_VIEW_PADDING;\n const padding = [top, right, bottom, left];\n zoomTo(this.olMap, extent, zoomScale, padding);\n\n this.createAndAddLayer(geometries, options?.highlightStyle);\n }\n\n private createAndAddLayer(geometries: Geometry[], highlightStyle: HighlightStyle | undefined) {\n const features = geometries.map((geometry) => {\n return new Feature({\n type: geometry.getType(),\n geometry: geometry\n });\n });\n const layer = new VectorLayer({\n className: \"highlight-layer\",\n source: new VectorSource({\n features: features\n }),\n style: function (feature, resolution) {\n return resolveStyle(feature, resolution, highlightStyle);\n }\n });\n // Ensure layer is rendered on top of operational layers\n layer.setZIndex(TOPMOST_LAYER_Z);\n this.olMap.addLayer(layer);\n this.currentHighlight = layer;\n }\n}\n\nfunction setCenter(olMap: OlMap, coordinates: Coordinate | undefined) {\n coordinates && coordinates.length && olMap.getView().setCenter(coordinates);\n}\n\nfunction zoomTo(\n olMap: OlMap,\n extent: Extent | undefined,\n zoomLevel: number | undefined,\n padding: number[]\n) {\n if (extent) {\n olMap.getView().fit(extent, { maxZoom: zoomLevel, padding: padding });\n } else {\n zoomLevel && olMap.getView().setZoom(zoomLevel);\n }\n}\n\n/** Returns the appropriate style from the user's highlightStyle or falls back to the default style. */\nfunction resolveStyle(\n feature: FeatureLike,\n resolution: number,\n highlightStyle: HighlightStyle | undefined\n) {\n const type: keyof typeof defaultHighlightStyle = feature.get(\"type\");\n const style = toStyleFunction(highlightStyle?.[type] ?? defaultHighlightStyle[type]);\n return style(feature, resolution);\n}\n\nconst defaultHighlightStyle = {\n \"Point\": new Style({\n image: new Icon({\n anchor: [0.5, 1],\n src: mapMarkerUrl\n })\n }),\n \"LineString\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n })\n })\n ],\n \"Polygon\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n }),\n fill: new Fill({\n color: \"rgba(224,255,255,0.35)\"\n })\n })\n ],\n \"MultiPolygon\": [\n new Style({\n stroke: new Stroke({\n color: \"#fff\",\n width: 5\n })\n }),\n new Style({\n stroke: new Stroke({\n color: \"#00ffff\",\n width: 3\n }),\n fill: new Fill({\n color: \"rgba(224,255,255,0.35)\"\n })\n })\n ]\n};\n"],"names":["toStyleFunction"],"mappings":";;;;;;;;;AAkBA,MAAM,2BAA8B,GAAA,EAAA,CAAA;AACpC,MAAM,yBAA4B,GAAA,EAAA,CAAA;AAClC,MAAM,oBAAA,GAAuB,EAAE,GAAK,EAAA,EAAA,EAAI,OAAO,EAAI,EAAA,MAAA,EAAQ,EAAI,EAAA,IAAA,EAAM,EAAG,EAAA,CAAA;AAEjE,MAAM,UAAW,CAAA;AAAA,EACZ,KAAA,CAAA;AAAA,EACA,gBAAA,CAAA;AAAA,EAER,YAAY,KAAc,EAAA;AACtB,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AAAA,GACjB;AAAA,EAEA,OAAU,GAAA;AACN,IAAA,IAAA,CAAK,cAAe,EAAA,CAAA;AAAA,GACxB;AAAA;AAAA;AAAA;AAAA,EAKA,2BAAA,CACI,YACA,OACF,EAAA;AAEE,IAAA,IAAA,CAAK,cAAe,EAAA,CAAA;AAEpB,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,CAAW,MAAQ,EAAA;AACnC,MAAA,OAAA;AAAA,KACJ;AACA,IAAK,IAAA,CAAA,iBAAA,CAAkB,YAAY,OAAO,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,cAAiB,GAAA;AACb,IAAA,IAAI,KAAK,gBAAkB,EAAA;AACvB,MAAK,IAAA,CAAA,KAAA,CAAM,WAAY,CAAA,IAAA,CAAK,gBAAgB,CAAA,CAAA;AAC5C,MAAA,IAAA,CAAK,gBAAmB,GAAA,KAAA,CAAA,CAAA;AAAA,KAC5B;AAAA,GACJ;AAAA,EAEQ,iBAAA,CAAkB,YAAwB,OAAuC,EAAA;AACrF,IAAA,IAAI,SAAS,WAAY,EAAA,CAAA;AACzB,IAAA,KAAA,MAAW,QAAQ,UAAY,EAAA;AAC3B,MAAA,MAAA,GAAS,MAAO,CAAA,MAAA,EAAQ,IAAK,CAAA,SAAA,EAAW,CAAA,CAAA;AAAA,KAC5C;AAEA,IAAM,MAAA,MAAA,GAAS,UAAU,MAAM,CAAA,CAAA;AAC/B,IAAM,MAAA,OAAA,GAAU,OAAQ,CAAA,MAAM,CAAM,KAAA,CAAA,CAAA;AACpC,IAAA,MAAM,YAAY,OACZ,GAAA,OAAA,EAAS,SAAa,IAAA,2BAAA,GACtB,SAAS,OAAW,IAAA,yBAAA,CAAA;AAC1B,IAAU,SAAA,CAAA,IAAA,CAAK,OAAO,MAAM,CAAA,CAAA;AAE5B,IAAM,MAAA;AAAA,MACF,GAAM,GAAA,CAAA;AAAA,MACN,KAAQ,GAAA,CAAA;AAAA,MACR,MAAS,GAAA,CAAA;AAAA,MACT,IAAO,GAAA,CAAA;AAAA,KACX,GAAI,SAAS,WAAe,IAAA,oBAAA,CAAA;AAC5B,IAAA,MAAM,OAAU,GAAA,CAAC,GAAK,EAAA,KAAA,EAAO,QAAQ,IAAI,CAAA,CAAA;AACzC,IAAA,MAAA,CAAO,IAAK,CAAA,KAAA,EAAO,MAAQ,EAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AAE7C,IAAK,IAAA,CAAA,iBAAA,CAAkB,UAAY,EAAA,OAAA,EAAS,cAAc,CAAA,CAAA;AAAA,GAC9D;AAAA,EAEQ,iBAAA,CAAkB,YAAwB,cAA4C,EAAA;AAC1F,IAAA,MAAM,QAAW,GAAA,UAAA,CAAW,GAAI,CAAA,CAAC,QAAa,KAAA;AAC1C,MAAA,OAAO,IAAI,OAAQ,CAAA;AAAA,QACf,IAAA,EAAM,SAAS,OAAQ,EAAA;AAAA,QACvB,QAAA;AAAA,OACH,CAAA,CAAA;AAAA,KACJ,CAAA,CAAA;AACD,IAAM,MAAA,KAAA,GAAQ,IAAI,WAAY,CAAA;AAAA,MAC1B,SAAW,EAAA,iBAAA;AAAA,MACX,MAAA,EAAQ,IAAI,YAAa,CAAA;AAAA,QACrB,QAAA;AAAA,OACH,CAAA;AAAA,MACD,KAAA,EAAO,SAAU,OAAA,EAAS,UAAY,EAAA;AAClC,QAAO,OAAA,YAAA,CAAa,OAAS,EAAA,UAAA,EAAY,cAAc,CAAA,CAAA;AAAA,OAC3D;AAAA,KACH,CAAA,CAAA;AAED,IAAA,KAAA,CAAM,UAAU,eAAe,CAAA,CAAA;AAC/B,IAAK,IAAA,CAAA,KAAA,CAAM,SAAS,KAAK,CAAA,CAAA;AACzB,IAAA,IAAA,CAAK,gBAAmB,GAAA,KAAA,CAAA;AAAA,GAC5B;AACJ,CAAA;AAEA,SAAS,SAAA,CAAU,OAAc,WAAqC,EAAA;AAClE,EAAA,WAAA,IAAe,YAAY,MAAU,IAAA,KAAA,CAAM,OAAQ,EAAA,CAAE,UAAU,WAAW,CAAA,CAAA;AAC9E,CAAA;AAEA,SAAS,MACL,CAAA,KAAA,EACA,MACA,EAAA,SAAA,EACA,OACF,EAAA;AACE,EAAA,IAAI,MAAQ,EAAA;AACR,IAAM,KAAA,CAAA,OAAA,GAAU,GAAI,CAAA,MAAA,EAAQ,EAAE,OAAS,EAAA,SAAA,EAAW,SAAkB,CAAA,CAAA;AAAA,GACjE,MAAA;AACH,IAAA,SAAA,IAAa,KAAM,CAAA,OAAA,EAAU,CAAA,OAAA,CAAQ,SAAS,CAAA,CAAA;AAAA,GAClD;AACJ,CAAA;AAGA,SAAS,YAAA,CACL,OACA,EAAA,UAAA,EACA,cACF,EAAA;AACE,EAAM,MAAA,IAAA,GAA2C,OAAQ,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACnE,EAAA,MAAM,QAAQA,UAAgB,CAAA,cAAA,GAAiB,IAAI,CAAK,IAAA,qBAAA,CAAsB,IAAI,CAAC,CAAA,CAAA;AACnF,EAAO,OAAA,KAAA,CAAM,SAAS,UAAU,CAAA,CAAA;AACpC,CAAA;AAEA,MAAM,qBAAwB,GAAA;AAAA,EAC1B,OAAA,EAAS,IAAI,KAAM,CAAA;AAAA,IACf,KAAA,EAAO,IAAI,IAAK,CAAA;AAAA,MACZ,MAAA,EAAQ,CAAC,GAAA,EAAK,CAAC,CAAA;AAAA,MACf,GAAK,EAAA,YAAA;AAAA,KACR,CAAA;AAAA,GACJ,CAAA;AAAA,EACD,YAAc,EAAA;AAAA,IACV,IAAI,KAAM,CAAA;AAAA,MACN,MAAA,EAAQ,IAAI,MAAO,CAAA;AAAA,QACf,KAAO,EAAA,MAAA;AAAA,QACP,KAAO,EAAA,CAAA;AAAA,OACV,CAAA;AAAA,KACJ,CAAA;AAAA,IACD,IAAI,KAAM,CAAA;AAAA,MACN,MAAA,EAAQ,IAAI,MAAO,CAAA;AAAA,QACf,KAAO,EAAA,SAAA;AAAA,QACP,KAAO,EAAA,CAAA;AAAA,OACV,CAAA;AAAA,KACJ,CAAA;AAAA,GACL;AAAA,EACA,SAAW,EAAA;AAAA,IACP,IAAI,KAAM,CAAA;AAAA,MACN,MAAA,EAAQ,IAAI,MAAO,CAAA;AAAA,QACf,KAAO,EAAA,MAAA;AAAA,QACP,KAAO,EAAA,CAAA;AAAA,OACV,CAAA;AAAA,KACJ,CAAA;AAAA,IACD,IAAI,KAAM,CAAA;AAAA,MACN,MAAA,EAAQ,IAAI,MAAO,CAAA;AAAA,QACf,KAAO,EAAA,SAAA;AAAA,QACP,KAAO,EAAA,CAAA;AAAA,OACV,CAAA;AAAA,MACD,IAAA,EAAM,IAAI,IAAK,CAAA;AAAA,QACX,KAAO,EAAA,wBAAA;AAAA,OACV,CAAA;AAAA,KACJ,CAAA;AAAA,GACL;AAAA,EACA,cAAgB,EAAA;AAAA,IACZ,IAAI,KAAM,CAAA;AAAA,MACN,MAAA,EAAQ,IAAI,MAAO,CAAA;AAAA,QACf,KAAO,EAAA,MAAA;AAAA,QACP,KAAO,EAAA,CAAA;AAAA,OACV,CAAA;AAAA,KACJ,CAAA;AAAA,IACD,IAAI,KAAM,CAAA;AAAA,MACN,MAAA,EAAQ,IAAI,MAAO,CAAA;AAAA,QACf,KAAO,EAAA,SAAA;AAAA,QACP,KAAO,EAAA,CAAA;AAAA,OACV,CAAA;AAAA,MACD,IAAA,EAAM,IAAI,IAAK,CAAA;AAAA,QACX,KAAO,EAAA,wBAAA;AAAA,OACV,CAAA;AAAA,KACJ,CAAA;AAAA,GACL;AACJ,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimpleLayerImpl.js","sources":["SimpleLayerImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { AbstractLayer } from \"../AbstractLayer\";\n\n/**\n * A simple layer that accepts a custom OpenLayer's layer instance.\n *\n * Some API features (such as sublayers) will not be available.\n */\nexport class SimpleLayerImpl extends AbstractLayer {\n get sublayers(): undefined {\n return undefined;\n }\n}\n"],"names":[],"mappings":";;AASO,MAAM,wBAAwB,aAAc,CAAA;AAAA,EAC/C,IAAI,SAAuB,GAAA;AACvB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AACJ;;;;"}
|
|
1
|
+
{"version":3,"file":"SimpleLayerImpl.js","sources":["SimpleLayerImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { AbstractLayer } from \"../AbstractLayer\";\n\n/**\n * A simple layer that accepts a custom OpenLayer's layer instance.\n *\n * Some API features (such as sublayers) will not be available.\n */\nexport class SimpleLayerImpl extends AbstractLayer {\n get legend() {\n return undefined;\n }\n get sublayers(): undefined {\n return undefined;\n }\n}\n"],"names":[],"mappings":";;AASO,MAAM,wBAAwB,aAAc,CAAA;AAAA,EAC/C,IAAI,MAAS,GAAA;AACT,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AAAA,EACA,IAAI,SAAuB,GAAA;AACvB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AACJ;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import ImageWMS from "ol/source/ImageWMS";
|
|
2
|
+
import { WMSLayer, WMSLayerConfig, WMSSublayer, WMSSublayerConfig } from "../../api";
|
|
2
3
|
import { AbstractLayer } from "../AbstractLayer";
|
|
3
4
|
import { AbstractLayerBase } from "../AbstractLayerBase";
|
|
4
5
|
import { MapModelImpl } from "../MapModelImpl";
|
|
@@ -6,19 +7,24 @@ import { SublayersCollectionImpl } from "../SublayersCollectionImpl";
|
|
|
6
7
|
export declare class WMSLayerImpl extends AbstractLayer implements WMSLayer {
|
|
7
8
|
#private;
|
|
8
9
|
constructor(config: WMSLayerConfig);
|
|
10
|
+
get legend(): undefined;
|
|
9
11
|
get url(): string;
|
|
12
|
+
get __source(): ImageWMS;
|
|
10
13
|
get sublayers(): SublayersCollectionImpl<WMSSublayerImpl>;
|
|
14
|
+
get capabilities(): Record<string, any> | undefined;
|
|
11
15
|
__attach(map: MapModelImpl): void;
|
|
12
16
|
/** Called by the sublayers when their visibility changed. */
|
|
13
17
|
__updateSublayerVisibility(): void;
|
|
14
18
|
}
|
|
15
|
-
declare class WMSSublayerImpl extends AbstractLayerBase implements
|
|
19
|
+
declare class WMSSublayerImpl extends AbstractLayerBase implements WMSSublayer {
|
|
16
20
|
#private;
|
|
17
21
|
constructor(config: WMSSublayerConfig);
|
|
18
|
-
get name(): string;
|
|
22
|
+
get name(): string | undefined;
|
|
19
23
|
get sublayers(): SublayersCollectionImpl<WMSSublayerImpl>;
|
|
20
24
|
get parent(): WMSSublayerImpl | WMSLayerImpl;
|
|
21
25
|
get parentLayer(): WMSLayerImpl;
|
|
26
|
+
get legend(): string | undefined;
|
|
27
|
+
set legend(legendUrl: string | undefined);
|
|
22
28
|
/**
|
|
23
29
|
* Called by the parent layer when it is attached to the map to attach all sublayers.
|
|
24
30
|
*/
|
|
@@ -26,4 +32,6 @@ declare class WMSSublayerImpl extends AbstractLayerBase implements Sublayer {
|
|
|
26
32
|
get visible(): boolean;
|
|
27
33
|
setVisible(newVisibility: boolean): void;
|
|
28
34
|
}
|
|
35
|
+
/** extract the legend url from the service capabilities */
|
|
36
|
+
export declare function getWMSLegendUrl(capabilities: Record<string, any>, layerName: string): undefined;
|
|
29
37
|
export {};
|