@osmix/router 0.0.2

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 (64) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +149 -0
  3. package/dist/src/algorithms/bidirectional.d.ts +19 -0
  4. package/dist/src/algorithms/bidirectional.d.ts.map +1 -0
  5. package/dist/src/algorithms/bidirectional.js +128 -0
  6. package/dist/src/algorithms/bidirectional.js.map +1 -0
  7. package/dist/src/algorithms/index.d.ts +17 -0
  8. package/dist/src/algorithms/index.d.ts.map +1 -0
  9. package/dist/src/algorithms/index.js +19 -0
  10. package/dist/src/algorithms/index.js.map +1 -0
  11. package/dist/src/algorithms/shortest-path.d.ts +24 -0
  12. package/dist/src/algorithms/shortest-path.d.ts.map +1 -0
  13. package/dist/src/algorithms/shortest-path.js +115 -0
  14. package/dist/src/algorithms/shortest-path.js.map +1 -0
  15. package/dist/src/binary-heap.d.ts +40 -0
  16. package/dist/src/binary-heap.d.ts.map +1 -0
  17. package/dist/src/binary-heap.js +122 -0
  18. package/dist/src/binary-heap.js.map +1 -0
  19. package/dist/src/graph.d.ts +135 -0
  20. package/dist/src/graph.d.ts.map +1 -0
  21. package/dist/src/graph.js +339 -0
  22. package/dist/src/graph.js.map +1 -0
  23. package/dist/src/index.d.ts +41 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js +41 -0
  26. package/dist/src/index.js.map +1 -0
  27. package/dist/src/router.d.ts +55 -0
  28. package/dist/src/router.d.ts.map +1 -0
  29. package/dist/src/router.js +189 -0
  30. package/dist/src/router.js.map +1 -0
  31. package/dist/src/types.d.ts +118 -0
  32. package/dist/src/types.d.ts.map +1 -0
  33. package/dist/src/types.js +5 -0
  34. package/dist/src/types.js.map +1 -0
  35. package/dist/src/utils.d.ts +20 -0
  36. package/dist/src/utils.d.ts.map +1 -0
  37. package/dist/src/utils.js +101 -0
  38. package/dist/src/utils.js.map +1 -0
  39. package/dist/test/algorithms.test.d.ts +2 -0
  40. package/dist/test/algorithms.test.d.ts.map +1 -0
  41. package/dist/test/algorithms.test.js +382 -0
  42. package/dist/test/algorithms.test.js.map +1 -0
  43. package/dist/test/router.bench.d.ts +2 -0
  44. package/dist/test/router.bench.d.ts.map +1 -0
  45. package/dist/test/router.bench.js +191 -0
  46. package/dist/test/router.bench.js.map +1 -0
  47. package/dist/test/router.test.d.ts +2 -0
  48. package/dist/test/router.test.d.ts.map +1 -0
  49. package/dist/test/router.test.js +515 -0
  50. package/dist/test/router.test.js.map +1 -0
  51. package/package.json +51 -0
  52. package/src/algorithms/bidirectional.ts +147 -0
  53. package/src/algorithms/index.ts +23 -0
  54. package/src/algorithms/shortest-path.ts +149 -0
  55. package/src/binary-heap.ts +147 -0
  56. package/src/graph.ts +414 -0
  57. package/src/index.ts +41 -0
  58. package/src/router.ts +262 -0
  59. package/src/types.ts +138 -0
  60. package/src/utils.ts +114 -0
  61. package/test/algorithms.test.ts +466 -0
  62. package/test/router.bench.ts +257 -0
  63. package/test/router.test.ts +738 -0
  64. package/tsconfig.json +9 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @osmix/router - Pathfinding on OSM road networks.
3
+ *
4
+ * Builds a routeable graph from OSM ways and provides pathfinding algorithms
5
+ * (Dijkstra, A*, bidirectional) for finding routes between nodes. Supports
6
+ * both distance and time-based routing.
7
+ *
8
+ * Key features:
9
+ * - **Graph construction**: Build routing graphs from OSM ways with highway filtering.
10
+ * - **Multiple algorithms**: Dijkstra, A*, and bidirectional search.
11
+ * - **Time-based routing**: Uses maxspeed tags and default speeds by highway type.
12
+ * - **One-way support**: Respects oneway=yes/1 tags.
13
+ * - **Snapping**: Find nearest routable node from arbitrary coordinates.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { buildGraph, Router, findNearestNodeOnGraph } from "@osmix/router"
18
+ *
19
+ * const graph = buildGraph(osm)
20
+ * const router = new Router(osm, graph)
21
+ *
22
+ * const start = findNearestNodeOnGraph(osm, graph, [-73.989, 40.733], 1)
23
+ * const end = findNearestNodeOnGraph(osm, graph, [-73.988, 40.734], 1)
24
+ *
25
+ * if (start && end) {
26
+ * const path = router.route(start.nodeIndex, end.nodeIndex)
27
+ * if (path) {
28
+ * const result = router.buildResult(path)
29
+ * console.log(result.coordinates)
30
+ * }
31
+ * }
32
+ * ```
33
+ *
34
+ * @module @osmix/router
35
+ */
36
+ export * from "./algorithms";
37
+ export * from "./graph";
38
+ export * from "./router";
39
+ export * from "./types";
40
+ export * from "./utils";
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * High-level router API.
3
+ *
4
+ * Wraps the routing graph and algorithms to provide a convenient interface
5
+ * for finding routes and building result objects with coordinates.
6
+ *
7
+ * @module
8
+ */
9
+ import type { Osm } from "@osmix/core";
10
+ import type { RoutingGraph } from "./graph";
11
+ import type { PathSegment, RouteOptions, RoutePathInfo, RouteResult, RouteStatistics } from "./types";
12
+ /**
13
+ * Router for finding paths through OSM road networks.
14
+ *
15
+ * Uses pathfinding algorithms (Dijkstra, A*, or bidirectional) to find
16
+ * routes between node indexes. Use `findNearestNodeOnGraph()` to snap
17
+ * arbitrary coordinates to routable nodes before calling `route()`.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * const router = new Router(osm, graph, { algorithm: "astar" })
22
+ * const path = router.route(startNodeIndex, endNodeIndex)
23
+ * if (path) {
24
+ * const result = router.buildResult(path)
25
+ * console.log(result.coordinates)
26
+ * }
27
+ * ```
28
+ */
29
+ export declare class Router {
30
+ readonly graph: RoutingGraph;
31
+ readonly osm: Osm;
32
+ private readonly defaults;
33
+ constructor(osm: Osm, graph: RoutingGraph, options?: Partial<RouteOptions>);
34
+ /**
35
+ * Find a route between two node indexes.
36
+ * Returns path segments or null if no path exists.
37
+ */
38
+ route(fromNodeIndex: number, toNodeIndex: number, options?: Partial<RouteOptions>): PathSegment[] | null;
39
+ /** Build route result with coordinates from path segments. */
40
+ buildResult(path: PathSegment[], options?: Partial<RouteOptions>): RouteResult;
41
+ /**
42
+ * Calculate route statistics (distance and time) from path segments.
43
+ * @param path - Path segments from route().
44
+ * @returns Total distance in meters and time in seconds.
45
+ */
46
+ getRouteStatistics(path: PathSegment[]): RouteStatistics;
47
+ /**
48
+ * Build route path info (segments and turn points) from path segments.
49
+ * Consecutive ways with the same name are merged into a single segment.
50
+ * @param path - Path segments from route().
51
+ * @returns Segments with per-way breakdown and turn point coordinates.
52
+ */
53
+ getRoutePathInfo(path: PathSegment[]): RoutePathInfo;
54
+ }
55
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,KAAK,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,EAEf,MAAM,SAAS,CAAA;AAEhB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,MAAM;IAClB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAC5B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;gBAGhD,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM;IAYpC;;;OAGG;IACH,KAAK,CACJ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GACjC,WAAW,EAAE,GAAG,IAAI;IAmBvB,8DAA8D;IAC9D,WAAW,CACV,IAAI,EAAE,WAAW,EAAE,EACnB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GACjC,WAAW;IAsDd;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,eAAe;IAqBxD;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa;CAqFpD"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * High-level router API.
3
+ *
4
+ * Wraps the routing graph and algorithms to provide a convenient interface
5
+ * for finding routes and building result objects with coordinates.
6
+ *
7
+ * @module
8
+ */
9
+ import { routingAlgorithms } from "./algorithms";
10
+ /**
11
+ * Router for finding paths through OSM road networks.
12
+ *
13
+ * Uses pathfinding algorithms (Dijkstra, A*, or bidirectional) to find
14
+ * routes between node indexes. Use `findNearestNodeOnGraph()` to snap
15
+ * arbitrary coordinates to routable nodes before calling `route()`.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const router = new Router(osm, graph, { algorithm: "astar" })
20
+ * const path = router.route(startNodeIndex, endNodeIndex)
21
+ * if (path) {
22
+ * const result = router.buildResult(path)
23
+ * console.log(result.coordinates)
24
+ * }
25
+ * ```
26
+ */
27
+ export class Router {
28
+ graph;
29
+ osm;
30
+ defaults;
31
+ constructor(osm, graph, options = {}) {
32
+ this.osm = osm;
33
+ this.graph = graph;
34
+ this.defaults = {
35
+ algorithm: options.algorithm ?? "astar",
36
+ metric: options.metric ?? "distance",
37
+ includeStats: options.includeStats ?? false,
38
+ includePathInfo: options.includePathInfo ?? false,
39
+ };
40
+ }
41
+ /**
42
+ * Find a route between two node indexes.
43
+ * Returns path segments or null if no path exists.
44
+ */
45
+ route(fromNodeIndex, toNodeIndex, options = {}) {
46
+ // Trivial case: same node
47
+ if (fromNodeIndex === toNodeIndex)
48
+ return [{ nodeIndex: fromNodeIndex, cost: 0 }];
49
+ const algorithm = routingAlgorithms[options.algorithm ?? this.defaults.algorithm];
50
+ const metric = options.metric ?? this.defaults.metric;
51
+ return algorithm((nodeIndex) => this.graph.getEdges(nodeIndex), fromNodeIndex, toNodeIndex, (edge) => (metric === "distance" ? edge.distance : edge.time), (nodeIndex) => this.osm.nodes.getNodeLonLat({ index: nodeIndex }), metric);
52
+ }
53
+ /** Build route result with coordinates from path segments. */
54
+ buildResult(path, options = {}) {
55
+ const coordinates = [];
56
+ const wayIndexes = [];
57
+ const nodeIndexes = [];
58
+ const seenNodes = new Set();
59
+ let currentWay;
60
+ for (let i = 0; i < path.length; i++) {
61
+ const seg = path[i];
62
+ const coord = this.osm.nodes.getNodeLonLat({ index: seg.nodeIndex });
63
+ if (coord)
64
+ coordinates.push(coord);
65
+ // Track way transitions
66
+ if (seg.wayIndex !== undefined && seg.wayIndex !== currentWay) {
67
+ wayIndexes.push(seg.wayIndex);
68
+ currentWay = seg.wayIndex;
69
+ // Mark node at way transition
70
+ if (i > 0 && !seenNodes.has(seg.nodeIndex)) {
71
+ seenNodes.add(seg.nodeIndex);
72
+ nodeIndexes.push(seg.nodeIndex);
73
+ }
74
+ }
75
+ // Mark start, end, and intersections
76
+ const isEndpoint = i === 0 || i === path.length - 1;
77
+ const isIntersection = this.graph.isIntersection(seg.nodeIndex);
78
+ if ((isEndpoint || isIntersection) && !seenNodes.has(seg.nodeIndex)) {
79
+ seenNodes.add(seg.nodeIndex);
80
+ nodeIndexes.push(seg.nodeIndex);
81
+ }
82
+ }
83
+ const result = { coordinates, wayIndexes, nodeIndexes };
84
+ const includeStats = options.includeStats ?? this.defaults.includeStats;
85
+ const includePathInfo = options.includePathInfo ?? this.defaults.includePathInfo;
86
+ if (includeStats) {
87
+ const stats = this.getRouteStatistics(path);
88
+ result.distance = stats.distance;
89
+ result.time = stats.time;
90
+ }
91
+ if (includePathInfo) {
92
+ const pathInfo = this.getRoutePathInfo(path);
93
+ result.segments = pathInfo.segments;
94
+ result.turnPoints = pathInfo.turnPoints;
95
+ }
96
+ return result;
97
+ }
98
+ /**
99
+ * Calculate route statistics (distance and time) from path segments.
100
+ * @param path - Path segments from route().
101
+ * @returns Total distance in meters and time in seconds.
102
+ */
103
+ getRouteStatistics(path) {
104
+ let distance = 0;
105
+ let time = 0;
106
+ for (const seg of path) {
107
+ if (seg.wayIndex !== undefined && seg.previousNodeIndex !== undefined) {
108
+ const edges = this.graph.getEdges(seg.previousNodeIndex);
109
+ const edge = edges.find((e) => e.targetNodeIndex === seg.nodeIndex && e.wayIndex === seg.wayIndex);
110
+ if (edge) {
111
+ distance += edge.distance;
112
+ time += edge.time;
113
+ }
114
+ }
115
+ }
116
+ return { distance, time };
117
+ }
118
+ /**
119
+ * Build route path info (segments and turn points) from path segments.
120
+ * Consecutive ways with the same name are merged into a single segment.
121
+ * @param path - Path segments from route().
122
+ * @returns Segments with per-way breakdown and turn point coordinates.
123
+ */
124
+ getRoutePathInfo(path) {
125
+ const edgeSequence = [];
126
+ for (const seg of path) {
127
+ if (seg.wayIndex !== undefined && seg.previousNodeIndex !== undefined) {
128
+ const edges = this.graph.getEdges(seg.previousNodeIndex);
129
+ const edge = edges.find((e) => e.targetNodeIndex === seg.nodeIndex && e.wayIndex === seg.wayIndex);
130
+ if (edge) {
131
+ edgeSequence.push({
132
+ wayIndex: seg.wayIndex,
133
+ transitionNodeIndex: seg.previousNodeIndex,
134
+ distance: edge.distance,
135
+ time: edge.time,
136
+ });
137
+ }
138
+ }
139
+ }
140
+ // Build segments, merging consecutive same-name ways
141
+ const segments = [];
142
+ const turnPoints = [];
143
+ let currentSegment = null;
144
+ let currentDisplayName = null;
145
+ const getDisplayName = (tags) => {
146
+ const name = tags?.["name"] ?? "";
147
+ const highway = tags?.["highway"] ?? "";
148
+ return name || highway;
149
+ };
150
+ for (const { wayIndex, transitionNodeIndex, distance, time, } of edgeSequence) {
151
+ const wayId = this.osm.ways.ids.at(wayIndex);
152
+ const tags = this.osm.ways.tags.getTags(wayIndex);
153
+ const name = tags?.["name"] ?? "";
154
+ const highway = tags?.["highway"] ?? "";
155
+ const displayName = getDisplayName(tags);
156
+ if (currentSegment && currentDisplayName === displayName) {
157
+ if (!currentSegment.wayIds.includes(wayId)) {
158
+ currentSegment.wayIds.push(wayId);
159
+ }
160
+ currentSegment.distance += distance;
161
+ currentSegment.time += time;
162
+ }
163
+ else {
164
+ if (currentSegment) {
165
+ segments.push(currentSegment);
166
+ const coord = this.osm.nodes.getNodeLonLat({
167
+ index: transitionNodeIndex,
168
+ });
169
+ if (coord) {
170
+ turnPoints.push(coord);
171
+ }
172
+ }
173
+ currentSegment = {
174
+ wayIds: [wayId],
175
+ name,
176
+ highway,
177
+ distance,
178
+ time,
179
+ };
180
+ currentDisplayName = displayName;
181
+ }
182
+ }
183
+ if (currentSegment) {
184
+ segments.push(currentSegment);
185
+ }
186
+ return { segments, turnPoints };
187
+ }
188
+ }
189
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Type definitions for the routing module.
3
+ * @module
4
+ */
5
+ import type { BufferType } from "@osmix/core";
6
+ import type { LonLat, OsmTags } from "@osmix/shared/types";
7
+ /** Per-way segment with distance and time (consecutive same-name ways merged). */
8
+ export interface WaySegment {
9
+ /** OSM way IDs included in this segment (multiple if merged). */
10
+ wayIds: number[];
11
+ /** Way name from tags (may be empty). */
12
+ name: string;
13
+ /** Highway type from tags. */
14
+ highway: string;
15
+ /** Distance travelled on this segment in meters. */
16
+ distance: number;
17
+ /** Time travelled on this segment in seconds. */
18
+ time: number;
19
+ }
20
+ /** Route statistics (distance and time). */
21
+ export interface RouteStatistics {
22
+ /** Total route distance in meters. */
23
+ distance: number;
24
+ /** Total route time in seconds. */
25
+ time: number;
26
+ }
27
+ /** Route path info (segments and turn points). */
28
+ export interface RoutePathInfo {
29
+ /** Per-way breakdown (consecutive same-name ways merged). */
30
+ segments: WaySegment[];
31
+ /** Coordinates where way name changes (turn points). */
32
+ turnPoints: LonLat[];
33
+ }
34
+ /** Route result containing the path geometry and metadata. */
35
+ export interface RouteResult {
36
+ /** Coordinates along the route. */
37
+ coordinates: LonLat[];
38
+ /** Way indexes traversed, in order. */
39
+ wayIndexes: number[];
40
+ /** Node indexes at turns and intersections. */
41
+ nodeIndexes: number[];
42
+ /** Total route distance in meters (when includeStats is true). */
43
+ distance?: number;
44
+ /** Total route time in seconds (when includeStats is true). */
45
+ time?: number;
46
+ /** Per-way breakdown (when includePathInfo is true). */
47
+ segments?: WaySegment[];
48
+ /** Coordinates where way name changes (when includePathInfo is true). */
49
+ turnPoints?: LonLat[];
50
+ }
51
+ /** Filter function to determine which highways are routable. Default: common vehicle highways. */
52
+ export type HighwayFilter = (tags?: OsmTags) => boolean;
53
+ /** Available routing algorithms. */
54
+ export type RoutingAlgorithm = "dijkstra" | "astar" | "bidirectional";
55
+ /** Routing metric to optimize. */
56
+ export type RoutingMetric = "distance" | "time";
57
+ /** Speed limits by highway type (km/h). */
58
+ export type DefaultSpeeds = Record<string, number>;
59
+ /** Router configuration options. */
60
+ export interface RouteOptions {
61
+ /** Routing algorithm. Default: "astar". */
62
+ algorithm: RoutingAlgorithm;
63
+ /** Optimization metric. Default: "distance". */
64
+ metric: RoutingMetric;
65
+ /** Include distance and time in result. Default: false. */
66
+ includeStats?: boolean;
67
+ /** Include segments and turnPoints in result. Default: false. */
68
+ includePathInfo?: boolean;
69
+ }
70
+ /** Edge in the routing graph. */
71
+ export interface GraphEdge {
72
+ /** Target node index. */
73
+ targetNodeIndex: number;
74
+ /** Way index this edge belongs to. */
75
+ wayIndex: number;
76
+ /** Distance in meters. */
77
+ distance: number;
78
+ /** Travel time in seconds. */
79
+ time: number;
80
+ }
81
+ /**
82
+ * Serializable representation of a RoutingGraph for worker transfer.
83
+ * Uses CSR (Compressed Sparse Row) format for efficient storage and zero-copy transfer.
84
+ */
85
+ export interface RoutingGraphTransferables {
86
+ /** Total number of nodes in the graph. */
87
+ nodeCount: number;
88
+ /** Total number of edges in the graph. */
89
+ edgeCount: number;
90
+ /** CSR offsets: edges for node i are at indices [edgeOffsets[i], edgeOffsets[i+1]) */
91
+ edgeOffsets: BufferType;
92
+ /** Target node index for each edge. */
93
+ edgeTargets: BufferType;
94
+ /** Way index for each edge. */
95
+ edgeWayIndexes: BufferType;
96
+ /** Distance in meters for each edge. */
97
+ edgeDistances: BufferType;
98
+ /** Travel time in seconds for each edge. */
99
+ edgeTimes: BufferType;
100
+ /** Bitset: 1 bit per node indicating if routable. */
101
+ routableBits: BufferType;
102
+ /** Bitset: 1 bit per node indicating if intersection. */
103
+ intersectionBits: BufferType;
104
+ }
105
+ /** Path segment returned by routing algorithms. */
106
+ export interface PathSegment {
107
+ /** Node index. */
108
+ nodeIndex: number;
109
+ /** Way index used to reach this node. */
110
+ wayIndex?: number;
111
+ /** Previous node in path. */
112
+ previousNodeIndex?: number;
113
+ /** Cost to reach this node. */
114
+ cost: number;
115
+ }
116
+ /** Function signature for routing algorithms. */
117
+ export type RoutingAlgorithmFn = (graph: (nodeIndex: number) => GraphEdge[], startNodeIndex: number, endNodeIndex: number, getEdgeWeight: (edge: GraphEdge) => number, getNodeCoord?: (nodeIndex: number) => LonLat | undefined, metric?: RoutingMetric) => PathSegment[] | null;
118
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Type definitions for the routing module.
3
+ * @module
4
+ */
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Routing utility functions.
3
+ *
4
+ * Provides highway filtering, speed limit parsing, and travel time calculation.
5
+ *
6
+ * @module
7
+ */
8
+ import type { OsmTags } from "@osmix/shared/types";
9
+ import type { DefaultSpeeds } from "./types";
10
+ /** Default speeds (km/h) by highway type. */
11
+ export declare const DEFAULT_SPEEDS: DefaultSpeeds;
12
+ /** Parse maxspeed tag to km/h. Handles "50", "50 km/h", "30 mph". */
13
+ export declare function parseMaxSpeed(value: string | number | undefined): number | null;
14
+ /** Get speed limit (km/h) for a way. */
15
+ export declare function getSpeedLimit(tags: OsmTags | undefined, defaultSpeeds?: DefaultSpeeds): number;
16
+ /** Default filter: common vehicle highways. */
17
+ export declare function defaultHighwayFilter(tags?: OsmTags): boolean;
18
+ /** Default pedestrian filter */
19
+ export declare function defaultPedestrianFilter(tags?: OsmTags): boolean;
20
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,aAoB5B,CAAA;AA6BD,qEAAqE;AACrE,wBAAgB,aAAa,CAC5B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,IAAI,CAqBf;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAC5B,IAAI,EAAE,OAAO,GAAG,SAAS,EACzB,aAAa,GAAE,aAA8B,GAC3C,MAAM,CAUR;AAED,+CAA+C;AAC/C,wBAAgB,oBAAoB,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAG5D;AAED,gCAAgC;AAChC,wBAAgB,uBAAuB,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAG/D"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Routing utility functions.
3
+ *
4
+ * Provides highway filtering, speed limit parsing, and travel time calculation.
5
+ *
6
+ * @module
7
+ */
8
+ /** Default speeds (km/h) by highway type. */
9
+ export const DEFAULT_SPEEDS = {
10
+ motorway: 120,
11
+ motorway_link: 60,
12
+ trunk: 100,
13
+ trunk_link: 50,
14
+ primary: 80,
15
+ primary_link: 50,
16
+ secondary: 70,
17
+ secondary_link: 50,
18
+ tertiary: 60,
19
+ tertiary_link: 50,
20
+ unclassified: 50,
21
+ residential: 30,
22
+ living_street: 20,
23
+ service: 20,
24
+ footway: 5,
25
+ path: 5,
26
+ cycleway: 20,
27
+ bridleway: 10,
28
+ steps: 2,
29
+ };
30
+ /** Highways included in default vehicle routing. */
31
+ const VEHICLE_HIGHWAYS = new Set([
32
+ "motorway",
33
+ "motorway_link",
34
+ "trunk",
35
+ "trunk_link",
36
+ "primary",
37
+ "primary_link",
38
+ "secondary",
39
+ "secondary_link",
40
+ "tertiary",
41
+ "tertiary_link",
42
+ "unclassified",
43
+ "residential",
44
+ "living_street",
45
+ "service",
46
+ ]);
47
+ /** Footways included in default pedestrian routing. */
48
+ const FOOT_HIGHWAYS = new Set([
49
+ "footway",
50
+ "path",
51
+ "cycleway",
52
+ "bridleway",
53
+ "steps",
54
+ ]);
55
+ /** Parse maxspeed tag to km/h. Handles "50", "50 km/h", "30 mph". */
56
+ export function parseMaxSpeed(value) {
57
+ if (!value)
58
+ return null;
59
+ const str = String(value).trim().toLowerCase();
60
+ // Numeric: assume km/h
61
+ const numeric = str.match(/^(\d+)$/);
62
+ if (numeric)
63
+ return Number.parseInt(numeric[1], 10);
64
+ // Explicit km/h
65
+ const kmh = str.match(/^(\d+)\s*(km\/h|kmh|kph)$/);
66
+ if (kmh)
67
+ return Number.parseInt(kmh[1], 10);
68
+ // MPH -> km/h
69
+ const mph = str.match(/^(\d+)\s*mph$/);
70
+ if (mph)
71
+ return Math.round(Number.parseInt(mph[1], 10) * 1.60934);
72
+ // Special values
73
+ if (str === "walk" || str === "none")
74
+ return 5;
75
+ return null;
76
+ }
77
+ /** Get speed limit (km/h) for a way. */
78
+ export function getSpeedLimit(tags, defaultSpeeds = DEFAULT_SPEEDS) {
79
+ if (tags?.["maxspeed"]) {
80
+ const parsed = parseMaxSpeed(tags["maxspeed"]);
81
+ if (parsed !== null)
82
+ return parsed;
83
+ }
84
+ const highway = tags?.["highway"] ? String(tags["highway"]) : undefined;
85
+ if (highway && defaultSpeeds[highway])
86
+ return defaultSpeeds[highway];
87
+ return 50;
88
+ }
89
+ /** Default filter: common vehicle highways. */
90
+ export function defaultHighwayFilter(tags) {
91
+ if (!tags?.["highway"])
92
+ return false;
93
+ return VEHICLE_HIGHWAYS.has(String(tags["highway"]));
94
+ }
95
+ /** Default pedestrian filter */
96
+ export function defaultPedestrianFilter(tags) {
97
+ if (!tags?.["highway"])
98
+ return false;
99
+ return FOOT_HIGHWAYS.has(String(tags["highway"]));
100
+ }
101
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=algorithms.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithms.test.d.ts","sourceRoot":"","sources":["../../test/algorithms.test.ts"],"names":[],"mappings":""}