写点什么

Redis 之 Geospatial,助你轻松实现附近的 xx 功能

作者:李子捌
  • 2021 年 11 月 27 日
  • 本文字数:2550 字

    阅读完需:约 8 分钟

Redis之Geospatial,助你轻松实现附近的xx功能

一、简介

Geospatial 是 Redis 在 3.2 版本以后增加的地理位置 GEO 模块,这个模块可以用来实现微信附近的人,在线点餐“附近的餐馆”等位置功能。

二、命令

2.1 GEOADD

命令简介:

GEOADD key longitude latitude member [longitude latitude member …]

image.png


将给定的空间元素(维度、经度、名字)添加到指定的键里面,数据以有序集合的形式被存放在键中。GEOADD 接收的参数必须先输入经度,然后输入维度。

GEOADD 经纬度的输入范围如下(对两极不支持):


  1. 有效经度介于-180°~180°之间

  2. 有效维度介于-85.05112878°至 85.05112878°之间

当用户尝试输入一个超出范围的经度或者纬度时, GEOADD 命令将返回一个错误。​

代码示例:可以依次添加单个,也可以同时添加多个地理位置的元素。

127.0.0.1:6379> geoadd city 116.405289 39.904987 beijing(integer) 1127.0.0.1:6379> geoadd city 117.190186 39.125595 tianjin(integer) 1127.0.0.1:6379> geoadd city 121.472641 31.231707 shanghai(integer) 1127.0.0.1:6379> geoadd city 112.982277 28.19409 changsha 113.28064 23.125177 guangzhou(integer) 2
复制代码


image.png


错误示例:


127.0.0.1:6379> geoadd city 190 18 buzhidao(error) ERR invalid longitude,latitude pair 190.000000,18.000000
复制代码


image.png


2.2 GEOPOS

命令简介:

GEOPOS key member [member …]

根据键(key)获取给定位置元素的位置(经度和纬度),GEOPOS 可以接收一个 member,也可以接收多个 member,如果 member 不存在则返回 nil​

代码示例:

127.0.0.1:6379> geopos beijing(empty array)127.0.0.1:6379> geopos city beijing1) 1) "116.40528827905654907"   2) "39.90498588819134085"127.0.0.1:6379> geopos city tianjin shanghai1) 1) "117.19018846750259399"   2) "39.12559461779084558"2) 1) "121.47264093160629272"   2) "31.23170744181923197"127.0.0.1:6379> geopos city xiaoriben1) (nil)
复制代码


image.png


2.3 GEODIST

命令简介:

GEODIST key member1 member2 [unit]

返回两个给定位置之间的距离,以双精度浮点数的形式被返回。如果给定的位置其中一个不存在(两个都不存在也是一样,下面有示例),将会返回空值(nil)。​

unit 单位描述:

  • m -> 米

  • km -> 千米

  • mi -> 英里

  • ft -> 英尺

默认单位:如果用户未给定指定单位 unit,则默认为米(m)​

误差范围:GEODIST 计算的算法会将地球考虑为一个完全球体,在极限情况下,存在最大 0.5%的误差​

代码示例:

127.0.0.1:6379> geodist city beijing shanghai m"1067597.0432"127.0.0.1:6379> geodist city beijing shanghai km"1067.5970"127.0.0.1:6379> geodist city beijing xiaoriben(nil)127.0.0.1:6379> geodist city meiguoguizi xiaoriben(nil)
复制代码


image.png


2.4 GEORADIUS

命令简介:

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

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

m|km|ft|mi 选项:

  • m -> 米

  • km -> 千米

  • mi -> 英里

  • ft -> 英尺

[WITHCOORD] [WITHDIST] [WITHHASH]选项:

  • [WITHCOORD]:将位置元素的经度和纬度也一并返回。

  • [WITHDIST] :在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。

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

[ASC|DESC] 选项:

  • ASC:根据给定的中心位置,从近到远返回位置元素

  • DESC:根据给定的中心位置,从远到近返回位置元素

[COUNT count] 参数:GEORADIUS 默认会返回符合条件的全部位置元素。但是用户可以通过[COUNT count] 参数去指定获取前 N 个匹配元素。这个参数可以减少需要返回的元素数量,一定程度上可以减少带宽压力。​

返回值:GEORADIUS 的返回值是一个数组,但是数组的内容会根据是否存在上述参数而改变

  • 未给定任何 WITH 参数,则返回普通线性列表

  • 给定[WITHCOORD] [WITHDIST] [WITHHASH]等参数后返回一个二层嵌套数组

具体返回值请查看后续示例,建议还是自己多搞几次就清楚了

代码示例:未给定任何 WITH 参数

127.0.0.1:6379> georadius city 116.405289 39.904987 1000 km1) "tianjin"2) "beijing"
复制代码

给定[WITHCOORD] [WITHDIST] [WITHHASH]等参数,返回的时二层嵌套数组

127.0.0.1:6379> georadius city 116.405289 39.904987 1000 km withcoord1) 1) "tianjin"   2) 1) "117.19018846750259399"      2) "39.12559461779084558"2) 1) "beijing"   2) 1) "116.40528827905654907"      2) "39.90498588819134085"
复制代码


127.0.0.1:6379> georadius city 116.405289 39.904987 1000 km withdist1) 1) "tianjin"   2) "109.7754"2) 1) "beijing"   2) "0.0001"
复制代码

2.5 GEORADIUSBYMEMBER

命令简介:

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

GEORADIUSBYMEMBER 与 GEORADIUS 的区别在于,GEORADIUSBYMEMBER 无需给定经纬度,只需要给定成员的 key 就行,具体使用与 GEORADIUS 一致

代码示例:

127.0.0.1:6379> georadiusbymember city beijing 1000 km1) "tianjin"2) "beijing"
复制代码


127.0.0.1:6379> georadiusbymember city beijing 1000 km withcoord1) 1) "tianjin"   2) 1) "117.19018846750259399"      2) "39.12559461779084558"2) 1) "beijing"   2) 1) "116.40528827905654907"      2) "39.90498588819134085"
复制代码

2.6 GEOHASH

命令名称:

GEOHASH key member [member …]

返回一个或多个位置元素的 GeoHash 表示,可以给顶多个 key 中的 member,因此返回的是一个数组。​

代码示例:

127.0.0.1:6379> geohash city beijing shanghai changsha1) "wx4g0b7xru0"2) "wtw3sjt9vs0"3) "wt026ux4mz0"
复制代码

三、中国省会城市的经纬度

为了便于各位大佬们学习 Geospatial 的学习,我整理了全国省会城市的经纬度在这,有需要的可以自取。

(infoq 好像不能插入表格……)





发布于: 2021 年 11 月 27 日阅读数: 7
用户头像

李子捌

关注

华为云享专家 2020.07.20 加入

公众号【李子捌】

评论

发布
暂无评论
Redis之Geospatial,助你轻松实现附近的xx功能