From 3eeedade52739afe5c6ca5ab25d0585ac869d499 Mon Sep 17 00:00:00 2001 From: cquest Date: Thu, 28 Jul 2016 14:59:52 +0200 Subject: [PATCH] Create polyline.py polyline decoder --- polyline.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 polyline.py diff --git a/polyline.py b/polyline.py new file mode 100644 index 0000000..74b19f1 --- /dev/null +++ b/polyline.py @@ -0,0 +1,35 @@ +# This function is free of any dependencies. +# source: https://github.com/mgd722/decode-google-maps-polyline +def decode_polyline(polyline_str): + '''Pass a Google Maps encoded polyline string; returns list of lat/lon pairs''' + index, lat, lng = 0, 0, 0 + coordinates = [] + changes = {'latitude': 0, 'longitude': 0} + + # Coordinates have variable length when encoded, so just keep + # track of whether we've hit the end of the string. In each + # while loop iteration, a single coordinate is decoded. + while index < len(polyline_str): + # Gather lat/lon changes, store them in a dictionary to apply them later + for unit in ['latitude', 'longitude']: + shift, result = 0, 0 + + while True: + byte = ord(polyline_str[index]) - 63 + index+=1 + result |= (byte & 0x1f) << shift + shift += 5 + if not byte >= 0x20: + break + + if (result & 1): + changes[unit] = ~(result >> 1) + else: + changes[unit] = (result >> 1) + + lat += changes['latitude'] + lng += changes['longitude'] + + coordinates.append((lat / 100000.0, lng / 100000.0)) + + return coordinates