]> git.openstreetmap.org Git - rails.git/blob - app/assets/javascripts/index/directions_engines/osrm.js
ebcbf1fb13eeb88697ae9ace538b4d54314ff032
[rails.git] / app / assets / javascripts / index / directions_engines / osrm.js
1 // OSRM car engine
2 // Doesn't yet support hints
3
4 function OSRMEngine() {
5   return {
6     name: "javascripts.directions.engines.osrm_car",
7     creditline: '<a href="http://project-osrm.org/" target="_blank">OSRM</a>',
8     draggable: true,
9
10     getRoute: function (isFinal, points, callback) {
11       var TURN_INSTRUCTIONS = [
12         "",
13         I18n.t('javascripts.directions.instructions.continue_on'),      // 1
14         I18n.t('javascripts.directions.instructions.slight_right'),     // 2
15         I18n.t('javascripts.directions.instructions.turn_right'),       // 3
16         I18n.t('javascripts.directions.instructions.sharp_right'),      // 4
17         I18n.t('javascripts.directions.instructions.uturn'),            // 5
18         I18n.t('javascripts.directions.instructions.sharp_left'),       // 6
19         I18n.t('javascripts.directions.instructions.turn_left'),        // 7
20         I18n.t('javascripts.directions.instructions.slight_left'),      // 8
21         I18n.t('javascripts.directions.instructions.via_point'),        // 9
22         I18n.t('javascripts.directions.instructions.follow'),           // 10
23         I18n.t('javascripts.directions.instructions.roundabout'),       // 11
24         I18n.t('javascripts.directions.instructions.leave_roundabout'), // 12
25         I18n.t('javascripts.directions.instructions.stay_roundabout'),  // 13
26         I18n.t('javascripts.directions.instructions.start'),            // 14
27         I18n.t('javascripts.directions.instructions.destination'),      // 15
28         I18n.t('javascripts.directions.instructions.against_oneway'),   // 16
29         I18n.t('javascripts.directions.instructions.end_oneway')        // 17
30       ];
31
32       var url = "http://router.project-osrm.org/viaroute?z=14&output=json";
33
34       for (var i = 0; i < points.length; i++) {
35         url += "&loc=" + points[i].lat + ',' + points[i].lng;
36       }
37
38       if (isFinal)
39         url += "&instructions=true";
40
41       $.ajax({
42         url: url,
43         dataType: 'json',
44         success: function (data) {
45           if (data.status == 207)
46             return callback(true);
47
48           var line = L.PolylineUtil.decode(data.route_geometry);
49           for (var i = 0; i < line.length; i++) {
50             line[i].lat /= 10;
51             line[i].lng /= 10;
52           }
53
54           var steps = [];
55           for (i = 0; i < data.route_instructions.length; i++) {
56             var s = data.route_instructions[i];
57             var linesegend;
58             var instCodes = s[0].split('-');
59             var instText = "<b>" + (i + 1) + ".</b> ";
60             instText += TURN_INSTRUCTIONS[instCodes[0]];
61             if (instCodes[1]) {
62               instText += "exit " + instCodes[1] + " ";
63             }
64             if (instCodes[0] != 15) {
65               instText += s[1] ? "<b>" + s[1] + "</b>" : I18n.t('javascripts.directions.instructions.unnamed');
66             }
67             if ((i + 1) < data.route_instructions.length) {
68               linesegend = data.route_instructions[i + 1][3] + 1;
69             } else {
70               linesegend = s[3] + 1;
71             }
72             steps.push([line[s[3]], s[0].split('-')[0], instText, s[2], line.slice(s[3], linesegend)]);
73           }
74
75           callback(null, {
76             line: line,
77             steps: steps,
78             distance: data.route_summary.total_distance,
79             time: data.route_summary.total_time
80           });
81         }
82       });
83     }
84   };
85 }
86
87 OSM.Directions.addEngine(OSRMEngine(), false);