zoukankan      html  css  js  c++  java
  • Redis GEO地理位置学习

    从Redis3.2开始,Redis基于geohash和有序集合(zset)提供了地理位置相关功能,用来实现类似微信中附近的人的功能,使用起来十分方便。

    Redis Geo模块大概提供了6个命令,分别为:
    1)geoadd:将给定的位置对象(纬度、经度、名字)添加到指定的key;
    2)geopos:从key里面返回所有给定位置对象的位置(经度和纬度);
    3)geodist:返回两个给定位置之间的距离;
    4)geohash:返回一个或多个位置对象的geohash表示;
    5)georadius:以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象;
    6)georadiusbymember:以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。

    1.添加地理位置

    geoadd key long lat member [longitude latitude member]

    命令:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。
    返回值:添加到sorted set元素的数目,但不包括已更新score的元素。

    203.195.205.63:0>geoadd geo:city 121.47 31.23 shanghai 
    116.40 39.90 beijing 
    118.78 32.07 nanjing
    "3"

    返回值 3 表示添加成功 3 条记录。

    2.获取地理位置信息

    geopos key member [member ...]

    命令描述:从key里返回member的位置(经度和纬度)。
    返回值:GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个为元素的经度, 而第二个则为元素的纬度。当给定的位置元素不存在时, 对应的数组项为空值。

    203.195.205.63:0>geopos geo:city shanghai
    203.195.205.63:0>geopos geo:city nanjing

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

    geodist key member1 member2 [unit]

    其中unit为可选参数,可选以下四种,默认 m:
    - m:代表单位米
    - km:代表单位千米
    - mi:代表单位英里
    - ft:代表单位尺

    203.195.205.63:0>geodist geo:city beijing shanghai
    "1067378.7564"

    4.获取指定位置内的地理位置集合

    命令1:georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
    命令2:georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]

    以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。

    范围可以使用以下其中一个单位:
    m 表示单位为米。
    km 表示单位为千米。
    mi 表示单位为英里。
    ft 表示单位为英尺。

    在给定以下可选项时, 命令会返回额外的信息:
    WITHDIST: 在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
    WITHCOORD: 将位置元素的经度和维度也一并返回。
    WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

    命令默认返回未排序的位置元素。 通过以下两个参数,用户可以指定被返回位置元素的排序方式:
    ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
    DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。

    在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

    返回值:
    在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样的线性(linear)列表。
    在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。

    在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。 至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:

    以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。
    geohash 整数。
    由两个元素组成的坐标,分别为经度和纬度。

    203.195.205.63:0>georadius geo:city 121.47 31.23 10000 km withdist
    203.195.205.63:0>georadiusbymember geo:city shanghai 10000 km withdist
    203.195.205.63:0>georadiusbymember geo:city shanghai 10000 km withcoord


    5.删除地理位置信息

    zrem key member

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

    203.195.205.63:0>zrem geo:city beijing

    6.获取geohash

    geohash key member [member ...]

    执行下面的操作可以得到shanghai 的geohash值:

    203.195.205.63:0>geohash geo:city shanghai
    1) "wtw3sj5zbj0"

    GEO的数据类型是zset,Redis将所有地理位置信息的geohash存在zset中
    geohash字符串越长表示地理位置精度越高
    两个geohash字符串越相似,两个位置距离越近
    geohash和经纬度之间有着一一对应的关系
    Redis GEO的命令都是基于geohash来实现的

    总结
    Redis GEO是一个很新的数据结构,使用geohash和zset实现。
    可以方便我们关于地理位置的存取,在特定的使用场景还是很有价值的。

  • 相关阅读:
    warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Windows10+CLion+OpenCV4.5.2开发环境搭建
    Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
    MediaCodec.configure Picture Width(1080) or Height(2163) invalid, should N*2
    tesseract
    Caer -- a friendly API wrapper for OpenCV
    Integrating OpenCV python tool into one SKlearn MNIST example for supporting prediction
    Integrating Hub with one sklearn mnist example
    What is WSGI (Web Server Gateway Interface)?
    Hub --- 机器学习燃料(数据)的仓库
  • 原文地址:https://www.cnblogs.com/linjiqin/p/12857952.html
Copyright © 2011-2022 走看看