@open-pioneer/map 0.7.0 → 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.
Files changed (53) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/README.md +116 -12
  3. package/api/MapModel.d.ts +48 -15
  4. package/api/layers/GroupLayer.d.ts +50 -0
  5. package/api/layers/GroupLayer.js +6 -0
  6. package/api/layers/GroupLayer.js.map +1 -0
  7. package/api/layers/SimpleLayer.d.ts +1 -0
  8. package/api/layers/SimpleLayer.js.map +1 -1
  9. package/api/layers/WMSLayer.d.ts +1 -0
  10. package/api/layers/WMSLayer.js.map +1 -1
  11. package/api/layers/WMTSLayer.d.ts +1 -0
  12. package/api/layers/WMTSLayer.js.map +1 -1
  13. package/api/layers/base.d.ts +35 -14
  14. package/api/layers/base.js.map +1 -1
  15. package/api/layers/index.d.ts +1 -0
  16. package/index.js +1 -0
  17. package/index.js.map +1 -1
  18. package/model/AbstractLayer.d.ts +2 -2
  19. package/model/AbstractLayer.js +16 -23
  20. package/model/AbstractLayer.js.map +1 -1
  21. package/model/AbstractLayerBase.d.ts +19 -4
  22. package/model/AbstractLayerBase.js +48 -35
  23. package/model/AbstractLayerBase.js.map +1 -1
  24. package/model/Highlights.d.ts +2 -1
  25. package/model/Highlights.js +2 -0
  26. package/model/Highlights.js.map +1 -1
  27. package/model/LayerCollectionImpl.d.ts +5 -3
  28. package/model/LayerCollectionImpl.js +27 -29
  29. package/model/LayerCollectionImpl.js.map +1 -1
  30. package/model/MapModelImpl.d.ts +12 -2
  31. package/model/MapModelImpl.js +94 -25
  32. package/model/MapModelImpl.js.map +1 -1
  33. package/model/SublayersCollectionImpl.d.ts +6 -3
  34. package/model/SublayersCollectionImpl.js +6 -4
  35. package/model/SublayersCollectionImpl.js.map +1 -1
  36. package/model/layers/GroupLayerImpl.d.ts +39 -0
  37. package/model/layers/GroupLayerImpl.js +88 -0
  38. package/model/layers/GroupLayerImpl.js.map +1 -0
  39. package/model/layers/SimpleLayerImpl.d.ts +1 -0
  40. package/model/layers/SimpleLayerImpl.js +3 -0
  41. package/model/layers/SimpleLayerImpl.js.map +1 -1
  42. package/model/layers/WMSLayerImpl.d.ts +9 -7
  43. package/model/layers/WMSLayerImpl.js +58 -51
  44. package/model/layers/WMSLayerImpl.js.map +1 -1
  45. package/model/layers/WMTSLayerImpl.d.ts +3 -5
  46. package/model/layers/WMTSLayerImpl.js +13 -13
  47. package/model/layers/WMTSLayerImpl.js.map +1 -1
  48. package/package.json +9 -8
  49. package/ui/hooks.d.ts +10 -0
  50. package/ui/hooks.js.map +1 -1
  51. package/util/defer.d.ts +0 -18
  52. package/util/defer.js +0 -21
  53. package/util/defer.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WMTSLayerImpl.js","sources":["WMTSLayerImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { createLogger, isAbortError } from \"@open-pioneer/core\";\nimport Tile from \"ol/Tile\";\nimport TileState from \"ol/TileState\";\nimport WMTSCapabilities from \"ol/format/WMTSCapabilities\";\nimport TileLayer from \"ol/layer/Tile\";\nimport type TileSourceType from \"ol/source/Tile\";\nimport WMTS, { optionsFromCapabilities } from \"ol/source/WMTS\";\nimport { WMTSLayer, WMTSLayerConfig } from \"../../api\";\nimport { fetchCapabilities } from \"../../util/capabilities-utils\";\nimport { AbstractLayer } from \"../AbstractLayer\";\nimport { MapModelImpl } from \"../MapModelImpl\";\nimport { ImageTile } from \"ol\";\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\n\nconst LOG = createLogger(\"map:WMTSLayer\");\n\nexport class WMTSLayerImpl extends AbstractLayer implements WMTSLayer {\n #url: string;\n #name: string;\n #matrixSet: string;\n #layer: TileLayer<TileSourceType>;\n #source: WMTS | undefined;\n #legend: string | undefined;\n #sourceOptions?: Partial<WMSSourceOptions>;\n readonly #abortController = new AbortController();\n\n constructor(config: WMTSLayerConfig) {\n const layer = new TileLayer();\n super({\n ...config,\n olLayer: layer\n });\n this.#url = config.url;\n this.#name = config.name;\n this.#layer = layer;\n this.#matrixSet = config.matrixSet;\n this.#sourceOptions = config.sourceOptions;\n }\n\n get type() {\n return \"wmts\" as const;\n }\n\n destroy(): void {\n super.destroy();\n this.#abortController.abort();\n }\n\n get legend(): string | undefined {\n return this.#legend;\n }\n\n __attach(map: MapModelImpl): void {\n super.__attach(map);\n this.#fetchWMTSCapabilities()\n .then((result: string) => {\n const parser = new WMTSCapabilities();\n const capabilities = parser.read(result);\n const options = optionsFromCapabilities(capabilities, {\n layer: this.#name,\n matrixSet: this.#matrixSet\n });\n if (!options) {\n throw new Error(\"Layer was not found in capabilities\");\n }\n const source = new WMTS({\n ...options,\n ...this.#sourceOptions,\n tileLoadFunction: (tile, tileUrl) => {\n this.#loadTile(tile, tileUrl);\n }\n });\n this.#source = source;\n this.#layer.setSource(this.#source);\n const activeStyleId = source.getStyle();\n const legendUrl = getWMTSLegendUrl(capabilities, this.name, activeStyleId);\n this.#legend = legendUrl;\n this.__emitChangeEvent(\"changed:legend\");\n })\n .catch((error) => {\n if (isAbortError(error)) {\n LOG.error(`Layer ${this.name} has been destroyed before fetching the data`);\n return;\n }\n LOG.error(`Failed fetching WMTS capabilities for Layer ${this.name}`, error);\n });\n }\n\n get layer() {\n return this.#layer;\n }\n\n get url() {\n return this.#url;\n }\n\n get name() {\n return this.#name;\n }\n\n get matrixSet() {\n return this.#matrixSet;\n }\n\n get sublayers(): undefined {\n return undefined;\n }\n\n async #fetchWMTSCapabilities(): Promise<string> {\n const httpService = this.map.__sharedDependencies.httpService;\n return fetchCapabilities(this.#url, httpService, this.#abortController.signal);\n }\n\n async #loadTile(tile: Tile, tileUrl: string): Promise<void> {\n const httpService = this.map.__sharedDependencies.httpService;\n try {\n if (!(tile instanceof ImageTile)) {\n throw new Error(\"Only 'ImageTile' is supported for now.\");\n }\n\n const image = tile.getImage();\n if (!isHtmlImage(image)) {\n // Could also be canvas or video\n throw new Error(\"Only <img> tags are supported as tiles for now.\");\n }\n\n const response = await httpService.fetch(tileUrl);\n if (!response.ok) {\n throw new Error(`Tile request failed with status ${response.status}.`);\n }\n\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n const finish = () => {\n // Cleanup object URL after load to prevent memory leaks.\n // https://stackoverflow.com/questions/62473876/openlayers-6-settileloadfunction-documented-example-uses-url-createobjecturld\n URL.revokeObjectURL(objectUrl);\n image.removeEventListener(\"load\", finish);\n image.removeEventListener(\"error\", finish);\n };\n image.addEventListener(\"load\", finish);\n image.addEventListener(\"error\", finish);\n image.src = objectUrl;\n } catch (e) {\n tile.setState(TileState.ERROR);\n if (!isAbortError(e)) {\n LOG.error(\"Failed to load tile\", e);\n }\n }\n }\n}\n\nfunction isHtmlImage(htmlElement: HTMLElement): htmlElement is HTMLImageElement {\n return htmlElement.tagName === \"IMG\";\n}\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function getWMTSLegendUrl(\n capabilities: Record<string, any>,\n activeLayerId: string | undefined,\n activeStyleId: string | undefined\n): string | undefined {\n const content = capabilities?.Contents;\n const layers = content?.Layer;\n\n let activeLayer = layers?.find((layer: any) => layer?.Identifier === activeLayerId);\n if (!activeLayer) {\n LOG.debug(\"Failed to find the active layer in WMTS layer capabilities.\");\n activeLayer = layers?.[0];\n if (!activeLayer) {\n LOG.debug(\"No layer in WMTS capabilities - giving up.\");\n return undefined;\n }\n }\n\n const styles = activeLayer.Style;\n let activeStyle = styles?.find((style: any) => style?.Identifier === activeStyleId);\n if (!activeStyle) {\n LOG.debug(\"Failed to find active style in WMTS layer.\");\n activeStyle = styles?.[0];\n if (!activeStyle) {\n LOG.debug(\"No style in WMTS layer capabilities - giving up.\");\n return undefined;\n }\n }\n\n const legendUrl = activeStyle.LegendURL?.[0]?.href;\n return legendUrl as string | undefined;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WMTSLayerImpl.js","sources":["WMTSLayerImpl.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { createLogger, isAbortError } from \"@open-pioneer/core\";\nimport Tile from \"ol/Tile\";\nimport TileState from \"ol/TileState\";\nimport WMTSCapabilities from \"ol/format/WMTSCapabilities\";\nimport TileLayer from \"ol/layer/Tile\";\nimport type TileSourceType from \"ol/source/Tile\";\nimport WMTS, { optionsFromCapabilities } from \"ol/source/WMTS\";\nimport { WMTSLayer, WMTSLayerConfig } from \"../../api\";\nimport { fetchCapabilities } from \"../../util/capabilities-utils\";\nimport { AbstractLayer } from \"../AbstractLayer\";\nimport { MapModelImpl } from \"../MapModelImpl\";\nimport { ImageTile } from \"ol\";\nimport type { Options as WMSSourceOptions } from \"ol/source/ImageWMS\";\nimport { reactive } from \"@conterra/reactivity-core\";\n\nconst LOG = createLogger(\"map:WMTSLayer\");\n\nexport class WMTSLayerImpl extends AbstractLayer implements WMTSLayer {\n #url: string;\n #name: string;\n #matrixSet: string;\n #layer: TileLayer<TileSourceType>;\n #source: WMTS | undefined;\n #sourceOptions?: Partial<WMSSourceOptions>;\n #legend = reactive<string | undefined>();\n readonly #abortController = new AbortController();\n\n constructor(config: WMTSLayerConfig) {\n const layer = new TileLayer();\n super({\n ...config,\n olLayer: layer\n });\n this.#url = config.url;\n this.#name = config.name;\n this.#layer = layer;\n this.#matrixSet = config.matrixSet;\n this.#sourceOptions = config.sourceOptions;\n }\n\n get type() {\n return \"wmts\" as const;\n }\n\n destroy(): void {\n this.#abortController.abort();\n super.destroy();\n }\n\n get legend(): string | undefined {\n return this.#legend.value;\n }\n\n get sublayers(): undefined {\n return undefined;\n }\n\n get layers(): undefined {\n return undefined;\n }\n\n __attachToMap(map: MapModelImpl): void {\n super.__attachToMap(map);\n this.#fetchWMTSCapabilities()\n .then((result: string) => {\n const parser = new WMTSCapabilities();\n const capabilities = parser.read(result);\n const options = optionsFromCapabilities(capabilities, {\n layer: this.#name,\n matrixSet: this.#matrixSet\n });\n if (!options) {\n throw new Error(\"Layer was not found in capabilities\");\n }\n const source = new WMTS({\n ...options,\n ...this.#sourceOptions,\n tileLoadFunction: (tile, tileUrl) => {\n this.#loadTile(tile, tileUrl);\n }\n });\n this.#source = source;\n this.#layer.setSource(this.#source);\n const activeStyleId = source.getStyle();\n const legendUrl = getWMTSLegendUrl(capabilities, this.name, activeStyleId);\n this.#legend.value = legendUrl;\n })\n .catch((error) => {\n if (isAbortError(error)) {\n LOG.error(`Layer ${this.name} has been destroyed before fetching the data`);\n return;\n }\n LOG.error(`Failed fetching WMTS capabilities for Layer ${this.name}`, error);\n });\n }\n\n get url() {\n return this.#url;\n }\n\n get name() {\n return this.#name;\n }\n\n get matrixSet() {\n return this.#matrixSet;\n }\n\n async #fetchWMTSCapabilities(): Promise<string> {\n const httpService = this.map.__sharedDependencies.httpService;\n return fetchCapabilities(this.#url, httpService, this.#abortController.signal);\n }\n\n async #loadTile(tile: Tile, tileUrl: string): Promise<void> {\n const httpService = this.map.__sharedDependencies.httpService;\n try {\n if (!(tile instanceof ImageTile)) {\n throw new Error(\"Only 'ImageTile' is supported for now.\");\n }\n\n const image = tile.getImage();\n if (!isHtmlImage(image)) {\n // Could also be canvas or video\n throw new Error(\"Only <img> tags are supported as tiles for now.\");\n }\n\n const response = await httpService.fetch(tileUrl);\n if (!response.ok) {\n throw new Error(`Tile request failed with status ${response.status}.`);\n }\n\n const blob = await response.blob();\n const objectUrl = URL.createObjectURL(blob);\n const finish = () => {\n // Cleanup object URL after load to prevent memory leaks.\n // https://stackoverflow.com/questions/62473876/openlayers-6-settileloadfunction-documented-example-uses-url-createobjecturld\n URL.revokeObjectURL(objectUrl);\n image.removeEventListener(\"load\", finish);\n image.removeEventListener(\"error\", finish);\n };\n image.addEventListener(\"load\", finish);\n image.addEventListener(\"error\", finish);\n image.src = objectUrl;\n } catch (e) {\n tile.setState(TileState.ERROR);\n if (!isAbortError(e)) {\n LOG.error(\"Failed to load tile\", e);\n }\n }\n }\n}\n\nfunction isHtmlImage(htmlElement: HTMLElement): htmlElement is HTMLImageElement {\n return htmlElement.tagName === \"IMG\";\n}\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport function getWMTSLegendUrl(\n capabilities: Record<string, any>,\n activeLayerId: string | undefined,\n activeStyleId: string | undefined\n): string | undefined {\n const content = capabilities?.Contents;\n const layers = content?.Layer;\n\n let activeLayer = layers?.find((layer: any) => layer?.Identifier === activeLayerId);\n if (!activeLayer) {\n LOG.debug(\"Failed to find the active layer in WMTS layer capabilities.\");\n activeLayer = layers?.[0];\n if (!activeLayer) {\n LOG.debug(\"No layer in WMTS capabilities - giving up.\");\n return undefined;\n }\n }\n\n const styles = activeLayer.Style;\n let activeStyle = styles?.find((style: any) => style?.Identifier === activeStyleId);\n if (!activeStyle) {\n LOG.debug(\"Failed to find active style in WMTS layer.\");\n activeStyle = styles?.[0];\n if (!activeStyle) {\n LOG.debug(\"No style in WMTS layer capabilities - giving up.\");\n return undefined;\n }\n }\n\n const legendUrl = activeStyle.LegendURL?.[0]?.href;\n return legendUrl as string | undefined;\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@open-pioneer/map",
4
- "version": "0.7.0",
4
+ "version": "0.8.0-dev.20241120115147",
5
5
  "description": "This package integrates OpenLayers maps into an open pioneer trails application.",
6
6
  "keywords": [
7
7
  "open-pioneer-trails"
@@ -14,18 +14,19 @@
14
14
  "directory": "src/packages/map"
15
15
  },
16
16
  "dependencies": {
17
- "@open-pioneer/chakra-integration": "^2.3.0",
18
- "@open-pioneer/core": "^2.3.0",
19
- "@open-pioneer/http": "^2.3.0",
20
- "@open-pioneer/react-utils": "^2.3.0",
21
- "@open-pioneer/runtime": "^2.3.0",
17
+ "@open-pioneer/chakra-integration": "^2.4.0-dev.20241120092632",
18
+ "@open-pioneer/core": "^2.4.0-dev.20241120092632",
19
+ "@open-pioneer/http": "^2.4.0-dev.20241120092632",
20
+ "@open-pioneer/react-utils": "^2.4.0-dev.20241120092632",
21
+ "@open-pioneer/runtime": "^2.4.0-dev.20241120092632",
22
22
  "@types/proj4": "^2.5.2",
23
- "ol": "^9.2.4",
23
+ "ol": "^10.2.1",
24
24
  "proj4": "^2.12.1",
25
25
  "react": "^18.3.1",
26
26
  "react-dom": "^18.3.1",
27
27
  "react-use": "^17.5.1",
28
- "uuid": "^10.0.0"
28
+ "uuid": "^10.0.0",
29
+ "@conterra/reactivity-core": "^0.4.3"
29
30
  },
30
31
  "exports": {
31
32
  "./package.json": "./package.json",
package/ui/hooks.d.ts CHANGED
@@ -4,21 +4,31 @@ import { Projection } from "ol/proj";
4
4
  import { Coordinate } from "ol/coordinate";
5
5
  /**
6
6
  * Returns the current view of the given map.
7
+ *
8
+ * @deprecated Use `mapModel.olView` instead.
7
9
  */
8
10
  export declare function useView(map: OlMap | undefined): OlView | undefined;
9
11
  /**
10
12
  * Returns the current projection of the map.
13
+ *
14
+ * @deprecated Use `mapModel.projection` instead.
11
15
  */
12
16
  export declare function useProjection(map: OlMap | undefined): Projection | undefined;
13
17
  /**
14
18
  * Returns the current resolution of the map.
19
+ *
20
+ * @deprecated Use `mapModel.resolution` instead.
15
21
  */
16
22
  export declare function useResolution(map: OlMap | undefined): number | undefined;
17
23
  /**
18
24
  * Returns the current center coordinates of the map.
25
+ *
26
+ * @deprecated Use `mapModel.center` instead.
19
27
  */
20
28
  export declare function useCenter(map: OlMap | undefined): Coordinate | undefined;
21
29
  /**
22
30
  * Returns the current scale of the map.
31
+ *
32
+ * @deprecated Use `mapModel.scale` instead.
23
33
  */
24
34
  export declare function useScale(map: OlMap | undefined): number | undefined;
package/ui/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sources":["hooks.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport OlMap from \"ol/Map\";\nimport OlView from \"ol/View\";\nimport { unByKey } from \"ol/Observable\";\nimport { Projection, getPointResolution } from \"ol/proj\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { EventsKey } from \"ol/events\";\nimport { useCallback, useMemo, useSyncExternalStore } from \"react\";\n\n/**\n * From Web Map Server Implementation Specification -> 7.2.4.6.9 Scale denominators\n *\n * For the purposes of this International Standard, the common pixel size is defined to be 0,28 mm × 0,28 mm.\n * Because arbitrary clients can request maps from a server, the true pixel size of the final rendering device is\n * unknown to the server.\n */\nconst DEFAULT_DPI = 25.4 / 0.28;\nconst INCHES_PER_METRE = 39.37;\n\n/**\n * Returns the current view of the given map.\n */\nexport function useView(map: OlMap | undefined): OlView | undefined {\n return useOlProperty(map, getView, watchView);\n}\n\nfunction getView(map: OlMap) {\n return map.getView();\n}\n\nfunction watchView(map: OlMap, cb: Callback) {\n return map.on(\"change:view\", cb);\n}\n\n/**\n * Returns the current projection of the map.\n */\nexport function useProjection(map: OlMap | undefined): Projection | undefined {\n const view = useView(map);\n return view?.getProjection();\n}\n\n/**\n * Returns the current resolution of the map.\n */\nexport function useResolution(map: OlMap | undefined): number | undefined {\n const view = useView(map);\n return useOlProperty(view, getResolution, watchResolution);\n}\n\nfunction getResolution(view: OlView): number | undefined {\n return view.getResolution();\n}\n\nfunction watchResolution(view: OlView, cb: Callback) {\n return view.on(\"change:resolution\", cb);\n}\n\n/**\n * Returns the current center coordinates of the map.\n */\nexport function useCenter(map: OlMap | undefined): Coordinate | undefined {\n const view = useView(map);\n return useOlProperty(view, getCenter, watchCenter);\n}\n\nfunction getCenter(view: OlView): Coordinate | undefined {\n return view.getCenter();\n}\n\nfunction watchCenter(view: OlView, cb: Callback) {\n return view.on(\"change:center\", cb);\n}\n\n/**\n * Returns the current scale of the map.\n */\nexport function useScale(map: OlMap | undefined): number | undefined {\n const center = useCenter(map);\n const resolution = useResolution(map);\n const projection = useProjection(map);\n const scale = useMemo(() => {\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 }, [projection, resolution, center]);\n return scale;\n}\n\ntype Callback = () => void;\n\n/**\n * Returns the value of an observable ol property.\n *\n * Make sure to keep `accessor` and `watcher` stable to reduce re-subscriptions:\n * either use global functions or wrap the functions into `useCallback`.\n */\nfunction useOlProperty<T, R>(\n object: T | undefined,\n accessor: (object: T) => R,\n watcher: (object: T, cb: Callback) => EventsKey\n): R | undefined {\n const getSnapshot = useCallback(\n () => (object ? accessor(object) : undefined),\n [object, accessor]\n );\n const subscribe = useCallback(\n (cb: Callback) => {\n if (!object) {\n return () => undefined;\n }\n\n const key = watcher(object, cb);\n return () => unByKey(key);\n },\n [object, watcher]\n );\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"names":["scale"],"mappings":"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"}
1
+ {"version":3,"file":"hooks.js","sources":["hooks.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport OlMap from \"ol/Map\";\nimport OlView from \"ol/View\";\nimport { unByKey } from \"ol/Observable\";\nimport { Projection, getPointResolution } from \"ol/proj\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { EventsKey } from \"ol/events\";\nimport { useCallback, useMemo, useSyncExternalStore } from \"react\";\n\n/**\n * From Web Map Server Implementation Specification -> 7.2.4.6.9 Scale denominators\n *\n * For the purposes of this International Standard, the common pixel size is defined to be 0,28 mm × 0,28 mm.\n * Because arbitrary clients can request maps from a server, the true pixel size of the final rendering device is\n * unknown to the server.\n */\nconst DEFAULT_DPI = 25.4 / 0.28;\nconst INCHES_PER_METRE = 39.37;\n\n/**\n * Returns the current view of the given map.\n *\n * @deprecated Use `mapModel.olView` instead.\n */\nexport function useView(map: OlMap | undefined): OlView | undefined {\n return useOlProperty(map, getView, watchView);\n}\n\nfunction getView(map: OlMap) {\n return map.getView();\n}\n\nfunction watchView(map: OlMap, cb: Callback) {\n return map.on(\"change:view\", cb);\n}\n\n/**\n * Returns the current projection of the map.\n *\n * @deprecated Use `mapModel.projection` instead.\n */\nexport function useProjection(map: OlMap | undefined): Projection | undefined {\n const view = useView(map);\n return view?.getProjection();\n}\n\n/**\n * Returns the current resolution of the map.\n *\n * @deprecated Use `mapModel.resolution` instead.\n */\nexport function useResolution(map: OlMap | undefined): number | undefined {\n const view = useView(map);\n return useOlProperty(view, getResolution, watchResolution);\n}\n\nfunction getResolution(view: OlView): number | undefined {\n return view.getResolution();\n}\n\nfunction watchResolution(view: OlView, cb: Callback) {\n return view.on(\"change:resolution\", cb);\n}\n\n/**\n * Returns the current center coordinates of the map.\n *\n * @deprecated Use `mapModel.center` instead.\n */\nexport function useCenter(map: OlMap | undefined): Coordinate | undefined {\n const view = useView(map);\n return useOlProperty(view, getCenter, watchCenter);\n}\n\nfunction getCenter(view: OlView): Coordinate | undefined {\n return view.getCenter();\n}\n\nfunction watchCenter(view: OlView, cb: Callback) {\n return view.on(\"change:center\", cb);\n}\n\n/**\n * Returns the current scale of the map.\n *\n * @deprecated Use `mapModel.scale` instead.\n */\nexport function useScale(map: OlMap | undefined): number | undefined {\n const center = useCenter(map);\n const resolution = useResolution(map);\n const projection = useProjection(map);\n const scale = useMemo(() => {\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 }, [projection, resolution, center]);\n return scale;\n}\n\ntype Callback = () => void;\n\n/**\n * Returns the value of an observable ol property.\n *\n * Make sure to keep `accessor` and `watcher` stable to reduce re-subscriptions:\n * either use global functions or wrap the functions into `useCallback`.\n */\nfunction useOlProperty<T, R>(\n object: T | undefined,\n accessor: (object: T) => R,\n watcher: (object: T, cb: Callback) => EventsKey\n): R | undefined {\n const getSnapshot = useCallback(\n () => (object ? accessor(object) : undefined),\n [object, accessor]\n );\n const subscribe = useCallback(\n (cb: Callback) => {\n if (!object) {\n return () => undefined;\n }\n\n const key = watcher(object, cb);\n return () => unByKey(key);\n },\n [object, watcher]\n );\n return useSyncExternalStore(subscribe, getSnapshot);\n}\n"],"names":["scale"],"mappings":"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"}
package/util/defer.d.ts DELETED
@@ -1,18 +0,0 @@
1
- export interface DeferredExecution {
2
- /**
3
- * Re-schedule execution of `func` (if it was not already executed).
4
- * Returns true on success, false otherwise.
5
- */
6
- reschedule(): boolean;
7
- /**
8
- * Cancels the pending execution (if it is still pending).
9
- */
10
- cancel(): void;
11
- }
12
- /**
13
- * Calls `func` at a slightly later time.
14
- *
15
- * The returned object can be used to re-schedule or cancel the execution of `func`.
16
- * However, `func` will be executed at most once.
17
- */
18
- export declare function defer(func: () => void): DeferredExecution;
package/util/defer.js DELETED
@@ -1,21 +0,0 @@
1
- function defer(func) {
2
- let executed = false;
3
- let timeout = setTimeout(() => {
4
- executed = true;
5
- timeout = void 0;
6
- func();
7
- });
8
- return {
9
- reschedule() {
10
- return !executed;
11
- },
12
- cancel() {
13
- if (timeout) {
14
- clearTimeout(timeout);
15
- }
16
- }
17
- };
18
- }
19
-
20
- export { defer };
21
- //# sourceMappingURL=defer.js.map
package/util/defer.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"defer.js","sources":["defer.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nexport interface DeferredExecution {\n /**\n * Re-schedule execution of `func` (if it was not already executed).\n * Returns true on success, false otherwise.\n */\n reschedule(): boolean;\n\n /**\n * Cancels the pending execution (if it is still pending).\n */\n cancel(): void;\n}\n\n/**\n * Calls `func` at a slightly later time.\n *\n * The returned object can be used to re-schedule or cancel the execution of `func`.\n * However, `func` will be executed at most once.\n */\nexport function defer(func: () => void): DeferredExecution {\n let executed = false;\n let timeout: ReturnType<typeof setTimeout> | undefined = setTimeout(() => {\n executed = true;\n timeout = undefined;\n func();\n });\n return {\n reschedule() {\n // Do nothing: if not executed, the timeout is still pending\n // and it will run in the future.\n return !executed;\n },\n cancel() {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n };\n}\n"],"names":[],"mappings":"AAqBO,SAAS,MAAM,IAAqC,EAAA;AACvD,EAAA,IAAI,QAAW,GAAA,KAAA,CAAA;AACf,EAAI,IAAA,OAAA,GAAqD,WAAW,MAAM;AACtE,IAAW,QAAA,GAAA,IAAA,CAAA;AACX,IAAU,OAAA,GAAA,KAAA,CAAA,CAAA;AACV,IAAK,IAAA,EAAA,CAAA;AAAA,GACR,CAAA,CAAA;AACD,EAAO,OAAA;AAAA,IACH,UAAa,GAAA;AAGT,MAAA,OAAO,CAAC,QAAA,CAAA;AAAA,KACZ;AAAA,IACA,MAAS,GAAA;AACL,MAAA,IAAI,OAAS,EAAA;AACT,QAAA,YAAA,CAAa,OAAO,CAAA,CAAA;AAAA,OACxB;AAAA,KACJ;AAAA,GACJ,CAAA;AACJ;;;;"}