@osmix/shared 0.0.8 → 0.0.11

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 (138) hide show
  1. package/dist/content-hasher.d.ts +28 -0
  2. package/dist/content-hasher.d.ts.map +1 -0
  3. package/dist/content-hasher.js +62 -0
  4. package/dist/content-hasher.js.map +1 -0
  5. package/dist/csv-parse-stream.d.ts +38 -0
  6. package/dist/csv-parse-stream.d.ts.map +1 -0
  7. package/dist/csv-parse-stream.js +157 -0
  8. package/dist/csv-parse-stream.js.map +1 -0
  9. package/dist/fixtures.d.ts.map +1 -0
  10. package/dist/{src/test/fixtures.js → fixtures.js} +2 -1
  11. package/dist/fixtures.js.map +1 -0
  12. package/dist/relation-kind.d.ts.map +1 -1
  13. package/dist/relation-kind.js +5 -3
  14. package/dist/relation-kind.js.map +1 -1
  15. package/dist/stream-to-bytes.js +2 -1
  16. package/dist/stream-to-bytes.js.map +1 -1
  17. package/dist/utils.d.ts +6 -1
  18. package/dist/utils.d.ts.map +1 -1
  19. package/dist/utils.js +21 -0
  20. package/dist/utils.js.map +1 -1
  21. package/package.json +34 -19
  22. package/src/content-hasher.ts +70 -0
  23. package/src/csv-parse-stream.ts +215 -0
  24. package/src/{test/fixtures.ts → fixtures.ts} +2 -1
  25. package/src/relation-kind.ts +5 -3
  26. package/src/stream-to-bytes.ts +1 -1
  27. package/src/utils.ts +20 -0
  28. package/CHANGELOG.md +0 -52
  29. package/dist/src/assert.d.ts +0 -24
  30. package/dist/src/assert.d.ts.map +0 -1
  31. package/dist/src/assert.js +0 -28
  32. package/dist/src/assert.js.map +0 -1
  33. package/dist/src/bbox-intersects.d.ts +0 -15
  34. package/dist/src/bbox-intersects.d.ts.map +0 -1
  35. package/dist/src/bbox-intersects.js +0 -24
  36. package/dist/src/bbox-intersects.js.map +0 -1
  37. package/dist/src/bytes-to-stream.d.ts +0 -18
  38. package/dist/src/bytes-to-stream.d.ts.map +0 -1
  39. package/dist/src/bytes-to-stream.js +0 -25
  40. package/dist/src/bytes-to-stream.js.map +0 -1
  41. package/dist/src/color.d.ts +0 -4
  42. package/dist/src/color.d.ts.map +0 -1
  43. package/dist/src/color.js +0 -33
  44. package/dist/src/color.js.map +0 -1
  45. package/dist/src/concat-bytes.d.ts +0 -5
  46. package/dist/src/concat-bytes.d.ts.map +0 -1
  47. package/dist/src/concat-bytes.js +0 -14
  48. package/dist/src/concat-bytes.js.map +0 -1
  49. package/dist/src/coordinates.d.ts +0 -28
  50. package/dist/src/coordinates.d.ts.map +0 -1
  51. package/dist/src/coordinates.js +0 -38
  52. package/dist/src/coordinates.js.map +0 -1
  53. package/dist/src/haversine-distance.d.ts +0 -16
  54. package/dist/src/haversine-distance.d.ts.map +0 -1
  55. package/dist/src/haversine-distance.js +0 -26
  56. package/dist/src/haversine-distance.js.map +0 -1
  57. package/dist/src/lineclip.d.ts +0 -2
  58. package/dist/src/lineclip.d.ts.map +0 -1
  59. package/dist/src/lineclip.js +0 -3
  60. package/dist/src/lineclip.js.map +0 -1
  61. package/dist/src/progress.d.ts +0 -42
  62. package/dist/src/progress.d.ts.map +0 -1
  63. package/dist/src/progress.js +0 -53
  64. package/dist/src/progress.js.map +0 -1
  65. package/dist/src/relation-kind.d.ts +0 -69
  66. package/dist/src/relation-kind.d.ts.map +0 -1
  67. package/dist/src/relation-kind.js +0 -375
  68. package/dist/src/relation-kind.js.map +0 -1
  69. package/dist/src/relation-multipolygon.d.ts +0 -43
  70. package/dist/src/relation-multipolygon.d.ts.map +0 -1
  71. package/dist/src/relation-multipolygon.js +0 -195
  72. package/dist/src/relation-multipolygon.js.map +0 -1
  73. package/dist/src/stream-to-bytes.d.ts +0 -18
  74. package/dist/src/stream-to-bytes.d.ts.map +0 -1
  75. package/dist/src/stream-to-bytes.js +0 -30
  76. package/dist/src/stream-to-bytes.js.map +0 -1
  77. package/dist/src/test/fixtures.d.ts.map +0 -1
  78. package/dist/src/test/fixtures.js.map +0 -1
  79. package/dist/src/throttle.d.ts +0 -25
  80. package/dist/src/throttle.d.ts.map +0 -1
  81. package/dist/src/throttle.js +0 -34
  82. package/dist/src/throttle.js.map +0 -1
  83. package/dist/src/tile.d.ts +0 -34
  84. package/dist/src/tile.d.ts.map +0 -1
  85. package/dist/src/tile.js +0 -72
  86. package/dist/src/tile.js.map +0 -1
  87. package/dist/src/transform-bytes.d.ts +0 -24
  88. package/dist/src/transform-bytes.d.ts.map +0 -1
  89. package/dist/src/transform-bytes.js +0 -28
  90. package/dist/src/transform-bytes.js.map +0 -1
  91. package/dist/src/types.d.ts +0 -99
  92. package/dist/src/types.d.ts.map +0 -1
  93. package/dist/src/types.js +0 -9
  94. package/dist/src/types.js.map +0 -1
  95. package/dist/src/utils.d.ts +0 -30
  96. package/dist/src/utils.d.ts.map +0 -1
  97. package/dist/src/utils.js +0 -70
  98. package/dist/src/utils.js.map +0 -1
  99. package/dist/src/way-is-area.d.ts +0 -24
  100. package/dist/src/way-is-area.d.ts.map +0 -1
  101. package/dist/src/way-is-area.js +0 -104
  102. package/dist/src/way-is-area.js.map +0 -1
  103. package/dist/src/zigzag.d.ts +0 -33
  104. package/dist/src/zigzag.d.ts.map +0 -1
  105. package/dist/src/zigzag.js +0 -40
  106. package/dist/src/zigzag.js.map +0 -1
  107. package/dist/test/fixtures.d.ts +0 -36
  108. package/dist/test/fixtures.d.ts.map +0 -1
  109. package/dist/test/fixtures.js +0 -175
  110. package/dist/test/fixtures.js.map +0 -1
  111. package/dist/test/haversine-distance.test.d.ts +0 -2
  112. package/dist/test/haversine-distance.test.d.ts.map +0 -1
  113. package/dist/test/haversine-distance.test.js +0 -8
  114. package/dist/test/haversine-distance.test.js.map +0 -1
  115. package/dist/test/relation-kind.test.d.ts +0 -2
  116. package/dist/test/relation-kind.test.d.ts.map +0 -1
  117. package/dist/test/relation-kind.test.js +0 -367
  118. package/dist/test/relation-kind.test.js.map +0 -1
  119. package/dist/test/relation-multipolygon.test.d.ts +0 -2
  120. package/dist/test/relation-multipolygon.test.d.ts.map +0 -1
  121. package/dist/test/relation-multipolygon.test.js +0 -237
  122. package/dist/test/relation-multipolygon.test.js.map +0 -1
  123. package/dist/test/utils.test.d.ts +0 -2
  124. package/dist/test/utils.test.d.ts.map +0 -1
  125. package/dist/test/utils.test.js +0 -76
  126. package/dist/test/utils.test.js.map +0 -1
  127. package/dist/test/way-is-area.test.d.ts +0 -2
  128. package/dist/test/way-is-area.test.d.ts.map +0 -1
  129. package/dist/test/way-is-area.test.js +0 -31
  130. package/dist/test/way-is-area.test.js.map +0 -1
  131. package/test/haversine-distance.test.ts +0 -8
  132. package/test/relation-kind.test.ts +0 -426
  133. package/test/relation-multipolygon.test.ts +0 -265
  134. package/test/utils.test.ts +0 -103
  135. package/test/way-is-area.test.ts +0 -42
  136. package/tsconfig.build.json +0 -5
  137. package/tsconfig.json +0 -9
  138. /package/dist/{src/test/fixtures.d.ts → fixtures.d.ts} +0 -0
@@ -1,16 +0,0 @@
1
- /**
2
- * Great-circle distance calculation using the Haversine formula.
3
- *
4
- * Computes the shortest distance between two points on a sphere,
5
- * accounting for Earth's curvature. Accurate for most geographic distances.
6
- *
7
- * @module
8
- */
9
- /**
10
- * Calculate the great-circle distance between two geographic points.
11
- * @param p1 - The first point
12
- * @param p2 - The second point
13
- * @returns The haversine distance in meters
14
- */
15
- export declare function haversineDistance(p1: [number, number], p2: [number, number]): number;
16
- //# sourceMappingURL=haversine-distance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"haversine-distance.d.ts","sourceRoot":"","sources":["../../src/haversine-distance.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACpB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAClB,MAAM,CAWR"}
@@ -1,26 +0,0 @@
1
- /**
2
- * Great-circle distance calculation using the Haversine formula.
3
- *
4
- * Computes the shortest distance between two points on a sphere,
5
- * accounting for Earth's curvature. Accurate for most geographic distances.
6
- *
7
- * @module
8
- */
9
- /**
10
- * Calculate the great-circle distance between two geographic points.
11
- * @param p1 - The first point
12
- * @param p2 - The second point
13
- * @returns The haversine distance in meters
14
- */
15
- export function haversineDistance(p1, p2) {
16
- const R = 6371008.8; // Earth's radius in meters
17
- const dLat = (p2[1] - p1[1]) * (Math.PI / 180);
18
- const dLon = (p2[0] - p1[0]) * (Math.PI / 180);
19
- const lat1 = p1[1] * (Math.PI / 180);
20
- const lat2 = p2[1] * (Math.PI / 180);
21
- const a = Math.sin(dLat / 2) ** 2 +
22
- Math.sin(dLon / 2) ** 2 * Math.cos(lat1) * Math.cos(lat2);
23
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
24
- return R * c;
25
- }
26
- //# sourceMappingURL=haversine-distance.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"haversine-distance.js","sourceRoot":"","sources":["../../src/haversine-distance.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAChC,EAAoB,EACpB,EAAoB;IAEpB,MAAM,CAAC,GAAG,SAAS,CAAA,CAAC,2BAA2B;IAC/C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAA;IACpC,MAAM,CAAC,GACN,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC1D,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,CAAA;AACb,CAAC"}
@@ -1,2 +0,0 @@
1
- export { clipPolygon, clipPolyline } from "lineclip";
2
- //# sourceMappingURL=lineclip.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lineclip.d.ts","sourceRoot":"","sources":["../../src/lineclip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA"}
@@ -1,3 +0,0 @@
1
- /// <reference path="./lineclip.d.ts" />
2
- export { clipPolygon, clipPolyline } from "lineclip";
3
- //# sourceMappingURL=lineclip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lineclip.js","sourceRoot":"","sources":["../../src/lineclip.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA"}
@@ -1,42 +0,0 @@
1
- /**
2
- * Progress event helpers for long-running operations.
3
- *
4
- * Provides a standard interface for reporting progress from workers and
5
- * async operations. Uses CustomEvent for cross-context communication.
6
- *
7
- * @module
8
- */
9
- export type ProgressLevel = "info" | "warn" | "error";
10
- /**
11
- * Progress payload containing a message and timestamp.
12
- * Planned expansion to include percentage completion.
13
- */
14
- export type Progress = {
15
- msg: string;
16
- timestamp: number;
17
- level: ProgressLevel;
18
- };
19
- /** CustomEvent carrying progress details. */
20
- export interface ProgressEvent extends CustomEvent<Progress> {
21
- }
22
- /**
23
- * Create a Progress payload with current timestamp.
24
- * @param msg - The progress message.
25
- */
26
- export declare function progress(msg: string, level?: ProgressLevel): Progress;
27
- /**
28
- * Create a ProgressEvent with the given message.
29
- * @param msg - The progress message.
30
- */
31
- export declare function progressEvent(msg: string, level?: ProgressLevel): ProgressEvent;
32
- /**
33
- * Extract the message string from a progress event.
34
- * @param event - The event to extract from.
35
- */
36
- export declare function progressEventMessage(event: Event): string;
37
- /**
38
- * Log a progress event's message to the console.
39
- * @param progress - The progress event to log.
40
- */
41
- export declare function logProgress(progress: ProgressEvent): void;
42
- //# sourceMappingURL=progress.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAErD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,aAAa,CAAA;CACpB,CAAA;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAc,SAAQ,WAAW,CAAC,QAAQ,CAAC;CAAG;AAE/D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,aAAsB,GAAG,QAAQ,CAM7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,aAAsB,GAC3B,aAAa,CAEf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,QAclD"}
@@ -1,53 +0,0 @@
1
- /**
2
- * Progress event helpers for long-running operations.
3
- *
4
- * Provides a standard interface for reporting progress from workers and
5
- * async operations. Uses CustomEvent for cross-context communication.
6
- *
7
- * @module
8
- */
9
- /**
10
- * Create a Progress payload with current timestamp.
11
- * @param msg - The progress message.
12
- */
13
- export function progress(msg, level = "info") {
14
- return {
15
- msg,
16
- timestamp: Date.now(),
17
- level,
18
- };
19
- }
20
- /**
21
- * Create a ProgressEvent with the given message.
22
- * @param msg - The progress message.
23
- */
24
- export function progressEvent(msg, level = "info") {
25
- return new CustomEvent("progress", { detail: progress(msg, level) });
26
- }
27
- /**
28
- * Extract the message string from a progress event.
29
- * @param event - The event to extract from.
30
- */
31
- export function progressEventMessage(event) {
32
- return event.detail.msg;
33
- }
34
- /**
35
- * Log a progress event's message to the console.
36
- * @param progress - The progress event to log.
37
- */
38
- export function logProgress(progress) {
39
- const level = progress.detail.level;
40
- const message = progressEventMessage(progress);
41
- switch (level) {
42
- case "info":
43
- console.log(message);
44
- break;
45
- case "warn":
46
- console.warn(message);
47
- break;
48
- case "error":
49
- console.error(message);
50
- break;
51
- }
52
- }
53
- //# sourceMappingURL=progress.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,QAAuB,MAAM;IAClE,OAAO;QACN,GAAG;QACH,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK;KACL,CAAA;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC5B,GAAW,EACX,QAAuB,MAAM;IAE7B,OAAO,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAY;IAChD,OAAQ,KAAuB,CAAC,MAAM,CAAC,GAAG,CAAA;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAuB;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAA;IACnC,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAC9C,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,MAAM;YACV,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACpB,MAAK;QACN,KAAK,MAAM;YACV,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrB,MAAK;QACN,KAAK,OAAO;YACX,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtB,MAAK;IACP,CAAC;AACF,CAAC"}
@@ -1,69 +0,0 @@
1
- /**
2
- * Relation kind detection and geometry building.
3
- *
4
- * Determines the semantic type of OSM relations (area, line, point, logic, super)
5
- * based on their type tag and member structure. Also provides utilities for
6
- * building geometries from relation members.
7
- *
8
- * @module
9
- */
10
- import type { LonLat, OsmRelation, OsmWay, RelationKind, RelationKindMetadata } from "./types";
11
- /**
12
- * Get the semantic kind of a relation based on its type tag.
13
- * Based on [OSM relation documentation](https://wiki.openstreetmap.org/wiki/Relation):
14
- * - Areas: multipolygon, boundary, site
15
- * - Lines: route, waterway, multilinestring, canal
16
- * - Points: multipoint
17
- * - Logic: restriction, route_master, network, collection
18
- * - [Super: relations that contain other relations](https://wiki.openstreetmap.org/wiki/Super-relation)
19
- */
20
- export declare function getRelationKind(relation: OsmRelation): RelationKind;
21
- /**
22
- * Get metadata about a relation kind.
23
- */
24
- export declare function getRelationKindMetadata(relation: OsmRelation): RelationKindMetadata;
25
- /**
26
- * Check if a relation is an area relation.
27
- */
28
- export declare function isAreaRelation(relation: OsmRelation): boolean;
29
- /**
30
- * Check if a relation is a line relation.
31
- */
32
- export declare function isLineRelation(relation: OsmRelation): boolean;
33
- /**
34
- * Check if a relation is a point relation.
35
- */
36
- export declare function isPointRelation(relation: OsmRelation): boolean;
37
- /**
38
- * Check if a relation is a super-relation (contains other relations).
39
- */
40
- export declare function isSuperRelation(relation: OsmRelation): boolean;
41
- /**
42
- * Check if a relation is a logical relation (non-geometric).
43
- */
44
- export declare function isLogicRelation(relation: OsmRelation): boolean;
45
- /**
46
- * Build MultiLineString geometry from a line relation by connecting way members.
47
- * Orders way members using their refs and handles role-based reversal.
48
- * Returns an array of LineString coordinates (each LineString is an array of LonLat).
49
- */
50
- export declare function buildRelationLineStrings(relation: OsmRelation, getWay: (wayId: number) => OsmWay | null, getNodeCoordinates: (nodeId: number) => LonLat | undefined): LonLat[][];
51
- /**
52
- * Collect point coordinates from a point relation.
53
- * Returns an array of LonLat coordinates from node members.
54
- */
55
- export declare function collectRelationPoints(relation: OsmRelation, getNodeCoordinates: (nodeId: number) => LonLat | undefined): LonLat[];
56
- /**
57
- * Resolve nested relation members, flattening the hierarchy with cycle detection.
58
- * Returns all nodes, ways, and relations that are members (directly or indirectly).
59
- * @param relation - The relation to resolve
60
- * @param getRelation - Function to get a relation by ID
61
- * @param maxDepth - Maximum recursion depth (default: 10)
62
- * @param visited - Set of relation IDs already visited (for cycle detection)
63
- */
64
- export declare function resolveRelationMembers(relation: OsmRelation, getRelation: (relationId: number) => OsmRelation | null, maxDepth?: number, visited?: Set<number>): {
65
- nodes: number[];
66
- ways: number[];
67
- relations: number[];
68
- };
69
- //# sourceMappingURL=relation-kind.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relation-kind.d.ts","sourceRoot":"","sources":["../../src/relation-kind.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACX,MAAM,EACN,WAAW,EAEX,MAAM,EACN,YAAY,EACZ,oBAAoB,EACpB,MAAM,SAAS,CAAA;AAEhB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,YAAY,CA4CnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,WAAW,GACnB,oBAAoB,CAyCtB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EACxC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,EAAE,CAiCZ;AAqJD;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,WAAW,EACrB,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,CAWV;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,EACvD,QAAQ,SAAK,EACb,OAAO,cAAoB,GACzB;IACF,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;CACnB,CA4DA"}
@@ -1,375 +0,0 @@
1
- /**
2
- * Relation kind detection and geometry building.
3
- *
4
- * Determines the semantic type of OSM relations (area, line, point, logic, super)
5
- * based on their type tag and member structure. Also provides utilities for
6
- * building geometries from relation members.
7
- *
8
- * @module
9
- */
10
- /**
11
- * Get the semantic kind of a relation based on its type tag.
12
- * Based on [OSM relation documentation](https://wiki.openstreetmap.org/wiki/Relation):
13
- * - Areas: multipolygon, boundary, site
14
- * - Lines: route, waterway, multilinestring, canal
15
- * - Points: multipoint
16
- * - Logic: restriction, route_master, network, collection
17
- * - [Super: relations that contain other relations](https://wiki.openstreetmap.org/wiki/Super-relation)
18
- */
19
- export function getRelationKind(relation) {
20
- const typeTag = relation.tags?.["type"];
21
- if (!typeTag || typeof typeTag !== "string") {
22
- // If no type tag, check if it has relation members (super-relation)
23
- if (relation.members.some((m) => m.type === "relation")) {
24
- return "super";
25
- }
26
- // Default to logic for untyped relations
27
- return "logic";
28
- }
29
- const normalizedType = typeTag.toLowerCase();
30
- // Area relations
31
- if (normalizedType === "multipolygon" ||
32
- normalizedType === "boundary" ||
33
- normalizedType === "site") {
34
- return "area";
35
- }
36
- // Line relations
37
- if (normalizedType === "route" ||
38
- normalizedType === "waterway" ||
39
- normalizedType === "multilinestring" ||
40
- normalizedType === "canal") {
41
- return "line";
42
- }
43
- // Point relations
44
- if (normalizedType === "multipoint") {
45
- return "point";
46
- }
47
- // Check for super-relation (has relation members)
48
- if (relation.members.some((m) => m.type === "relation")) {
49
- return "super";
50
- }
51
- // Default to logic for other types (restriction, route_master, network, collection, etc.)
52
- return "logic";
53
- }
54
- /**
55
- * Get metadata about a relation kind.
56
- */
57
- export function getRelationKindMetadata(relation) {
58
- const kind = getRelationKind(relation);
59
- switch (kind) {
60
- case "area":
61
- return {
62
- kind: "area",
63
- expectedRoles: ["outer", "inner"],
64
- orderMatters: false,
65
- description: "Area relation (multipolygon, boundary, site)",
66
- };
67
- case "line":
68
- return {
69
- kind: "line",
70
- expectedRoles: undefined, // Routes can have various roles
71
- orderMatters: true,
72
- description: "Line relation (route, waterway, multilinestring)",
73
- };
74
- case "point":
75
- return {
76
- kind: "point",
77
- expectedRoles: undefined,
78
- orderMatters: false,
79
- description: "Point relation (multipoint)",
80
- };
81
- case "super":
82
- return {
83
- kind: "super",
84
- expectedRoles: undefined,
85
- orderMatters: false,
86
- description: "Super-relation (contains other relations)",
87
- };
88
- case "logic":
89
- return {
90
- kind: "logic",
91
- expectedRoles: undefined,
92
- orderMatters: false,
93
- description: "Logical relation (restriction, route_master, network, collection, etc.)",
94
- };
95
- }
96
- }
97
- /**
98
- * Check if a relation is an area relation.
99
- */
100
- export function isAreaRelation(relation) {
101
- return getRelationKind(relation) === "area";
102
- }
103
- /**
104
- * Check if a relation is a line relation.
105
- */
106
- export function isLineRelation(relation) {
107
- return getRelationKind(relation) === "line";
108
- }
109
- /**
110
- * Check if a relation is a point relation.
111
- */
112
- export function isPointRelation(relation) {
113
- return getRelationKind(relation) === "point";
114
- }
115
- /**
116
- * Check if a relation is a super-relation (contains other relations).
117
- */
118
- export function isSuperRelation(relation) {
119
- return getRelationKind(relation) === "super";
120
- }
121
- /**
122
- * Check if a relation is a logical relation (non-geometric).
123
- */
124
- export function isLogicRelation(relation) {
125
- return getRelationKind(relation) === "logic";
126
- }
127
- /**
128
- * Build MultiLineString geometry from a line relation by connecting way members.
129
- * Orders way members using their refs and handles role-based reversal.
130
- * Returns an array of LineString coordinates (each LineString is an array of LonLat).
131
- */
132
- export function buildRelationLineStrings(relation, getWay, getNodeCoordinates) {
133
- const lineStrings = [];
134
- const wayMembers = relation.members.filter((m) => m.type === "way");
135
- if (wayMembers.length === 0)
136
- return lineStrings;
137
- // Group ways by role if roles are used
138
- const roleGroups = new Map();
139
- for (const member of wayMembers) {
140
- const role = member.role?.toLowerCase() ?? "";
141
- if (!roleGroups.has(role)) {
142
- roleGroups.set(role, []);
143
- }
144
- roleGroups.get(role).push(member);
145
- }
146
- // If no roles or single role group, process all ways together
147
- const groupsToProcess = roleGroups.size === 1 || !relation.members.some((m) => m.role)
148
- ? [wayMembers]
149
- : Array.from(roleGroups.values());
150
- for (const group of groupsToProcess) {
151
- // Try to connect ways into continuous linestrings
152
- const connected = connectWaysToLineStrings(group, getWay, getNodeCoordinates);
153
- lineStrings.push(...connected);
154
- }
155
- return lineStrings;
156
- }
157
- /**
158
- * Connect ways that share endpoints to form continuous LineStrings.
159
- * Returns an array of LineStrings (each is an array of LonLat coordinates).
160
- */
161
- function connectWaysToLineStrings(wayMembers, getWay, getNodeCoordinates) {
162
- if (wayMembers.length === 0)
163
- return [];
164
- const lineStrings = [];
165
- const used = new Set();
166
- const wayMap = new Map();
167
- // Build map of way ID to way
168
- for (const member of wayMembers) {
169
- const way = getWay(member.ref);
170
- if (way) {
171
- wayMap.set(member.ref, way);
172
- }
173
- }
174
- // Build linestrings by connecting ways
175
- for (const member of wayMembers) {
176
- if (used.has(member.ref))
177
- continue;
178
- const startWay = wayMap.get(member.ref);
179
- if (!startWay || startWay.refs.length < 2)
180
- continue;
181
- const coords = [];
182
- const currentWay = startWay;
183
- used.add(member.ref);
184
- // Get coordinates for the starting way
185
- for (const nodeId of currentWay.refs) {
186
- const coord = getNodeCoordinates(nodeId);
187
- if (coord)
188
- coords.push(coord);
189
- }
190
- // Try to extend forward
191
- while (true) {
192
- let found = false;
193
- const lastCoord = coords[coords.length - 1];
194
- if (!lastCoord)
195
- break;
196
- for (const nextMember of wayMembers) {
197
- if (used.has(nextMember.ref))
198
- continue;
199
- const nextWay = wayMap.get(nextMember.ref);
200
- if (!nextWay || nextWay.refs.length < 2)
201
- continue;
202
- const nextStart = getNodeCoordinates(nextWay.refs[0]);
203
- const nextEnd = getNodeCoordinates(nextWay.refs[nextWay.refs.length - 1]);
204
- if (!nextStart || !nextEnd)
205
- continue;
206
- // Check if next way connects to current end
207
- if (lastCoord[0] === nextStart[0] && lastCoord[1] === nextStart[1]) {
208
- // Connect normally
209
- for (let i = 1; i < nextWay.refs.length; i++) {
210
- const nodeId = nextWay.refs[i];
211
- if (nodeId === undefined)
212
- continue;
213
- const coord = getNodeCoordinates(nodeId);
214
- if (coord)
215
- coords.push(coord);
216
- }
217
- used.add(nextMember.ref);
218
- found = true;
219
- break;
220
- }
221
- if (lastCoord[0] === nextEnd[0] && lastCoord[1] === nextEnd[1]) {
222
- // Need to reverse next way
223
- for (let i = nextWay.refs.length - 2; i >= 0; i--) {
224
- const nodeId = nextWay.refs[i];
225
- if (nodeId === undefined)
226
- continue;
227
- const coord = getNodeCoordinates(nodeId);
228
- if (coord)
229
- coords.push(coord);
230
- }
231
- used.add(nextMember.ref);
232
- found = true;
233
- break;
234
- }
235
- }
236
- if (!found)
237
- break;
238
- }
239
- // Try to extend backward
240
- while (true) {
241
- let found = false;
242
- const firstCoord = coords[0];
243
- if (!firstCoord)
244
- break;
245
- for (const prevMember of wayMembers) {
246
- if (used.has(prevMember.ref))
247
- continue;
248
- const prevWay = wayMap.get(prevMember.ref);
249
- if (!prevWay || prevWay.refs.length < 2)
250
- continue;
251
- const prevStart = getNodeCoordinates(prevWay.refs[0]);
252
- const prevEnd = getNodeCoordinates(prevWay.refs[prevWay.refs.length - 1]);
253
- if (!prevStart || !prevEnd)
254
- continue;
255
- // Check if prev way connects to current start
256
- if (firstCoord[0] === prevEnd[0] && firstCoord[1] === prevEnd[1]) {
257
- // Connect normally (prepend)
258
- const newCoords = [];
259
- for (let i = 0; i < prevWay.refs.length - 1; i++) {
260
- const nodeId = prevWay.refs[i];
261
- if (nodeId === undefined)
262
- continue;
263
- const coord = getNodeCoordinates(nodeId);
264
- if (coord)
265
- newCoords.push(coord);
266
- }
267
- coords.unshift(...newCoords);
268
- used.add(prevMember.ref);
269
- found = true;
270
- break;
271
- }
272
- if (firstCoord[0] === prevStart[0] && firstCoord[1] === prevStart[1]) {
273
- // Need to reverse prev way (prepend reversed)
274
- const newCoords = [];
275
- for (let i = prevWay.refs.length - 1; i > 0; i--) {
276
- const nodeId = prevWay.refs[i];
277
- if (nodeId === undefined)
278
- continue;
279
- const coord = getNodeCoordinates(nodeId);
280
- if (coord)
281
- newCoords.push(coord);
282
- }
283
- coords.unshift(...newCoords);
284
- used.add(prevMember.ref);
285
- found = true;
286
- break;
287
- }
288
- }
289
- if (!found)
290
- break;
291
- }
292
- if (coords.length >= 2) {
293
- lineStrings.push(coords);
294
- }
295
- }
296
- return lineStrings;
297
- }
298
- /**
299
- * Collect point coordinates from a point relation.
300
- * Returns an array of LonLat coordinates from node members.
301
- */
302
- export function collectRelationPoints(relation, getNodeCoordinates) {
303
- const points = [];
304
- for (const member of relation.members) {
305
- if (member.type === "node") {
306
- const coord = getNodeCoordinates(member.ref);
307
- if (coord) {
308
- points.push(coord);
309
- }
310
- }
311
- }
312
- return points;
313
- }
314
- /**
315
- * Resolve nested relation members, flattening the hierarchy with cycle detection.
316
- * Returns all nodes, ways, and relations that are members (directly or indirectly).
317
- * @param relation - The relation to resolve
318
- * @param getRelation - Function to get a relation by ID
319
- * @param maxDepth - Maximum recursion depth (default: 10)
320
- * @param visited - Set of relation IDs already visited (for cycle detection)
321
- */
322
- export function resolveRelationMembers(relation, getRelation, maxDepth = 10, visited = new Set()) {
323
- const nodes = new Set();
324
- const ways = new Set();
325
- const relations = new Set();
326
- // Cycle detection or max depth reached
327
- if (visited.has(relation.id) || maxDepth <= 0) {
328
- return { nodes: [], ways: [], relations: [] };
329
- }
330
- visited.add(relation.id);
331
- for (const member of relation.members) {
332
- if (member.type === "node") {
333
- if (!nodes.has(member.ref)) {
334
- nodes.add(member.ref);
335
- }
336
- }
337
- else if (member.type === "way") {
338
- if (!ways.has(member.ref)) {
339
- ways.add(member.ref);
340
- }
341
- }
342
- else if (member.type === "relation") {
343
- if (!relations.has(member.ref)) {
344
- relations.add(member.ref);
345
- // Recursively resolve nested relation
346
- const nestedRelation = getRelation(member.ref);
347
- if (nestedRelation) {
348
- const nested = resolveRelationMembers(nestedRelation, getRelation, maxDepth - 1, visited);
349
- // Merge nested results
350
- for (const nodeId of nested.nodes) {
351
- if (!nodes.has(nodeId)) {
352
- nodes.add(nodeId);
353
- }
354
- }
355
- for (const wayId of nested.ways) {
356
- if (!ways.has(wayId)) {
357
- ways.add(wayId);
358
- }
359
- }
360
- for (const relId of nested.relations) {
361
- if (!relations.has(relId)) {
362
- relations.add(relId);
363
- }
364
- }
365
- }
366
- }
367
- }
368
- }
369
- return {
370
- nodes: Array.from(nodes),
371
- ways: Array.from(ways),
372
- relations: Array.from(relations),
373
- };
374
- }
375
- //# sourceMappingURL=relation-kind.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"relation-kind.js","sourceRoot":"","sources":["../../src/relation-kind.ts"],"names":[],"mappings":"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"}