isochrone-explorer
Version:
A powerful isochrone and routing engine based on Dijkstra's algorithm for accurate travel time calculations.
41 lines (30 loc) • 1.28 kB
JavaScript
const { calculateDistance } = require('./geoUtils');
const { MODE_SPEEDS } = require('../constants');
function dijkstra(graph, startNode, maxDistance, maxTime, nodeCoords, mode, modeType) {
const visited = new Set();
const distances = {};
const queue = [];
distances[startNode] = 0;
queue.push({ node: startNode, cost: 0 });
while (queue.length > 0) {
queue.sort((a, b) => a.cost - b.cost);
const { node: currentNode } = queue.shift();
if (visited.has(currentNode)) continue;
visited.add(currentNode);
const neighbors = graph[currentNode] || [];
for (const neighbor of neighbors) {
const distance = neighbor.distance;
const time = distance / (MODE_SPEEDS[mode] * 1000 / 3600);
const cost = modeType === 'distance' ? distance : time;
const newCost = distances[currentNode] + cost;
const limit = modeType === 'distance' ? maxDistance : maxTime;
if (limit && newCost > limit) continue;
if (distances[neighbor.node] === undefined || newCost < distances[neighbor.node]) {
distances[neighbor.node] = newCost;
queue.push({ node: neighbor.node, cost: newCost });
}
}
}
return Object.keys(distances);
}
module.exports = { dijkstra };