@osmix/router 0.0.13 → 0.1.0

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 (62) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/LICENSE +21 -0
  3. package/README.md +138 -53
  4. package/dist/algorithms/bidirectional.d.ts +6 -9
  5. package/dist/algorithms/bidirectional.d.ts.map +1 -1
  6. package/dist/algorithms/bidirectional.js +84 -104
  7. package/dist/algorithms/bidirectional.js.map +1 -1
  8. package/dist/algorithms/index.d.ts +1 -1
  9. package/dist/algorithms/index.d.ts.map +1 -1
  10. package/dist/algorithms/index.js +1 -1
  11. package/dist/algorithms/index.js.map +1 -1
  12. package/dist/algorithms/shortest-path.d.ts +2 -1
  13. package/dist/algorithms/shortest-path.d.ts.map +1 -1
  14. package/dist/algorithms/shortest-path.js +9 -7
  15. package/dist/algorithms/shortest-path.js.map +1 -1
  16. package/dist/binary-heap.d.ts +5 -0
  17. package/dist/binary-heap.d.ts.map +1 -1
  18. package/dist/binary-heap.js +11 -4
  19. package/dist/binary-heap.js.map +1 -1
  20. package/dist/graph.d.ts +35 -7
  21. package/dist/graph.d.ts.map +1 -1
  22. package/dist/graph.js +161 -119
  23. package/dist/graph.js.map +1 -1
  24. package/dist/index.d.ts +9 -4
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +9 -4
  27. package/dist/index.js.map +1 -1
  28. package/dist/router.d.ts +1 -1
  29. package/dist/router.d.ts.map +1 -1
  30. package/dist/router.js +6 -3
  31. package/dist/router.js.map +1 -1
  32. package/dist/topology-stats.d.ts +37 -0
  33. package/dist/topology-stats.d.ts.map +1 -0
  34. package/dist/topology-stats.js +62 -0
  35. package/dist/topology-stats.js.map +1 -0
  36. package/dist/types.d.ts +15 -2
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/utils.d.ts +1 -1
  39. package/dist/utils.d.ts.map +1 -1
  40. package/dist/utils.js +1 -7
  41. package/dist/utils.js.map +1 -1
  42. package/package.json +32 -29
  43. package/src/algorithms/bidirectional.ts +124 -136
  44. package/src/algorithms/index.ts +10 -10
  45. package/src/algorithms/shortest-path.ts +96 -92
  46. package/src/binary-heap.ts +133 -129
  47. package/src/graph.ts +389 -355
  48. package/src/index.ts +14 -9
  49. package/src/router.ts +221 -233
  50. package/src/topology-stats.ts +84 -0
  51. package/src/types.ts +102 -87
  52. package/src/utils.ts +67 -74
  53. package/test/algorithms.test.ts +396 -353
  54. package/test/binary-heap.test.ts +27 -0
  55. package/test/limits.test.ts +82 -0
  56. package/test/no-shared-array-buffer.test.ts +37 -0
  57. package/test/router.bench.ts +171 -188
  58. package/test/router.test.ts +685 -726
  59. package/test/spatial-capability.test.ts +23 -0
  60. package/test/topology-stats.test.ts +82 -0
  61. package/tsconfig.build.json +6 -6
  62. package/tsconfig.json +7 -7
package/dist/graph.js CHANGED
@@ -11,7 +11,9 @@
11
11
  * @module
12
12
  */
13
13
  import { BufferConstructor } from "@osmix/core";
14
- import { haversineDistance } from "@osmix/shared/haversine-distance";
14
+ import { haversineDistance } from "@osmix/geo/haversine-distance";
15
+ import { BitSet } from "@osmix/shared/bit-set";
16
+ import { normalizedWayDirection } from "@osmix/types/way-direction";
15
17
  import { DEFAULT_SPEEDS, defaultHighwayFilter, getSpeedLimit } from "./utils.js";
16
18
  /**
17
19
  * Routing graph built from OSM ways and nodes.
@@ -22,7 +24,8 @@ import { DEFAULT_SPEEDS, defaultHighwayFilter, getSpeedLimit } from "./utils.js"
22
24
  * @example Build from OSM data
23
25
  * ```ts
24
26
  * const graph = new RoutingGraph(osm)
25
- * const route = router.route(graph, startNode, endNode)
27
+ * const router = new Router(osm, graph)
28
+ * const path = router.route(startNodeIndex, endNodeIndex)
26
29
  * ```
27
30
  *
28
31
  * @example Transfer between workers
@@ -46,8 +49,14 @@ export class RoutingGraph {
46
49
  edgeWayIndexes = null;
47
50
  edgeDistances = null;
48
51
  edgeTimes = null;
49
- routableBits = null;
50
- intersectionBits = null;
52
+ routable = null;
53
+ intersections = null;
54
+ // Incoming-edge CSR, built on first use by getIncomingEdges(). Per worker; not transferred.
55
+ reverseOffsets = null;
56
+ /** Forward edge index for each incoming edge, grouped by target node. */
57
+ reverseEdges = null;
58
+ reverseSources = null;
59
+ cachedMaxSpeedMps = null;
51
60
  // Expose highway filter and default speeds
52
61
  filter;
53
62
  defaultSpeeds;
@@ -81,25 +90,58 @@ export class RoutingGraph {
81
90
  this.edgeWayIndexes = new Uint32Array(t.edgeWayIndexes);
82
91
  this.edgeDistances = new Float32Array(t.edgeDistances);
83
92
  this.edgeTimes = new Float32Array(t.edgeTimes);
84
- this.routableBits = new Uint8Array(t.routableBits);
85
- this.intersectionBits = new Uint8Array(t.intersectionBits);
93
+ this.routable = new BitSet(t.nodeCount, t.routableBits);
94
+ this.intersections = new BitSet(t.nodeCount, t.intersectionBits);
86
95
  }
87
96
  /**
88
- * Build the graph from OSM data.
97
+ * Build the graph from OSM data in two passes over the routable ways, straight into typed
98
+ * arrays: the first counts each node's outgoing edges and sets the node flags, the second
99
+ * fills the CSR arrays. No per-edge objects or `Map`/`Set` (V8 caps those near 2^24 entries).
89
100
  */
90
101
  buildFromOsm(osm, filter, defaultSpeeds) {
91
102
  this.nodeCount = osm.nodes.size;
92
- const tempEdges = new Map();
93
- const tempRoutable = new Set();
94
- const tempIntersections = new Set();
95
- const addEdgeToNode = (from, edge) => {
96
- let nodeEdges = tempEdges.get(from);
97
- if (!nodeEdges) {
98
- nodeEdges = [];
99
- tempEdges.set(from, nodeEdges);
100
- }
101
- nodeEdges.push(edge);
103
+ const bitsetLength = BitSet.byteLength(this.nodeCount);
104
+ this.routable = new BitSet(this.nodeCount, new BufferConstructor(bitsetLength));
105
+ this.intersections = new BitSet(this.nodeCount, new BufferConstructor(bitsetLength));
106
+ const offsets = new Uint32Array(new BufferConstructor((this.nodeCount + 1) * Uint32Array.BYTES_PER_ELEMENT));
107
+ this.edgeOffsets = offsets;
108
+ // Pass 1: count outgoing edges into offsets[from + 1], and mark routable nodes and
109
+ // intersections (a node seen a second time).
110
+ this.forEachSegment(osm, filter, defaultSpeeds, (from, to, direction) => {
111
+ if (direction !== "reverse")
112
+ offsets[from + 1]++;
113
+ if (direction !== "forward")
114
+ offsets[to + 1]++;
115
+ this.markRoutable(from);
116
+ this.markRoutable(to);
117
+ });
118
+ for (let n = 0; n < this.nodeCount; n++)
119
+ offsets[n + 1] += offsets[n];
120
+ this.edgeCount = offsets[this.nodeCount];
121
+ this.edgeTargets = new Uint32Array(new BufferConstructor(this.edgeCount * Uint32Array.BYTES_PER_ELEMENT));
122
+ this.edgeWayIndexes = new Uint32Array(new BufferConstructor(this.edgeCount * Uint32Array.BYTES_PER_ELEMENT));
123
+ this.edgeDistances = new Float32Array(new BufferConstructor(this.edgeCount * Float32Array.BYTES_PER_ELEMENT));
124
+ this.edgeTimes = new Float32Array(new BufferConstructor(this.edgeCount * Float32Array.BYTES_PER_ELEMENT));
125
+ // Pass 2: fill each node's edges in way order.
126
+ const cursor = offsets.slice(0, this.nodeCount);
127
+ const addEdge = (from, to, wayIndex, distance, time) => {
128
+ const edgeIndex = cursor[from]++;
129
+ this.edgeTargets[edgeIndex] = to;
130
+ this.edgeWayIndexes[edgeIndex] = wayIndex;
131
+ this.edgeDistances[edgeIndex] = distance;
132
+ this.edgeTimes[edgeIndex] = time;
102
133
  };
134
+ this.forEachSegment(osm, filter, defaultSpeeds, (from, to, direction, wayIndex, speedMps) => {
135
+ const distance = haversineDistance(osm.nodes.getNodeLonLat({ index: from }), osm.nodes.getNodeLonLat({ index: to }));
136
+ const time = distance / speedMps;
137
+ if (direction !== "reverse")
138
+ addEdge(from, to, wayIndex, distance, time);
139
+ if (direction !== "forward")
140
+ addEdge(to, from, wayIndex, distance, time);
141
+ });
142
+ }
143
+ /** Visit each segment of each routable way, in way order, with its direction and speed. */
144
+ forEachSegment(osm, filter, defaultSpeeds, visit) {
103
145
  for (let wayIndex = 0; wayIndex < osm.ways.size; wayIndex++) {
104
146
  const tags = osm.ways.tags.getTags(wayIndex);
105
147
  if (!filter(tags))
@@ -107,95 +149,33 @@ export class RoutingGraph {
107
149
  const refs = osm.ways.getRefIds(wayIndex);
108
150
  if (refs.length < 2)
109
151
  continue;
110
- // Create bidirectional edges between consecutive nodes (respecting one-way)
111
- const oneway = tags?.["oneway"] === "yes" || tags?.["oneway"] === "1";
112
- const speedKph = getSpeedLimit(tags, defaultSpeeds);
113
- const speedMps = (speedKph * 1_000) / 60 / 60;
114
- const nodes = refs.map((ref) => osm.nodes.ids.getIndexFromId(ref));
115
- for (let i = 0; i < nodes.length - 1; i++) {
116
- const nodeIndex = nodes[i];
117
- const targetNodeIndex = nodes[i + 1];
118
- const fromCoord = osm.nodes.getNodeLonLat({ index: nodeIndex });
119
- const targetCoord = osm.nodes.getNodeLonLat({ index: targetNodeIndex });
120
- const distanceM = haversineDistance(fromCoord, targetCoord);
121
- const time = distanceM / speedMps;
122
- // Forward edge
123
- addEdgeToNode(nodeIndex, {
124
- targetNodeIndex: targetNodeIndex,
125
- wayIndex,
126
- distance: distanceM,
127
- time,
128
- });
129
- this.edgeCount++;
130
- // Reverse edge (unless one-way)
131
- if (!oneway) {
132
- addEdgeToNode(targetNodeIndex, {
133
- targetNodeIndex: nodeIndex,
134
- wayIndex,
135
- distance: distanceM,
136
- time,
137
- });
138
- this.edgeCount++;
139
- }
140
- // Track routable nodes and intersections (nodes appearing in multiple ways)
141
- if (tempRoutable.has(nodeIndex)) {
142
- tempIntersections.add(nodeIndex);
143
- }
144
- else {
145
- tempRoutable.add(nodeIndex);
146
- }
147
- if (tempRoutable.has(targetNodeIndex)) {
148
- tempIntersections.add(targetNodeIndex);
149
- }
150
- else {
151
- tempRoutable.add(targetNodeIndex);
152
- }
153
- }
154
- }
155
- // Convert to CSR format and free temporary structures
156
- // Allocate CSR arrays
157
- const offsetsBuffer = new BufferConstructor((this.nodeCount + 1) * Uint32Array.BYTES_PER_ELEMENT);
158
- const targetsBuffer = new BufferConstructor(this.edgeCount * Uint32Array.BYTES_PER_ELEMENT);
159
- const wayIndexesBuffer = new BufferConstructor(this.edgeCount * Uint32Array.BYTES_PER_ELEMENT);
160
- const distancesBuffer = new BufferConstructor(this.edgeCount * Float32Array.BYTES_PER_ELEMENT);
161
- const timesBuffer = new BufferConstructor(this.edgeCount * Float32Array.BYTES_PER_ELEMENT);
162
- this.edgeOffsets = new Uint32Array(offsetsBuffer);
163
- this.edgeTargets = new Uint32Array(targetsBuffer);
164
- this.edgeWayIndexes = new Uint32Array(wayIndexesBuffer);
165
- this.edgeDistances = new Float32Array(distancesBuffer);
166
- this.edgeTimes = new Float32Array(timesBuffer);
167
- // Build CSR format: iterate through all nodes in order
168
- let edgeIndex = 0;
169
- for (let nodeIndex = 0; nodeIndex < this.nodeCount; nodeIndex++) {
170
- this.edgeOffsets[nodeIndex] = edgeIndex;
171
- const edges = tempEdges.get(nodeIndex);
172
- if (edges) {
173
- for (const edge of edges) {
174
- this.edgeTargets[edgeIndex] = edge.targetNodeIndex;
175
- this.edgeWayIndexes[edgeIndex] = edge.wayIndex;
176
- this.edgeDistances[edgeIndex] = edge.distance;
177
- this.edgeTimes[edgeIndex] = edge.time;
178
- edgeIndex++;
179
- }
152
+ const normalizedDirection = normalizedWayDirection(tags);
153
+ // Preserve the existing router approximation for unsupported dynamic values.
154
+ // Matching does not use this fallback to establish direction equivalence.
155
+ const direction = normalizedDirection === "unsupported"
156
+ ? tags?.["junction"] === "roundabout"
157
+ ? "forward"
158
+ : "both"
159
+ : normalizedDirection;
160
+ const speedMps = (getSpeedLimit(tags, defaultSpeeds) * 1_000) / 60 / 60;
161
+ let from = osm.nodes.ids.getIndexFromId(refs[0]);
162
+ for (let i = 1; i < refs.length; i++) {
163
+ const to = osm.nodes.ids.getIndexFromId(refs[i]);
164
+ // A ref to a node outside the dataset (for example, cut off by an extract) has index -1.
165
+ // Skip the segments that touch it rather than store a wrapped Uint32 index.
166
+ if (from >= 0 && to >= 0)
167
+ visit(from, to, direction, wayIndex, speedMps);
168
+ from = to;
180
169
  }
181
170
  }
182
- this.edgeOffsets[this.nodeCount] = edgeIndex;
183
- // Build bitsets for routable and intersection flags
184
- const bitsetLength = Math.ceil(this.nodeCount / 8);
185
- const routableBuffer = new BufferConstructor(bitsetLength);
186
- const intersectionBuffer = new BufferConstructor(bitsetLength);
187
- this.routableBits = new Uint8Array(routableBuffer);
188
- this.intersectionBits = new Uint8Array(intersectionBuffer);
189
- for (const nodeIndex of tempRoutable) {
190
- const byteIndex = nodeIndex >> 3;
191
- const bitMask = 1 << (nodeIndex & 7);
192
- this.routableBits[byteIndex] |= bitMask;
193
- }
194
- for (const nodeIndex of tempIntersections) {
195
- const byteIndex = nodeIndex >> 3;
196
- const bitMask = 1 << (nodeIndex & 7);
197
- this.intersectionBits[byteIndex] |= bitMask;
198
- }
171
+ }
172
+ /** Mark a node routable, or an intersection if it was already routable. */
173
+ markRoutable(nodeIndex) {
174
+ // Segment endpoints are resolved node indexes, so they are in range.
175
+ if (this.routable.hasUnchecked(nodeIndex))
176
+ this.intersections.addUnchecked(nodeIndex);
177
+ else
178
+ this.routable.addUnchecked(nodeIndex);
199
179
  }
200
180
  /**
201
181
  * Check if a node is part of the routable network.
@@ -203,9 +183,7 @@ export class RoutingGraph {
203
183
  isRoutable(nodeIndex) {
204
184
  if (nodeIndex < 0 || nodeIndex >= this.nodeCount)
205
185
  return false;
206
- const byteIndex = nodeIndex >> 3;
207
- const bitMask = 1 << (nodeIndex & 7);
208
- return (this.routableBits[byteIndex] & bitMask) !== 0;
186
+ return this.routable.hasUnchecked(nodeIndex);
209
187
  }
210
188
  /**
211
189
  * Check if a node is an intersection (multiple ways meet).
@@ -213,18 +191,13 @@ export class RoutingGraph {
213
191
  isIntersection(nodeIndex) {
214
192
  if (nodeIndex < 0 || nodeIndex >= this.nodeCount)
215
193
  return false;
216
- const byteIndex = nodeIndex >> 3;
217
- const bitMask = 1 << (nodeIndex & 7);
218
- return (this.intersectionBits[byteIndex] & bitMask) !== 0;
194
+ return this.intersections.hasUnchecked(nodeIndex);
219
195
  }
220
196
  /**
221
197
  * Get outgoing edges from a node.
222
198
  */
223
199
  getEdges(nodeIndex) {
224
- if (nodeIndex < 0 ||
225
- nodeIndex >= this.nodeCount ||
226
- !this.edgeOffsets ||
227
- !this.edgeTargets) {
200
+ if (nodeIndex < 0 || nodeIndex >= this.nodeCount || !this.edgeOffsets || !this.edgeTargets) {
228
201
  return [];
229
202
  }
230
203
  const start = this.edgeOffsets[nodeIndex];
@@ -240,6 +213,71 @@ export class RoutingGraph {
240
213
  }
241
214
  return edges;
242
215
  }
216
+ /**
217
+ * Get incoming edges of a node. In each returned edge, `targetNodeIndex` is the
218
+ * edge's source node. The reverse index (4 bytes per node plus 8 bytes per edge)
219
+ * is built on the first call.
220
+ */
221
+ getIncomingEdges(nodeIndex) {
222
+ if (nodeIndex < 0 || nodeIndex >= this.nodeCount || !this.edgeOffsets || !this.edgeTargets) {
223
+ return [];
224
+ }
225
+ if (!this.reverseOffsets)
226
+ this.buildReverseIndex();
227
+ const start = this.reverseOffsets[nodeIndex];
228
+ const end = this.reverseOffsets[nodeIndex + 1];
229
+ const edges = [];
230
+ for (let i = start; i < end; i++) {
231
+ const edgeIndex = this.reverseEdges[i];
232
+ edges.push({
233
+ targetNodeIndex: this.reverseSources[i],
234
+ wayIndex: this.edgeWayIndexes[edgeIndex],
235
+ distance: this.edgeDistances[edgeIndex],
236
+ time: this.edgeTimes[edgeIndex],
237
+ });
238
+ }
239
+ return edges;
240
+ }
241
+ buildReverseIndex() {
242
+ const offsets = this.edgeOffsets;
243
+ const targets = this.edgeTargets;
244
+ const reverseOffsets = new Uint32Array(this.nodeCount + 1);
245
+ for (let i = 0; i < this.edgeCount; i++)
246
+ reverseOffsets[targets[i] + 1]++;
247
+ for (let n = 0; n < this.nodeCount; n++) {
248
+ reverseOffsets[n + 1] += reverseOffsets[n];
249
+ }
250
+ const cursor = reverseOffsets.slice(0, this.nodeCount);
251
+ const reverseEdges = new Uint32Array(this.edgeCount);
252
+ const reverseSources = new Uint32Array(this.edgeCount);
253
+ for (let source = 0; source < this.nodeCount; source++) {
254
+ for (let e = offsets[source]; e < offsets[source + 1]; e++) {
255
+ const slot = cursor[targets[e]]++;
256
+ reverseEdges[slot] = e;
257
+ reverseSources[slot] = source;
258
+ }
259
+ }
260
+ this.reverseOffsets = reverseOffsets;
261
+ this.reverseEdges = reverseEdges;
262
+ this.reverseSources = reverseSources;
263
+ }
264
+ /**
265
+ * Fastest edge speed in the graph, in meters per second. The A* time heuristic
266
+ * divides by this so that it never overestimates travel time.
267
+ */
268
+ get maxSpeedMps() {
269
+ if (this.cachedMaxSpeedMps !== null)
270
+ return this.cachedMaxSpeedMps;
271
+ let max = 0;
272
+ for (let i = 0; i < this.edgeCount; i++) {
273
+ const time = this.edgeTimes[i];
274
+ if (time > 0)
275
+ max = Math.max(max, this.edgeDistances[i] / time);
276
+ }
277
+ // Float32 rounding can shave a little off the true speed; keep the bound safe.
278
+ this.cachedMaxSpeedMps = max > 0 ? max * (1 + 1e-6) : Number.POSITIVE_INFINITY;
279
+ return this.cachedMaxSpeedMps;
280
+ }
243
281
  /**
244
282
  * Get transferable buffers for passing to another thread.
245
283
  */
@@ -252,12 +290,13 @@ export class RoutingGraph {
252
290
  edgeWayIndexes: this.edgeWayIndexes.buffer,
253
291
  edgeDistances: this.edgeDistances.buffer,
254
292
  edgeTimes: this.edgeTimes.buffer,
255
- routableBits: this.routableBits.buffer,
256
- intersectionBits: this.intersectionBits.buffer,
293
+ routableBits: this.routable.buffer,
294
+ intersectionBits: this.intersections.buffer,
257
295
  };
258
296
  }
259
297
  /**
260
- * Get the number of nodes in the graph.
298
+ * Number of node slots in the graph: every node in the source OSM data, not only
299
+ * routable ones. Use `isRoutable()` to test a node.
261
300
  */
262
301
  get size() {
263
302
  return this.nodeCount;
@@ -275,6 +314,9 @@ export class RoutingGraph {
275
314
  * graph (i.e., lie on a routable way). Returns the closest match with its
276
315
  * coordinates and distance.
277
316
  *
317
+ * Snaps to graph nodes only, not to points along edges. Requires the "all" node
318
+ * spatial index; throws `SpatialIndexNotBuiltError` without it.
319
+ *
278
320
  * @param osm - The OSM dataset.
279
321
  * @param point - The [lon, lat] coordinates to search from.
280
322
  * @param maxDistanceM - Maximum search radius in meters.
@@ -282,7 +324,7 @@ export class RoutingGraph {
282
324
  *
283
325
  * @example
284
326
  * ```ts
285
- * const nearest = graph.findNearestNodeOnGraph(osm, [-73.989, 40.733], 0.5)
327
+ * const nearest = graph.findNearestRoutableNode(osm, [-73.989, 40.733], 500)
286
328
  * if (nearest) {
287
329
  * console.log(`Found node ${nearest.nodeIndex} at ${nearest.distance}m`)
288
330
  * }
@@ -334,6 +376,6 @@ export function getTransferableBuffers(t) {
334
376
  t.intersectionBits,
335
377
  ];
336
378
  // Only ArrayBuffers need to be transferred; SharedArrayBuffers are shared automatically
337
- return buffers.filter((b) => b instanceof ArrayBuffer && !(b instanceof SharedArrayBuffer));
379
+ return buffers.filter((b) => b instanceof ArrayBuffer);
338
380
  }
339
381
  //# sourceMappingURL=graph.js.map
package/dist/graph.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAA6B,MAAM,aAAa,CAAA;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAQpE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,YAAY;IACxB,oDAAoD;IAC5C,SAAS,GAAG,CAAC,CAAA;IACrB,0CAA0C;IAClC,SAAS,GAAG,CAAC,CAAA;IAErB,gDAAgD;IACxC,WAAW,GAAuB,IAAI,CAAA;IACtC,WAAW,GAAuB,IAAI,CAAA;IACtC,cAAc,GAAuB,IAAI,CAAA;IACzC,aAAa,GAAwB,IAAI,CAAA;IACzC,SAAS,GAAwB,IAAI,CAAA;IACrC,YAAY,GAAsB,IAAI,CAAA;IACtC,gBAAgB,GAAsB,IAAI,CAAA;IAElD,2CAA2C;IAClC,MAAM,CAAe;IACrB,aAAa,CAAe;IAErC;;;;;;OAMG;IACH,YACC,MAAuC,EACvC,MAAM,GAAkB,oBAAoB,EAC5C,aAAa,GAAkB,cAAc;QAE7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAC3B,iCAAiC;YACjC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;aAAM,CAAC;YACP,sBAAsB;YACtB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;QACjD,CAAC;IACF,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,CAA4B;QACrD,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAA;QAC5B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAA;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QACjD,IAAI,CAAC,cAAc,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;QACvD,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QAClD,IAAI,CAAC,gBAAgB,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;IAC3D,CAAC;IAED;;OAEG;IACK,YAAY,CACnB,GAAQ,EACR,MAAqB,EACrB,aAA4B;QAE5B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAA;QAC/B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAA;QAChD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;QACtC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;QAE3C,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAe,EAAE,EAAE;YACvD,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,SAAS,GAAG,EAAE,CAAA;gBACd,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;YAC/B,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC,CAAA;QAED,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,SAAQ;YAE3B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;YACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAQ;YAE7B,4EAA4E;YAC5E,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAA;YACrE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;YACnD,MAAM,QAAQ,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAA;YAElE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;gBAC3B,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;gBACrC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;gBAC/D,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;gBAEvE,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;gBAC3D,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAA;gBAEjC,eAAe;gBACf,aAAa,CAAC,SAAS,EAAE;oBACxB,eAAe,EAAE,eAAe;oBAChC,QAAQ;oBACR,QAAQ,EAAE,SAAS;oBACnB,IAAI;iBACJ,CAAC,CAAA;gBACF,IAAI,CAAC,SAAS,EAAE,CAAA;gBAEhB,gCAAgC;gBAChC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACb,aAAa,CAAC,eAAe,EAAE;wBAC9B,eAAe,EAAE,SAAS;wBAC1B,QAAQ;wBACR,QAAQ,EAAE,SAAS;wBACnB,IAAI;qBACJ,CAAC,CAAA;oBACF,IAAI,CAAC,SAAS,EAAE,CAAA;gBACjB,CAAC;gBAED,4EAA4E;gBAC5E,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBACjC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBACjC,CAAC;qBAAM,CAAC;oBACP,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;gBAC5B,CAAC;gBAED,IAAI,YAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;oBACxC,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;gBACvC,CAAC;qBAAM,CAAC;oBACP,YAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;gBACnC,CAAC;YACF,CAAC;QACF,CAAC;QAED,sDAAsD;QAEtD,sBAAsB;QACtB,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAC1C,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,iBAAiB,CACpD,CAAA;QACD,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAC1C,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAC9C,CAAA;QACD,MAAM,gBAAgB,GAAG,IAAI,iBAAiB,CAC7C,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,iBAAiB,CAC9C,CAAA;QACD,MAAM,eAAe,GAAG,IAAI,iBAAiB,CAC5C,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,iBAAiB,CAC/C,CAAA;QACD,MAAM,WAAW,GAAG,IAAI,iBAAiB,CACxC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,iBAAiB,CAC/C,CAAA;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,CAAA;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC,CAAA;QACjD,IAAI,CAAC,cAAc,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAA;QACvD,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,eAAe,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,WAAW,CAAC,CAAA;QAE9C,uDAAuD;QACvD,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC;YACjE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;YACvC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACtC,IAAI,KAAK,EAAE,CAAC;gBACX,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBAC1B,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,eAAe,CAAA;oBAClD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;oBAC9C,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;oBAC7C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;oBACrC,SAAS,EAAE,CAAA;gBACZ,CAAC;YACF,CAAC;QACF,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAA;QAE5C,oDAAoD;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAClD,MAAM,cAAc,GAAG,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAA;QAC1D,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAA;QAC9D,IAAI,CAAC,YAAY,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC,CAAA;QAClD,IAAI,CAAC,gBAAgB,GAAG,IAAI,UAAU,CAAC,kBAAkB,CAAC,CAAA;QAE1D,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAA;YAChC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;YACpC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAE,IAAI,OAAO,CAAA;QACzC,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAA;YAChC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;YACpC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAE,IAAI,OAAO,CAAA;QAC7C,CAAC;IACF,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAiB;QAC3B,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAA;QAC9D,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,YAAa,CAAC,SAAS,CAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAiB;QAC/B,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAA;QAC9D,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,CAAA;QAChC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QACpC,OAAO,CAAC,IAAI,CAAC,gBAAiB,CAAC,SAAS,CAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5D,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAiB;QACzB,IACC,SAAS,GAAG,CAAC;YACb,SAAS,IAAI,IAAI,CAAC,SAAS;YAC3B,CAAC,IAAI,CAAC,WAAW;YACjB,CAAC,IAAI,CAAC,WAAW,EAChB,CAAC;YACF,OAAO,EAAE,CAAA;QACV,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAE,CAAA;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,CAAC,CAAE,CAAA;QAC5C,MAAM,KAAK,GAAgB,EAAE,CAAA;QAE7B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC;gBACV,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE;gBACrC,QAAQ,EAAE,IAAI,CAAC,cAAe,CAAC,CAAC,CAAE;gBAClC,QAAQ,EAAE,IAAI,CAAC,aAAc,CAAC,CAAC,CAAE;gBACjC,IAAI,EAAE,IAAI,CAAC,SAAU,CAAC,CAAC,CAAE;aACzB,CAAC,CAAA;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACb,CAAC;IAED;;OAEG;IACH,aAAa;QACZ,OAAO;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAY,CAAC,MAAoB;YACnD,WAAW,EAAE,IAAI,CAAC,WAAY,CAAC,MAAoB;YACnD,cAAc,EAAE,IAAI,CAAC,cAAe,CAAC,MAAoB;YACzD,aAAa,EAAE,IAAI,CAAC,aAAc,CAAC,MAAoB;YACvD,SAAS,EAAE,IAAI,CAAC,SAAU,CAAC,MAAoB;YAC/C,YAAY,EAAE,IAAI,CAAC,YAAa,CAAC,MAAoB;YACrD,gBAAgB,EAAE,IAAI,CAAC,gBAAiB,CAAC,MAAoB;SAC7D,CAAA;IACF,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,SAAS,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,SAAS,CAAA;IACtB,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,uBAAuB,CAAC,GAAQ,EAAE,KAAa,EAAE,YAAoB;QACpE,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAC/C,KAAK,CAAC,CAAC,CAAC,EACR,KAAK,CAAC,CAAC,CAAC,EACR,YAAY,GAAG,KAAK,CACpB,CAAA;QAED,IAAI,IAAI,GAIG,IAAI,CAAA;QACf,IAAI,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAA;QAExC,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,SAAQ;YAEzC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YAC/D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;YACpD,IAAI,QAAQ,GAAG,SAAS,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;gBACtD,SAAS,GAAG,QAAQ,CAAA;gBACpB,IAAI,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;YACvD,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAA;IACZ,CAAC;CACD;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CACzB,GAAQ,EACR,MAAM,GAAkB,oBAAoB,EAC5C,aAAa,GAAkB,cAAc;IAE7C,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACrC,CAA4B;IAE5B,MAAM,OAAO,GAAG;QACf,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,gBAAgB;KAClB,CAAA;IACD,wFAAwF;IACxF,OAAO,OAAO,CAAC,MAAM,CACpB,CAAC,CAAC,EAAoB,EAAE,CACvB,CAAC,YAAY,WAAW,IAAI,CAAC,CAAC,CAAC,YAAY,iBAAiB,CAAC,CAC9D,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -9,18 +9,22 @@
9
9
  * - **Graph construction**: Build routing graphs from OSM ways with highway filtering.
10
10
  * - **Multiple algorithms**: Dijkstra, A*, and bidirectional search.
11
11
  * - **Time-based routing**: Uses maxspeed tags and default speeds by highway type.
12
- * - **One-way support**: Respects oneway=yes/1 tags.
12
+ * - **One-way support**: Respects explicit one-way tags and implicit roundabout direction.
13
13
  * - **Snapping**: Find nearest routable node from arbitrary coordinates.
14
14
  *
15
+ * Not modeled: turn restrictions, access tags, `oneway:*` per-mode overrides,
16
+ * conditional restrictions, turn costs and elevation. See the README "Limitations".
17
+ *
15
18
  * @example
16
19
  * ```ts
17
- * import { buildGraph, Router, findNearestNodeOnGraph } from "@osmix/router"
20
+ * import { buildGraph, Router } from "@osmix/router"
18
21
  *
19
22
  * const graph = buildGraph(osm)
20
23
  * const router = new Router(osm, graph)
21
24
  *
22
- * const start = findNearestNodeOnGraph(osm, graph, [-73.989, 40.733], 1)
23
- * const end = findNearestNodeOnGraph(osm, graph, [-73.988, 40.734], 1)
25
+ * // Snap radius is in meters. Needs the "all" node spatial index.
26
+ * const start = graph.findNearestRoutableNode(osm, [-73.989, 40.733], 500)
27
+ * const end = graph.findNearestRoutableNode(osm, [-73.988, 40.734], 500)
24
28
  *
25
29
  * if (start && end) {
26
30
  * const path = router.route(start.nodeIndex, end.nodeIndex)
@@ -36,6 +40,7 @@
36
40
  export * from "./algorithms/index.ts";
37
41
  export * from "./graph.ts";
38
42
  export * from "./router.ts";
43
+ export * from "./topology-stats.ts";
39
44
  export * from "./types.ts";
40
45
  export * from "./utils.ts";
41
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,cAAc,uBAAuB,CAAA;AACrC,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -9,18 +9,22 @@
9
9
  * - **Graph construction**: Build routing graphs from OSM ways with highway filtering.
10
10
  * - **Multiple algorithms**: Dijkstra, A*, and bidirectional search.
11
11
  * - **Time-based routing**: Uses maxspeed tags and default speeds by highway type.
12
- * - **One-way support**: Respects oneway=yes/1 tags.
12
+ * - **One-way support**: Respects explicit one-way tags and implicit roundabout direction.
13
13
  * - **Snapping**: Find nearest routable node from arbitrary coordinates.
14
14
  *
15
+ * Not modeled: turn restrictions, access tags, `oneway:*` per-mode overrides,
16
+ * conditional restrictions, turn costs and elevation. See the README "Limitations".
17
+ *
15
18
  * @example
16
19
  * ```ts
17
- * import { buildGraph, Router, findNearestNodeOnGraph } from "@osmix/router"
20
+ * import { buildGraph, Router } from "@osmix/router"
18
21
  *
19
22
  * const graph = buildGraph(osm)
20
23
  * const router = new Router(osm, graph)
21
24
  *
22
- * const start = findNearestNodeOnGraph(osm, graph, [-73.989, 40.733], 1)
23
- * const end = findNearestNodeOnGraph(osm, graph, [-73.988, 40.734], 1)
25
+ * // Snap radius is in meters. Needs the "all" node spatial index.
26
+ * const start = graph.findNearestRoutableNode(osm, [-73.989, 40.733], 500)
27
+ * const end = graph.findNearestRoutableNode(osm, [-73.988, 40.734], 500)
24
28
  *
25
29
  * if (start && end) {
26
30
  * const path = router.route(start.nodeIndex, end.nodeIndex)
@@ -36,6 +40,7 @@
36
40
  export * from "./algorithms/index.js";
37
41
  export * from "./graph.js";
38
42
  export * from "./router.js";
43
+ export * from "./topology-stats.js";
39
44
  export * from "./types.js";
40
45
  export * from "./utils.js";
41
46
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,cAAc,uBAAuB,CAAA;AACrC,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
package/dist/router.d.ts CHANGED
@@ -13,7 +13,7 @@ import type { PathSegment, RouteOptions, RoutePathInfo, RouteResult, RouteStatis
13
13
  * Router for finding paths through OSM road networks.
14
14
  *
15
15
  * Uses pathfinding algorithms (Dijkstra, A*, or bidirectional) to find
16
- * routes between node indexes. Use `findNearestNodeOnGraph()` to snap
16
+ * routes between node indexes. Use `graph.findNearestRoutableNode()` to snap
17
17
  * arbitrary coordinates to routable nodes before calling `route()`.
18
18
  *
19
19
  * @example
@@ -1 +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,YAAY,CAAA;AAC9C,OAAO,KAAK,EACX,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,EAEf,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;;;;;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;IAEjD,YACC,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,EAUnC;IAED;;;OAGG;IACH,KAAK,CACJ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GACjC,WAAW,EAAE,GAAG,IAAI,CAiBtB;IAED,8DAA8D;IAC9D,WAAW,CACV,IAAI,EAAE,WAAW,EAAE,EACnB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GACjC,WAAW,CAoDb;IAED;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,eAAe,CAmBvD;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,CAoFnD;CACD"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,eAAe,EAEhB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,MAAM;IACjB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,YAAY,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,EAS7E;IAED;;;OAGG;IACH,KAAK,CACH,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,WAAW,EAAE,GAAG,IAAI,CAmBtB;IAED,8DAA8D;IAC9D,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,WAAW,CAmDjF;IAED;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,eAAe,CAkBvD;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,aAAa,CA8EnD;CACF"}
package/dist/router.js CHANGED
@@ -11,7 +11,7 @@ import { routingAlgorithms } from "./algorithms/index.js";
11
11
  * Router for finding paths through OSM road networks.
12
12
  *
13
13
  * Uses pathfinding algorithms (Dijkstra, A*, or bidirectional) to find
14
- * routes between node indexes. Use `findNearestNodeOnGraph()` to snap
14
+ * routes between node indexes. Use `graph.findNearestRoutableNode()` to snap
15
15
  * arbitrary coordinates to routable nodes before calling `route()`.
16
16
  *
17
17
  * @example
@@ -48,7 +48,10 @@ export class Router {
48
48
  return [{ nodeIndex: fromNodeIndex, cost: 0 }];
49
49
  const algorithm = routingAlgorithms[options.algorithm ?? this.defaults.algorithm];
50
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);
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
+ reverseGraph: (nodeIndex) => this.graph.getIncomingEdges(nodeIndex),
53
+ maxSpeedMps: this.graph.maxSpeedMps,
54
+ });
52
55
  }
53
56
  /** Build route result with coordinates from path segments. */
54
57
  buildResult(path, options = {}) {
@@ -147,7 +150,7 @@ export class Router {
147
150
  const highway = tags?.["highway"] ?? "";
148
151
  return name || highway;
149
152
  };
150
- for (const { wayIndex, transitionNodeIndex, distance, time, } of edgeSequence) {
153
+ for (const { wayIndex, transitionNodeIndex, distance, time } of edgeSequence) {
151
154
  const wayId = this.osm.ways.ids.at(wayIndex);
152
155
  const tags = this.osm.ways.tags.getTags(wayIndex);
153
156
  const name = tags?.["name"] ?? "";
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { OsmTags } from "@osmix/types";
2
+ import type { HighwayFilter } from "./types.ts";
3
+ /** Counts that describe a routing network's shape. */
4
+ export interface RoutingTopologyStats {
5
+ /** Every node in the source, routable or not. */
6
+ nodes: number;
7
+ /** Nodes on at least one way the filter accepts. */
8
+ routableNodes: number;
9
+ /** Directed edges: two per segment, one for a one-way segment. */
10
+ edges: number;
11
+ /** Weakly connected components among routable nodes. */
12
+ components: number;
13
+ }
14
+ /** Anything that can list its ways: an `Osm`, or a planner view of pending changes. */
15
+ export interface RoutingTopologySource {
16
+ nodeCount: number;
17
+ ways(): Iterable<{
18
+ tags?: OsmTags | undefined;
19
+ refs: readonly number[];
20
+ }>;
21
+ }
22
+ /**
23
+ * Directed edges one way adds for `filter` (two per segment, one when one-way), or null when
24
+ * the filter does not route it. Direction follows the router: an unsupported one-way value
25
+ * counts as forward on a roundabout and as two-way elsewhere.
26
+ */
27
+ export declare function routingWayEdges(way: {
28
+ tags?: OsmTags | undefined;
29
+ refs: readonly number[];
30
+ }, filter: HighwayFilter): number | null;
31
+ /**
32
+ * The same counts `RoutingGraph` would give for `filter`, computed from ways alone, without
33
+ * building the graph (no coordinates, speeds or CSR arrays). Direction follows the router: an
34
+ * unsupported one-way value counts as forward on a roundabout and as two-way elsewhere.
35
+ */
36
+ export declare function routingTopologyStats(source: RoutingTopologySource, filter: HighwayFilter): RoutingTopologyStats;
37
+ //# sourceMappingURL=topology-stats.d.ts.map