一、认识geohash
算法计算后,获取到可比较字符串
纬度:1 1 0 1 0 0 1 0 1 1 0 0 0 1 0,经度:1 0 1 1 1 0 0 0 1 1 0 0 0 1 1,合并:偶数位放经度,奇数位放纬度:
首先将11100 11101 00100 01111 0000 01101转成十进制,对应着28、29、4、15,0,13 十进制对应的base32编码就是wx4g0e
然户将获取到的经纬度二进制数以每5个数为一组,将每一组都进行转换成十进制数字。
然后采用Base32对应编码进行转换可得到编码 wx4g0e这样的可比较的字符串,比如我们的经纬度都分了10次,那么最后生成的字符串的长度就是4,范围是20km,如果我们经纬度都分20次,那么最后生成的字符串的长度就是8,范围可以精确到19m。为什么是可比较字符串,后面会详细讲解到。
在此对Base32编码进行一番简单介绍: Base32,是将数字 0~9 ,加上26个字母(去除a,i,l,o 四个)进行组合而成的32个字符编码形式。如代码:
在线解析的GeoHash值(wx4gjk32kfrx)
二、geohash算法
Geohash中的每一个字母或者数字(如wx4g0e中的w)都是由5bits组成(2^5 = 32,base32),这5bits可以有32中不同的组合(0~31),这样我将整个地图区域分为32个区域,00000 ~ 11111标识这32个区域。第一次划分后:
第一次划分(11100)5bits中有3bits是经度(2^3 = 8), 2bits纬度4个区段(2^2 = 4),32个区域(对应Base32)
GeoHash将每一个区域画成一块块矩形块,用字符串表示,查询附近点,坐标计算出字符串,定位到所在矩形块, wx4e就包含wx4e0e,也就是说wx4e0e在wx4e范围内。
弊端如图:不仅获取当前所在矩形区域,还获取周围8个矩形块中的点:
三、GeoHash对应地图精度参考图
Redis3.2之后支持Geo
(lat:39.9257460000,lng:116.5998310000)
geohash拆分规律拆分后:11100 11101 00100 01111 10001 10010 00011 00010 01110 10111 11101
转成10进制得到28 29 4 15 17 18 3 2 18 14 23 29
链接:https://www.cnblogs.com/LBSer/p/3310455.html
链接:https://zhuanlan.zhihu.com/p/27771446