@iwpnd/valhalla-ts
Version:
A nodejs client and helper utilities for valhalla routing engine
66 lines • 1.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.polylineToLineString = exports.decodePolyline = void 0;
/**
* Decode a valhalla polyline to an array of {@link GeoJSON.Position}
*
* @param {String} polyline
* @param {Number} precision = 6
* @returns {@link GeoJSON.Position[]}
*
* @see https://github.com/DennisOSRM/Project-OSRM-Web/blob/master/WebContent/routing/OSRM.RoutingGeometry.js
*/
const decodePolyline = (polyline, precision = 6) => {
let index = 0;
let lat = 0;
let lon = 0;
let result = 0;
let shift = 0;
let byte = null;
let dLatitude;
let dLongitude;
const factor = 10 ** precision;
const coordinates = [];
while (index < polyline.length) {
byte = 0x20;
shift = 0;
result = 0;
while (byte >= 0x20) {
byte = polyline.charCodeAt(index) - 63;
result |= (byte & 0x1f) << shift;
shift += 5;
index++;
}
dLatitude = result & 1 ? ~(result >> 1) : result >> 1;
byte = 0x20;
shift = 0;
result = 0;
while (byte >= 0x20) {
byte = polyline.charCodeAt(index) - 63;
result |= (byte & 0x1f) << shift;
shift += 5;
index++;
}
dLongitude = result & 1 ? ~(result >> 1) : result >> 1;
lat += dLatitude;
lon += dLongitude;
coordinates.push([lon / factor, lat / factor]);
}
return coordinates;
};
exports.decodePolyline = decodePolyline;
/**
* Decode valhalla polyline shape to {@link GeoJSON.LineString}
*
* @param {String} polyline
* @param {Number} precision
*
* @returns {GeoJSON.LineString}
*
*/
const polylineToLineString = (polyline, precision = 6) => ({
type: 'LineString',
coordinates: (0, exports.decodePolyline)(polyline, precision),
});
exports.polylineToLineString = polylineToLineString;
//# sourceMappingURL=decode-polyline.js.map