Redis Geospatial 使用详解

geospatial 地理位置

操作命令:

命令描述
geoadd添加地理位置的坐标
geopos获取地理位置的坐标
geodist计算两个位置之间的距离
georadius根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
georadiusbymember根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合
geohash返回一个或多个位置对象的 geohash 值
geoadd

将指定的地理空间位置(经度、纬度、名称)添加到指定的key中,具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

当坐标位置超出上述指定范围时,该命令将会返回一个错误。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> geoadd city 108.93425 34.23053 xian #添加地理位置的坐标
(integer) 1
127.0.0.1:6379> geoadd city 109.94107 33.86273 shangluo
(integer) 1
# 添加地理位置的坐标,可以同时添加多个
127.0.0.1:6379> geoadd city 109.02697 32.6955 ankang 107.03194 33.06784 hanzhong  109.07593  35.06914 tongchuan
(integer) 3
geopos

geopos命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。

当给定的位置元素不存在时, 对应的数组项为空值。

127.0.0.1:6379> geopos city shangluo  #获取地理位置的坐标
1) 1) "109.94106799364089966"
   2) "33.86273026216494486"
   #获取多个地理位置的坐标
127.0.0.1:6379> geopos city shangluo hanzhong
1) 1) "109.94106799364089966"
   2) "33.86273026216494486"
2) 1) "107.03193873167037964"
   2) "33.06783917187508592"

geodist

返回两个给定位置之间的距离。

如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数 unit 必须是以下单位的其中一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。
   #计算两个位置之间的距离
127.0.0.1:6379> geodist city xian shangluo km
"101.4055"
127.0.0.1:6379> geodist city xian hanzhong  km
"218.5048"
georadius

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

范围可以使用以下其中一个单位:

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

在给定以下可选项时, 命令会返回额外的信息:

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

命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

  • ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
  • DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。

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

#以108 33为坐标 查询直线距离300km的城市
127.0.0.1:6379> georadius city 108 33 300 km
1) "hanzhong"
2) "ankang"
3) "xian"
4) "shangluo"
5) "tongchuan"
#  查询直线距离150km的城市
127.0.0.1:6379> georadius city 108 33 150 km
1) "hanzhong"
2) "ankang"
# 查询直线距离300km的城市,返回结果添加经度纬度和直线距离
#withcoord withdist 可同时使用,也可以单个使用
127.0.0.1:6379> georadius city 108 33 300 km withcoord withdist
1) 1) "hanzhong"
   2) "90.5827"
   3) 1) "107.03193873167037964"
      2) "33.06783917187508592"
2) 1) "ankang"
   2) "101.7638"
   3) 1) "109.02697116136550903"
      2) "32.69549877245283653"
3) 1) "xian"
   2) "161.9275"
   3) 1) "108.93425256013870239"
      2) "34.23053097599082406"
4) 1) "shangluo"
   2) "204.1306"
   3) 1) "109.94106799364089966"
      2) "33.86273026216494486"
5) 1) "tongchuan"
   2) "250.5958"
   3) 1) "109.07593220472335815"
      2) "35.06914093683695199"
 # 查询直线距离150km的城市,返回结果添加经度纬度和直线距离
127.0.0.1:6379> georadius city 108 33 150 km withcoord withdist
1) 1) "hanzhong"
   2) "90.5827"
   3) 1) "107.03193873167037964"
      2) "33.06783917187508592"
2) 1) "ankang"
   2) "101.7638"
   3) 1) "109.02697116136550903"
      2) "32.69549877245283653"
# 查询直线距离150km的城市,返回结果添加经度纬度和直线距离,结果只匹配一个元素
#  count  返回值取前N个匹配元素
127.0.0.1:6379> georadius city 108 33 150 km withcoord withdist count 1
1) 1) "hanzhong"
   2) "90.5827"
   3) 1) "107.03193873167037964"
      2) "33.06783917187508592"

georadiusbymember

georadiusbymember命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心

#找出距离指定元素的指定距离内的其他元素
127.0.0.1:6379> georadiusbymember city xian 200 km
1) "ankang"
2) "xian"
3) "shangluo"
4) "tongchuan"
127.0.0.1:6379> georadiusbymember city xian 150 km
1) "xian"
2) "tongchuan"
3) "shangluo"
127.0.0.1:6379> georadiusbymember city xian 100 km
1) "xian"
2) "tongchuan"
geohash

geohash 返回一个或多个位置元素的 Geohash 表示;

官方文档:http://redis.cn/commands/geohash.html

# 将经纬度转化为字符串
127.0.0.1:6379> geohash city xian shangluo
1) "wqj6wz7x210"
2) "wqn0tu88sw0"

geo的底层是使用Zset来实现的,可以使用Zset命令操作geo

127.0.0.1:6379> zrange city 0 -1
1) "hanzhong"
2) "ankang"
3) "xian"
4) "shangluo"
5) "tongchuan"
127.0.0.1:6379> zrem city tongchuan
(integer) 1
127.0.0.1:6379> zrange city 0 -1
1) "hanzhong"
2) "ankang"
3) "xian"
4) "shangluo"
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值