Files
maps-saas/packages/js-sdk/src/utils.ts
T

44 lines
1.3 KiB
TypeScript

/**
* Utilities for Intaleq Map SDK.
*/
export class PolylineUtils {
/**
* Decodes a Google-encoded polyline string into an array of [lng, lat] coordinates.
* Note: MapLibre and GeoJSON use [lng, lat] while Google/Flutter use [lat, lng].
*/
static decode(encoded: string): [number, number][] {
const points: [number, number][] = [];
let index = 0;
const len = encoded.length;
let lat = 0;
let lng = 0;
while (index < len) {
let b: number;
let shift = 0;
let result = 0;
do {
b = encoded.charCodeAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
const dlat = ((result & 1) !== 0 ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = encoded.charCodeAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
const dlng = ((result & 1) !== 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;
// MapLibre uses [lng, lat]
points.push([lng / 1E5, lat / 1E5]);
}
return points;
}
}