isochrone-explorer
Version:
A powerful isochrone and routing engine based on Dijkstra's algorithm for accurate travel time calculations.
46 lines (37 loc) • 1.36 kB
JavaScript
const { getOsmData } = require('./osm/overpass');
const { parseGraph, findClosestNode } = require('./utils/osmUtils');
const { dijkstra } = require('./utils/dijkstra');
const { reducePointsToPolygon } = require('./utils/geoUtils');
const { MODE_SPEEDS } = require('./constants');
async function generateIsochrones({ locations, distances, times, modes }) {
const results = [];
for (let i = 0; i < locations.length; i++) {
const [lon, lat] = locations[i];
const mode = modes[i];
if (!MODE_SPEEDS[mode]) {
results.push({ error: `Invalid mode: ${mode}` });
continue;
}
const osmData = await getOsmData(lat, lon);
const { graph, nodeCoords } = parseGraph(osmData);
const startNode = findClosestNode(nodeCoords, lat, lon);
if (!startNode) {
results.push({ error: "No start node found" });
continue;
}
const reachableNodes = dijkstra(
graph,
startNode,
distances[i] || null,
times[i] || null,
nodeCoords,
mode,
distances[i] ? "distance" : "time"
);
const coords = reachableNodes.map(n => [nodeCoords[n].lat, nodeCoords[n].lon]);
const polygon = reducePointsToPolygon(coords);
results.push({ location: locations[i], polygon });
}
return results;
}
module.exports = { generateIsochrones };