• GEO(地理信息定位)


    核心知识点:

    1.GEO是利用zset来存储地理位置信息,可以用来计算地理位置之间的距离,也可以做统计;

    2.命令:geoadd geopos geodist geohash georadius/georadiusbymember;

    3.geohash字符串越长越精准,字符串越相近距离越近。

    Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、

    摇一摇这类依赖于地理位置信息的功能,对于需要实现这些功能的开发者来说是一大福音。

    GEO功能是Redis的另一位作者Matt Stancliff借鉴NoSQL数据库Ardb实现的,Ardb的作者来自中国,它提供了优秀的GEO功能。

    使用GEO的主要命令如下:

    1.增加地理位置信息

    geoadd key longitude latitude member [longitude latitude member ...]

    longitude、latitude、member分别是该地理位置的经度、纬度、成员。本篇文章以下表的5个城市为例:

    127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
    (integer) 1
    127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
    (integer) 0

    返回的结果代表添加成功的个数,如果返回0代表已经存在。

    geoadd还可以用来更新地理位置信息,虽然返回0,geoadd可以同时添加多个地理位置信息。

    127.0.0.1:6379> geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
    (integer) 4

    2.获取地理位置信息

    geopos key member [member ...]

    获取地理位置信息:

    127.0.0.1:6379> geopos cities:locations tianjin
    1) 1) "117.12000042200088501"
       2) "39.0800000535766543"

    3.获取两个地理位置的距离

    geodist key member1 member2 [unit]

    其中unit代表返回结果的单位,包含以下四种:

    • m(meters)代表米
    • km(kilometers)代表公里
    • mi(miles)代表英里
    • ft(feet)代表尺

    下面结算北京到天津的距离,并以公里为单位:

    127.0.0.1:6379> geodist cities:locations beijing tianjin km
    "89.2061"

    4.获取指定位置范围内的地理信息位置集合

    georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
    
    georadiusbymember key member radiusm m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

    georadius和georadiusbymember两个命令的作用是一样的,都是以一个地理位置为中心算出指定半径内的其它地理信息位置,

    不同的是georadius命令的中心位置给出了具体的经纬度,georadiusbymember只需给出成员即可,

    其中radius m|km|ft|mi是必须参数,指定了半径,带单位,下面是它可选参数的解释:

    • withcoord:返回结果中包含经纬度;
    • withdist:返回结果中包含离中心节点位置的距离;
    • withhash:返回结果中包含geohash;
    • COUNT count:指定返回结果的数量;
    • asc|desc:指定结果按照离中心节点的距离做升序或者降序;
    • store key:将返回结果的地理位置信息保存到指定键;
    • storedist key:将返回结果离中心离中心节点的距离保存到指定键。
    127.0.0.1:6379> georadiusbymember cities:locations beijing 100 km  #距离北京100km内的城市
    1) "beijing"
    2) "tianjin"

    5.获取geohash 

    geohash key member [member ... ]

    Redis使用geohash将二维经纬度转换为一维字符串:

    127.0.0.1:6379> geohash cities:locations beijing
    1) "wx48ypbe2q0"

    geohash有如下特点:

    • GEO的数据类型为zset,Redis将所有地理位置信息的geohash存放在zset中。
    • 字符串越长,表示的位置更精准。
    • 两个字符串越相似,它们之间的距离越近,Redis利用字符串前缀匹配算法实现相关命令
    • geohash编码和经纬度是可以相互转换的。

    Redis正是使用有序集合并结合geohash的特性实现了GEO的若干命令。

    6.删除地理位置信息

    zrem key member

    GEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所有可以借用zrem实现对地理位置信息的删除。

    127.0.0.1:6379> zrem cities:locations tangshan
    (integer) 1
  • 相关阅读:
    添加常驻Notification
    Java 数组操作
    一百本英文原著之旅 ( 15 finished )
    SQLServer2005中查询语句的执行顺序
    高效程序员的45个习惯
    博客园经典闪存语录
    for xml path('') 引发的数据不完整
    ajax向前台输出二维数组 并解析
    重视知识的本质
    C语言排序
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/8186666.html
Copyright © 2020-2023  润新知