in packages/geofire-common/src/index.ts [316:335]
export function geohashQuery(geohash: Geohash, bits: number): GeohashRange {
validateGeohash(geohash);
const precision = Math.ceil(bits / BITS_PER_CHAR);
if (geohash.length < precision) {
return [geohash, geohash + '~'];
}
geohash = geohash.substring(0, precision);
const base = geohash.substring(0, geohash.length - 1);
const lastValue = BASE32.indexOf(geohash.charAt(geohash.length - 1));
const significantBits = bits - (base.length * BITS_PER_CHAR);
const unusedBits = (BITS_PER_CHAR - significantBits);
// delete unused bits
const startValue = (lastValue >> unusedBits) << unusedBits;
const endValue = startValue + (1 << unusedBits);
if (endValue > 31) {
return [base + BASE32[startValue], base + '~'];
} else {
return [base + BASE32[startValue], base + BASE32[endValue]];
}
}