Redis GeoHash 测距
GeoHash本质上是空间索引的一种方式,其基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码。以GeoHash方式建立空间索引,可以提高对空间poi数据进行经纬度检索的效率。由于采用的是base32编码方式,即Geohash中的每一个字母或者数字都是由5bits组成(2^5 = 32,base32),这5bits可以有32中不同的组合(0~31),这样我们可以将整个地图区域分为32个区域,通过00000 ~ 11111来标识这32个区域。
Redis 3.2版本之后增加。
使用场景:存储地理位置、附近的人。
代码实现方法
定义实体类
1 | js复制代码/** |
初始化数据
1 | js复制代码 @PostConstruct |
GeoHash实际上是存在zset里,score存geohash算法计算出来的值
计算两个位置的距离
Distance distance(K var1, M var2, M var3, Metric var4);
Diststance有两个属性:double value(距离) Metric metric(单位)
var1 表示redis key值
var2 var3 表示zset两个位置的key值
var4 表示距离单位(可不传,默认单位为米)
1 | js复制代码String geo = "geo"; |
结果
1 | js复制代码{ |
以中心位置为圆心找出指定半径范围内的位置
GeoResults radius(K var1, Circle var2, GeoRadiusCommandArgs var3);
GeoLocation有两个属性 : T name (zset中key值) ,Point point (返回 经纬度 double x,double y);
GeoResults有两个属性 : Distance averageDistance(平均距离) ,List content (返回GeoLocation属性);
var1 表示redis key值
var2 表示圆心坐标位置
var3 表示添加过滤排序条件
includeDistance 包含距离
includeCoordinates 包含经纬度
sortAscending 正序排序
limit 限定返回的记录数
1 | js复制代码String geo = "geo"; |
结果
1 | js复制代码{ |
本文转载自: 掘金