zoukankan      html  css  js  c++  java
  • 使用 redis-py 储存地理位置数据

    Redis 3.2 版本的其中一个重要更新就是提供了对地理位置(GEO)数据的支持, 这一特性允许用户将地理位置信息储存到 Redis 数据库中, 并对它们执行距离计算、范围查找等操作。

    可喜的是, 今天笔者发现 redis-py 的最新版本已经添加了对 GEO 特性的支持, 所以今天就让我们一起来看看如何在 redis-py 中处理地理位置数据。

    redis-py github:

    https://github.com/andymccurdy/redis-py

    目前redis-py只有 2.10.6版本支持地理位置(GEO)数据的支持,如果需要使用GEO,请更新2.10.6版本。

    如果已安装redis-py

    pip uninstall redis # 卸载redis
    
    pip install redis

    载入redis-py库:

    from redis import  Redis
    conn = Redis()

    通过对 Redis() 对象的属性进行访问, 我们可以确认各个 GEO 命令在 redis-py 中都有了相应的方法:

    >>>>>>: for i in dir(conn):
       ...:     if i.startswith('geo'):
       ...:         print i
       ...:
       
    geoadd
    geodist
    geohash
    geopos
    georadius
    georadiusbymember

    添加地理位置 geoadd():

    geoadd(self, name, *values) 
    
    >>> conn.geoadd("广东", 114.07, 22.62, "深圳", 113.23, 23.16, "广州", 113.11, 23.05, "佛山")
    3

    获取地理位置 geopos():

    geopos(self, name, *values)
    
    >>> conn.geopos('广东','广州')
     [(113.22999805212021, 23.15999943763535)]

    计算两地间的距离geodist():

    geodist(self, name, place1, place2, unit=None)
    
    >>> conn.geodist('广东','广州','佛山')
    17331.9291

    GEODIST 命令默认使用米作为单位, 所以它返回了17331.9291米作为结果, 为了让这个结果更为直观一些, 我们可以将 GEODIST 命令的单位从米改为千米(公里)

    >>> conn.geodist('广东','广州','佛山',unit='km')
    17.3319

    现在可以看到广州和佛山之间的相距是17.3319km

    范围查找georadius()和georadiusbymember()

    # 以给定的经纬度为中心, 找出某一半径内的元素
    georadius(self, name, longitude, latitude, radius, unit=None, withdist=False, withcoord=False, withhash=False, count=None, sort=None, store=None, store_dist=None)
    
    # 找出位于指定范围内的元素,中心点是由给定的位置元素决定
    georadiusbymember(self, name, member, radius, unit=None, withdist=False, withcoord=False, withhash=False, count=None, sort=None, store=None, store_dist=None)

    georadius()

    # 查找深圳坐标120公里范围内的城市
    >>> conn.georadius("Guangdong", 113.23, 23.16, 100, unit="km", withdist=True)
    
    [['佛山', 17.3321], ['深圳', 0.0002], ['广州', 104.9567]]

    georadiusbymember()

    >>> conn.georadiusbymember("广东", "广州", 30, unit="km", withdist=True)
    [['广州', 0.0], ['佛山', 17.3319]]

    获取 geohash

    # 返回一个或多个位置元素的 Geohash 表示
    geohash(self, name, *values)
    
    
    >>> conn.geohash("广东", "广州", "佛山", "深圳")
    ['ws0eb85sf00', 'ws07juh5yp0', 'ws10etz5p90']

     使用 redis-py 储存地理位置数据

  • 相关阅读:
    BZOJ1027 [HNOI2004]打鼹鼠 【dp】
    面试的绝招(V1.0)
    面试的绝招(V1.0)
    Google是如何做测试的?
    Google是如何做测试的?
    Google是如何做测试的?
    六年测试之精华分享:产品质量应从哪些方面提高
    六年测试之精华分享:产品质量应从哪些方面提高
    六年测试之精华分享:产品质量应从哪些方面提高
    拒绝混乱,回归有序
  • 原文地址:https://www.cnblogs.com/chenxinming-top/p/9448558.html
Copyright © 2011-2022 走看看