12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- /**
- * Function that decodes input geohash into latitude and longitude
- */
- export function decodeGeohash(geohash: string): [number, number] | undefined {
- if (!geohash?.length) {
- return undefined;
- }
- const BITS = [16, 8, 4, 2, 1];
- const BASE32 = '0123456789bcdefghjkmnpqrstuvwxyz';
- let isEven = true;
- const lat: number[] = [];
- const lon: number[] = [];
- lat[0] = -90.0;
- lat[1] = 90.0;
- lon[0] = -180.0;
- lon[1] = 180.0;
- let base32Decoded: number;
- geohash.split('').forEach((item: string) => {
- base32Decoded = BASE32.indexOf(item);
- BITS.forEach((mask) => {
- if (isEven) {
- refineInterval(lon, base32Decoded, mask);
- } else {
- refineInterval(lat, base32Decoded, mask);
- }
- isEven = !isEven;
- });
- });
- const latCenter = (lat[0] + lat[1]) / 2;
- const lonCenter = (lon[0] + lon[1]) / 2;
- return [lonCenter, latCenter];
- }
- function refineInterval(interval: any[], base32Decoded: number, mask: number) {
- /* tslint:disable no-bitwise*/
- if (base32Decoded & mask) {
- interval[0] = (interval[0] + interval[1]) / 2;
- } else {
- interval[1] = (interval[0] + interval[1]) / 2;
- }
- }
|