UNPKG

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