redis中使用GeoHash
1.GeoHash底层原理
1.Redis3.2开始提供GEO模块,该模块使用了GeoHash算法
2.核心思想:GeoHash是一种地址编码方式,其将二维的空间经纬度数据编码成一个一维字符串。我们大致可以将大致划分如下图这个范围。GeoHash算法就是基于这种思想,不断地去划分区域,划分次数越多,精度越高。
3.具体算法:
这里以广州的经纬度为例子,113.229259,23.17652
这里就拿纬度23.17652来说,纬度的范围为【-90,90】,23.17652在【0,90】之间,故可以得到一个值1,再次划分,【0,90】的中间值为45,23.17652落在【0,45】之间,故得到一个0,【0,45】的中间值为22.5,23.17652落在【22.5,45】之间,故可以得到一个1…假设最后得到的结果为101,经度算出的结果为110,合并这两个值,规律为经度占偶数位,纬度占奇数位,这样可以得到一个结果111001,按照Base32对合并后的结果集进行编码,得到一个字符串,这个字符串可以到可以拿去 geohash.org 网站上解析,就可以看到地址是在哪了。
2. 基本使用
1.添加地址
geoadd city 116.332906 39.892695 beijing
geoadd city 114.064552 22.548457 shenzhen
- 算出两个地址的距离
geodist city beijing shenzhen km
- 获取元素的位置,有可能会有误差
geopos city beijing
- 获取元素的hash值
geohash city beijing
- 以北京为中心,方圆2000km的城市由近到远列出4个,不排除北京本身
georadiusbymember city beijing 2000 km withdist withhash withcoord count 4 asc
6.也可以根据经纬度来查询附近城市
georadius city 116.332906 39.892695 2000 km withdist withhash withcoord count 4 asc