3c2aaff8ce18f14fec04e5a0b94cdd101e4b46c4
[rails.git] / app / assets / javascripts / index / directions / mapzen.js
1 function MapzenEngine(id, costing) {
2   var MZ_INSTR_MAP = [
3     1,  // kNone = 0;
4     14, // kStart = 1;
5     14, // kStartRight = 2;
6     14, // kStartLeft = 3;
7     15, // kDestination = 4;
8     15, // kDestinationRight = 5;
9     15, // kDestinationLeft = 6;
10     1,  // kBecomes = 7;
11     1,  // kContinue = 8;
12     2,  // kSlightRight = 9;
13     3,  // kRight = 10;
14     4,  // kSharpRight = 11;
15     5,  // kUturnRight = 12;
16     5,  // kUturnLeft = 13;
17     6,  // kSharpLeft = 14;
18     7,  // kLeft = 15;
19     8,  // kSlightLeft = 16;
20     1,  // kRampStraight = 17;
21     2,  // kRampRight = 18;
22     8,  // kRampLeft = 19;
23     2,  // kExitRight = 20;
24     8,  // kExitLeft = 21;
25     1,  // kStayStraight = 22;
26     2,  // kStayRight = 23;
27     8,  // kStayLeft = 24;
28     1,  // kMerge = 25;
29     11, // kRoundaboutEnter = 26;
30     12, // kRoundaboutExit = 27;
31     1,  // kFerryEnter = 28;
32     1   // kFerryExit = 29;
33   ];
34
35   return {
36     id: id,
37     creditline: "<a href='https://mapzen.com/projects/valhalla' target='_blank'>Mapzen</a>",
38     draggable: false,
39
40     getRoute: function (points, callback) {
41       return $.ajax({
42         url: document.location.protocol + "//valhalla.mapzen.com/route",
43         data: {
44           api_key: OSM.MAPZEN_VALHALLA_KEY,
45           json: JSON.stringify({
46             locations: points.map(function (p) { return { lat: p.lat, lon: p.lng }; }),
47             costing: costing,
48             directions_options: {
49               units: "km",
50               language: I18n.currentLocale()
51             }
52           })
53         },
54         dataType: "json",
55         success: function (data) {
56           var trip = data.trip;
57
58           if (trip.status === 0) {
59             var line = [];
60             var steps = [];
61             var distance = 0;
62             var time = 0;
63
64             trip.legs.forEach(function (leg) {
65               var legLine = L.PolylineUtil.decode(leg.shape, {
66                 precision: 6
67               });
68
69               line = line.concat(legLine);
70
71               leg.maneuvers.forEach(function (manoeuvre) {
72                 var point = legLine[manoeuvre.begin_shape_index];
73
74                 steps.push([
75                   { lat: point[0], lng: point[1] },
76                   MZ_INSTR_MAP[manoeuvre.type],
77                   manoeuvre.instruction,
78                   manoeuvre.length * 1000,
79                   []
80                 ]);
81               });
82
83               distance = distance + leg.summary.length;
84               time = time + leg.summary.time;
85             });
86
87             callback(false, {
88               line: line,
89               steps: steps,
90               distance: distance,
91               time: time
92             });
93           } else {
94             callback(true);
95           }
96         }
97       });
98     }
99   };
100 }
101
102 if (OSM.MAPZEN_VALHALLA_KEY) {
103   OSM.Directions.addEngine(new MapzenEngine("mapzen_car", "auto"), true);
104   OSM.Directions.addEngine(new MapzenEngine("mapzen_bicycle", "bicycle"), true);
105   OSM.Directions.addEngine(new MapzenEngine("mapzen_foot", "pedestrian"), true);
106 }