In my panic to move my website off Google Maps, I took some shortcuts. One of those was to continue to use the helper function google.maps.geometry.encoding.decodePath. I primarily use this for decoding the paths of Strava segments, since these are encoded using the same algorithm as Google. But loading up the Google Maps API script for a single function is rather ridiculous, so I’ve converted the path decoder from the rather marvellous (and seemingly abandoned) Strava.NET library.
For your pleasure, here is some TypeScript that will create a here maps LineString from an encoded path. Other map providers are available and adjusting it for them should be fairly straightforward.
function decodePath(polylinechars: string): H.geo.LineString {
var poly = new H.geo.LineString();
if (polylinechars == null || polylinechars === "") {
return poly;
}
var index = 0;
var currentLat = 0;
var currentLng = 0;
while (index < polylinechars.length) {
// calculate next latitude
var sum = 0;
var shifter = 0;
var next5bits;
do {
next5bits = polylinechars.charCodeAt(index++) - 63;
sum |= (next5bits & 31) << shifter;
shifter += 5;
} while (next5bits >= 32 && index < polylinechars.length);
if (index >= polylinechars.length)
break;
currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
// calculate next longitude
sum = 0;
shifter = 0;
do {
next5bits = polylinechars.charCodeAt(index++) - 63;
sum |= (next5bits & 31) << shifter;
shifter += 5;
} while (next5bits >= 32 && index < polylinechars.length);
if (index >= polylinechars.length && next5bits >= 32)
break;
currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
poly.pushPoint(new H.geo.Point(currentLat / 100000.0, currentLng / 100000.0));
}
return poly;
}
No comments:
Post a Comment