[gnome-maps/wip/routing2: 9/23] Add EPAF decoder



commit c591546cc6c072e33097f8d383f8de36e2edd18b
Author: Mattias Bengtsson <mattias jc bengtsson gmail com>
Date:   Sat Aug 24 02:22:35 2013 +0200

    Add EPAF decoder
    
    Add a decoder for Encoded Polyline Algorithm Format (EPAF).
    
    EPAF is a Google format for space efficient serialization of
    coordinate series. Both OSRM and GraphHopper uses it for encoding
    their routes.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=728695

 src/epaf.js                     |   71 +++++++++++++++++++++++++++++++++++++++
 src/gnome-maps.js.gresource.xml |    1 +
 2 files changed, 72 insertions(+), 0 deletions(-)
---
diff --git a/src/epaf.js b/src/epaf.js
new file mode 100644
index 0000000..f96866d
--- /dev/null
+++ b/src/epaf.js
@@ -0,0 +1,71 @@
+/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */
+/* vim: set et ts=4 sw=4: */
+/*
+ * Copyright (c) 2013 Mattias Bengtsson.
+ *
+ * GNOME Maps is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * GNOME Maps is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with GNOME Maps; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Author: Jussi Kukkonen <jku goto fi>
+ *         Mattias Bengtsson <mattias jc bengtsson gmail com>
+ */
+
+// Google encoded polyline decoder
+// https://developers.google.com/maps/documentation/utilities/polylinealgorithm
+
+const Champlain = imports.gi.Champlain;
+
+function _decodeValue(data, index) {
+    let b;
+    let shift = 0;
+    let value = 0;
+
+    do {
+        // 63 added to keep string printable
+        b = data.charCodeAt(index++) - 63;
+
+        // Get 5 bits at a time until hit the end of value
+        // (which is not OR'd with 0x20)
+        value |= (b & 0x1f) << shift;
+        shift += 5;
+    } while (b >= 0x20);
+
+    // negative values are encoded as two's complement
+    let ret_val = ((value & 1) ? ~(value >> 1) : (value >> 1));
+    return [ret_val, index];
+}
+
+function decode(data) {
+    let length = data.length;
+    let polyline = [];
+    let index = 0;
+    let lat = 0;
+    let lon = 0;
+
+    while (index < length) {
+        let latdelta, londelta;
+
+        [latdelta, index] = _decodeValue(data, index);
+        [londelta, index] = _decodeValue(data, index);
+
+        // first value is absolute, rest are relative to previous value
+        lat += latdelta;
+        lon += londelta;
+        polyline.push(new Champlain.Coordinate({
+            latitude:  lat * 1e-5,
+            longitude: lon * 1e-5
+        }));
+    }
+    return polyline;
+}
diff --git a/src/gnome-maps.js.gresource.xml b/src/gnome-maps.js.gresource.xml
index 37366f2..804d0fd 100644
--- a/src/gnome-maps.js.gresource.xml
+++ b/src/gnome-maps.js.gresource.xml
@@ -4,6 +4,7 @@
     <file>application.js</file>
     <file>config.js</file>
     <file>contextMenu.js</file>
+    <file>epaf.js</file>
     <file>geoclue.js</file>
     <file>layersPopover.js</file>
     <file>main.js</file>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]