UNPKG

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
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 };