• Redis系列(四):地理信息


    除了Bitmaps和HyperLogLog,Redis还提供了关于地理空间的相关操作,主要是经纬度。Redis提供的地理信息操作是有误差的,最大误差可能会达到5%。Redis提供的Geo的操作如下:

    • geoadd

    完整命令参数为geoadd key longitude latitude member [longitude latitude member ...]

    将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。下面的例子是把广州塔(113.324553,23.106414)和中山纪念堂(113.264692,23.13286)添加到guangzhou这个key中

    127.0.0.1:6379> geoadd guangzhoudibiao 113.324553 23.106414 guangzhouta 113.264692 23.13286 zhongshanjiniantang
    

    在线获取地点的经纬度可以到高德地图网站查看。

    • geopos

    完整命令参数为geopos key member [member ...]

    获取key中指定位置的经纬度。比如获取广州塔的经纬度

    127.0.0.1:6379> geopos guangzhoudibiao guangzhouta
    1) 1) "113.3245512843132019"
       2) "23.10641289760576456"
    

    也可以一次性指定多个位置

    127.0.0.1:6379> geopos guangzhoudibiao guangzhouta zhongshanjiniantang
    1) 1) "113.3245512843132019"
       2) "23.10641289760576456"
    2) 1) "113.26468974351882935"
       2) "23.13286017818230533"
    

    结果会以列表的形式显示,每个位置中的1)是经度,2)是维度。

    • geodist

    完整命令参数为geodist key member1 member2 [unit]

    返回地址member1和member2的距离,unit是单位,可以是下面几种

    m:米

    km:千米

    mi:英里

    ft:英尺

    默认单位是米

    比如看一下广州塔与中山纪念堂之间的距离

    127.0.0.1:6379> geodist guangzhoudibiao guangzhouta zhongshanjiniantang km
    "6.7934"
    

    显示是6.79公里,注意这是直线距离,不是路线。有兴趣的可以在高德地图或者百度地图用测距的功能对比一下。

    • georadius

    完整命令参数为georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

    这个命令比较有意思,它返回的是以经纬度(longitude, latitude)为中心,radius为半径范围内key中符合的位置。其中m|km|ft|mi是半径的单位,含义和geodist相同。它有几个可选参数:

    WITHCOORD:将位置的经纬度也一并返回

    WITHDIST:将位置与中心的距离返回,单位与指定的半径的单位相同。

    WITHHASH:以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

    count:指定返回的个数,用法和MySQL的Limit类似。

    ASC|DESC:默认情况下返回的数据不会排序,可以指定ASC升序或者DESC降序。这里的升序降序的排序规则是位置到中心点的距离。

    以下的例子先多增加几个位置,然后计算某个地址的指定范围的其它位置

    127.0.0.1:6379> geoadd guangzhoudibiao 113.264499 23.130061 guangzhoushizhengfu
    (integer) 1
    127.0.0.1:6379> geoadd guangzhoudibiao 113.326336 23.11475 guangdongbowuguan
    (integer) 1
    127.0.0.1:6379> geoadd guangzhoudibiao 113.298415 23.096714 zhongshandaxue
    (integer) 1
    127.0.0.1:6379> georadius guangzhoudibiao 113.264499 23.130061 5 km withdist
    1) 1) "guangzhoushizhengfu"
       2) "0.0003"
    2) 1) "zhongshanjiniantang"
       2) "0.3120"
    

    上面的例子先增加了广州市政府、广东博物馆、中山大学3个位置,然后以广州市政府为中心,查找所有5km之内的位置,最后找到了自身和中山纪念堂。

    我们使用的美团、大众点评等应用会在列表中的店显示与你当前距离,这种场景下用georadius 命令就很有用了,另外很多IM应用的附近的人也可以用这个命令来实现。

    • georadiusbymember

    完整命令参数为georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

    在上面的georadius你可能发现了一个问题,就是我们在实际使用的时候往往更加关心某个位置附近的其它位置,这里的位置是一个具体的地点,比如广州市政府,我们根本不关心广州市政府的经纬度是什么,所以这个命令是通过位置名称来查找的,它与georadius命令唯一的不同就是,它指定的是位置名称,而georadius指定的是经纬度

    比如我们还是查找广州市政府附近5km的其它位置

    127.0.0.1:6379> georadiusbymember guangzhoudibiao guangzhoushizhengfu 5 km withdist
    1) 1) "guangzhoushizhengfu"
       2) "0.0000"
    2) 1) "zhongshanjiniantang"
       2) "0.3119"
    
  • 相关阅读:
    终极版:Mybatis整合Spring配置
    出错: IOException parsing XML document from ServletContext resource [/cn.mgy.conig]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/cn.mgy.conig]
    出错:Error creating bean with name 'studentServiceImpl': Unsatisfied dependency expressed through field 'studentMapper';
    Spring出现事务代理的原因
    SpringMVC:处理静态资源
    运行maven命令的时候出现jre不正确
    spring-mybatis的整合
    [leetcode] 17. Letter Combinations of a Phone Number (medium)
    [PTA] 数据结构与算法题目集 6-12 二叉搜索树的操作集
    [PTA] 数据结构与算法题目集 6-11 先序输出叶结点
  • 原文地址:https://www.cnblogs.com/spareyaya/p/12823164.html
Copyright © 2020-2023  润新知