vgridjs
Version:
Vgrid DGGS JS
1 lines • 15.5 kB
Source Map (JSON)
{"version":3,"sources":["../dggs/geohash.ts"],"names":[],"mappings":"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","file":"geohash.cjs","sourcesContent":["/**\r\n * Geohash implementation in TypeScript\r\n * Original Python implementation by Hiroaki Kawai <kawai@iij.ad.jp>\r\n */\r\n\r\nconst _base32 = '0123456789bcdefghjkmnpqrstuvwxyz';\r\nconst _base32Map: { [key: string]: number } = {};\r\nfor (let i = 0; i < _base32.length; i++) {\r\n _base32Map[_base32[i]] = i;\r\n}\r\n\r\ninterface BBox {\r\n s: number;\r\n w: number;\r\n n: number;\r\n e: number;\r\n}\r\n\r\ninterface DecodeResult {\r\n latitude: number;\r\n longitude: number;\r\n latitudeDelta?: number;\r\n longitudeDelta?: number;\r\n}\r\n\r\nfunction _floatHexToInt(f: number): [number, number] | null {\r\n if (f < -1.0 || f >= 1.0) {\r\n return null;\r\n }\r\n\r\n if (f === 0.0) {\r\n return [1, 1];\r\n }\r\n\r\n const h = f.toString(16);\r\n const x = h.indexOf(\"0x1.\");\r\n if (x < 0) return null;\r\n const p = h.indexOf(\"p\");\r\n if (p <= 0) return null;\r\n\r\n const halfLen = h.slice(x + 4, p).length * 4 - parseInt(h.slice(p + 1));\r\n let r: number;\r\n if (x === 0) {\r\n r = (1 << halfLen) + ((1 << (h.slice(x + 4, p).length * 4)) + parseInt(h.slice(x + 4, p), 16));\r\n } else {\r\n r = (1 << halfLen) - ((1 << (h.slice(x + 4, p).length * 4)) + parseInt(h.slice(x + 4, p), 16));\r\n }\r\n\r\n return [r, halfLen + 1];\r\n}\r\n\r\nfunction _intToFloatHex(i: number, l: number): number {\r\n if (l === 0) {\r\n return -1.0;\r\n }\r\n\r\n const half = 1 << (l - 1);\r\n const s = Math.floor((l + 3) / 4);\r\n if (i >= half) {\r\n i = i - half;\r\n return parseFloat(`0x0.${(i << (s * 4 - l)).toString(16).padStart(s, '0')}p1`);\r\n } else {\r\n i = half - i;\r\n return parseFloat(`-0x0.${(i << (s * 4 - l)).toString(16).padStart(s, '0')}p1`);\r\n }\r\n}\r\n\r\nfunction _encodeI2c(lat: number, lon: number, latLength: number, lonLength: number): string {\r\n const precision = Math.floor((latLength + lonLength) / 5);\r\n let a: number, b: number;\r\n if (latLength < lonLength) {\r\n a = lon;\r\n b = lat;\r\n } else {\r\n a = lat;\r\n b = lon;\r\n }\r\n\r\n const boost = [0, 1, 4, 5, 16, 17, 20, 21];\r\n let ret = '';\r\n for (let i = 0; i < precision; i++) {\r\n ret += _base32[(boost[a & 7] + (boost[b & 3] << 1)) & 0x1F];\r\n const t = a >> 3;\r\n a = b >> 2;\r\n b = t;\r\n }\r\n\r\n return ret.split('').reverse().join('');\r\n}\r\n\r\nexport function encode(latitude: number, longitude: number, precision: number = 12): string {\r\n if (latitude >= 90.0 || latitude < -90.0) {\r\n throw new Error(\"Invalid latitude.\");\r\n }\r\n while (longitude < -180.0) {\r\n longitude += 360.0;\r\n }\r\n while (longitude >= 180.0) {\r\n longitude -= 360.0;\r\n }\r\n\r\n const xprecision = precision + 1;\r\n let latLength = Math.floor(xprecision * 5 / 2);\r\n let lonLength = latLength;\r\n if (xprecision % 2 === 1) {\r\n lonLength += 1;\r\n }\r\n\r\n const a = _floatHexToInt(latitude / 90.0);\r\n const o = _floatHexToInt(longitude / 180.0);\r\n if (!a || !o) {\r\n throw new Error(\"Invalid coordinates\");\r\n }\r\n\r\n let ai: number, oi: number;\r\n if (a[1] > latLength) {\r\n ai = a[0] >> (a[1] - latLength);\r\n } else {\r\n ai = a[0] << (latLength - a[1]);\r\n }\r\n\r\n if (o[1] > lonLength) {\r\n oi = o[0] >> (o[1] - lonLength);\r\n } else {\r\n oi = o[0] << (lonLength - o[1]);\r\n }\r\n\r\n return _encodeI2c(ai, oi, latLength, lonLength).slice(0, precision);\r\n}\r\n\r\nfunction _decodeC2i(hashcode: string): [number, number, number, number] {\r\n let lon = 0;\r\n let lat = 0;\r\n let bitLength = 0;\r\n let latLength = 0;\r\n let lonLength = 0;\r\n\r\n for (const i of hashcode) {\r\n const t = _base32Map[i];\r\n if (bitLength % 2 === 0) {\r\n lon = lon << 3;\r\n lat = lat << 2;\r\n lon += (t >> 2) & 4;\r\n lat += (t >> 2) & 2;\r\n lon += (t >> 1) & 2;\r\n lat += (t >> 1) & 1;\r\n lon += t & 1;\r\n lonLength += 3;\r\n latLength += 2;\r\n } else {\r\n lon = lon << 2;\r\n lat = lat << 3;\r\n lat += (t >> 2) & 4;\r\n lon += (t >> 2) & 2;\r\n lat += (t >> 1) & 2;\r\n lon += (t >> 1) & 1;\r\n lat += t & 1;\r\n lonLength += 2;\r\n latLength += 3;\r\n }\r\n bitLength += 5;\r\n }\r\n\r\n return [lat, lon, latLength, lonLength];\r\n}\r\n\r\nexport function decode(hashcode: string, delta: boolean = false): DecodeResult {\r\n const [lat, lon, latLength, lonLength] = _decodeC2i(hashcode);\r\n\r\n const latitudeDelta = 90.0 / (1 << latLength);\r\n const longitudeDelta = 180.0 / (1 << lonLength);\r\n const latitude = _intToFloatHex(lat, latLength) * 90.0 + latitudeDelta;\r\n const longitude = _intToFloatHex(lon, lonLength) * 180.0 + longitudeDelta;\r\n\r\n if (delta) {\r\n return { latitude, longitude, latitudeDelta, longitudeDelta };\r\n }\r\n return { latitude, longitude };\r\n}\r\n\r\nexport function decodeExactly(hashcode: string): DecodeResult {\r\n return decode(hashcode, true);\r\n}\r\n\r\nexport function bbox(hashcode: string): BBox {\r\n const [lat, lon, latLength, lonLength] = _decodeC2i(hashcode);\r\n const latitudeDelta = 180.0 / (1 << latLength);\r\n const longitudeDelta = 360.0 / (1 << lonLength);\r\n const latitude = _intToFloatHex(lat, latLength) * 90.0;\r\n const longitude = _intToFloatHex(lon, lonLength) * 180.0;\r\n\r\n return {\r\n s: latitude,\r\n w: longitude,\r\n n: latitude + latitudeDelta,\r\n e: longitude + longitudeDelta\r\n };\r\n}\r\n\r\nexport function neighbors(hashcode: string): string[] {\r\n const [lat, lon, latLength, lonLength] = _decodeC2i(hashcode);\r\n const ret: string[] = [];\r\n let tlat = lat;\r\n\r\n for (const tlon of [lon - 1, lon + 1]) {\r\n const code = _encodeI2c(tlat, tlon, latLength, lonLength);\r\n if (code) {\r\n ret.push(code);\r\n }\r\n }\r\n\r\n tlat = lat + 1;\r\n if (!(tlat >> latLength)) {\r\n for (const tlon of [lon - 1, lon, lon + 1]) {\r\n ret.push(_encodeI2c(tlat, tlon, latLength, lonLength));\r\n }\r\n }\r\n\r\n tlat = lat - 1;\r\n if (tlat >= 0) {\r\n for (const tlon of [lon - 1, lon, lon + 1]) {\r\n ret.push(_encodeI2c(tlat, tlon, latLength, lonLength));\r\n }\r\n }\r\n\r\n return ret;\r\n}\r\n\r\nexport function expand(hashcode: string): string[] {\r\n const ret = neighbors(hashcode);\r\n ret.push(hashcode);\r\n return ret;\r\n}\r\n\r\n// Vgrid specific functions\r\nexport function geohashParent(geohashId: string): string {\r\n if (!geohashId || geohashId.length <= 1) {\r\n throw new Error(\"Cannot get parent of an empty or single-character geohash.\");\r\n }\r\n return geohashId.slice(0, -1);\r\n}\r\n\r\nexport function geohashChildren(geohashId: string, resolution: number): string[] {\r\n if (geohashId.length >= resolution) {\r\n return geohashId.length === resolution ? [geohashId] : [];\r\n }\r\n\r\n let children = [geohashId];\r\n while (children[0].length < resolution) {\r\n children = children.flatMap(c => _base32.split('').map(ch => c + ch));\r\n }\r\n return children;\r\n}\r\n"]}