36 lines
945 B
Python
36 lines
945 B
Python
_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)
|