@osmix/router 0.0.11 → 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.
- package/CHANGELOG.md +78 -0
- package/LICENSE +21 -0
- package/README.md +138 -53
- package/dist/algorithms/bidirectional.d.ts +6 -9
- package/dist/algorithms/bidirectional.d.ts.map +1 -1
- package/dist/algorithms/bidirectional.js +84 -104
- package/dist/algorithms/bidirectional.js.map +1 -1
- package/dist/algorithms/index.d.ts +2 -2
- package/dist/algorithms/index.d.ts.map +1 -1
- package/dist/algorithms/index.js +1 -1
- package/dist/algorithms/index.js.map +1 -1
- package/dist/algorithms/shortest-path.d.ts +2 -1
- package/dist/algorithms/shortest-path.d.ts.map +1 -1
- package/dist/algorithms/shortest-path.js +9 -7
- package/dist/algorithms/shortest-path.js.map +1 -1
- package/dist/binary-heap.d.ts +5 -0
- package/dist/binary-heap.d.ts.map +1 -1
- package/dist/binary-heap.js +11 -4
- package/dist/binary-heap.js.map +1 -1
- package/dist/graph.d.ts +35 -7
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +161 -119
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -4
- package/dist/index.js.map +1 -1
- package/dist/router.d.ts +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +6 -3
- package/dist/router.js.map +1 -1
- package/dist/topology-stats.d.ts +37 -0
- package/dist/topology-stats.d.ts.map +1 -0
- package/dist/topology-stats.js +62 -0
- package/dist/topology-stats.js.map +1 -0
- package/dist/types.d.ts +15 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -7
- package/dist/utils.js.map +1 -1
- package/package.json +32 -29
- package/src/algorithms/bidirectional.ts +124 -136
- package/src/algorithms/index.ts +10 -10
- package/src/algorithms/shortest-path.ts +96 -92
- package/src/binary-heap.ts +133 -129
- package/src/graph.ts +389 -355
- package/src/index.ts +14 -9
- package/src/router.ts +221 -233
- package/src/topology-stats.ts +84 -0
- package/src/types.ts +102 -87
- package/src/utils.ts +67 -74
- package/test/algorithms.test.ts +396 -353
- package/test/binary-heap.test.ts +27 -0
- package/test/limits.test.ts +82 -0
- package/test/no-shared-array-buffer.test.ts +37 -0
- package/test/router.bench.ts +171 -188
- package/test/router.test.ts +685 -726
- package/test/spatial-capability.test.ts +23 -0
- package/test/topology-stats.test.ts +82 -0
- package/tsconfig.build.json +6 -3
- 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/
|
|
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
|
|
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
|
-
|
|
50
|
-
|
|
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.
|
|
85
|
-
this.
|
|
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
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
//
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
wayIndex,
|
|
126
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
256
|
-
intersectionBits: this.
|
|
293
|
+
routableBits: this.routable.buffer,
|
|
294
|
+
intersectionBits: this.intersections.buffer,
|
|
257
295
|
};
|
|
258
296
|
}
|
|
259
297
|
/**
|
|
260
|
-
*
|
|
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.
|
|
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
|
|
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":"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"}
|
|
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
|
|
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
|
|
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
|
-
*
|
|
23
|
-
* const
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
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
|
|
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
|
|
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
|
-
*
|
|
23
|
-
* const
|
|
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
|
|
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 `
|
|
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
|
package/dist/router.d.ts.map
CHANGED
|
@@ -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,
|
|
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 `
|
|
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
|
|
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"] ?? "";
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
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
|