@open-pioneer/map 0.6.1 → 0.8.0-dev.20241120115147
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 +214 -0
- package/README.md +127 -12
- package/api/MapModel.d.ts +50 -17
- package/api/index.d.ts +2 -1
- package/api/layers/GroupLayer.d.ts +50 -0
- package/api/layers/GroupLayer.js +6 -0
- package/api/layers/GroupLayer.js.map +1 -0
- package/api/layers/SimpleLayer.d.ts +5 -2
- package/api/layers/SimpleLayer.js.map +1 -1
- package/api/layers/WMSLayer.d.ts +6 -3
- package/api/layers/WMSLayer.js.map +1 -1
- package/api/layers/WMTSLayer.d.ts +4 -2
- package/api/layers/WMTSLayer.js.map +1 -1
- package/api/layers/base.d.ts +77 -18
- package/api/layers/base.js +9 -0
- package/api/layers/base.js.map +1 -0
- package/api/layers/index.d.ts +1 -0
- package/index.js +3 -0
- package/index.js.map +1 -1
- package/model/AbstractLayer.d.ts +4 -3
- package/model/AbstractLayer.js +16 -23
- package/model/AbstractLayer.js.map +1 -1
- package/model/AbstractLayerBase.d.ts +21 -5
- package/model/AbstractLayerBase.js +48 -35
- package/model/AbstractLayerBase.js.map +1 -1
- package/model/Highlights.d.ts +11 -4
- package/model/Highlights.js +5 -1
- package/model/Highlights.js.map +1 -1
- package/model/LayerCollectionImpl.d.ts +10 -10
- package/model/LayerCollectionImpl.js +39 -37
- package/model/LayerCollectionImpl.js.map +1 -1
- package/model/MapModelImpl.d.ts +16 -3
- package/model/MapModelImpl.js +94 -25
- package/model/MapModelImpl.js.map +1 -1
- package/model/SublayersCollectionImpl.d.ts +6 -3
- package/model/SublayersCollectionImpl.js +6 -4
- package/model/SublayersCollectionImpl.js.map +1 -1
- package/model/layers/GroupLayerImpl.d.ts +39 -0
- package/model/layers/GroupLayerImpl.js +88 -0
- package/model/layers/GroupLayerImpl.js.map +1 -0
- package/model/layers/SimpleLayerImpl.d.ts +4 -1
- package/model/layers/SimpleLayerImpl.js +6 -0
- package/model/layers/SimpleLayerImpl.js.map +1 -1
- package/model/layers/WMSLayerImpl.d.ts +11 -7
- package/model/layers/WMSLayerImpl.js +64 -51
- package/model/layers/WMSLayerImpl.js.map +1 -1
- package/model/layers/WMTSLayerImpl.d.ts +4 -5
- package/model/layers/WMTSLayerImpl.js +16 -13
- package/model/layers/WMTSLayerImpl.js.map +1 -1
- package/package.json +11 -12
- package/ui/CssProps.d.ts +9 -0
- package/ui/CssProps.js +13 -0
- package/ui/CssProps.js.map +1 -0
- package/ui/DefaultMapProvider.d.ts +39 -0
- package/ui/DefaultMapProvider.js +24 -0
- package/ui/DefaultMapProvider.js.map +1 -0
- package/ui/MapAnchor.d.ts +0 -3
- package/ui/MapAnchor.js +5 -49
- package/ui/MapAnchor.js.map +1 -1
- package/ui/MapContainer.d.ts +3 -3
- package/ui/MapContainer.js +30 -25
- package/ui/MapContainer.js.map +1 -1
- package/ui/MapContainerContext.d.ts +7 -0
- package/ui/MapContainerContext.js +17 -0
- package/ui/MapContainerContext.js.map +1 -0
- package/ui/computeMapAnchorStyles.d.ts +3 -0
- package/ui/computeMapAnchorStyles.js +51 -0
- package/ui/computeMapAnchorStyles.js.map +1 -0
- package/ui/hooks.d.ts +10 -0
- package/ui/hooks.js.map +1 -1
- package/ui/styles.css +7 -0
- package/ui/styles.css.map +1 -1
- package/ui/useMapModel.d.ts +33 -6
- package/ui/useMapModel.js +40 -2
- package/ui/useMapModel.js.map +1 -1
- package/ui/MapContext.d.ts +0 -11
- package/ui/MapContext.js +0 -17
- package/ui/MapContext.js.map +0 -1
- package/util/defer.d.ts +0 -18
- package/util/defer.js +0 -21
- package/util/defer.js.map +0 -1
package/model/MapModelImpl.js
CHANGED
|
@@ -1,20 +1,26 @@
|
|
|
1
|
+
import { reactive, synchronized, computed } from '@conterra/reactivity-core';
|
|
1
2
|
import { createLogger, EventEmitter, isAbortError, createManualPromise, createAbortError } from '@open-pioneer/core';
|
|
2
3
|
import { unByKey } from 'ol/Observable.js';
|
|
3
4
|
import { getCenter } from 'ol/extent.js';
|
|
4
|
-
import {
|
|
5
|
+
import { getPointResolution } from 'ol/proj.js';
|
|
5
6
|
import { Highlights } from './Highlights.js';
|
|
7
|
+
import { LayerCollectionImpl } from './LayerCollectionImpl.js';
|
|
6
8
|
|
|
7
9
|
const LOG = createLogger("map:MapModel");
|
|
10
|
+
const DEFAULT_DPI = 25.4 / 0.28;
|
|
11
|
+
const INCHES_PER_METRE = 39.37;
|
|
8
12
|
class MapModelImpl extends EventEmitter {
|
|
9
13
|
#id;
|
|
10
14
|
#olMap;
|
|
15
|
+
#olView;
|
|
11
16
|
#layers = new LayerCollectionImpl(this);
|
|
12
17
|
#highlights;
|
|
13
18
|
#sharedDeps;
|
|
14
19
|
#destroyed = false;
|
|
15
20
|
#container;
|
|
16
|
-
#initialExtent;
|
|
17
|
-
#
|
|
21
|
+
#initialExtent = reactive();
|
|
22
|
+
#viewBindings;
|
|
23
|
+
#scale;
|
|
18
24
|
#abortController = new AbortController();
|
|
19
25
|
#displayStatus;
|
|
20
26
|
#displayWaiter;
|
|
@@ -22,7 +28,14 @@ class MapModelImpl extends EventEmitter {
|
|
|
22
28
|
super();
|
|
23
29
|
this.#id = properties.id;
|
|
24
30
|
this.#olMap = properties.olMap;
|
|
25
|
-
this.#
|
|
31
|
+
this.#olView = synchronized(
|
|
32
|
+
() => this.#olMap.getView(),
|
|
33
|
+
(cb) => {
|
|
34
|
+
const key = this.#olMap.on("change:view", cb);
|
|
35
|
+
return () => unByKey(key);
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
this.#initialExtent.value = properties.initialExtent;
|
|
26
39
|
this.#sharedDeps = {
|
|
27
40
|
httpService: properties.httpService
|
|
28
41
|
};
|
|
@@ -43,8 +56,22 @@ class MapModelImpl extends EventEmitter {
|
|
|
43
56
|
this.#displayWaiter = void 0;
|
|
44
57
|
}
|
|
45
58
|
);
|
|
46
|
-
this.#
|
|
47
|
-
this.#
|
|
59
|
+
this.#container = synchronized(
|
|
60
|
+
() => this.#olMap.getTargetElement() ?? void 0,
|
|
61
|
+
(cb) => {
|
|
62
|
+
const key = this.#olMap.on("change:target", cb);
|
|
63
|
+
return () => unByKey(key);
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
this.#viewBindings = computed(() => createViewBindings(this.#olView.value));
|
|
67
|
+
this.#scale = computed(() => {
|
|
68
|
+
const { projection, resolution, center } = this;
|
|
69
|
+
if (projection == null || resolution == null || center == null) {
|
|
70
|
+
return void 0;
|
|
71
|
+
}
|
|
72
|
+
const pointResolution = getPointResolution(projection, resolution, center);
|
|
73
|
+
const scale = Math.round(pointResolution * INCHES_PER_METRE * DEFAULT_DPI);
|
|
74
|
+
return scale;
|
|
48
75
|
});
|
|
49
76
|
}
|
|
50
77
|
destroy() {
|
|
@@ -57,10 +84,6 @@ class MapModelImpl extends EventEmitter {
|
|
|
57
84
|
} catch (e) {
|
|
58
85
|
LOG.warn(`Unexpected error from event listener during map model destruction:`, e);
|
|
59
86
|
}
|
|
60
|
-
if (this.#targetWatchKey) {
|
|
61
|
-
unByKey(this.#targetWatchKey);
|
|
62
|
-
}
|
|
63
|
-
this.#targetWatchKey = void 0;
|
|
64
87
|
this.#abortController.abort();
|
|
65
88
|
this.#displayWaiter?.reject(new Error("Map model was destroyed."));
|
|
66
89
|
this.#layers.destroy();
|
|
@@ -73,18 +96,48 @@ class MapModelImpl extends EventEmitter {
|
|
|
73
96
|
get olMap() {
|
|
74
97
|
return this.#olMap;
|
|
75
98
|
}
|
|
99
|
+
get olView() {
|
|
100
|
+
return this.#olView.value;
|
|
101
|
+
}
|
|
102
|
+
get projection() {
|
|
103
|
+
return this.#viewBindings.value.projection;
|
|
104
|
+
}
|
|
105
|
+
get center() {
|
|
106
|
+
return this.#viewBindings.value.center.value;
|
|
107
|
+
}
|
|
108
|
+
get resolution() {
|
|
109
|
+
return this.#viewBindings.value.resolution.value;
|
|
110
|
+
}
|
|
111
|
+
get zoomLevel() {
|
|
112
|
+
return this.#viewBindings.value.zoom.value;
|
|
113
|
+
}
|
|
114
|
+
get scale() {
|
|
115
|
+
return this.#scale.value;
|
|
116
|
+
}
|
|
76
117
|
get layers() {
|
|
77
118
|
return this.#layers;
|
|
78
119
|
}
|
|
79
120
|
get container() {
|
|
80
|
-
return this.#container;
|
|
121
|
+
return this.#container.value;
|
|
81
122
|
}
|
|
82
123
|
get initialExtent() {
|
|
83
|
-
return this.#initialExtent;
|
|
124
|
+
return this.#initialExtent.value;
|
|
84
125
|
}
|
|
85
126
|
get __sharedDependencies() {
|
|
86
127
|
return this.#sharedDeps;
|
|
87
128
|
}
|
|
129
|
+
setScale(newScale) {
|
|
130
|
+
const view = this.olView;
|
|
131
|
+
const projection = this.projection;
|
|
132
|
+
const center = this.center;
|
|
133
|
+
if (!center) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const mpu = projection.getMetersPerUnit() ?? 1;
|
|
137
|
+
const resolution = INCHES_PER_METRE * DEFAULT_DPI * mpu;
|
|
138
|
+
const pointResolution = newScale / getPointResolution(projection, resolution, center);
|
|
139
|
+
view.setResolution(pointResolution);
|
|
140
|
+
}
|
|
88
141
|
highlight(geometries, options) {
|
|
89
142
|
return this.#highlights.addHighlight(geometries, options);
|
|
90
143
|
}
|
|
@@ -128,8 +181,8 @@ class MapModelImpl extends EventEmitter {
|
|
|
128
181
|
try {
|
|
129
182
|
const olMap = this.#olMap;
|
|
130
183
|
const view = olMap.getView();
|
|
131
|
-
if (this.#initialExtent) {
|
|
132
|
-
const extent = this.#initialExtent;
|
|
184
|
+
if (this.#initialExtent.value) {
|
|
185
|
+
const extent = this.#initialExtent.value;
|
|
133
186
|
const olExtent = [extent.xMin, extent.yMin, extent.xMax, extent.yMax];
|
|
134
187
|
const olCenter = getCenter(olExtent);
|
|
135
188
|
const resolution = view.getResolutionForExtent(olExtent);
|
|
@@ -143,22 +196,38 @@ class MapModelImpl extends EventEmitter {
|
|
|
143
196
|
const [xMin = 0, yMin = 0, xMax = 0, yMax = 0] = olExtent;
|
|
144
197
|
const extent = { xMin, yMin, xMax, yMax };
|
|
145
198
|
LOG.debug(`Detected initial extent`, extent);
|
|
146
|
-
this.#initialExtent = extent;
|
|
147
|
-
this.emit("changed:initialExtent");
|
|
148
|
-
this.emit("changed");
|
|
199
|
+
this.#initialExtent.value = extent;
|
|
149
200
|
}
|
|
150
201
|
} catch (e) {
|
|
151
202
|
throw new Error(`Failed to apply the initial extent.`, { cause: e });
|
|
152
203
|
}
|
|
153
204
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
205
|
+
}
|
|
206
|
+
function createViewBindings(view) {
|
|
207
|
+
return {
|
|
208
|
+
resolution: synchronized(
|
|
209
|
+
() => view.getResolution(),
|
|
210
|
+
(cb) => {
|
|
211
|
+
const key = view.on("change:resolution", cb);
|
|
212
|
+
return () => unByKey(key);
|
|
213
|
+
}
|
|
214
|
+
),
|
|
215
|
+
center: synchronized(
|
|
216
|
+
() => view.getCenter(),
|
|
217
|
+
(cb) => {
|
|
218
|
+
const key = view.on("change:center", cb);
|
|
219
|
+
return () => unByKey(key);
|
|
220
|
+
}
|
|
221
|
+
),
|
|
222
|
+
zoom: synchronized(
|
|
223
|
+
() => view.getZoom(),
|
|
224
|
+
(cb) => {
|
|
225
|
+
const key = view.on("change:resolution", cb);
|
|
226
|
+
return () => unByKey(key);
|
|
227
|
+
}
|
|
228
|
+
),
|
|
229
|
+
projection: view.getProjection()
|
|
230
|
+
};
|
|
162
231
|
}
|
|
163
232
|
function waitForMapSize(olMap, signal) {
|
|
164
233
|
const promise = new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapModelImpl.js","sources":["MapModelImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {\n EventEmitter,\n ManualPromise,\n createAbortError,\n createLogger,\n createManualPromise,\n isAbortError\n} from \"@open-pioneer/core\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport { EventsKey } from \"ol/events\";\nimport { getCenter } from \"ol/extent\";\nimport {\n ExtentConfig,\n Highlight,\n HighlightOptions,\n HighlightZoomOptions,\n MapModel,\n MapModelEvents\n} from \"../api\";\nimport { LayerCollectionImpl } from \"./LayerCollectionImpl\";\nimport { Geometry } from \"ol/geom\";\nimport { Highlights } from \"./Highlights\";\nimport { HttpService } from \"@open-pioneer/http\";\n\nconst LOG = createLogger(\"map:MapModel\");\n\n/**\n * Shared services or other entities propagated from the map model to all layer instances.\n */\nexport interface SharedDependencies {\n httpService: HttpService;\n}\n\nexport class MapModelImpl extends EventEmitter<MapModelEvents> implements MapModel {\n readonly #id: string;\n readonly #olMap: OlMap;\n readonly #layers = new LayerCollectionImpl(this);\n readonly #highlights: Highlights;\n readonly #sharedDeps: SharedDependencies;\n\n #destroyed = false;\n #container: HTMLElement | undefined;\n #initialExtent: ExtentConfig | undefined;\n #targetWatchKey: EventsKey | undefined;\n\n readonly #abortController = new AbortController();\n #displayStatus: \"waiting\" | \"ready\" | \"error\";\n #displayWaiter: ManualPromise<void> | undefined;\n\n constructor(properties: {\n id: string;\n olMap: OlMap;\n initialExtent: ExtentConfig | undefined;\n httpService: HttpService;\n }) {\n super();\n this.#id = properties.id;\n this.#olMap = properties.olMap;\n this.#initialExtent = properties.initialExtent;\n this.#sharedDeps = {\n httpService: properties.httpService\n };\n this.#highlights = new Highlights(this.#olMap);\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 this.#targetWatchKey = this.#olMap.on(\"change:target\", () => {\n this.#onTargetChanged();\n });\n }\n\n destroy() {\n if (this.#destroyed) {\n return;\n }\n\n this.#destroyed = true;\n try {\n this.emit(\"destroy\");\n } catch (e) {\n LOG.warn(`Unexpected error from event listener during map model destruction:`, e);\n }\n\n if (this.#targetWatchKey) {\n unByKey(this.#targetWatchKey);\n }\n this.#targetWatchKey = undefined;\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 get id(): string {\n return this.#id;\n }\n\n get olMap(): OlMap {\n return this.#olMap;\n }\n\n get layers(): LayerCollectionImpl {\n return this.#layers;\n }\n\n get container(): HTMLElement | undefined {\n return this.#container;\n }\n\n get initialExtent(): ExtentConfig | undefined {\n return this.#initialExtent;\n }\n\n get __sharedDependencies(): SharedDependencies {\n return this.#sharedDeps;\n }\n\n highlight(geometries: Geometry[], options?: HighlightOptions | undefined): Highlight {\n return this.#highlights.addHighlight(geometries, options);\n }\n zoom(geometries: Geometry[], options?: HighlightZoomOptions | undefined): void {\n this.#highlights.zoomToHighlight(geometries, options);\n }\n\n highlightAndZoom(geometries: Geometry[], options?: HighlightZoomOptions) {\n return this.#highlights.addHighlightAndZoom(geometries, options ?? {});\n }\n\n removeHighlights() {\n this.#highlights.clearHighlight();\n }\n\n whenDisplayed(): Promise<void> {\n if (this.#destroyed) {\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) {\n // Initial extent was set from the outside. We simply ensure that it gets displayed by the map.\n const extent = this.#initialExtent;\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 = extent;\n this.emit(\"changed:initialExtent\");\n this.emit(\"changed\");\n }\n } catch (e) {\n throw new Error(`Failed to apply the initial extent.`, { cause: e });\n }\n }\n\n #onTargetChanged() {\n const newContainer: HTMLElement | undefined = this.#olMap.getTargetElement() ?? undefined;\n if (this.#container !== newContainer) {\n this.#container = newContainer;\n this.emit(\"changed:container\");\n this.emit(\"changed\");\n }\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":";;;;;;AA2BA,MAAM,GAAA,GAAM,aAAa,cAAc,CAAA,CAAA;AAShC,MAAM,qBAAqB,YAAiD,CAAA;AAAA,EACtE,GAAA,CAAA;AAAA,EACA,MAAA,CAAA;AAAA,EACA,OAAA,GAAU,IAAI,mBAAA,CAAoB,IAAI,CAAA,CAAA;AAAA,EACtC,WAAA,CAAA;AAAA,EACA,WAAA,CAAA;AAAA,EAET,UAAa,GAAA,KAAA,CAAA;AAAA,EACb,UAAA,CAAA;AAAA,EACA,cAAA,CAAA;AAAA,EACA,eAAA,CAAA;AAAA,EAES,gBAAA,GAAmB,IAAI,eAAgB,EAAA,CAAA;AAAA,EAChD,cAAA,CAAA;AAAA,EACA,cAAA,CAAA;AAAA,EAEA,YAAY,UAKT,EAAA;AACC,IAAM,KAAA,EAAA,CAAA;AACN,IAAA,IAAA,CAAK,MAAM,UAAW,CAAA,EAAA,CAAA;AACtB,IAAA,IAAA,CAAK,SAAS,UAAW,CAAA,KAAA,CAAA;AACzB,IAAA,IAAA,CAAK,iBAAiB,UAAW,CAAA,aAAA,CAAA;AACjC,IAAA,IAAA,CAAK,WAAc,GAAA;AAAA,MACf,aAAa,UAAW,CAAA,WAAA;AAAA,KAC5B,CAAA;AACA,IAAA,IAAA,CAAK,WAAc,GAAA,IAAI,UAAW,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAE7C,IAAA,IAAA,CAAK,cAAiB,GAAA,SAAA,CAAA;AACtB,IAAA,IAAA,CAAK,iBAAkB,CAAA,IAAA;AAAA,MACnB,MAAM;AACF,QAAA,IAAA,CAAK,cAAiB,GAAA,OAAA,CAAA;AACtB,QAAA,IAAA,CAAK,gBAAgB,OAAQ,EAAA,CAAA;AAC7B,QAAA,IAAA,CAAK,cAAiB,GAAA,KAAA,CAAA,CAAA;AAAA,OAC1B;AAAA,MACA,CAAC,KAAU,KAAA;AACP,QAAI,IAAA,CAAC,YAAa,CAAA,KAAK,CAAG,EAAA;AACtB,UAAI,GAAA,CAAA,KAAA,CAAM,4BAA4B,KAAK,CAAA,CAAA;AAAA,SAC/C;AAEA,QAAA,IAAA,CAAK,cAAiB,GAAA,OAAA,CAAA;AACtB,QAAA,IAAA,CAAK,cAAgB,EAAA,MAAA,CAAO,IAAI,KAAA,CAAM,2BAA2B,CAAC,CAAA,CAAA;AAClE,QAAA,IAAA,CAAK,cAAiB,GAAA,KAAA,CAAA,CAAA;AAAA,OAC1B;AAAA,KACJ,CAAA;AACA,IAAA,IAAA,CAAK,eAAkB,GAAA,IAAA,CAAK,MAAO,CAAA,EAAA,CAAG,iBAAiB,MAAM;AACzD,MAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,KACzB,CAAA,CAAA;AAAA,GACL;AAAA,EAEA,OAAU,GAAA;AACN,IAAA,IAAI,KAAK,UAAY,EAAA;AACjB,MAAA,OAAA;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAA;AAClB,IAAI,IAAA;AACA,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA,CAAA;AAAA,aACd,CAAG,EAAA;AACR,MAAI,GAAA,CAAA,IAAA,CAAK,sEAAsE,CAAC,CAAA,CAAA;AAAA,KACpF;AAEA,IAAA,IAAI,KAAK,eAAiB,EAAA;AACtB,MAAA,OAAA,CAAQ,KAAK,eAAe,CAAA,CAAA;AAAA,KAChC;AACA,IAAA,IAAA,CAAK,eAAkB,GAAA,KAAA,CAAA,CAAA;AACvB,IAAA,IAAA,CAAK,iBAAiB,KAAM,EAAA,CAAA;AAC5B,IAAA,IAAA,CAAK,cAAgB,EAAA,MAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AACrB,IAAA,IAAA,CAAK,YAAY,OAAQ,EAAA,CAAA;AACzB,IAAA,IAAA,CAAK,OAAO,OAAQ,EAAA,CAAA;AAAA,GACxB;AAAA,EAEA,IAAI,EAAa,GAAA;AACb,IAAA,OAAO,IAAK,CAAA,GAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,KAAe,GAAA;AACf,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,MAA8B,GAAA;AAC9B,IAAA,OAAO,IAAK,CAAA,OAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,SAAqC,GAAA;AACrC,IAAA,OAAO,IAAK,CAAA,UAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,aAA0C,GAAA;AAC1C,IAAA,OAAO,IAAK,CAAA,cAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,oBAA2C,GAAA;AAC3C,IAAA,OAAO,IAAK,CAAA,WAAA,CAAA;AAAA,GAChB;AAAA,EAEA,SAAA,CAAU,YAAwB,OAAmD,EAAA;AACjF,IAAA,OAAO,IAAK,CAAA,WAAA,CAAY,YAAa,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAAA,GAC5D;AAAA,EACA,IAAA,CAAK,YAAwB,OAAkD,EAAA;AAC3E,IAAK,IAAA,CAAA,WAAA,CAAY,eAAgB,CAAA,UAAA,EAAY,OAAO,CAAA,CAAA;AAAA,GACxD;AAAA,EAEA,gBAAA,CAAiB,YAAwB,OAAgC,EAAA;AACrE,IAAA,OAAO,KAAK,WAAY,CAAA,mBAAA,CAAoB,UAAY,EAAA,OAAA,IAAW,EAAE,CAAA,CAAA;AAAA,GACzE;AAAA,EAEA,gBAAmB,GAAA;AACf,IAAA,IAAA,CAAK,YAAY,cAAe,EAAA,CAAA;AAAA,GACpC;AAAA,EAEA,aAA+B,GAAA;AAC3B,IAAA,IAAI,KAAK,UAAY,EAAA;AACjB,MAAA,OAAO,OAAQ,CAAA,MAAA,CAAO,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA,CAAA;AAAA,KAC/D;AACA,IAAI,IAAA,IAAA,CAAK,mBAAmB,OAAS,EAAA;AACjC,MAAA,OAAO,OAAQ,CAAA,MAAA,CAAO,IAAI,KAAA,CAAM,2BAA2B,CAAC,CAAA,CAAA;AAAA,KAChE;AACA,IAAI,IAAA,IAAA,CAAK,mBAAmB,OAAS,EAAA;AACjC,MAAA,OAAO,QAAQ,OAAQ,EAAA,CAAA;AAAA,KAC3B;AACA,IAAQ,OAAA,CAAA,IAAA,CAAK,cAAmB,KAAA,mBAAA,EAAuB,EAAA,OAAA,CAAA;AAAA,GAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAiC,GAAA;AACnC,IAAI,IAAA;AACA,MAAA,MAAM,cAAe,CAAA,IAAA,CAAK,KAAO,EAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA,CAAA;AAAA,aACxD,CAAG,EAAA;AACR,MAAI,IAAA,YAAA,CAAa,CAAC,CAAG,EAAA;AACjB,QAAM,MAAA,CAAA,CAAA;AAAA,OACV;AACA,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,2CAAA,CAAA,EAA+C,EAAE,KAAA,EAAO,GAAG,CAAA,CAAA;AAAA,KAC/E;AAEA,IAAI,IAAA;AACA,MAAA,MAAM,QAAQ,IAAK,CAAA,MAAA,CAAA;AACnB,MAAM,MAAA,IAAA,GAAO,MAAM,OAAQ,EAAA,CAAA;AAE3B,MAAA,IAAI,KAAK,cAAgB,EAAA;AAErB,QAAA,MAAM,SAAS,IAAK,CAAA,cAAA,CAAA;AACpB,QAAM,MAAA,QAAA,GAAW,CAAC,MAAO,CAAA,IAAA,EAAM,OAAO,IAAM,EAAA,MAAA,CAAO,IAAM,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAEpE,QAAM,MAAA,QAAA,GAAW,UAAU,QAAQ,CAAA,CAAA;AACnC,QAAM,MAAA,UAAA,GAAa,IAAK,CAAA,sBAAA,CAAuB,QAAQ,CAAA,CAAA;AACvD,QAAI,GAAA,CAAA,KAAA,CAAM,2BAA2B,MAAM,CAAA,CAAA;AAC3C,QAAI,GAAA,CAAA,KAAA,CAAM,sBAAsB,QAAQ,CAAA,CAAA;AACxC,QAAI,GAAA,CAAA,KAAA,CAAM,0BAA0B,UAAU,CAAA,CAAA;AAE9C,QAAA,IAAA,CAAK,UAAU,QAAQ,CAAA,CAAA;AACvB,QAAA,IAAA,CAAK,cAAc,UAAU,CAAA,CAAA;AAAA,OAC1B,MAAA;AAGH,QAAM,MAAA,QAAA,GAAW,KAAK,eAAgB,EAAA,CAAA;AACtC,QAAM,MAAA,CAAC,OAAO,CAAG,EAAA,IAAA,GAAO,GAAG,IAAO,GAAA,CAAA,EAAG,IAAO,GAAA,CAAC,CAAI,GAAA,QAAA,CAAA;AACjD,QAAA,MAAM,MAAuB,GAAA,EAAE,IAAM,EAAA,IAAA,EAAM,MAAM,IAAK,EAAA,CAAA;AACtD,QAAI,GAAA,CAAA,KAAA,CAAM,2BAA2B,MAAM,CAAA,CAAA;AAE3C,QAAA,IAAA,CAAK,cAAiB,GAAA,MAAA,CAAA;AACtB,QAAA,IAAA,CAAK,KAAK,uBAAuB,CAAA,CAAA;AACjC,QAAA,IAAA,CAAK,KAAK,SAAS,CAAA,CAAA;AAAA,OACvB;AAAA,aACK,CAAG,EAAA;AACR,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,mCAAA,CAAA,EAAuC,EAAE,KAAA,EAAO,GAAG,CAAA,CAAA;AAAA,KACvE;AAAA,GACJ;AAAA,EAEA,gBAAmB,GAAA;AACf,IAAA,MAAM,YAAwC,GAAA,IAAA,CAAK,MAAO,CAAA,gBAAA,EAAsB,IAAA,KAAA,CAAA,CAAA;AAChF,IAAI,IAAA,IAAA,CAAK,eAAe,YAAc,EAAA;AAClC,MAAA,IAAA,CAAK,UAAa,GAAA,YAAA,CAAA;AAClB,MAAA,IAAA,CAAK,KAAK,mBAAmB,CAAA,CAAA;AAC7B,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA,CAAA;AAAA,KACvB;AAAA,GACJ;AACJ,CAAA;AAEA,SAAS,cAAA,CAAe,OAAc,MAAoC,EAAA;AACtE,EAAA,MAAM,OAAU,GAAA,IAAI,OAAc,CAAA,CAAC,SAAS,MAAW,KAAA;AACnD,IAAI,IAAA,QAAA,CAAA;AAEJ,IAAA,SAAS,SAAY,GAAA;AACjB,MAAA,MAAM,WAAc,GAAA,KAAA,CAAM,OAAQ,EAAA,IAAK,EAAC,CAAA;AACxC,MAAA,MAAM,CAAC,KAAA,GAAQ,CAAG,EAAA,MAAA,GAAS,CAAC,CAAI,GAAA,WAAA,CAAA;AAChC,MAAA,IAAI,WAAe,IAAA,KAAA,GAAQ,CAAK,IAAA,MAAA,GAAS,CAAG,EAAA;AACxC,QAAO,MAAA,EAAA,CAAA;AAAA,OACX;AAAA,KACJ;AAEA,IAAA,SAAS,OAAU,GAAA;AACf,MAAA,MAAA,CAAO,kBAAkB,CAAA,CAAA;AAAA,KAC7B;AAEA,IAAA,SAAS,OAAO,KAA2B,EAAA;AACvC,MAAA,IAAI,QAAU,EAAA;AACV,QAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAChB,QAAW,QAAA,GAAA,KAAA,CAAA,CAAA;AAAA,OACf;AACA,MAAO,MAAA,CAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA,CAAA;AAE3C,MAAA,IAAI,KAAO,EAAA;AACP,QAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,OACT,MAAA;AACH,QAAQ,OAAA,CAAA,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AAAA,OACpB;AAAA,KACJ;AAEA,IAAA,IAAI,OAAO,OAAS,EAAA;AAChB,MAAA,MAAA,CAAO,kBAAkB,CAAA,CAAA;AACzB,MAAA,OAAA;AAAA,KACJ;AAEA,IAAO,MAAA,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AACxC,IAAW,QAAA,GAAA,KAAA,CAAM,EAAG,CAAA,aAAA,EAAe,SAAS,CAAA,CAAA;AAAA,GAC/C,CAAA,CAAA;AACD,EAAO,OAAA,OAAA,CAAA;AACX,CAAA;AAEA,SAAS,KAAK,YAAqC,EAAA;AAC/C,EAAA,OAAO,IAAI,OAAQ,CAAA,CAAC,YAAY,UAAW,CAAA,OAAA,EAAS,YAAY,CAAC,CAAA,CAAA;AACrE;;;;"}
|
|
1
|
+
{"version":3,"file":"MapModelImpl.js","sources":["MapModelImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 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 {\n createAbortError,\n createLogger,\n createManualPromise,\n EventEmitter,\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 {\n ExtentConfig,\n Highlight,\n HighlightOptions,\n HighlightZoomOptions,\n MapModel,\n MapModelEvents\n} from \"../api\";\nimport { Highlights } from \"./Highlights\";\nimport { LayerCollectionImpl } from \"./LayerCollectionImpl\";\n\nconst LOG = createLogger(\"map:MapModel\");\n\nconst DEFAULT_DPI = 25.4 / 0.28;\nconst INCHES_PER_METRE = 39.37;\n\n/**\n * Shared services or other entities propagated from the map model to all layer instances.\n */\nexport interface SharedDependencies {\n httpService: HttpService;\n}\n\nexport class MapModelImpl extends EventEmitter<MapModelEvents> implements MapModel {\n readonly #id: string;\n readonly #olMap: OlMap;\n readonly #olView: ReadonlyReactive<OlView>;\n readonly #layers = new LayerCollectionImpl(this);\n readonly #highlights: Highlights;\n readonly #sharedDeps: SharedDependencies;\n\n #destroyed = 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 constructor(properties: {\n id: string;\n olMap: OlMap;\n initialExtent: ExtentConfig | undefined;\n httpService: HttpService;\n }) {\n super();\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.#sharedDeps = {\n httpService: properties.httpService\n };\n this.#highlights = new Highlights(this.#olMap);\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);\n const scale = Math.round(pointResolution * INCHES_PER_METRE * DEFAULT_DPI);\n return scale;\n });\n }\n\n destroy() {\n if (this.#destroyed) {\n return;\n }\n\n this.#destroyed = true;\n try {\n this.emit(\"destroy\");\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 get id(): string {\n return this.#id;\n }\n\n get olMap(): OlMap {\n return this.#olMap;\n }\n\n get olView(): OlView {\n return this.#olView.value;\n }\n\n get projection(): Projection {\n return this.#viewBindings.value.projection;\n }\n\n get center(): Coordinate | undefined {\n return this.#viewBindings.value.center.value;\n }\n\n get resolution(): number | undefined {\n return this.#viewBindings.value.resolution.value;\n }\n\n get zoomLevel(): number | undefined {\n return this.#viewBindings.value.zoom.value;\n }\n\n get scale(): number | undefined {\n return this.#scale.value;\n }\n\n get layers(): LayerCollectionImpl {\n return this.#layers;\n }\n\n get container(): HTMLElement | undefined {\n return this.#container.value;\n }\n\n get initialExtent(): ExtentConfig | undefined {\n return this.#initialExtent.value;\n }\n\n get __sharedDependencies(): SharedDependencies {\n return this.#sharedDeps;\n }\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 highlight(geometries: Geometry[], options?: HighlightOptions | undefined): Highlight {\n return this.#highlights.addHighlight(geometries, options);\n }\n\n zoom(geometries: Geometry[], options?: HighlightZoomOptions | undefined): void {\n this.#highlights.zoomToHighlight(geometries, options);\n }\n\n highlightAndZoom(geometries: Geometry[], options?: HighlightZoomOptions) {\n return this.#highlights.addHighlightAndZoom(geometries, options ?? {});\n }\n\n removeHighlights() {\n this.#highlights.clearHighlight();\n }\n\n whenDisplayed(): Promise<void> {\n if (this.#destroyed) {\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,10 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { LayerRetrievalOptions, Sublayer as SublayerInterface, SublayersCollection, SublayersCollectionEvents } from "../api";
|
|
1
|
+
import { LayerRetrievalOptions, SublayerBaseType, SublayersCollection } from "../api";
|
|
3
2
|
import { AbstractLayerBase } from "./AbstractLayerBase";
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Manages the sublayers of a layer.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SublayersCollectionImpl<Sublayer extends SublayerBaseType & AbstractLayerBase> implements SublayersCollection<Sublayer> {
|
|
5
7
|
#private;
|
|
6
8
|
constructor(sublayers: Sublayer[]);
|
|
7
9
|
destroy(): void;
|
|
10
|
+
getItems(options?: LayerRetrievalOptions): Sublayer[];
|
|
8
11
|
getSublayers(_options?: LayerRetrievalOptions | undefined): Sublayer[];
|
|
9
12
|
/**
|
|
10
13
|
* Returns a reference to the internal sublayers array.
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
class SublayersCollectionImpl extends EventEmitter {
|
|
1
|
+
class SublayersCollectionImpl {
|
|
2
|
+
/* eslint-enable indent */
|
|
4
3
|
#sublayers;
|
|
5
4
|
constructor(sublayers) {
|
|
6
|
-
super();
|
|
7
5
|
this.#sublayers = sublayers;
|
|
8
6
|
}
|
|
9
7
|
destroy() {
|
|
@@ -12,6 +10,10 @@ class SublayersCollectionImpl extends EventEmitter {
|
|
|
12
10
|
}
|
|
13
11
|
this.#sublayers = [];
|
|
14
12
|
}
|
|
13
|
+
// Generic method name for consistent interface
|
|
14
|
+
getItems(options) {
|
|
15
|
+
return this.getSublayers(options);
|
|
16
|
+
}
|
|
15
17
|
getSublayers(_options) {
|
|
16
18
|
return this.#sublayers.slice();
|
|
17
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SublayersCollectionImpl.js","sources":["SublayersCollectionImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport {
|
|
1
|
+
{"version":3,"file":"SublayersCollectionImpl.js","sources":["SublayersCollectionImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { LayerRetrievalOptions, SublayerBaseType, SublayersCollection } from \"../api\";\nimport { AbstractLayerBase } from \"./AbstractLayerBase\";\n\n/**\n * Manages the sublayers of a layer.\n */\n// NOTE: adding / removing sublayers currently not supported\n/* eslint-disable indent */\nexport class SublayersCollectionImpl<Sublayer extends SublayerBaseType & AbstractLayerBase>\n implements SublayersCollection<Sublayer>\n{\n /* eslint-enable indent */\n #sublayers: Sublayer[];\n\n constructor(sublayers: Sublayer[]) {\n this.#sublayers = sublayers;\n }\n\n destroy() {\n for (const layer of this.#sublayers) {\n layer.destroy();\n }\n this.#sublayers = [];\n }\n\n // Generic method name for consistent interface\n getItems(options?: LayerRetrievalOptions): Sublayer[] {\n return this.getSublayers(options);\n }\n\n getSublayers(_options?: LayerRetrievalOptions | undefined): Sublayer[] {\n // NOTE: options are ignored because layers are always ordered at this time.\n return this.#sublayers.slice();\n }\n\n /**\n * Returns a reference to the internal sublayers array.\n *\n * NOTE: Do not modify directly!\n */\n __getRawSublayers(): Sublayer[] {\n return this.#sublayers;\n }\n}\n"],"names":[],"mappings":"AAUO,MAAM,uBAEb,CAAA;AAAA;AAAA,EAEI,UAAA,CAAA;AAAA,EAEA,YAAY,SAAuB,EAAA;AAC/B,IAAA,IAAA,CAAK,UAAa,GAAA,SAAA,CAAA;AAAA,GACtB;AAAA,EAEA,OAAU,GAAA;AACN,IAAW,KAAA,MAAA,KAAA,IAAS,KAAK,UAAY,EAAA;AACjC,MAAA,KAAA,CAAM,OAAQ,EAAA,CAAA;AAAA,KAClB;AACA,IAAA,IAAA,CAAK,aAAa,EAAC,CAAA;AAAA,GACvB;AAAA;AAAA,EAGA,SAAS,OAA6C,EAAA;AAClD,IAAO,OAAA,IAAA,CAAK,aAAa,OAAO,CAAA,CAAA;AAAA,GACpC;AAAA,EAEA,aAAa,QAA0D,EAAA;AAEnE,IAAO,OAAA,IAAA,CAAK,WAAW,KAAM,EAAA,CAAA;AAAA,GACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAgC,GAAA;AAC5B,IAAA,OAAO,IAAK,CAAA,UAAA,CAAA;AAAA,GAChB;AACJ;;;;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Group } from "ol/layer";
|
|
2
|
+
import { GroupLayerCollection, Layer, LayerRetrievalOptions } from "../../api";
|
|
3
|
+
import { GroupLayer, GroupLayerConfig } from "../../api/layers/GroupLayer";
|
|
4
|
+
import { AbstractLayer } from "../AbstractLayer";
|
|
5
|
+
import { MapModelImpl } from "../MapModelImpl";
|
|
6
|
+
export declare class GroupLayerImpl extends AbstractLayer implements GroupLayer {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(config: GroupLayerConfig);
|
|
9
|
+
get type(): "group";
|
|
10
|
+
get legend(): undefined;
|
|
11
|
+
get layers(): GroupLayerCollectionImpl;
|
|
12
|
+
get sublayers(): undefined;
|
|
13
|
+
/**
|
|
14
|
+
* return raw OL LayerGroup
|
|
15
|
+
* Warning: Do not manipulate the collection of layers in this group, changes are not synchronized!
|
|
16
|
+
*/
|
|
17
|
+
get olLayer(): Group;
|
|
18
|
+
__attachToMap(map: MapModelImpl): void;
|
|
19
|
+
}
|
|
20
|
+
export declare class GroupLayerCollectionImpl implements GroupLayerCollection {
|
|
21
|
+
#private;
|
|
22
|
+
constructor(layers: Layer[], parent: GroupLayer);
|
|
23
|
+
/**
|
|
24
|
+
* Destroys this collection, all contained layers are detached from their parent group layer
|
|
25
|
+
*/
|
|
26
|
+
destroy(): void;
|
|
27
|
+
getItems(options?: LayerRetrievalOptions): (AbstractLayer & Layer)[];
|
|
28
|
+
getLayers(_options?: LayerRetrievalOptions | undefined): (AbstractLayer & Layer)[];
|
|
29
|
+
/**
|
|
30
|
+
* Returns a reference to the internal group layer array.
|
|
31
|
+
*
|
|
32
|
+
* NOTE: Do not modify directly!
|
|
33
|
+
*/
|
|
34
|
+
__getRawLayers(): (AbstractLayer & Layer)[];
|
|
35
|
+
/**
|
|
36
|
+
* Returns the parent group layer that owns this collection.
|
|
37
|
+
*/
|
|
38
|
+
__getParent(): GroupLayer;
|
|
39
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Group } from 'ol/layer.js';
|
|
2
|
+
import { AbstractLayer } from '../AbstractLayer.js';
|
|
3
|
+
import { AbstractLayerBase } from '../AbstractLayerBase.js';
|
|
4
|
+
|
|
5
|
+
class GroupLayerImpl extends AbstractLayer {
|
|
6
|
+
#children;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
const groupLayers = config.layers;
|
|
9
|
+
const olGroup = new Group({ layers: groupLayers.map((sublayer) => sublayer.olLayer) });
|
|
10
|
+
super({ ...config, olLayer: olGroup });
|
|
11
|
+
this.#children = new GroupLayerCollectionImpl(groupLayers, this);
|
|
12
|
+
}
|
|
13
|
+
get type() {
|
|
14
|
+
return "group";
|
|
15
|
+
}
|
|
16
|
+
get legend() {
|
|
17
|
+
return void 0;
|
|
18
|
+
}
|
|
19
|
+
get layers() {
|
|
20
|
+
return this.#children;
|
|
21
|
+
}
|
|
22
|
+
get sublayers() {
|
|
23
|
+
return void 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* return raw OL LayerGroup
|
|
27
|
+
* Warning: Do not manipulate the collection of layers in this group, changes are not synchronized!
|
|
28
|
+
*/
|
|
29
|
+
get olLayer() {
|
|
30
|
+
return super.olLayer;
|
|
31
|
+
}
|
|
32
|
+
__attachToMap(map) {
|
|
33
|
+
super.__attachToMap(map);
|
|
34
|
+
this.layers.__getRawLayers().forEach((layer) => layer.__attachToMap(map));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
class GroupLayerCollectionImpl {
|
|
38
|
+
#layers;
|
|
39
|
+
#parent;
|
|
40
|
+
constructor(layers, parent) {
|
|
41
|
+
layers = layers.slice();
|
|
42
|
+
for (const layer of layers) {
|
|
43
|
+
if (layer instanceof AbstractLayer) {
|
|
44
|
+
layer.__attachToGroup(parent);
|
|
45
|
+
} else {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`Layer '${layer.id}' of group '${parent.id}' does not implement abstract class '${AbstractLayerBase.name}`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.#layers = layers;
|
|
52
|
+
this.#parent = parent;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Destroys this collection, all contained layers are detached from their parent group layer
|
|
56
|
+
*/
|
|
57
|
+
destroy() {
|
|
58
|
+
for (const layer of this.#layers) {
|
|
59
|
+
layer.__detachFromGroup();
|
|
60
|
+
layer.destroy();
|
|
61
|
+
}
|
|
62
|
+
this.#layers = [];
|
|
63
|
+
}
|
|
64
|
+
// Generic method name for consistent interface
|
|
65
|
+
getItems(options) {
|
|
66
|
+
return this.getLayers(options);
|
|
67
|
+
}
|
|
68
|
+
getLayers(_options) {
|
|
69
|
+
return this.#layers.slice();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns a reference to the internal group layer array.
|
|
73
|
+
*
|
|
74
|
+
* NOTE: Do not modify directly!
|
|
75
|
+
*/
|
|
76
|
+
__getRawLayers() {
|
|
77
|
+
return this.#layers;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns the parent group layer that owns this collection.
|
|
81
|
+
*/
|
|
82
|
+
__getParent() {
|
|
83
|
+
return this.#parent;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export { GroupLayerCollectionImpl, GroupLayerImpl };
|
|
88
|
+
//# sourceMappingURL=GroupLayerImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupLayerImpl.js","sources":["GroupLayerImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Group } from \"ol/layer\";\nimport { GroupLayerCollection, Layer, LayerRetrievalOptions } from \"../../api\";\nimport { GroupLayer, GroupLayerConfig } from \"../../api/layers/GroupLayer\";\nimport { AbstractLayer } from \"../AbstractLayer\";\nimport { AbstractLayerBase } from \"../AbstractLayerBase\";\nimport { MapModelImpl } from \"../MapModelImpl\";\n\nexport class GroupLayerImpl extends AbstractLayer implements GroupLayer {\n #children: GroupLayerCollectionImpl;\n\n constructor(config: GroupLayerConfig) {\n const groupLayers = config.layers;\n const olGroup = new Group({ layers: groupLayers.map((sublayer) => sublayer.olLayer) });\n super({ ...config, olLayer: olGroup });\n this.#children = new GroupLayerCollectionImpl(groupLayers, this);\n }\n\n get type() {\n return \"group\" as const;\n }\n\n get legend() {\n return undefined;\n }\n\n get layers(): GroupLayerCollectionImpl {\n return this.#children;\n }\n\n get sublayers(): undefined {\n return undefined;\n }\n\n /**\n * return raw OL LayerGroup\n * Warning: Do not manipulate the collection of layers in this group, changes are not synchronized!\n */\n get olLayer(): Group {\n return super.olLayer as Group;\n }\n\n __attachToMap(map: MapModelImpl): void {\n super.__attachToMap(map);\n this.layers.__getRawLayers().forEach((layer) => layer.__attachToMap(map));\n }\n}\n\n// NOTE: adding / removing currently not supported.\n// When adding support for dynamic content, make sure to also updating the layer indexing logic in the map (LayerCollectionImpl).\n// Nested children of a group layer must also be found in id-lookups.\nexport class GroupLayerCollectionImpl implements GroupLayerCollection {\n #layers: (AbstractLayer & Layer)[];\n #parent: GroupLayer;\n\n constructor(layers: Layer[], parent: GroupLayer) {\n layers = layers.slice(); // Don't modify the input\n for (const layer of layers) {\n if (layer instanceof AbstractLayer) {\n layer.__attachToGroup(parent); //attach every layer to the parent group layer\n } else {\n throw new Error(\n `Layer '${layer.id}' of group '${parent.id}' does not implement abstract class '${AbstractLayerBase.name}`\n );\n }\n }\n this.#layers = layers as (Layer & AbstractLayer)[];\n this.#parent = parent;\n }\n\n /**\n * Destroys this collection, all contained layers are detached from their parent group layer\n */\n destroy() {\n for (const layer of this.#layers) {\n layer.__detachFromGroup();\n layer.destroy();\n }\n this.#layers = [];\n }\n\n // Generic method name for consistent interface\n getItems(options?: LayerRetrievalOptions): (AbstractLayer & Layer)[] {\n return this.getLayers(options);\n }\n\n getLayers(_options?: LayerRetrievalOptions | undefined): (AbstractLayer & Layer)[] {\n // NOTE: options are ignored because layers are always ordered at this time.\n return this.#layers.slice();\n }\n\n /**\n * Returns a reference to the internal group layer array.\n *\n * NOTE: Do not modify directly!\n */\n __getRawLayers(): (AbstractLayer & Layer)[] {\n return this.#layers;\n }\n\n /**\n * Returns the parent group layer that owns this collection.\n */\n __getParent(): GroupLayer {\n return this.#parent;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { SimpleLayer } from "../../api";
|
|
1
2
|
import { AbstractLayer } from "../AbstractLayer";
|
|
2
3
|
/**
|
|
3
4
|
* A simple layer that accepts a custom OpenLayer's layer instance.
|
|
4
5
|
*
|
|
5
6
|
* Some API features (such as sublayers) will not be available.
|
|
6
7
|
*/
|
|
7
|
-
export declare class SimpleLayerImpl extends AbstractLayer {
|
|
8
|
+
export declare class SimpleLayerImpl extends AbstractLayer implements SimpleLayer {
|
|
9
|
+
get type(): "simple";
|
|
8
10
|
get legend(): undefined;
|
|
11
|
+
get layers(): undefined;
|
|
9
12
|
get sublayers(): undefined;
|
|
10
13
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { AbstractLayer } from '../AbstractLayer.js';
|
|
2
2
|
|
|
3
3
|
class SimpleLayerImpl extends AbstractLayer {
|
|
4
|
+
get type() {
|
|
5
|
+
return "simple";
|
|
6
|
+
}
|
|
4
7
|
get legend() {
|
|
5
8
|
return void 0;
|
|
6
9
|
}
|
|
10
|
+
get layers() {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
7
13
|
get sublayers() {
|
|
8
14
|
return void 0;
|
|
9
15
|
}
|
|
@@ -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 legend() {\n return undefined;\n }\n get sublayers(): undefined {\n return undefined;\n }\n}\n"],"names":[],"mappings":";;
|
|
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 { SimpleLayer } from \"../../api\";\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 implements SimpleLayer {\n get type() {\n return \"simple\" as const;\n }\n\n get legend(): undefined {\n return undefined;\n }\n\n get layers(): undefined {\n return undefined;\n }\n\n get sublayers(): undefined {\n return undefined;\n }\n}\n"],"names":[],"mappings":";;AAUO,MAAM,wBAAwB,aAAqC,CAAA;AAAA,EACtE,IAAI,IAAO,GAAA;AACP,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AAAA,EAEA,IAAI,MAAoB,GAAA;AACpB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AAAA,EAEA,IAAI,MAAoB,GAAA;AACpB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AAAA,EAEA,IAAI,SAAuB,GAAA;AACvB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACX;AACJ;;;;"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import ImageWMS from "ol/source/ImageWMS";
|
|
2
1
|
import { WMSLayer, WMSLayerConfig, WMSSublayer, WMSSublayerConfig } from "../../api";
|
|
3
2
|
import { AbstractLayer } from "../AbstractLayer";
|
|
4
3
|
import { AbstractLayerBase } from "../AbstractLayerBase";
|
|
@@ -7,29 +6,34 @@ import { SublayersCollectionImpl } from "../SublayersCollectionImpl";
|
|
|
7
6
|
export declare class WMSLayerImpl extends AbstractLayer implements WMSLayer {
|
|
8
7
|
#private;
|
|
9
8
|
constructor(config: WMSLayerConfig);
|
|
9
|
+
destroy(): void;
|
|
10
|
+
get type(): "wms";
|
|
10
11
|
get legend(): undefined;
|
|
11
12
|
get url(): string;
|
|
12
|
-
get
|
|
13
|
+
get layers(): undefined;
|
|
13
14
|
get sublayers(): SublayersCollectionImpl<WMSSublayerImpl>;
|
|
14
15
|
get capabilities(): Record<string, any> | undefined;
|
|
15
|
-
|
|
16
|
-
/** Called by the sublayers when their visibility changed. */
|
|
17
|
-
__updateSublayerVisibility(): void;
|
|
16
|
+
__attachToMap(map: MapModelImpl): void;
|
|
18
17
|
}
|
|
19
18
|
declare class WMSSublayerImpl extends AbstractLayerBase implements WMSSublayer {
|
|
20
19
|
#private;
|
|
21
20
|
constructor(config: WMSSublayerConfig);
|
|
21
|
+
get type(): "wms-sublayer";
|
|
22
22
|
get name(): string | undefined;
|
|
23
|
+
get layers(): undefined;
|
|
23
24
|
get sublayers(): SublayersCollectionImpl<WMSSublayerImpl>;
|
|
24
25
|
get parent(): WMSSublayerImpl | WMSLayerImpl;
|
|
25
26
|
get parentLayer(): WMSLayerImpl;
|
|
26
27
|
get legend(): string | undefined;
|
|
27
|
-
|
|
28
|
+
get visible(): boolean;
|
|
28
29
|
/**
|
|
29
30
|
* Called by the parent layer when it is attached to the map to attach all sublayers.
|
|
30
31
|
*/
|
|
31
32
|
__attach(map: MapModelImpl, parentLayer: WMSLayerImpl, parent: WMSLayerImpl | WMSSublayerImpl): void;
|
|
32
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Called by the parent layer to update the legend on load.
|
|
35
|
+
*/
|
|
36
|
+
__setLegend(legendUrl: string | undefined): void;
|
|
33
37
|
setVisible(newVisibility: boolean): void;
|
|
34
38
|
}
|
|
35
39
|
/** extract the legend url from the service capabilities */
|