(1)GeoHash算法学习讲解、解析及原理分析

一、认识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个字符编码形式。如代码:

Base32对应编码参考图:(上面二进制转换对应的十进制数值)

在线解析的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,也就是说wx4e0ewx4e范围内。

弊端如图:不仅获取当前所在矩形区域,还获取周围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

链接:https://www.cnblogs.com/tgzhu/p/6204173.html

链接:https://www.cnblogs.com/zhenbianshu/p/6863405.html

你可能感兴趣的:((1)GeoHash算法学习讲解、解析及原理分析)