Redis GEO地理位置

Redis 的 GEO是在3.2版本才有的 官方说明:Redis 3.2 contains significant changes to the API and implementation of Redis. A new set of commands for Geo indexing was added (GEOADD, GEORADIUS and related commands).

Redis GEO实现主要包含了以下两项技术: 使用geohash保存地理位置的坐标。 使用有序集合(zset)保存地理位置的集合。

GEOADD 增加某个地理位置的坐标; GEOPOS 获取某个地理位置的坐标; GEODIST 获取两个地理位置的距离; GEORADIUS 根据给定地理位置坐标获取指定范围内的地理位置集合; GEORADIUSBYMEMBER 根据给定地理位置获取指定范围内的地理位置集合; GEOHASH 获取某个地理位置的geohash值。

1.GEOADD 添加地理位置 GEOADD key longitude latitude member [longitude latitude member ...]

将给定的空间元素(纬度、经度、名字)添加到指定的键里面。 这些数据会以有序集合的形式被储存在键里面, 从而使得像 GEORADIUS 和 GEORADIUSBYMEMBER 这样的命令可以在之后通过位置查询取得这些元素。

GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。 GEOADD 能够记录的坐标是有限的: 非常接近两极的区域是无法被索引的。 有效的经度介于 -180 度至 180 度之间。 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。 当用户尝试输入一个超出范围的经度或者纬度时, GEOADD 命令将返回一个错误。 127.0.0.1:6379> geoadd user 116.38829803467 39.928901672363 "xiaoming" 121.4691562490 31.2323076784 "xiaohong" (integer) 2

2.GEOPOS 获取某个地理位置的坐标; GEOPOS key member [member ...] 从键里面返回所有给定位置元素的位置(经度和纬度)。

GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。 当给定的位置元素不存在时, 对应的数组项为空值。

127.0.0.1:6379> geopos user xiaoming 1) 1) "116.38829803467" 2) "39.928901672363"

3.GEODIST 获取两个地理位置的距离; GEODIST key member1 member2 [unit]

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

指定单位的参数 unit 必须是以下单位的其中一个: m 表示单位为米。 km 表示单位为千米。 mi 表示单位为英里。 ft 表示单位为英尺。 如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。 GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。 127.0.0.1:6379> geodist user xiaoming xiaohong m "1070429.1913"

4.GEORADIUS 根据给定地理位置坐标获取指定范围内的地理位置集合; GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

范围可以使用以下其中一个单位: m 表示单位为米。 km 表示单位为千米。 mi 表示单位为英里。 ft 表示单位为英尺。 在给定以下可选项时, 命令会返回额外的信息:

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

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

127.0.0.1:6379> georadius user 120 35 800 km WITHDIST 1) 1) "xiaoming" 2) "634.0595" 2) 1) "xiaohong" 2) "440.8323"

5.GEORADIUSBYMEMBER 根据给定地理位置获取指定范围内的地理位置集合; GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点。 GEORADIUSBYMEMBER可以根据给定地理位置获取指定范围内的地理位置集合。GEORADIUS命令传递的是坐标,GEORADIUSBYMEMBER传递的是地理位置。GEORADIUS更为灵活,可以获取任何坐标点范围内的地理位置。但是大多数时候,只是想获取某个地理位置附近的其他地理位置,使用GEORADIUSBYMEMBER则更为方便

127.0.0.1:6386> georadiusbymember user xiaoming 1500 km WITHDIST 1) 1) "xiaohong" 2) "1070.4292" 2) 1) "xiaoming" 2) "0.0000"

6.GEOHASH 获取某个地理位置的geohash值。 GEOHASH key member [member ...]

GEOHASH 命令返回一个数组, 数组的每个项都是一个 geohash 。 命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。

127.0.0.1:6386> geohash user xiaoming 1) "wx4g0kz6ey0"

4.应用场景: LBS(Location Based Service)基于位置的服务,它是通过电信移动运营商的无线电通讯网络(如GSM网、CDMA网)或外部定位方式(如GPS)获取移动终端用户的位置信息(地理坐标,或大地坐标) 常见的有,附近的位置,附近的人,摇一摇,获取两点之间的距离等等

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏美团技术团队

Android热更新方案Robust开源,新增自动化补丁工具

我们在之前的博客文章中介绍了高兼容性、高稳定性的实时热更新解决方案Robust之后,业内反响强烈,不断有读者咨询我们什么时候开源。今天我们非常高兴地宣布,Rob...

50250
来自专栏Ryan Miao

附近的人位置距离计算方法

附近的人的位置用经纬度表示,然后通过两点的经纬度计算距离。根据网上的推荐,最终采用geohash。 geohash的实现java版: 1 import ja...

63370
来自专栏编程

Shell 中的命令替换及参数扩展

今天和大家分享的主要是 “命令替换” 以及 “参数扩展” 。 -- 季文康 本文导航 ◈ 前言 00% ◈ 什么是命令替换 14% ◈ 1、一层 SHELL 嵌...

21890
来自专栏肖蕾的博客

图文并茂解释Kotlin == 和 === 之间的差异

11230
来自专栏码匠的流水账

聊聊storm trident batch的分流与聚合

storm-core-1.2.2-sources.jar!/org/apache/storm/trident/topology/TridentBoltExecu...

17510
来自专栏大数据

功能式Python中的探索性数据分析

这里有一些技巧来处理日志文件提取。假设我们正在查看一些Enterprise Splunk提取。我们可以用Splunk来探索数据。或者我们可以得到一个简单的提取并...

34910
来自专栏小文博客

小文’s blog — 奇妙的数字 –《蓝桥杯代码笔记2》

14250
来自专栏函数式编程语言及工具

Akka(2):Actor生命周期管理 - 监控和监视

  在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式。对比起我们习惯的行令式(imperative)编程模式,Actor...

39980
来自专栏林冠宏的技术文章

最近实现的一个分离文章内容功能,挺有意思,分享一下

这个功能的描述是: 把一本符合markdown语法写的书里面的所有大章节里面内容的每个大标题和该标题对应下的内容做分离,一 一对应。 一般会出现这种问题的场景:...

19260
来自专栏专注研发

poj-1017-packets

A factory produces products packed in square packets of the same height h and of...

8710

扫码关注云+社区

领取腾讯云代金券