Skip to content

Instantly share code, notes, and snippets.

@ericjames
Last active April 11, 2018 17:38
Show Gist options
  • Save ericjames/f9db0dd0de8b10ef25e56e5efe9d037e to your computer and use it in GitHub Desktop.
Save ericjames/f9db0dd0de8b10ef25e56e5efe9d037e to your computer and use it in GitHub Desktop.
Google Maps Polyline Encoding to GeoJSON coordinates for Mapbox integration (Credit to @ivansams)
// Obtained from https://github.com/ivansams at https://jsfiddle.net/ivansams/tw7qLvh4/2/
// Only the function that converts polyline to geojson coordinates for Mapbox integration
// Was previously called GetGeoJSON, but this function simply returns a flat array of polylines in [lng, lat] format
function getCoordsFromPolyline(str, precision) {
var precision = precision || 5; // Precision as 5 yields 00.000
var index = 0,
lat = 0,
lng = 0,
coordinates = [],
shift = 0,
result = 0,
byte = null,
latitude_change,
longitude_change,
factor = Math.pow(10, precision || 5);
// Coordinates have variable length when encoded, so just keep
// track of whether we've hit the end of the string. In each
// loop iteration, a single coordinate is decoded.
while (index < str.length) {
// Reset shift, result, and byte
byte = null;
shift = 0;
result = 0;
do {
byte = str.charCodeAt(index++) - 63;
result |= (byte & 0x1f) << shift;
shift += 5;
} while (byte >= 0x20);
latitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));
shift = result = 0;
do {
byte = str.charCodeAt(index++) - 63;
result |= (byte & 0x1f) << shift;
shift += 5;
} while (byte >= 0x20);
longitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));
lat += latitude_change;
lng += longitude_change;
coordinates.push([lng / factor, lat / factor]);
}
return coordinates;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment