geo

  添加位置和获取位置

  为了进行地理位置相关操作, GEOADD 命令将具体的地理位置记录起来,  该命令的基本格式如下:

GEOADD location-set longitude latitude name [longitude latitude name ...]

  GEOADD 命令每次可以添加一个或多个经纬度地理位置。 其中 location-set 为储存地理位置的集合, 而 longitude 、 latitude 和 name则分别为地理位置的经度、纬度、名字。

  广州、佛山、东莞、深圳等数个广东省的市添加到位置集合 Guangdong-cities 里面:

redis> GEOADD Guangdong-cities 113.2278442 23.1255978 Guangzhou 113.106308 23.0088312 Foshan 113.7943267 22.9761989 Dongguan 114.0538788 22.5551603 Shenzhen
4    -- 成功添加四个位置

  在将位置记录到位置集合之后, 可以使用 GEOPOS 命令, 输入位置的名字并取得位置的具体经纬度:

GEOPOS location-set name [name ...]

  想要获取广州和佛山的经纬度, 那么可以执行以下代码:

redis> GEOPOS Guangdong-cities Qingyuan Guangzhou Foshan
1) 1) "113.22784155607224"    -- 广州的经度
   2) "23.125598202060807"    -- 广州的纬度
2) 1) "113.10631066560745"    -- 佛山的经度
   2) "23.008831202413539"    -- 佛山的纬度

  计算两个位置之间的距离

  在 Redis 里面, 计算两个位置之间的距离可以通过 GEODIST 命令来实现:

GEODIST location-set location-x location-y [unit]

  用户需要给定想要计算差距的地点 location-x 和 location-y , 以及储存这两个地点的地理位置集合。

  可选参数 unit 用于指定计算距离时的单位, 它的值可以是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

  如果用户没有指定 unit 参数, 那么 GEODIST 默认使用米为单位

  如何计算清远和广州之间的距离:

redis> GEODIST Guangdong-cities Qingyuan Guangzhou
"52094.433840356309"    -- 两地相距 52094 米

  获取指定范围内的元素

  常见的地理位置操作就是找出特定范围之内的其他存在的地点。 比如找出地点 x 范围 100 米之内的所有地点, 找出地点 y 范围 50 公里之内的所有地点等等。

  Redis 提供 GEORADIUS 和 GEORADIUSBYMEMBER 两个命令来实现查找特定范围内地点的功能,  GEORADIUS 使用用户给定的经纬度作为计算范围时的中心点, 而 GEORADIUSBYMEMBER 则使用储存在位置集合里面的某个地点作为中心点。 以下是这两个命令的基本格式:

GEORADIUS location-set longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]

GEORADIUSBYMEMBER location-set location radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]
  • m|km|ft|mi 指定的是计算范围时的单位;
  • 如果给定可选的 WITHCOORD , 那么命令在返回匹配的位置时会将位置的经纬度一并返回;
  • 如果给定可选的 WITHDIST , 那么命令在返回匹配的位置时会将位置与中心点之间的距离一并返回;
  • 在默认情况下, GEORADIUS 和 GEORADIUSBYMEMBER 的结果是未排序的, ASC 可以让查找结果根据距离从近到远排序, 而 DESC 则可以让查找结果根据从远到近排序;
  • COUNT 参数指定要返回的结果数量。

  使用 GEORADIUSBYMEMBER 去找出位于广州 50 公里、 100 公里以及 150 公里以内的城市:

redis> GEORADIUSBYMEMBER Guangdong-cities Guangzhou 50 km
1) "Foshan"
2) "Guangzhou"

redis> GEORADIUSBYMEMBER Guangdong-cities Guangzhou 100 km
1) "Foshan"
2) "Guangzhou"
3) "Dongguan"
4) "Qingyuan"

  每个社交网站基本上都内置了“查找附近的人”这一功能, 通过 Redis , 我们也可以实现同样的功能, 以下是实现该功能的伪代码:

def pin(user, longitude, latitude):
    """
    记录用户的地理位置。
    """
    GEOADD('user-location-set', longitude, latitude, user)

def find_nearby(user, n):
    """
    返回指定用户附近 n 公里的所有其他用户。
    """
    return GEORADIUSBYMEMBER('user-location-set', user, n, unit='km')

  

posted on 2019-06-06 22:38  溪水静幽  阅读(499)  评论(0)    收藏  举报