_BASE32 = "0123456789bcdefghjkmnpqrstuvwxyz" _BITS = [16, 8, 4, 2, 1] def encode_geohash(lat: float, lon: float, precision: int = 7) -> str: lat_interval = [-90.0, 90.0] lon_interval = [-180.0, 180.0] geohash = [] bit = 0 ch = 0 even = True while len(geohash) < precision: if even: mid = (lon_interval[0] + lon_interval[1]) / 2 if lon >= mid: ch |= _BITS[bit] lon_interval[0] = mid else: lon_interval[1] = mid else: mid = (lat_interval[0] + lat_interval[1]) / 2 if lat >= mid: ch |= _BITS[bit] lat_interval[0] = mid else: lat_interval[1] = mid even = not even if bit < 4: bit += 1 else: geohash.append(_BASE32[ch]) bit = 0 ch = 0 return "".join(geohash)