isochrone-explorer
Version:
A powerful isochrone and routing engine based on Dijkstra's algorithm for accurate travel time calculations.
51 lines (39 loc) • 1.33 kB
JavaScript
const { calculateDistance } = require('./geoUtils');
function parseGraph(osmData) {
const graph = {};
const nodeCoords = {};
for (const element of osmData.elements) {
if (element.type === 'node') {
nodeCoords[element.id] = { lat: element.lat, lon: element.lon };
}
}
for (const element of osmData.elements) {
if (element.type === 'way') {
const nodes = element.nodes;
for (let i = 0; i < nodes.length - 1; i++) {
const node1 = nodes[i];
const node2 = nodes[i + 1];
if (!graph[node1]) graph[node1] = [];
if (!graph[node2]) graph[node2] = [];
const distance = calculateDistance(nodeCoords[node1], nodeCoords[node2]);
graph[node1].push({ node: node2, distance });
graph[node2].push({ node: node1, distance });
}
}
}
return { graph, nodeCoords };
}
function findClosestNode(nodeCoords, lat, lon) {
let minDistance = Infinity;
let closestNode = null;
for (const nodeId in nodeCoords) {
const node = nodeCoords[nodeId];
const distance = calculateDistance({ lat, lon }, node);
if (distance < minDistance) {
minDistance = distance;
closestNode = nodeId;
}
}
return closestNode;
}
module.exports = { parseGraph, findClosestNode };