Redis

Redis 笔记(九)-三种特殊类型 Geospatial(地理

2021-08-10  本文已影响0人  yjtuuige
命令 描述
geoadd 将具体经纬度的坐标存入一个有序集合
geopos 获取集合中的一个/多个成员坐标
geodist 返回两个给定位置之间的距离(默认以米作为单位)
georadius 以给定的经纬度为中心, 找出某一半径内的元素
geohash 返回一个或多个位置元素的 geohash 表示,使用 geohash 位置 52 点整数编码
georadiusbymember 功能与 georadius 相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点
127.0.0.1:6379> geoadd china:city 116.4 39.9 beijing    # 添加北京的经纬度
(integer) 1
127.0.0.1:6379> geoadd china:city 121.4 31.2 shanghai    # 添加上海的经纬度
(integer) 1
127.0.0.1:6379> geoadd china:city 114.1 22.5 shenzhen
(integer) 1
127.0.0.1:6379> geoadd china:city 113.3 23.1 guangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 114.2 22.3 xianggang
(integer) 1
127.0.0.1:6379> geoadd china:city 113.5 22.2 aomen
(integer) 1
127.0.0.1:6379> geoadd china:city 106.5 29.5 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 108.9 34.2 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 120.1 30.2 hangzhou 91.1 29.6 lasa        # 批量添加城市位置信息
(integer) 2

有效经纬度

  1. 有效的经度从 -180 度180 度
  2. 有效的纬度从 -85.05112878 度85.05112878 度
  3. 指定单位的参数 unit 必须是以下单位的其中一个:
    • m 表示单位为米。
    • km 表示单位为千米。
    • mi 表示单位为英里。
    • ft 表示单位为英尺。
127.0.0.1:6379> geopos china:city beijing shanghai xian
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "121.40000134706497192"
   2) "31.20000061483705878"
3) 1) "108.90000075101852417"
   2) "34.20000025962658441"
127.0.0.1:6379> geodist china:city beijing lasa        # 默认为米
"2567992.5356"
127.0.0.1:6379> geodist china:city beijing lasa km        # 千米
"2567.9925"
127.0.0.1:6379> geodist china:city beijing lasa mi        # 英里
"1595.6805"
# 范围查找  经度110 纬度 30为圆心 半径100km内所有的城市
127.0.0.1:6379> georadius china:city 110 30 100 km  
(empty array)
# 范围查找  经度110 纬度 30为圆心 半径1000km内所有的城市
127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "xian"
3) "aomen"
4) "xianggang"
5) "shenzhen"
6) "guangzhou"
7) "hangzhou"
# 范围查找  经度110 纬度 30为圆心 半径100km内所有的城市 带上经纬度和城市距离该点的直线距离
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist
1) 1) "chongqing"
   2) "342.5131"
   3) 1) "106.49999767541885376"
      2) "29.50000115408581536"
2) 1) "xian"
   2) "478.4989"
   3) 1) "108.90000075101852417"
      2) "34.20000025962658441"
3) 1) "aomen"
   2) "935.1758"
   3) 1) "113.49999994039535522"
      2) "22.19999914574732003"
4) 1) "xianggang"
   2) "953.3433"
   3) 1) "114.19999748468399048"
      2) "22.29999896492555678"
5) 1) "shenzhen"
   2) "928.8366"
   3) 1) "114.09999936819076538"
      2) "22.50000113800319212"
6) 1) "guangzhou"
   2) "834.6077"
   3) 1) "113.29999834299087524"
      2) "23.10000005307264104"
7) 1) "hangzhou"
   2) "971.8350"
   3) 1) "120.09999901056289673"
      2) "30.19999988833350102"
127.0.0.1:6379> georadius china:city 110 30 1000 km withcoord withdist count 2    # count 控制个数
1) 1) "chongqing"
   2) "342.5131"
   3) 1) "106.49999767541885376"
      2) "29.50000115408581536"
2) 1) "xian"
   2) "478.4989"
   3) 1) "108.90000075101852417"
      2) "34.20000025962658441"
# 根据给定的元素,确定中心点,再进行查找
127.0.0.1:6379> georadiusbymember china:city beijing 1000 km withdist
1) 1) "beijing"
   2) "0.0000"
2) 1) "xian"
   2) "918.6872"
127.0.0.1:6379> georadiusbymember china:city beijing 1500 km withdist
1) 1) "chongqing"
   2) "1466.7920"
2) 1) "xian"
   2) "918.6872"
3) 1) "hangzhou"
   2) "1129.9710"
4) 1) "shanghai"
   2) "1067.7424"
5) 1) "beijing"
   2) "0.0000"
# 将二维的经纬度,转换为一维的字符串,经过 hash 之后的结果
127.0.0.1:6379> geohash china:city beijing shanghai
1) "wx4fbxxfke0"            # 如果两个字符串越像,则代表越接近
2) "wtw36xbc1j0"

底层原理:使用经纬度定位地理坐标,并用一个有序集合 zset 保存,所以 zset命令也可以使用

127.0.0.1:6379> zrange china:city 0 -1        # 查看所有的元素
 1) "lasa"
 2) "chongqing"
 3) "xian"
 4) "aomen"
 5) "xianggang"
 6) "shenzhen"
 7) "guangzhou"
 8) "hangzhou"
 9) "shanghai"
10) "beijing"
127.0.0.1:6379> zrem china:city beijing shanghai        # 删除指定元素
(integer) 2
127.0.0.1:6379> zrange china:city 0 -1
1) "lasa"
2) "chongqing"
3) "xian"
4) "aomen"
5) "xianggang"
6) "shenzhen"
7) "guangzhou"
8) "hangzhou"
上一篇 下一篇

猜你喜欢

热点阅读