Redis数据类型 - 地理坐标(GEO)

一、地理坐标简介

Redis GEO是Redis在3.2版本中新添加的特性,可以将经纬度格式的地理坐标存储到Redis中,并对这些坐标执行距离计算、范围查找等操作。

二、地理坐标常用操作

  • 存储坐标

通过使用GEOADD命令,用户可以将给定的一个或多个经纬度坐标存储到位置集合中,并为这些坐标设置相应的名字。
语法格式:GEOADD key longitude1 latitude1 name1 longitude2 latitude2 name2 …,如

# 添加广州市和清远市的坐标到cities
GEOADD cities 113.2278442 23.1255978 Guangzhou 113.2099647 23.593675 Qingyuan

GEOADD命令会返回新添加至位置集合的坐标数量作为返回值。如果给定的位置在集合中已经有了与之相关联的坐标,那么GEOADD命令将使用用户给定的新坐标去代替已有的旧坐标。

  • 获取指定位置的坐标

在使用GEOADD命令将位置及其坐标存储到位置集合之后,可以使用GEOPOS命令去获取给定位置的坐标
语法格式:GEOPOS key name1 name2 …,如

# 获取cities中Guangzhou的坐标
GEOPOS cities Guangzhou

GEOPOS命令会返回一个数组作为执行结果,数组中的每项都包含经度和维度两个元素,且与用户给定的位置相对应。如果用户给定的位置并不存在于位置集合当中,那么GEOPOS命令将返回一个空值。

  • 计算两个位置之间的直线距离

GEODIST命令可用于计算两个给定位置之间的直线距离,该命令的DIST是Distance的简写,意味距离
语法格式:GEODIST key name1 name2 [unit]
其中,unit用于指定自己想使用的距离单位,可以是以下单位中的一个:
·m——以米为单位,为默认单位。
·km——以千米为单位。
·mi——以英里为单位,1英里≈1.61千米。
·ft——以英尺为单位,1英尺≈0.30米。

# 获取广州市和清远市的直线距离,且以千米为单位
GEODIST cities Guangzhou Qingyuan km

在默认情况下,GEODIST命令将以米为单位,返回两个给定位置之间的直线距离。

在调用GEODIST命令时,如果用户给定的某个位置并不存在于位置集合中,那么命令将返回空值,表示计算失败。

  • 查找指定坐标半径范围内的其他位置

通过使用GEORADIUS命令,可以指定一个经纬度作为中心点,并从位置集合中找出位于中心点指定半径范围内的其他位置
语法格式:GEORADIUS key longitude latitude radius unit [WITHDIST]
其中,可选项WITHDIST如果使用,那么GEORADIUS命令不仅会返回位于指定半径范围内的位置,还会返回这些位置与中心点之间的距离,

# 以广州的经纬度作为中心点,查找cities中位于其半径50km内的所有其他城市
# 并返回距离,在返回距离时所使用的单位与进行范围查找时所使用的单位一致
GEORADIUS cities 113.2278442 23.1255978 50 km WITHDIST

除了WITHDIST之外,GEORADIUS命令还提供了另一个可选项WITHCOORD,通过使用这个选项,用户可以让GEORADIUS命令在返回被匹配位置的同时,将这些位置的坐标也一并返回。

GEORADIUS命令在默认情况下会以无序方式返回被匹配的位置,但是通过使用可选的ASC选项或DESC选项,用户可以改变这一行为,让GEORADIUS命令以有序方式返回结果。如果使用了ASC选项,那么GEORADIUS将根据中心点与被匹配位置之间的距离,按照由近到远的顺序返回被匹配的位置;相反,如果用户使用的是DESC选项,那么GEORADIUS将按照由远到近的顺序返回被匹配的位置。

默认情况下,GEORADIUS命令将返回指定半径范围内的所有其他位置,但是通过可选的COUNT选项,我们可以限制命令返回的最大位置数量,如

# 最多只返回两个位置
GEORADIUS cities 113.2278442 23.1255978 50 km COUNT 2

除了GEORADIUS命令之外,还有一个GEORADIUSBYMEMBER命令也可以用于查找指定位置半径范围内的其他位置;这两个命令的主要区别在于GEORADIUS命令通过给定经纬度来指定中心点,而GEORADIUSBYMEMBER命令则通过选择位置集合中的一个位置作为中心点;除了指定中心点时使用的参数不一样之外,GEORADIUSBYMEMBER命令中的其他参数和选项的意义都与GEORADIUS命令一样。如

# 以广州的经纬度作为中心点,查找cities中位于其半径50km内的所有其他城市
# 最多只返回两个位置
GEORADIUS cities Guangzhou 50 km COUNT 2

除此之外,EORADIUSBYMEMBER命令在返回结果的时候,会把作为中心点的位置也一并返回。

GEORADIUS命令和GEORADIUSBYMEMBER命令都支持WITHHASH选项,使用了这个选项的命令将会在结果中包含被匹配位置的Geohash值。需要注意的是,与GEOHASH命令不一样,GEORADIUS命令和GEORADIUSBYMEMBER命令返回的是被解释为数字的Geohash值。而GEOHASH命令返回的则是被解释为字符串的Geohash值。

  • 获取指定位置的Geohash值

可以通过向GEOHASH命令传入一个或多个位置来获得这些位置对应的经纬度坐标的Geohash表示;
语法格式:GEOHASH key name1 name2 …,如

# 获取cities中Guangzhou和Qingyuan的geohash表示
GEOHASH cities Guangzhou Qingyuan

Geohash是一种编码格式,这种格式可以将用户给定的经度和纬度转换成单个Geohash值,也可以根据给定的Geohash值还原出被转换的经度和纬度。比如,通过使用Geohash编码程序,我们可以将清远市的经纬度(113.20996731519699097,23.59367501967128788)编码为Geohash值"ws0w0phgp70",也可以根据这个Geohash值还原出清远市的经纬度。
当应用程序因为某些原因只能使用单个值去表示位置的经纬度时,我们就可以考虑使用GEOHASH命令去获取位置坐标的Geohash值,而不是直接使用GEOPOS命令去获取位置的经纬度。

  • 使用有序集合命令操作GEO数据

一个位置集合实际上就是一个有序集合,当用户调用GEO命令对位置集合进行操作时,这些命令实际上是在操作一个有序集合。例如,当我们使用GEOADD命令将广州市的经纬度添加到cities位置集合时,Redis会把给定的经纬度转换成数字形式的Geohash值,然后调用ZADD命令,将位置名及其Geohash值添加到有序集合中,其中Geohash值作为分值,位置名作为元素项。

除了GEOADD之外,包括GEOPOS、GEODIST、GEORADIUS、GEORADIUSBYMEMBER和GEOHASH在内的所有GEO命令都是在有序集合的基础上实现的,这也使得我们可以直接使用有序集合命令对位置集合进行操作。
比如,可以使用ZRANGE命令查看位置集合存储的所有位置,以及这些位置的Geohash值:

# 查看cities中所有元素,同时返回分值
ZRANGE cities 0 -1 WITHSCORES
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值