Add support for Mapzen's Valhalla routing engine
authorTom Hughes <tom@compton.nu>
Tue, 29 Sep 2015 14:37:04 +0000 (15:37 +0100)
committerTom Hughes <tom@compton.nu>
Tue, 29 Sep 2015 14:37:04 +0000 (15:37 +0100)
app/assets/javascripts/index/directions/mapzen.js [new file with mode: 0644]
app/assets/javascripts/osm.js.erb
config/example.application.yml
config/locales/en.yml

diff --git a/app/assets/javascripts/index/directions/mapzen.js b/app/assets/javascripts/index/directions/mapzen.js
new file mode 100644 (file)
index 0000000..3c2aaff
--- /dev/null
@@ -0,0 +1,106 @@
+function MapzenEngine(id, costing) {
+  var MZ_INSTR_MAP = [
+    1,  // kNone = 0;
+    14, // kStart = 1;
+    14, // kStartRight = 2;
+    14, // kStartLeft = 3;
+    15, // kDestination = 4;
+    15, // kDestinationRight = 5;
+    15, // kDestinationLeft = 6;
+    1,  // kBecomes = 7;
+    1,  // kContinue = 8;
+    2,  // kSlightRight = 9;
+    3,  // kRight = 10;
+    4,  // kSharpRight = 11;
+    5,  // kUturnRight = 12;
+    5,  // kUturnLeft = 13;
+    6,  // kSharpLeft = 14;
+    7,  // kLeft = 15;
+    8,  // kSlightLeft = 16;
+    1,  // kRampStraight = 17;
+    2,  // kRampRight = 18;
+    8,  // kRampLeft = 19;
+    2,  // kExitRight = 20;
+    8,  // kExitLeft = 21;
+    1,  // kStayStraight = 22;
+    2,  // kStayRight = 23;
+    8,  // kStayLeft = 24;
+    1,  // kMerge = 25;
+    11, // kRoundaboutEnter = 26;
+    12, // kRoundaboutExit = 27;
+    1,  // kFerryEnter = 28;
+    1   // kFerryExit = 29;
+  ];
+
+  return {
+    id: id,
+    creditline: "<a href='https://mapzen.com/projects/valhalla' target='_blank'>Mapzen</a>",
+    draggable: false,
+
+    getRoute: function (points, callback) {
+      return $.ajax({
+        url: document.location.protocol + "//valhalla.mapzen.com/route",
+        data: {
+          api_key: OSM.MAPZEN_VALHALLA_KEY,
+          json: JSON.stringify({
+            locations: points.map(function (p) { return { lat: p.lat, lon: p.lng }; }),
+            costing: costing,
+            directions_options: {
+              units: "km",
+              language: I18n.currentLocale()
+            }
+          })
+        },
+        dataType: "json",
+        success: function (data) {
+          var trip = data.trip;
+
+          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
+              });
+
+              line = line.concat(legLine);
+
+              leg.maneuvers.forEach(function (manoeuvre) {
+                var point = legLine[manoeuvre.begin_shape_index];
+
+                steps.push([
+                  { lat: point[0], lng: point[1] },
+                  MZ_INSTR_MAP[manoeuvre.type],
+                  manoeuvre.instruction,
+                  manoeuvre.length * 1000,
+                  []
+                ]);
+              });
+
+              distance = distance + leg.summary.length;
+              time = time + leg.summary.time;
+            });
+
+            callback(false, {
+              line: line,
+              steps: steps,
+              distance: distance,
+              time: time
+            });
+          } else {
+            callback(true);
+          }
+        }
+      });
+    }
+  };
+}
+
+if (OSM.MAPZEN_VALHALLA_KEY) {
+  OSM.Directions.addEngine(new MapzenEngine("mapzen_car", "auto"), true);
+  OSM.Directions.addEngine(new MapzenEngine("mapzen_bicycle", "bicycle"), true);
+  OSM.Directions.addEngine(new MapzenEngine("mapzen_foot", "pedestrian"), true);
+}
index 58a44d630f3ea578d1b6d394190f7949dc74af67..61c2d1e6b9faebe220fd4b26bf9b8d18b8e5689f 100644 (file)
@@ -14,6 +14,9 @@ OSM = {
 <% if defined?(MAPQUEST_KEY) %>
   MAPQUEST_KEY:          <%= MAPQUEST_KEY.to_json %>,
 <% end %>
+<% if defined?(MAPZEN_VALHALLA_KEY) %>
+  MAPZEN_VALHALLA_KEY:   <%= MAPZEN_VALHALLA_KEY.to_json %>,
+<% end %>
 
   MARKER_GREEN:          <%= image_path("marker-green.png").to_json %>,
   MARKER_RED:            <%= image_path("marker-red.png").to_json %>,
index 59980cdf385cc474ad25a47c4f5fa8aa72013d06..8b61b50e6cd4ed6bf344197ec36ec896353eddbb 100644 (file)
@@ -100,6 +100,8 @@ defaults: &defaults
   #windowslive_auth_secret: ""
   # MapQuest authentication details
   #mapquest_key: ""
+  # Mapzen authentication details
+  #mapzen_valhalla_key: ""
 
 development:
   <<: *defaults
index c50d63f947539367598d76ac6d01e175a5255722..ad20f490521e43e66f4c81f3459ee85a2f51f848 100644 (file)
@@ -2232,6 +2232,9 @@ en:
         mapquest_car: "Car (MapQuest)"
         mapquest_foot: "Foot (MapQuest)"
         osrm_car: "Car (OSRM)"
+        mapzen_bicycle: "Bicycle (Mapzen)"
+        mapzen_car: "Car (Mapzen)"
+        mapzen_foot: "Foot (Mapzen)"
       directions: "Directions"
       distance: "Distance"
       errors: