@open-pioneer/coordinate-viewer 1.0.0 → 1.2.0-dev.20251128143231

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 CHANGED
@@ -1,5 +1,31 @@
1
1
  # @open-pioneer/coordinate-viewer
2
2
 
3
+ ## 1.2.0-dev.20251128143231
4
+
5
+ ### Patch Changes
6
+
7
+ - 279ca67: Use `workspace:*` instead of `workspace:^` for local package references as default. This ensures that trails packages from this repository are always referenced with their exact version to avoid potential issues with version mismatches. If a project specifically wants to use other versions for some trails packages, a pnpm override can be used to force other versions.
8
+ - Updated dependencies [279ca67]
9
+ - @open-pioneer/map@1.2.0-dev.20251128143231
10
+
11
+ ## 1.1.0
12
+
13
+ ### Minor Changes
14
+
15
+ - 10338fa: Update OpenLayers to 10.7.0
16
+ - a8b8a36: Update trails core packages to 4.3.0
17
+ - 10338fa: Update Chakra to 3.29.0
18
+
19
+ ### Patch Changes
20
+
21
+ - b73abe4: Refactor internals to improve code clarity.
22
+ - Updated dependencies [fce7fa9]
23
+ - Updated dependencies [10338fa]
24
+ - Updated dependencies [a8b8a36]
25
+ - Updated dependencies [10338fa]
26
+ - Updated dependencies [c38b619]
27
+ - @open-pioneer/map@1.1.0
28
+
3
29
  ## 1.0.0
4
30
 
5
31
  ### Minor Changes
@@ -26,4 +26,3 @@ export interface CoordinateViewerProps extends CommonComponentProps, MapModelPro
26
26
  * The `CoordinateViewer` component can be used in an app to render the coordinates at the current mouse position.
27
27
  */
28
28
  export declare const CoordinateViewer: FC<CoordinateViewerProps>;
29
- export declare function useCoordinatesString(coordinates: number[] | undefined, precision: number | undefined, format: CoordinateViewerProps["format"]): string;
@@ -6,82 +6,51 @@ import { useReactiveSnapshot } from '@open-pioneer/reactivity';
6
6
  import { unByKey } from 'ol/Observable.js';
7
7
  import { transform } from 'ol/proj.js';
8
8
  import { useIntl } from './_virtual/_virtual-pioneer-module_react-hooks.js';
9
- import { useState, useEffect } from 'react';
9
+ import { useMemo, useState, useEffect } from 'react';
10
+ import { formatCoordinates } from './formatCoordinates.js';
10
11
 
11
- const DEFAULT_PRECISION = 4;
12
- const DEFAULT_DISPLAY_FORMAT = "decimal";
13
12
  const CoordinateViewer = (props) => {
14
13
  const { precision, displayProjectionCode, format } = props;
15
14
  const { containerProps } = useCommonComponentProps("coordinate-viewer", props);
16
15
  const map = useMapModelValue(props);
17
- const mapProjectionCode = useReactiveSnapshot(() => {
18
- return map?.projection.getCode() ?? "";
19
- }, [map]);
20
- let { coordinates } = useCoordinates(map.olMap);
21
- coordinates = coordinates && displayProjectionCode ? transformCoordinates(coordinates, mapProjectionCode, displayProjectionCode) : coordinates;
22
- const coordinatesString = useCoordinatesString(coordinates, precision, format);
23
- const projectionString = displayProjectionCode ? displayProjectionCode : mapProjectionCode;
24
- const displayString = coordinatesString ? coordinatesString + " " + projectionString : "";
16
+ const intl = useIntl();
17
+ const { coordinates, projectionCode } = useCoordinates(map, displayProjectionCode);
18
+ const coordinatesString = useMemo(() => {
19
+ if (!coordinates) {
20
+ return "";
21
+ }
22
+ return formatCoordinates(coordinates, precision, intl, format);
23
+ }, [coordinates, precision, format, intl]);
24
+ let displayString = "";
25
+ if (coordinatesString) {
26
+ displayString = `${coordinatesString} ${projectionCode}`;
27
+ }
25
28
  return /* @__PURE__ */ jsx(Box, { ...containerProps, children: /* @__PURE__ */ jsx(Text, { className: "coordinate-viewer-text", children: displayString }) });
26
29
  };
27
- function useCoordinatesString(coordinates, precision, format) {
28
- const intl = useIntl();
29
- const coordinatesString = coordinates ? formatCoordinates(coordinates, precision, intl, format) : "";
30
- return coordinatesString;
31
- }
32
- function useCoordinates(map) {
30
+ function useCoordinates(map, displayProjectionCode) {
33
31
  const [coordinates, setCoordinates] = useState();
32
+ const mapProjectionCode = useReactiveSnapshot(() => {
33
+ return map?.projection.getCode() ?? "";
34
+ }, [map]);
34
35
  useEffect(() => {
35
- const eventsKey = map.on("pointermove", (evt) => {
36
+ const eventsKey = map.olMap.on("pointermove", (evt) => {
36
37
  setCoordinates(evt.coordinate);
37
38
  });
38
39
  return () => unByKey(eventsKey);
39
40
  }, [map]);
40
- return { coordinates };
41
- }
42
- function formatCoordinates(coordinates, configuredPrecision, intl, configuredFormat) {
43
- if (coordinates[0] == null || coordinates[1] == null) {
44
- return "";
45
- }
46
- const precision = configuredPrecision ?? DEFAULT_PRECISION;
47
- const format = configuredFormat ?? DEFAULT_DISPLAY_FORMAT;
48
- const [x, y] = coordinates;
49
- let str;
50
- if (format === "degree" && isFinite(x) && isFinite(y)) {
51
- const [xHour, xMin, xSek] = toDegree(x, intl, precision);
52
- const [yHour, yMin, ySek] = toDegree(y, intl, precision);
53
- const xString = `${Math.abs(xHour)}\xB0${xMin}'${xSek}"${0 <= xHour ? "(E)" : "(W)"}`;
54
- const yString = `${Math.abs(yHour)}\xB0${yMin}'${ySek}"${0 <= yHour ? "(N)" : "(S)"}`;
55
- str = xString + " " + yString;
56
- } else {
57
- const xString = intl.formatNumber(x, {
58
- maximumFractionDigits: precision,
59
- minimumFractionDigits: precision
60
- });
61
- const yString = intl.formatNumber(y, {
62
- maximumFractionDigits: precision,
63
- minimumFractionDigits: precision
64
- });
65
- str = xString + " " + yString;
66
- }
67
- return str;
68
- }
69
- function toDegree(coordPart, intl, precision) {
70
- const cHour = Math.floor(coordPart);
71
- const cNach = coordPart - cHour;
72
- const cMin = Math.floor(60 * cNach);
73
- const cMinNach = 60 * cNach - cMin;
74
- const cSek = 60 * cMinNach;
75
- const cSekRounded = intl.formatNumber(cSek, {
76
- maximumFractionDigits: precision,
77
- minimumFractionDigits: precision
78
- });
79
- return [cHour, cMin, cSekRounded];
41
+ const finalCoordinates = useMemo(() => {
42
+ if (coordinates && displayProjectionCode) {
43
+ return transformCoordinates(coordinates, mapProjectionCode, displayProjectionCode);
44
+ }
45
+ return coordinates;
46
+ }, [coordinates, mapProjectionCode, displayProjectionCode]);
47
+ const projectionCode = displayProjectionCode ? displayProjectionCode : mapProjectionCode;
48
+ return { coordinates: finalCoordinates, projectionCode };
80
49
  }
81
50
  function transformCoordinates(coordinates, source, destination) {
82
51
  const transformed = transform(coordinates, source, destination);
83
52
  return transformed;
84
53
  }
85
54
 
86
- export { CoordinateViewer, useCoordinatesString };
55
+ export { CoordinateViewer };
87
56
  //# sourceMappingURL=CoordinateViewer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CoordinateViewer.js","sources":["CoordinateViewer.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Box, Text } from \"@chakra-ui/react\";\nimport { MapModelProps, useMapModelValue } from \"@open-pioneer/map\";\nimport { CommonComponentProps, useCommonComponentProps } from \"@open-pioneer/react-utils\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport OlMap from \"ol/Map\";\nimport { unByKey } from \"ol/Observable\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { EventsKey } from \"ol/events\";\nimport { transform } from \"ol/proj\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { FC, useEffect, useState } from \"react\";\n\nconst DEFAULT_PRECISION = 4;\nconst DEFAULT_DISPLAY_FORMAT = \"decimal\";\n\n/**\n * These are special properties for the CoordinateViewer.\n */\nexport interface CoordinateViewerProps extends CommonComponentProps, MapModelProps {\n /**\n * Number of decimal places shown for coordinates.\n */\n precision?: number;\n\n /**\n * Projection of the coordinates shown in the rendered HTML, does not affect the map projection\n */\n displayProjectionCode?: string;\n\n /**\n * Configures the display format.\n * By default, the current coordinates are shown as decimal numbers (format: \"decimal\").\n *\n * If the format is set to \"degree\", the coordinates are shown in angular degrees (DMS).\n * This can only be used meaningfully (at this time) if the underlying projection provides lat/lon coordinates.\n */\n format?: \"decimal\" | \"degree\";\n}\n\n/**\n * The `CoordinateViewer` component can be used in an app to render the coordinates at the current mouse position.\n */\nexport const CoordinateViewer: FC<CoordinateViewerProps> = (props) => {\n const { precision, displayProjectionCode, format } = props;\n const { containerProps } = useCommonComponentProps(\"coordinate-viewer\", props);\n const map = useMapModelValue(props);\n const mapProjectionCode = useReactiveSnapshot(() => {\n return map?.projection.getCode() ?? \"\";\n }, [map]);\n let { coordinates } = useCoordinates(map.olMap);\n coordinates =\n coordinates && displayProjectionCode\n ? transformCoordinates(coordinates, mapProjectionCode, displayProjectionCode)\n : coordinates;\n const coordinatesString = useCoordinatesString(coordinates, precision, format);\n const projectionString = displayProjectionCode ? displayProjectionCode : mapProjectionCode;\n const displayString = coordinatesString ? coordinatesString + \" \" + projectionString : \"\";\n return (\n <Box {...containerProps}>\n <Text className=\"coordinate-viewer-text\">{displayString}</Text>\n </Box>\n );\n};\n\n/* Separate function for easier testing */\nexport function useCoordinatesString(\n coordinates: number[] | undefined,\n precision: number | undefined,\n format: CoordinateViewerProps[\"format\"]\n): string {\n const intl = useIntl();\n const coordinatesString = coordinates\n ? formatCoordinates(coordinates, precision, intl, format)\n : \"\";\n return coordinatesString;\n}\n\nfunction useCoordinates(map: OlMap): { coordinates: Coordinate | undefined } {\n const [coordinates, setCoordinates] = useState<Coordinate | undefined>();\n\n useEffect(() => {\n const eventsKey: EventsKey = map.on(\"pointermove\", (evt) => {\n setCoordinates(evt.coordinate);\n });\n return () => unByKey(eventsKey);\n }, [map]);\n\n return { coordinates };\n}\n\nfunction formatCoordinates(\n coordinates: number[],\n configuredPrecision: number | undefined,\n intl: PackageIntl,\n configuredFormat: CoordinateViewerProps[\"format\"]\n) {\n if (coordinates[0] == null || coordinates[1] == null) {\n return \"\";\n }\n\n const precision = configuredPrecision ?? DEFAULT_PRECISION;\n const format = configuredFormat ?? DEFAULT_DISPLAY_FORMAT;\n const [x, y] = coordinates;\n\n let str;\n if (format === \"degree\" && isFinite(x) && isFinite(y)) {\n const [xHour, xMin, xSek] = toDegree(x, intl, precision);\n const [yHour, yMin, ySek] = toDegree(y, intl, precision);\n\n const xString = `${Math.abs(xHour)}°${xMin}'${xSek}\"${0 <= xHour ? \"(E)\" : \"(W)\"}`;\n const yString = `${Math.abs(yHour)}°${yMin}'${ySek}\"${0 <= yHour ? \"(N)\" : \"(S)\"}`;\n\n str = xString + \" \" + yString;\n } else {\n const xString = intl.formatNumber(x, {\n maximumFractionDigits: precision,\n minimumFractionDigits: precision\n });\n const yString = intl.formatNumber(y, {\n maximumFractionDigits: precision,\n minimumFractionDigits: precision\n });\n str = xString + \" \" + yString;\n }\n return str;\n}\n\nfunction toDegree(\n coordPart: number,\n intl: PackageIntl,\n precision: number\n): [number, number, string] {\n const cHour = Math.floor(coordPart);\n const cNach = coordPart - cHour;\n\n const cMin = Math.floor(60 * cNach);\n const cMinNach = 60 * cNach - cMin;\n\n const cSek = 60 * cMinNach;\n const cSekRounded = intl.formatNumber(cSek, {\n maximumFractionDigits: precision,\n minimumFractionDigits: precision\n });\n\n return [cHour, cMin, cSekRounded];\n}\n\nfunction transformCoordinates(\n coordinates: number[],\n source: string,\n destination: string\n): number[] {\n const transformed = transform(coordinates, source, destination);\n return transformed;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAeA,MAAM,iBAAA,GAAoB,CAAA;AAC1B,MAAM,sBAAA,GAAyB,SAAA;AA6BxB,MAAM,gBAAA,GAA8C,CAAC,KAAA,KAAU;AAClE,EAAA,MAAM,EAAE,SAAA,EAAW,qBAAA,EAAuB,MAAA,EAAO,GAAI,KAAA;AACrD,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,uBAAA,CAAwB,qBAAqB,KAAK,CAAA;AAC7E,EAAA,MAAM,GAAA,GAAM,iBAAiB,KAAK,CAAA;AAClC,EAAA,MAAM,iBAAA,GAAoB,oBAAoB,MAAM;AAChD,IAAA,OAAO,GAAA,EAAK,UAAA,CAAW,OAAA,EAAQ,IAAK,EAAA;AAAA,EACxC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACR,EAAA,IAAI,EAAE,WAAA,EAAY,GAAI,cAAA,CAAe,IAAI,KAAK,CAAA;AAC9C,EAAA,WAAA,GACI,eAAe,qBAAA,GACT,oBAAA,CAAqB,WAAA,EAAa,iBAAA,EAAmB,qBAAqB,CAAA,GAC1E,WAAA;AACV,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,WAAA,EAAa,SAAA,EAAW,MAAM,CAAA;AAC7E,EAAA,MAAM,gBAAA,GAAmB,wBAAwB,qBAAA,GAAwB,iBAAA;AACzE,EAAA,MAAM,aAAA,GAAgB,iBAAA,GAAoB,iBAAA,GAAoB,GAAA,GAAM,gBAAA,GAAmB,EAAA;AACvF,EAAA,uBACI,GAAA,CAAC,OAAK,GAAG,cAAA,EACL,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,aAAA,EAAc,CAAA,EAC5D,CAAA;AAER;AAGO,SAAS,oBAAA,CACZ,WAAA,EACA,SAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,oBAAoB,WAAA,GACpB,iBAAA,CAAkB,aAAa,SAAA,EAAW,IAAA,EAAM,MAAM,CAAA,GACtD,EAAA;AACN,EAAA,OAAO,iBAAA;AACX;AAEA,SAAS,eAAe,GAAA,EAAqD;AACzE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,EAAiC;AAEvE,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,SAAA,GAAuB,GAAA,CAAI,EAAA,CAAG,aAAA,EAAe,CAAC,GAAA,KAAQ;AACxD,MAAA,cAAA,CAAe,IAAI,UAAU,CAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,QAAQ,SAAS,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO,EAAE,WAAA,EAAY;AACzB;AAEA,SAAS,iBAAA,CACL,WAAA,EACA,mBAAA,EACA,IAAA,EACA,gBAAA,EACF;AACE,EAAA,IAAI,YAAY,CAAC,CAAA,IAAK,QAAQ,WAAA,CAAY,CAAC,KAAK,IAAA,EAAM;AAClD,IAAA,OAAO,EAAA;AAAA,EACX;AAEA,EAAA,MAAM,YAAY,mBAAA,IAAuB,iBAAA;AACzC,EAAA,MAAM,SAAS,gBAAA,IAAoB,sBAAA;AACnC,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,WAAA;AAEf,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,WAAW,QAAA,IAAY,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AACnD,IAAA,MAAM,CAAC,OAAO,IAAA,EAAM,IAAI,IAAI,QAAA,CAAS,CAAA,EAAG,MAAM,SAAS,CAAA;AACvD,IAAA,MAAM,CAAC,OAAO,IAAA,EAAM,IAAI,IAAI,QAAA,CAAS,CAAA,EAAG,MAAM,SAAS,CAAA;AAEvD,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA,IAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,CAAA,IAAK,KAAA,GAAQ,QAAQ,KAAK,CAAA,CAAA;AAChF,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA,IAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,CAAA,IAAK,KAAA,GAAQ,QAAQ,KAAK,CAAA,CAAA;AAEhF,IAAA,GAAA,GAAM,UAAU,GAAA,GAAM,OAAA;AAAA,EAC1B,CAAA,MAAO;AACH,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG;AAAA,MACjC,qBAAA,EAAuB,SAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KAC1B,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG;AAAA,MACjC,qBAAA,EAAuB,SAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KAC1B,CAAA;AACD,IAAA,GAAA,GAAM,UAAU,GAAA,GAAM,OAAA;AAAA,EAC1B;AACA,EAAA,OAAO,GAAA;AACX;AAEA,SAAS,QAAA,CACL,SAAA,EACA,IAAA,EACA,SAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,EAAA,MAAM,QAAQ,SAAA,GAAY,KAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAK,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,GAAQ,IAAA;AAE9B,EAAA,MAAM,OAAO,EAAA,GAAK,QAAA;AAClB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM;AAAA,IACxC,qBAAA,EAAuB,SAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GAC1B,CAAA;AAED,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AACpC;AAEA,SAAS,oBAAA,CACL,WAAA,EACA,MAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,WAAA,EAAa,MAAA,EAAQ,WAAW,CAAA;AAC9D,EAAA,OAAO,WAAA;AACX;;;;"}
1
+ {"version":3,"file":"CoordinateViewer.js","sources":["CoordinateViewer.tsx"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { Box, Text } from \"@chakra-ui/react\";\nimport { MapModel, MapModelProps, useMapModelValue } from \"@open-pioneer/map\";\nimport { CommonComponentProps, useCommonComponentProps } from \"@open-pioneer/react-utils\";\nimport { useReactiveSnapshot } from \"@open-pioneer/reactivity\";\nimport { unByKey } from \"ol/Observable\";\nimport { Coordinate } from \"ol/coordinate\";\nimport { EventsKey } from \"ol/events\";\nimport { transform } from \"ol/proj\";\nimport { useIntl } from \"open-pioneer:react-hooks\";\nimport { FC, useEffect, useMemo, useState } from \"react\";\nimport { formatCoordinates } from \"./formatCoordinates\";\n\n/**\n * These are special properties for the CoordinateViewer.\n */\nexport interface CoordinateViewerProps extends CommonComponentProps, MapModelProps {\n /**\n * Number of decimal places shown for coordinates.\n */\n precision?: number;\n\n /**\n * Projection of the coordinates shown in the rendered HTML, does not affect the map projection\n */\n displayProjectionCode?: string;\n\n /**\n * Configures the display format.\n * By default, the current coordinates are shown as decimal numbers (format: \"decimal\").\n *\n * If the format is set to \"degree\", the coordinates are shown in angular degrees (DMS).\n * This can only be used meaningfully (at this time) if the underlying projection provides lat/lon coordinates.\n */\n format?: \"decimal\" | \"degree\";\n}\n\n/**\n * The `CoordinateViewer` component can be used in an app to render the coordinates at the current mouse position.\n */\nexport const CoordinateViewer: FC<CoordinateViewerProps> = (props) => {\n const { precision, displayProjectionCode, format } = props;\n const { containerProps } = useCommonComponentProps(\"coordinate-viewer\", props);\n const map = useMapModelValue(props);\n const intl = useIntl();\n const { coordinates, projectionCode } = useCoordinates(map, displayProjectionCode);\n\n const coordinatesString = useMemo(() => {\n if (!coordinates) {\n return \"\";\n }\n return formatCoordinates(coordinates, precision, intl, format);\n }, [coordinates, precision, format, intl]);\n\n let displayString = \"\";\n if (coordinatesString) {\n displayString = `${coordinatesString} ${projectionCode}`;\n }\n\n return (\n <Box {...containerProps}>\n <Text className=\"coordinate-viewer-text\">{displayString}</Text>\n </Box>\n );\n};\n\nfunction useCoordinates(map: MapModel, displayProjectionCode: string | undefined) {\n const [coordinates, setCoordinates] = useState<Coordinate | undefined>();\n const mapProjectionCode = useReactiveSnapshot(() => {\n return map?.projection.getCode() ?? \"\";\n }, [map]);\n\n useEffect(() => {\n const eventsKey: EventsKey = map.olMap.on(\"pointermove\", (evt) => {\n setCoordinates(evt.coordinate);\n });\n return () => unByKey(eventsKey);\n }, [map]);\n\n const finalCoordinates = useMemo(() => {\n if (coordinates && displayProjectionCode) {\n return transformCoordinates(coordinates, mapProjectionCode, displayProjectionCode);\n }\n return coordinates;\n }, [coordinates, mapProjectionCode, displayProjectionCode]);\n const projectionCode = displayProjectionCode ? displayProjectionCode : mapProjectionCode;\n return { coordinates: finalCoordinates, projectionCode };\n}\n\nfunction transformCoordinates(\n coordinates: number[],\n source: string,\n destination: string\n): number[] {\n const transformed = transform(coordinates, source, destination);\n return transformed;\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAyCO,MAAM,gBAAA,GAA8C,CAAC,KAAA,KAAU;AAClE,EAAA,MAAM,EAAE,SAAA,EAAW,qBAAA,EAAuB,MAAA,EAAO,GAAI,KAAA;AACrD,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,uBAAA,CAAwB,qBAAqB,KAAK,CAAA;AAC7E,EAAA,MAAM,GAAA,GAAM,iBAAiB,KAAK,CAAA;AAClC,EAAA,MAAM,OAAO,OAAA,EAAQ;AACrB,EAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAe,GAAI,cAAA,CAAe,KAAK,qBAAqB,CAAA;AAEjF,EAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAM;AACpC,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,OAAO,EAAA;AAAA,IACX;AACA,IAAA,OAAO,iBAAA,CAAkB,WAAA,EAAa,SAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,EACjE,GAAG,CAAC,WAAA,EAAa,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAC,CAAA;AAEzC,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,IAAI,iBAAA,EAAmB;AACnB,IAAA,aAAA,GAAgB,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AAAA,EAC1D;AAEA,EAAA,uBACI,GAAA,CAAC,OAAK,GAAG,cAAA,EACL,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,aAAA,EAAc,CAAA,EAC5D,CAAA;AAER;AAEA,SAAS,cAAA,CAAe,KAAe,qBAAA,EAA2C;AAC9E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,EAAiC;AACvE,EAAA,MAAM,iBAAA,GAAoB,oBAAoB,MAAM;AAChD,IAAA,OAAO,GAAA,EAAK,UAAA,CAAW,OAAA,EAAQ,IAAK,EAAA;AAAA,EACxC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,YAAuB,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,aAAA,EAAe,CAAC,GAAA,KAAQ;AAC9D,MAAA,cAAA,CAAe,IAAI,UAAU,CAAA;AAAA,IACjC,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,QAAQ,SAAS,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACnC,IAAA,IAAI,eAAe,qBAAA,EAAuB;AACtC,MAAA,OAAO,oBAAA,CAAqB,WAAA,EAAa,iBAAA,EAAmB,qBAAqB,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,WAAA;AAAA,EACX,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,qBAAqB,CAAC,CAAA;AAC1D,EAAA,MAAM,cAAA,GAAiB,wBAAwB,qBAAA,GAAwB,iBAAA;AACvE,EAAA,OAAO,EAAE,WAAA,EAAa,gBAAA,EAAkB,cAAA,EAAe;AAC3D;AAEA,SAAS,oBAAA,CACL,WAAA,EACA,MAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,WAAA,EAAa,MAAA,EAAQ,WAAW,CAAA;AAC9D,EAAA,OAAO,WAAA;AACX;;;;"}
@@ -0,0 +1,3 @@
1
+ import { PackageIntl } from "@open-pioneer/runtime";
2
+ import type { CoordinateViewerProps } from "./CoordinateViewer";
3
+ export declare function formatCoordinates(coordinates: number[], configuredPrecision: number | undefined, intl: PackageIntl, configuredFormat: CoordinateViewerProps["format"]): string;
@@ -0,0 +1,44 @@
1
+ const DEFAULT_PRECISION = 4;
2
+ const DEFAULT_DISPLAY_FORMAT = "decimal";
3
+ function formatCoordinates(coordinates, configuredPrecision, intl, configuredFormat) {
4
+ if (coordinates[0] == null || coordinates[1] == null) {
5
+ return "";
6
+ }
7
+ const precision = configuredPrecision ?? DEFAULT_PRECISION;
8
+ const format = configuredFormat ?? DEFAULT_DISPLAY_FORMAT;
9
+ const [x, y] = coordinates;
10
+ let str;
11
+ if (format === "degree" && isFinite(x) && isFinite(y)) {
12
+ const [xHour, xMin, xSek] = toDegree(x, intl, precision);
13
+ const [yHour, yMin, ySek] = toDegree(y, intl, precision);
14
+ const xString = `${Math.abs(xHour)}\xB0${xMin}'${xSek}"${0 <= xHour ? "(E)" : "(W)"}`;
15
+ const yString = `${Math.abs(yHour)}\xB0${yMin}'${ySek}"${0 <= yHour ? "(N)" : "(S)"}`;
16
+ str = xString + " " + yString;
17
+ } else {
18
+ const xString = intl.formatNumber(x, {
19
+ maximumFractionDigits: precision,
20
+ minimumFractionDigits: precision
21
+ });
22
+ const yString = intl.formatNumber(y, {
23
+ maximumFractionDigits: precision,
24
+ minimumFractionDigits: precision
25
+ });
26
+ str = xString + " " + yString;
27
+ }
28
+ return str;
29
+ }
30
+ function toDegree(coordPart, intl, precision) {
31
+ const cHour = Math.floor(coordPart);
32
+ const cNach = coordPart - cHour;
33
+ const cMin = Math.floor(60 * cNach);
34
+ const cMinNach = 60 * cNach - cMin;
35
+ const cSek = 60 * cMinNach;
36
+ const cSekRounded = intl.formatNumber(cSek, {
37
+ maximumFractionDigits: precision,
38
+ minimumFractionDigits: precision
39
+ });
40
+ return [cHour, cMin, cSekRounded];
41
+ }
42
+
43
+ export { formatCoordinates };
44
+ //# sourceMappingURL=formatCoordinates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatCoordinates.js","sources":["formatCoordinates.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2023-2025 Open Pioneer project (https://github.com/open-pioneer)\n// SPDX-License-Identifier: Apache-2.0\nimport { PackageIntl } from \"@open-pioneer/runtime\";\nimport type { CoordinateViewerProps } from \"./CoordinateViewer\";\n\nconst DEFAULT_PRECISION = 4;\nconst DEFAULT_DISPLAY_FORMAT = \"decimal\";\n\nexport function formatCoordinates(\n coordinates: number[],\n configuredPrecision: number | undefined,\n intl: PackageIntl,\n configuredFormat: CoordinateViewerProps[\"format\"]\n) {\n if (coordinates[0] == null || coordinates[1] == null) {\n return \"\";\n }\n\n const precision = configuredPrecision ?? DEFAULT_PRECISION;\n const format = configuredFormat ?? DEFAULT_DISPLAY_FORMAT;\n const [x, y] = coordinates;\n\n let str;\n if (format === \"degree\" && isFinite(x) && isFinite(y)) {\n const [xHour, xMin, xSek] = toDegree(x, intl, precision);\n const [yHour, yMin, ySek] = toDegree(y, intl, precision);\n\n const xString = `${Math.abs(xHour)}°${xMin}'${xSek}\"${0 <= xHour ? \"(E)\" : \"(W)\"}`;\n const yString = `${Math.abs(yHour)}°${yMin}'${ySek}\"${0 <= yHour ? \"(N)\" : \"(S)\"}`;\n\n str = xString + \" \" + yString;\n } else {\n const xString = intl.formatNumber(x, {\n maximumFractionDigits: precision,\n minimumFractionDigits: precision\n });\n const yString = intl.formatNumber(y, {\n maximumFractionDigits: precision,\n minimumFractionDigits: precision\n });\n str = xString + \" \" + yString;\n }\n return str;\n}\n\nfunction toDegree(\n coordPart: number,\n intl: PackageIntl,\n precision: number\n): [number, number, string] {\n const cHour = Math.floor(coordPart);\n const cNach = coordPart - cHour;\n\n const cMin = Math.floor(60 * cNach);\n const cMinNach = 60 * cNach - cMin;\n\n const cSek = 60 * cMinNach;\n const cSekRounded = intl.formatNumber(cSek, {\n maximumFractionDigits: precision,\n minimumFractionDigits: precision\n });\n\n return [cHour, cMin, cSekRounded];\n}\n"],"names":[],"mappings":"AAKA,MAAM,iBAAA,GAAoB,CAAA;AAC1B,MAAM,sBAAA,GAAyB,SAAA;AAExB,SAAS,iBAAA,CACZ,WAAA,EACA,mBAAA,EACA,IAAA,EACA,gBAAA,EACF;AACE,EAAA,IAAI,YAAY,CAAC,CAAA,IAAK,QAAQ,WAAA,CAAY,CAAC,KAAK,IAAA,EAAM;AAClD,IAAA,OAAO,EAAA;AAAA,EACX;AAEA,EAAA,MAAM,YAAY,mBAAA,IAAuB,iBAAA;AACzC,EAAA,MAAM,SAAS,gBAAA,IAAoB,sBAAA;AACnC,EAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,WAAA;AAEf,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,WAAW,QAAA,IAAY,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AACnD,IAAA,MAAM,CAAC,OAAO,IAAA,EAAM,IAAI,IAAI,QAAA,CAAS,CAAA,EAAG,MAAM,SAAS,CAAA;AACvD,IAAA,MAAM,CAAC,OAAO,IAAA,EAAM,IAAI,IAAI,QAAA,CAAS,CAAA,EAAG,MAAM,SAAS,CAAA;AAEvD,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA,IAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,CAAA,IAAK,KAAA,GAAQ,QAAQ,KAAK,CAAA,CAAA;AAChF,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA,IAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,CAAA,IAAK,KAAA,GAAQ,QAAQ,KAAK,CAAA,CAAA;AAEhF,IAAA,GAAA,GAAM,UAAU,GAAA,GAAM,OAAA;AAAA,EAC1B,CAAA,MAAO;AACH,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG;AAAA,MACjC,qBAAA,EAAuB,SAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KAC1B,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG;AAAA,MACjC,qBAAA,EAAuB,SAAA;AAAA,MACvB,qBAAA,EAAuB;AAAA,KAC1B,CAAA;AACD,IAAA,GAAA,GAAM,UAAU,GAAA,GAAM,OAAA;AAAA,EAC1B;AACA,EAAA,OAAO,GAAA;AACX;AAEA,SAAS,QAAA,CACL,SAAA,EACA,IAAA,EACA,SAAA,EACwB;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,EAAA,MAAM,QAAQ,SAAA,GAAY,KAAA;AAE1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAK,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,GAAQ,IAAA;AAE9B,EAAA,MAAM,OAAO,EAAA,GAAK,QAAA;AAClB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM;AAAA,IACxC,qBAAA,EAAuB,SAAA;AAAA,IACvB,qBAAA,EAAuB;AAAA,GAC1B,CAAA;AAED,EAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AACpC;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@open-pioneer/coordinate-viewer",
4
- "version": "1.0.0",
4
+ "version": "1.2.0-dev.20251128143231",
5
5
  "description": "This package provides a UI component to show the current coordinates at the users current mouse position.",
6
6
  "keywords": [
7
7
  "open-pioneer-trails"
@@ -14,13 +14,13 @@
14
14
  "directory": "src/packages/coordinate-viewer"
15
15
  },
16
16
  "dependencies": {
17
- "@chakra-ui/react": "^3.28.0",
18
- "@open-pioneer/react-utils": "^4.2.0",
19
- "@open-pioneer/runtime": "^4.2.0",
20
- "@open-pioneer/reactivity": "^4.2.0",
21
- "ol": "^10.6.1",
17
+ "@chakra-ui/react": "^3.29.0",
18
+ "@open-pioneer/react-utils": "^4.3.0",
19
+ "@open-pioneer/runtime": "^4.3.0",
20
+ "@open-pioneer/reactivity": "^4.3.0",
21
+ "ol": "^10.7.0",
22
22
  "react": "^19.2.0",
23
- "@open-pioneer/map": "^1.0.0"
23
+ "@open-pioneer/map": "1.2.0-dev.20251128143231"
24
24
  },
25
25
  "exports": {
26
26
  "./package.json": "./package.json",