- 使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
- 通过georadius就可以完成 附近的人功能
-
- withcoord:带上坐标
-
- withdist:带上距离,单位与半径单位相同
-
- COUNT n : 只显示前n个(按距离递增排序)
- geoadd key longitud(经度) latitude(纬度) member [..] 将具体经纬度的坐标存入一个有序集合
- geopos key member [member..] 获取集合中的一个/多个成员坐标
- geodist key member1 member2 [unit] 返回两个给定位置之间的距离。默认以米作为单位。
- georadius key longitude latitude radius m|km|mi|ft [WITHCOORD][WITHDIST] [WITHHASH] [COUNT count] 以给定的经纬度为中心, 返回集合包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
- GEORADIUSBYMEMBER key member radius... 功能与GEORADIUS相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点。
- geohash key member1 [member2..] 返回一个或多个位置元素的Geohash表示。使用Geohash位置52点整数编码。
- # 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
- # 有效的经度从-180度到180度。
- # 有效的纬度从-85.05112878度到85.05112878度。
- # 当坐标位置超出上述指定范围时,该命令将会返回一个错误,如:
- 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin
- (error) ERR invalid longitude,latitude pair 39.900000,116.400000
-
- # 参数 key 值()
- 127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
- (integer) 1
- 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
- (integer) 1
- 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqi 114.05 22.52 shengzhen
- (integer) 2
- 127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
- (integer) 2
- 127.0.0.1:6379> GEOPOS china:city beijing # 获取指定的城市的经度和纬度!
- 1) 1) "116.39999896287918091"
- 2) "39.90000009167092543"
- 127.0.0.1:6379> GEOPOS china:city beijing chongqi
- 1) 1) "116.39999896287918091"
- 2) "39.90000009167092543"
- 2) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
单位:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
- 127.0.0.1:6379> GEODIST china:city beijing shanghai km # 查看上海到北京的直线距离
- "1067.3788"
- 127.0.0.1:6379> GEODIST china:city beijing chongqi km # 查看重庆到北京的直线距离
- "1464.0708"
- 127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
- 1) "beijing"
- 2) "xian"
- 127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
- 1) "hangzhou"
- 2) "shanghai"
Geohash :将位置信息转化为 11个字符的Geohash字符串!
将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
-
- 127.0.0.1:6379> geohash china:city beijing chongqi
- 1) "wx4fbxxfke0"
- 2) "wm5xzrybty0"
我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询!
获得附近指定数量的人,如:200人
所有数据应该都录入:china:city
- 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km # 以110,30 这个经纬度为中心,寻找方圆1000km内的城市
- 1) "chongqi"
- 2) "xian"
- 3) "shengzhen"
- 4) "hangzhou"
- 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist # 显示到中间距离的位置
- 1) 1) "chongqi"
- 2) "341.9374"
- 2) 1) "xian"
- 2) "483.8340"
- 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord # 显示他人的定位信息
- 1) 1) "chongqi"
- 2) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
- 2) 1) "xian"
- 2) 1) "108.96000176668167114"
- 2) "34.25999964418929977"
- 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1 # 筛选出指定数量的结果!
- 1) 1) "chongqi"
- 2) "341.9374"
- 3) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
- 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2
- 1) 1) "chongqi"
- 2) "341.9374"
- 3) 1) "106.49999767541885376"
- 2) "29.52999957900659211"
- 2) 1) "xian"
- 2) "483.8340"
- 3) 1) "108.96000176668167114"
- 2) "34.25999964418929977"
GEO 底层的实现原理其实就是 Zset!
我们可以使用Zset命令来操作Geospatial !
- 127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看地图中全部的元素
- 1) "chongqi"
- 2) "xian"
- 3) "shengzhen"
- 4) "hangzhou"
- 5) "shanghai"
- 6) "beijing"
- 127.0.0.1:6379> zrem china:city beijing # 移除指定元素!
- (integer) 1
- 127.0.0.1:6379> ZRANGE china:city 0 -1
- 1) "chongqi"
- 2) "xian"
- 3) "shengzhen"
- 4) "hangzhou"
- 5) "shanghai"