function FOSSGISOSRMEngine(modeId, vehicleType) {
let cachedHints = [];
- function _processDirections(route) {
+ function getInstructionText(step) {
const INSTRUCTION_TEMPLATE = {
"continue": "continue",
"merge right": "merge_right",
"depart": "start",
"arrive": "destination"
};
- const ICON_MAP = {
- "continue": "straight",
- "merge right": "merge-right",
- "merge left": "merge-left",
- "off ramp right": "exit-right",
- "off ramp left": "exit-left",
- "on ramp right": "right",
- "on ramp left": "left",
- "fork right": "fork-right",
- "fork left": "fork-left",
- "end of road right": "end-of-road-right",
- "end of road left": "end-of-road-left",
- "turn straight": "straight",
- "turn slight right": "slight-right",
- "turn right": "right",
- "turn sharp right": "sharp-right",
- "turn uturn": "u-turn-left",
- "turn slight left": "slight-left",
- "turn left": "left",
- "turn sharp left": "sharp-left",
- "roundabout": "roundabout",
- "rotary": "roundabout",
- "exit roundabout": "roundabout",
- "exit rotary": "roundabout",
- "depart": "start",
- "arrive": "destination"
- };
function numToWord(num) {
return ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"][num - 1];
}
+
+ const instrPrefix = "javascripts.directions.instructions.";
+ let template = instrPrefix + INSTRUCTION_TEMPLATE[step.maneuverId];
+
+ const destinations = "<b>" + step.destinations + "</b>";
+ let namedRoad = true;
+ let name;
+
+ if (step.name && step.ref) {
+ name = "<b>" + step.name + " (" + step.ref + ")</b>";
+ } else if (step.name) {
+ name = "<b>" + step.name + "</b>";
+ } else if (step.ref) {
+ name = "<b>" + step.ref + "</b>";
+ } else {
+ name = OSM.i18n.t(instrPrefix + "unnamed");
+ namedRoad = false;
+ }
+
+ if (step.maneuver.type.match(/^exit (rotary|roundabout)$/)) {
+ return OSM.i18n.t(template, { name: name });
+ }
+ if (step.maneuver.type.match(/^(rotary|roundabout)$/)) {
+ if (!step.maneuver.exit) {
+ return OSM.i18n.t(template + "_without_exit", { name: name });
+ }
+ if (step.maneuver.exit > 10) {
+ return OSM.i18n.t(template + "_with_exit", { exit: step.maneuver.exit, name: name });
+ }
+ return OSM.i18n.t(template + "_with_exit_ordinal", { exit: OSM.i18n.t(instrPrefix + "exit_counts." + numToWord(step.maneuver.exit)), name: name });
+ }
+ if (!step.maneuver.type.match(/^(on ramp|off ramp)$/)) {
+ return OSM.i18n.t(template + "_without_exit", { name: name });
+ }
+ const params = {};
+ if (step.exits && step.maneuver.type.match(/^(off ramp)$/)) params.exit = step.exits;
+ if (step.destinations) params.directions = destinations;
+ if (namedRoad) params.directions = name;
+ if (Object.keys(params).length > 0) {
+ template = template + "_with_" + Object.keys(params).join("_");
+ }
+ return OSM.i18n.t(template, params);
+ }
+
+ function _processDirections(leg) {
function getManeuverId(maneuver) {
// special case handling
switch (maneuver.type) {
return "turn " + maneuver.modifier;
}
}
+ const ICON_MAP = {
+ "continue": "straight",
+ "merge right": "merge-right",
+ "merge left": "merge-left",
+ "off ramp right": "exit-right",
+ "off ramp left": "exit-left",
+ "on ramp right": "right",
+ "on ramp left": "left",
+ "fork right": "fork-right",
+ "fork left": "fork-left",
+ "end of road right": "end-of-road-right",
+ "end of road left": "end-of-road-left",
+ "turn straight": "straight",
+ "turn slight right": "slight-right",
+ "turn right": "right",
+ "turn sharp right": "sharp-right",
+ "turn uturn": "u-turn-left",
+ "turn slight left": "slight-left",
+ "turn left": "left",
+ "turn sharp left": "sharp-left",
+ "roundabout": "roundabout",
+ "rotary": "roundabout",
+ "exit roundabout": "roundabout",
+ "exit rotary": "roundabout",
+ "depart": "start",
+ "arrive": "destination"
+ };
+
+ for (const step of leg.steps) step.maneuverId = getManeuverId(step.maneuver);
- const steps = route.legs.flatMap(
- leg => leg.steps.map(function (step) {
- const maneuver_id = getManeuverId(step.maneuver);
-
- const instrPrefix = "javascripts.directions.instructions.";
- let template = instrPrefix + INSTRUCTION_TEMPLATE[maneuver_id];
-
- const step_geometry = L.PolylineUtil.decode(step.geometry, { precision: 5 }).map(L.latLng);
-
- let instText;
- const destinations = "<b>" + step.destinations + "</b>";
- let namedRoad = true;
- let name;
-
- if (step.name && step.ref) {
- name = "<b>" + step.name + " (" + step.ref + ")</b>";
- } else if (step.name) {
- name = "<b>" + step.name + "</b>";
- } else if (step.ref) {
- name = "<b>" + step.ref + "</b>";
- } else {
- name = OSM.i18n.t(instrPrefix + "unnamed");
- namedRoad = false;
- }
-
- if (step.maneuver.type.match(/^exit (rotary|roundabout)$/)) {
- instText = OSM.i18n.t(template, { name: name });
- } else if (step.maneuver.type.match(/^(rotary|roundabout)$/)) {
- if (step.maneuver.exit) {
- if (step.maneuver.exit <= 10) {
- instText = OSM.i18n.t(template + "_with_exit_ordinal", { exit: OSM.i18n.t(instrPrefix + "exit_counts." + numToWord(step.maneuver.exit)), name: name });
- } else {
- instText = OSM.i18n.t(template + "_with_exit", { exit: step.maneuver.exit, name: name });
- }
- } else {
- instText = OSM.i18n.t(template + "_without_exit", { name: name });
- }
- } else if (step.maneuver.type.match(/^(on ramp|off ramp)$/)) {
- const params = {};
- if (step.exits && step.maneuver.type.match(/^(off ramp)$/)) params.exit = step.exits;
- if (step.destinations) params.directions = destinations;
- if (namedRoad) params.directions = name;
- if (Object.keys(params).length > 0) {
- template = template + "_with_" + Object.keys(params).join("_");
- }
- instText = OSM.i18n.t(template, params);
- } else {
- instText = OSM.i18n.t(template + "_without_exit", { name: name });
- }
- return [[step.maneuver.location[1], step.maneuver.location[0]], ICON_MAP[maneuver_id], instText, step.distance, step_geometry];
- })
- );
+ const steps = leg.steps.map(step => [
+ ICON_MAP[step.maneuverId],
+ getInstructionText(step),
+ step.distance,
+ L.PolylineUtil.decode(step.geometry, { precision: 5 })
+ ]);
return {
- line: steps.flatMap(step => step[4]),
+ line: steps.flatMap(step => step[3]),
steps,
- distance: route.distance,
- time: route.duration
+ distance: leg.distance,
+ time: leg.duration
};
}
.then(response => {
if (response.code !== "Ok") throw new Error();
cachedHints = response.waypoints.map(wp => wp.hint);
- return _processDirections(response.routes[0]);
+ return _processDirections(response.routes[0].legs[0]);
});
}
};