X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/4197b2d008dc6b524b3f5f4ed632e581b6d74b51..22f590c9ef38ce3a1745be4cc3f411c763696c07:/app/assets/javascripts/index/directions/fossgis_valhalla.js diff --git a/app/assets/javascripts/index/directions/fossgis_valhalla.js b/app/assets/javascripts/index/directions/fossgis_valhalla.js index bc093fea4..41ad6a972 100644 --- a/app/assets/javascripts/index/directions/fossgis_valhalla.js +++ b/app/assets/javascripts/index/directions/fossgis_valhalla.js @@ -1,6 +1,6 @@ (function () { function FOSSGISValhallaEngine(id, costing) { - var INSTR_MAP = [ + const INSTR_MAP = [ 0, // kNone = 0; 8, // kStart = 1; 8, // kStartRight = 2; @@ -42,74 +42,70 @@ 20 // kMergeLeft = 38; ]; - return { - id: id, - creditline: - "Valhalla (FOSSGIS)", - draggable: false, - - getRoute: function (points, callback) { - return $.ajax({ - url: OSM.FOSSGIS_VALHALLA_URL, - data: { - json: JSON.stringify({ - locations: points.map(function (p) { - return { lat: p.lat, lon: p.lng, radius: 5 }; - }), - costing: costing, - directions_options: { - units: "km", - language: I18n.currentLocale() - } - }) - }, - dataType: "json", - success: function (data) { - var trip = data.trip; + function _processDirections(tripLegs) { + let line = []; + let steps = []; + let distance = 0; + let time = 0; - if (trip.status === 0) { - var line = []; - var steps = []; - var distance = 0; - var time = 0; - - trip.legs.forEach(function (leg) { - var legLine = L.PolylineUtil.decode(leg.shape, { - precision: 6 - }); + for (const leg of tripLegs) { + const legLine = L.PolylineUtil.decode(leg.shape, { + precision: 6 + }); - line = line.concat(legLine); + const legSteps = leg.maneuvers.map(function (manoeuvre, idx) { + const num = `${idx + 1}. `; + const lineseg = legLine + .slice(manoeuvre.begin_shape_index, manoeuvre.end_shape_index + 1) + .map(([lat, lng]) => ({ lat, lng })); + return [ + lineseg[0], + INSTR_MAP[manoeuvre.type], + num + manoeuvre.instruction, + manoeuvre.length * 1000, + lineseg + ]; + }); - leg.maneuvers.forEach(function (manoeuvre, idx) { - var point = legLine[manoeuvre.begin_shape_index]; + line = line.concat(legLine); + steps = steps.concat(legSteps); + distance += leg.summary.length; + time += leg.summary.time; + } - steps.push([ - { lat: point[0], lng: point[1] }, - INSTR_MAP[manoeuvre.type], - "" + (idx + 1) + ". " + manoeuvre.instruction, - manoeuvre.length * 1000, - [] - ]); - }); + return { + line: line, + steps: steps, + distance: distance * 1000, + time: time + }; + } - distance = distance + leg.summary.length; - time = time + leg.summary.time; - }); + return { + id: id, + creditline: + "Valhalla (FOSSGIS)", + draggable: false, - callback(false, { - line: line, - steps: steps, - distance: distance * 1000, - time: time - }); - } else { - callback(true); + getRoute: function (points, signal) { + const query = new URLSearchParams({ + json: JSON.stringify({ + locations: points.map(function (p) { + return { lat: p.lat, lon: p.lng, radius: 5 }; + }), + costing: costing, + directions_options: { + units: "km", + language: I18n.currentLocale() } - }, - error: function () { - callback(true); - } + }) }); + return fetch(OSM.FOSSGIS_VALHALLA_URL + "?" + query, { signal }) + .then(response => response.json()) + .then(({ trip }) => { + if (trip.status !== 0) throw new Error(); + return _processDirections(trip.legs); + }); } }; }