Skip to content

Instantly share code, notes, and snippets.

@n-bar
Last active June 22, 2017 09:19
Show Gist options
  • Save n-bar/16d41104c32653037bfe47b598eac886 to your computer and use it in GitHub Desktop.
Save n-bar/16d41104c32653037bfe47b598eac886 to your computer and use it in GitHub Desktop.
geohash
# https://en.wikipedia.org/wiki/Geohash
__base32 = '0123456789bcdefghjkmnpqrstuvwxyz'
def encode(lat, lon, precision):
"""(Double?, Double? Uint32) -> String?
precision(km):
1 ±2500
2 ±630
3 ±78
4 ±20
5 ±2.4
6 ±0.61
7 ±0.076
8 ±0.019
9 ±0.0024
10 ±0.00060
11 ±0.000074
"""
if lat is None or lon is None:
return None
lat_interval, lon_interval = (-90.0, 90.0), (-180.0, 180.0)
geohash = []
bits = 16, 8, 4, 2, 1
bit = 0
ch = 0
even = True
while len(geohash) < precision:
if even:
mid = (lon_interval[0] + lon_interval[1]) / 2.0
if lon > mid:
ch |= bits[bit]
lon_interval = (mid, lon_interval[1])
else:
lon_interval = (lon_interval[0], mid)
else:
mid = (lat_interval[0] + lat_interval[1]) / 2.0
if lat > mid:
ch |= bits[bit]
lat_interval = (mid, lat_interval[1])
else:
lat_interval = (lat_interval[0], mid)
even = not even
if bit < 4:
bit += 1
else:
geohash += __base32[ch]
bit = 0
ch = 0
return ''.join(geohash)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment