编码实现-硬扣代码
_all__ = ['encode', 'decode', 'bbox', 'neighbors']
_base32 = '0123456789bcdefghjkmnpqrstuvwxyz'
# 10进制和32进制转换,32进制去掉了ailo
_decode_map = {}
_encode_map = {}
for i in range(len(_base32)):
_decode_map[_base32[i]] = i
_encode_map[i]=_base32[i]
def bbox(geohash):
lat_range, lon_range = [-90.0, 90.0], [-180.0, 180.0]
is_lon = True
for letter in geohash:
code = str(bin(_decode_map[letter]))[2:].rjust(5, '0')
for bi in code:
if is_lon and bi == '0':
lon_range[1] = sum(lon_range) / 2
elif is_lon and bi == '1':
lon_range[0] = sum(lon_range) / 2
elif (not is_lon) and bi == '0':
lat_range[1] = sum(lat_range) / 2
elif (not is_lon) and bi == '1':
lat_range[0] = sum(lat_range) / 2
is_lon = not is_lon
# 左上、右下;(lat_max,lon_min),(lat_min,lon_max)
return [[lon_range[0], lat_range[1]], [lon_range[1], lat_range[1]], [lon_range[1], lat_range[0]],
[lon_range[0], lat_range[0]]]
m = bbox('wtw3sks')
print(m)
用高德验证:
使用geohash2
效果一样的, 简单方便, 3行代码搞定
from geohash2 import decode_exactly
g = 'wtw3sks'
lat, lon, x, y = decode_exactly(g)
print([[lon-y, lat+x], [lon+y, lat+x], [lon+y, lat-x], [lon-y, lat-x]])