redis轻松处理经纬度坐标点数据的实现方法

 更新时间:2021年10月20日 10:49:03   作者:be5yond  
这篇文章主要介绍了redis轻松处理经纬度坐标点数据的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Redis 3.2 之后,支持地理坐标数据的管理。将给定的坐标元素(纬度、经度、名字)添加到指定的键里面。 这些数据就会以有序集合的形式被储, 可以通过GEORADIUS 计算两个坐标点的距离,或者使用GEORADIUS 和 GEORADIUSBYMEMBER查询某个坐标半径内的数据。下面对其中常用的命令进行一个简单的介绍。

1. GEOADD

将坐标信息添加到指定的键里面。

 GEOADD key longitude latitude member [longitude latitude member ...]

longitude:坐标点经度,有效值[ -180,180 ]

latitude:坐标点纬度,有效值[ -85.05112878, 85.05112878 ]

示例:

127.0.0.1:6379> geoadd parks 116.300892 40.009462 yuanmingyuan
(integer) 1
127.0.0.1:6379>  geoadd parks 116.188797 39.990132 xiangshan 116.255916 40.030233 baiwangshan
(integer) 2
 
127.0.0.1:6379> GEOADD parks 110 89.9 nanji
(error) ERR invalid longitude,latitude pair 110.000000,89.900000

可以看到,GEOADD 支持一次添加一个或多个地点,每个地点需要包含精度维度和名称,当尝试添加合法经纬度外的坐标(维度为89.9的nanji) 时, 会报错。

2. GEOPOS

GEOPOS命令根据地点的名称返回对应的经纬度。集合中不存在时,返回数据为空

示例:

127.0.0.1:6379> GEOPOS parks xiangshan baiwangshan nanji
1) 1) "116.18879646062850952"
   2) "39.99013224137585354"
2) 1) "116.2559160590171814"
   2) "40.03023406483775659"
3) (nil)

3. GEODIST

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

GEODIST key member1 member2 [unit]

合法的unit值

unit: m(缺省值) km mi ft
说明: 千米 英里 英尺

示例:

127.0.0.1:6379> GEODIST parks xiangshan baiwangshan
"7251.9492"
127.0.0.1:6379> GEODIST parks xiangshan baiwangshan km
"7.2519"
127.0.0.1:6379> GEODIST parks xiangshan nanji km
(nil)

4. GEORADIUS

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

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

经纬度和单位参数与前面命令保持一致。 其他可选参数说明

  • WITHCOORD: 将坐标数据的经纬度一并返回
  • WITHDIST:将坐标数据与当前坐标的距离一并返回
  • WITHHASH:以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值
  • COUNT:返回指定条数的数据
  • ASC|DESC:根据中心的位置, 按照从近到远或者从远到近的方式返回位置元素
  • STORE和STOREDIST:将返回结果保存至一个有序集合,区别是STORE保存的是hash值,STOREDIST保存的是距离

示例:

返回额外信息

127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km
1) "xiangshan"
2) "baiwangshan"
3) "yuanmingyuan"
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHCOORD WITHDIST WITHHASH
1) 1) "xiangshan"
   2) "10.9353"
   3) (integer) 4069878528493207
   4) 1) "116.18879646062850952"
      2) "39.99013224137585354"
2) 1) "baiwangshan"
   2) "3.6941"
   3) (integer) 4069880373231506
   4) 1) "116.2559160590171814"
      2) "40.03023406483775659"
3) 1) "yuanmingyuan"
   2) "4.3576"
   3) (integer) 4069880708898691
   4) 1) "116.30089133977890015"
      2) "40.00946202493697257"

指定数据条数和排序

127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST ASC
1) 1) "baiwangshan"
   2) "3.6941"
2) 1) "yuanmingyuan"
   2) "4.3576"
3) 1) "xiangshan"
   2) "10.9353"
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST DESC
1) 1) "xiangshan"
   2) "10.9353"
2) 1) "yuanmingyuan"
   2) "4.3576"
3) 1) "baiwangshan"
   2) "3.6941"
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km WITHDIST ASC COUNT 2
1) 1) "baiwangshan"
   2) "3.6941"
2) 1) "yuanmingyuan"
   2) "4.3576"

将结果保存到新的zset, hash值或者距离

127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km ASC COUNT 2 STORE store_20km
(integer) 2
127.0.0.1:6379> GEORADIUS parks 116.29248 40.048107 20 km ASC COUNT 2 STOREDIST storedist_20km
(integer) 2
127.0.0.1:6379> ZRANGE store_20km 0 -1 WITHSCORES
1) "baiwangshan"
2) "4069880373231506"
3) "yuanmingyuan"
4) "4069880708898691"
127.0.0.1:6379> ZRANGE storedist_20km 0 -1 WITHSCORES
1) "baiwangshan"
2) "3.6941190849982757"
3) "yuanmingyuan"
4) "4.3576262236174665"

5. GEORADIUSBYMEMBER

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

示例:

GEORADIUSBYMEMBER parks yuanmingyuan 5 km ASC
1) "yuanmingyuan"
2) "baiwangshan"

查询圆明园5公里内的公园

到此这篇关于redis轻松处理经纬度坐标点数据的实现方法的文章就介绍到这了,更多相关redis 经纬度坐标点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈redis采用不同内存分配器tcmalloc和jemalloc

    浅谈redis采用不同内存分配器tcmalloc和jemalloc

    下面小编就为大家带来一篇浅谈redis采用不同内存分配器tcmalloc和jemalloc。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Spring boot+redis实现消息发布与订阅的代码

    Spring boot+redis实现消息发布与订阅的代码

    这篇文章主要介绍了Spring boot+redis实现消息发布与订阅,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值需要的朋友可以参考下
    2020-04-04
  • Redis Sentinel服务配置流程(详解)

    Redis Sentinel服务配置流程(详解)

    下面小编就为大家带来一篇Redis Sentinel服务配置流程(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Win10配置redis服务实现过程详解

    Win10配置redis服务实现过程详解

    这篇文章主要介绍了Win10配置redis服务实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 详解Redis在SpringBoot工程中的综合应用

    详解Redis在SpringBoot工程中的综合应用

    这篇文章主要介绍了Redis在SpringBoot工程中的综合应用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • redis限流的实际应用

    redis限流的实际应用

    这篇文章主要介绍了redis限流的实际应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 详解用Redis实现Session功能

    详解用Redis实现Session功能

    本篇文章主要介绍了用Redis实现Session功能,具有一定的参考价值,小编觉得挺不错的,现在分享给大家,也给大家做个参考。
    2016-12-12
  • SpringBoot 开启Redis缓存及使用方法

    SpringBoot 开启Redis缓存及使用方法

    用redis做缓存,是因为redis有着很优秀的读写能力,在集群下可以保证数据的高可用,那么今天通过本文给大家讲解下SpringBoot使用Redis的缓存的方法,感兴趣的朋友一起看看吧
    2021-08-08
  • redis通过pipeline提升吞吐量的方法

    redis通过pipeline提升吞吐量的方法

    下面小编就为大家分享一篇redis通过pipeline提升吞吐量的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 浅谈Redis哨兵模式的使用

    浅谈Redis哨兵模式的使用

    这篇文章主要介绍了浅谈Redis哨兵模式的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论