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