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

  • 朋友的定位,附近的人,打车距离计算
  • redisgeoredis3.2 就推出了,可以推算地理位置的信息,两地之间的距离,方圆几公里的人
  • 在线城市经纬度查询工具:链接
  • 基本命令(以 geo 开头):
命令 描述
geoadd 将具体经纬度的坐标存入一个有序集合
geopos 获取集合中的一个/多个成员坐标
geodist 返回两个给定位置之间的距离(默认以米作为单位)
georadius 以给定的经纬度为中心, 找出某一半径内的元素
geohash 返回一个或多个位置元素的 geohash 表示,使用 geohash 位置 52 点整数编码
georadiusbymember 功能与 georadius 相同,只是中心位置不是具体的经纬度,而是使用结合中已有的成员作为中心点
  • 添加地理位置的坐标:geoadd
    1、 将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中(先经度,后纬度)
    2、 两极(南北极 )无法直接添加
    3、 一般会下载城市数据,通过 java 等程序一次性导入
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 表示单位为英尺。
  • 获取地理位置的坐标:geopos
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"
  • 计算两个位置之间的距离 :geodist
    应用:两人之间的直线距离
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"
  • 根据经纬度坐标,获取指定范围内的地理位置集合:georadius
    以给定的经纬度为中心,找出某一半径内所有的元素
    实现附近的人:获取所有附近的人的地址(GPS
# 范围查找  经度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"
  • 关于 georadius 的参数
    通过 georadius 就可以完成 附近的人 功能
    withcoord:带上坐标
    withdist:带上距离,单位与半径单位相同
    count n : 只显示前 n 个(按距离递增排序)

  • 根据地点,获取指定范围内的地理位置集合:georadiusbymember

# 根据给定的元素,确定中心点,再进行查找
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"
  • 返回一个或多个位置对象的 geohash 值:geohash
# 将二维的经纬度,转换为一维的字符串,经过 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"

你可能感兴趣的:(Redis 笔记(九)-三种特殊类型 Geospatial(地理位置))