Redis——GEO

Redis GEO Redis GEO扩展功能为用户提供了强大的地理空间数据处理能力。通过使用GEO命令,可以方便地实现地理位置信息的存储、查询和分析。在实际应用中,应根据具体场景和需求,选择合适的GEO命令和性能优化策略。 阅读详情

目录

GEOHASH算法原理及实现

基本原理

Geohash算法的三步骤

首先将经纬度变成二进制。

第2步,就是将经纬度合并。

第3步,按照Base32进行编码

GEO数据结构

GEOADD

1.1 GEOADD概念

1.2 GEOADD命令

1.3 GEOADD示例

GEODIST

2.1 GEODIST概念

2.2 GEODIST命令

2.3 GEODIST示例

GEOPOS

3.1 GEOPOS概念

3.2 GEOPOS命令

3.2 GEOPOS示例

GEOHASH

4.1 GEOHASH概念

4.2 GEOHASH命令

4.3 GEOHASH示例

GEORADIUS

5.1 GEORADIUS概念

5.2 GEORADIUS命令

5.3 GEORADIUS示例

GEORADIUSBYMEMBER

6.1 GEORADIUSBYMEMBER概念

6.2 GEORADIUSBYMEMBER命令

6.3 GEORADIUSBYMEMBER示例


GEOHASH算法原理及实现

        需求:假如在抖音中发布视频时,可以选择带上位置信息,请设计一种数据结构或方案,用于存储检索位置信息(简化为平面坐标 x, y),以实现搜索附近视频的功能(如附近 3km)。

Geohash算法就是将经纬度编码,将二维变一维,给地址位置分区的一种算法。

基本原理

GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串

我们知道,经度范围是东经180到西经180,纬度范围是南纬90到北纬90,我们设定西经为负,南纬为负,所以地球上的经度范围就是[-180, 180],纬度范围就是[-90,90]。如果以本初子午线、赤道为界,地球可以分成4个部分。

如果纬度范围[-90°, 0°)用二进制0代表,(0°, 90°]用二进制1代表,经度范围[-180°, 0°)用二进制0代表,(0°, 180°]用二进制1代表,那么地球可以分成如下4个部分

如果在小块范围内递归对半划分呢?

可以看到,划分的区域更多了,也更精确了。geohash算法就是基于这种思想,划分的次数更多,区域更多,区域面积更小了。通过将经纬度编码,给地理位置分区

Geohash算法的三步骤

Geohash算法一共有三步。

首先将经纬度变成二进制。

比如这样一个点(39.923201, 116.390705)
纬度的范围是(-90,90),其中间值为0。对于纬度39.923201,在区间(0,90)中,因此得到一个1;(0,90)区间的中间值为45度,纬度39.923201小于45,因此得到一个0,依次计算下去,即可得到纬度的二进制表示,如下表:

最后得到纬度的二进制表示为:

  10111000110001111001

同理可以得到经度116.390705的二进制表示为:

  11010010110001000100

第2步,就是将经纬度合并。

经度占偶数位,纬度占奇数位,注意,0也是偶数位。

  11100 11101 00100 01111 00000 01101 01011 00001

第3步,按照Base32进行编码

Base32编码表的其中一种如下,是用0-9、b-z(去掉a, i, l, o)这32个字母进行编码。具体操作是先将上一步得到的合并后二进制转换为10进制数据,然后对应生成Base32码。需要注意的是,将5个二进制位转换成一个base32码。上例最终得到的值为

  wx4g0ec1

Geohash比直接用经纬度的高效很多,而且使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。

  • GeoHash用一个字符串表示经度和纬度两个坐标。在数据库中可以实现在一列上应用索引(某些情况下无法在两列上同时应用索引)
  • GeoHash表示的并不是一个点,而是一个矩形区域
  • GeoHash编码的前缀可以表示更大的区域。例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地点搜索

编码越长,表示的范围越小,位置也越精确。因此我们就可以通过比较GeoHash匹配的位数来判断两个点之间的大概距离。

问题

geohash算法有两个问题。首先是边缘问题。

如图,如果车在红点位置,区域内还有一个黄点。相邻区域内的绿点明显离红点更近。但因为黄点的编码和红点一样,最终找到的将是黄点。这就有问题了。

要解决这个问题,很简单,只要再查找周边8个区域内的点,看哪个离自己更近即可。

另外就是曲线突变问题。

本文第2张图片比较好地解释了这个问题。其中0111和1000两个编码非常相近,但它们的实际距离确很远。所以编码相近的两个单位,并不一定真实距离很近,这需要实际计算两个点的距离才行。


 


GEO数据结构


GEOADD

1.1 GEOADD概念

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

  GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。 GEOADD 能够记录的坐标是有限的: 非常接近两极的区域是无法被索引的。 精确的坐标限制由 EPSG:900913 / EPSG:3785 / OSGEO:41001 等坐标系统定义, 具体如下:

        有效的经度介于 -180 度至 180 度之间。

        有效的纬度介于 -85.05112878 度至 85.05112878 度之间。

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

1.2 GEOADD命令

        时间复杂度: 每添加一个元素的复杂度为 O(log(N)) , 其中 N 为键里面包含的位置元素数量。

        命令demo: GEOADD key longitude latitude member [longitude latitude member ...]

        命令描述:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。

        返回值:添加到sorted set元素的数目,但不包括已更新score的元素。

1.3 GEOADD示例


GEODIST

2.1 GEODIST概念

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

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

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

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

        如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

  GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

2.2 GEODIST命令

复杂度: O(log(N))

命令demo: GEODIST key member1 member2 [unit]

2.3 GEODIST示例


GEOPOS

3.1 GEOPOS概念

        从键里面返回所有给定位置元素的位置(经度和纬度)。

        因为 GEOPOS 命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。

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

3.2 GEOPOS命令

时间复杂度: 获取每个位置元素的复杂度为 O(log(N)) , 其中 N 为键里面包含的位置元素数量。

命令demo: GEOPOS key member [member ...]

3.2 GEOPOS示例


GEOHASH

4.1 GEOHASH概念

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

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

4.2 GEOHASH命令

时间复杂度: 寻找每个位置元素的复杂度为 O(log(N)) , 其中 N 为给定键包含的位置元素数量。

命令demo: GEOHASH key member [member ...]

命令描述:返回一个或多个位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash

4.3 GEOHASH示例


GEORADIUS

5.1 GEORADIUS概念

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

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

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

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

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

WITHCOORD : 将位置元素的经度和维度也一并返回。

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

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

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

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

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

GEORADIUS 命令返回一个数组, 具体来说:

  • 在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 ["New York","Milan","Paris"] 这样的线性(linear)列表。
  • 在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。

在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。 至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:

  • 以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。
  • geohash 整数。
  • 由两个元素组成的坐标,分别为经度和纬度。

5.2 GEORADIUS命令

时间复杂度: O(N+log(M)), 其中 N 为指定半径范围内的位置元素数量, 而 M 则是被返回位置元素的数量。

命令demo: GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

5.3 GEORADIUS示例


GEORADIUSBYMEMBER

6.1 GEORADIUSBYMEMBER概念

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

时间复杂度: O(log(N)+M), 其中 N 为指定范围之内的元素数量, 而 M 则是被返回的元素数量。

6.2 GEORADIUSBYMEMBER命令

命令: GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

6.3 GEORADIUSBYMEMBER示例

Redis GEO 功能解析 Redis GEO 是 Redis 数据库提供的一个强大的地理位置信息处理功能。通过一系列的命令,Redis GEO 可以轻松地存储、查询和计算地理位置信息,适用于多种实际应用场景。尽管 Redis GEO 有一些限制,但它的性能和易用性使其成为处理地理位置信息的优秀选择。 阅读详情

相关推荐

【Redis7】10大数据类型之GEO类型

GEO数据类型非常适合需要处理地图、定位服务或者任何与地理位置相关的应用程序,比如餐饮外卖服务的门店定位、出行应用中的路线规划等场景。Redis的GEO(地理空间)数据类型是一种特殊的数据结构,用于存储地理位置信息并执行地理位置相关的操作。由于这里的数据比很少,示例效果不太好.大家明白熟悉命令就行.感兴趣的话,可以自己去添加一些数据.:将地理位置的坐标转化为一个唯一的字符串编码(GeoHash),这有助于快速索引和查询。:查询指定位置周围的地点,基于给定的最大距离(半径)。

云泽野の编程日记 1647

Redis Geospatial地理位置

Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。 文档:https://www.redis.net.cn/order/3687.html 只有六个命令 geoadd:添加地理位置的坐标。 geopos:获取地理位置的坐标。 geodist:计算两个位置之间的距离。 georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。 georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。 geohash:返回一

MW 802

Redis-GEO

Redis-GEO 一. Redis的GEO特性 Redis3.2版本提供了GEO功能,支持存储地理位置信息用来实现诸如摇一摇,附近位置这类依赖于地理位置信息的功能。 二. 命令 2.1 增加地理位置信息 命令:geoadd key longitude latitude member[longitude latitude member…] 例如:geoadd cities:locati............

sunhuiliang85的专栏 4525

redis GEO 类型原理及命令详解

我们有一个需求是用户搜索附近的店铺,就是所谓的位置信息服务(Location-Based Service,LBS)的应用。这样的相关服务我们每天都在接触,用滴滴打车,中午去美团订外卖等等。当我们用这些服务方便我们的生活的时候,大家有没有想过是怎么实现的。目前市场上很多软件比如Es,Redis 都提供了类似的功能,他们底层都是用的GeoHash 编码,只不过底层的数据结构不同。今天主要讲的是Redis 的 Geo 如何实现这个功能。

擅长后端研发 5131

Redis GEO详解

redis GEO: redis GEO主要用于存储地理位置信息,并对存储的信息进行操作,该功能在Redis 3.2版本新增。 redis GEO操作方法: geoadd:添加地理位置的坐标 geopos:获取地理位置的坐标 geodist:计算两个位置之间的距离 georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合 georadiusbymember:根据存储在位置集合里面的某个地点获取指定范围内的地理位置集合 geohash:返回一个或多个位置对象的geohash值

li_w_ch的博客 1871

Redis——GeoHash原理与应用

摘要 Redis 在 3.2 版本以后增加了地理位置 GEO 模块,意味着我们可以使用 Redis 来实现摩拜单车「附近的 Mobike」、美团和饿了么「附近的餐馆」这样的功能了。 用数据库来算附近的人 地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90,90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。比如掘金办公室在望京 SOHO,它的经纬度坐标是 (116.48105,39.996794),都是正数,因为

庄小焱 1399

【Redis】之Geo

对Geo的基本命令和Spring命令的概述,并且进行简单举例

weixin_73060900的博客 1662

如何使用windows搭建一个公网ftp/sftp服务器

在有公网ip的情况下,使用windows系统搭建一个ftp/sftp服务器会带来很多的方便,可以实现远程移动端的一键式访问,对于文件的备份、多设备的共享都十分的方便。然而网上许多的教程都是基于windows自带的iis搭建一个局域网ftp服务器,然而在搭建好后,我想要通过端口映射的方式实现在外网访问时,却发现连接不上的问题,感觉可能是因为windows家庭版的原因导致的。因此在查阅很多资料之后终于找到了一个公网ftp/sftp服务器的搭建方式,实测可用。这里把流程记录一下,做一个备忘录,也方便大家搭建。

weixin_43354138的博客 1万+

Redis用GEO实现附近的人功能

GEO就是的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)GEODIST:计算指定的两个点之间的距离并返回GEOHASH:将指定member的坐标转为hash字符串形式并返回GEOPOS:返回指定member的坐标。

时间如瑾 代码如诗 3570

Educoder | 计算机网络实验-IP协议分析

本关任务:使用 Ping 命令发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IPV4 地址的编址方法,加深对 IP 协议的理解。

Mksg_28的博客 4760

KALI虚拟机挂代理教程

需要你本地挂了代理,然后通过虚拟机连接本机代理端口,不说废话了,直接说怎么做了。 1.查看选项设置中自己的小飞机的本地端口是多少:(默认是1080) 2.本机win+r打开cmd,输入ipconfig查看本地ip,我的本地ip是192.168.0.107: 2.打开kali虚拟机,编辑ProxyChains配置文件: vi /etc/proxychains.conf 3.在文件末尾的ProxyList中添加物理机本地ip和1080端口作为代理地址: 4.保存并退出即可: esc :wq 回车 5.

qq_34853514的博客 3万+

Redis的GEO详解

Redis 的 GEO(Geographic)模块是用于处理地理位置信息的工具集,主要支持等功能。其底层基于有序集合(ZSET)实现,利用了 ZSET 的排序特性来管理地理位置的排序和查询。

zwh1zwh的博客 1500

5分钟搞懂双目相机标定:从棋盘格到3D点云的完整流程(附Python代码)

本文详细介绍了双目相机标定的完整流程,从棋盘格准备到3D点云生成,涵盖单目标定、双目标定、立体校正、视差计算等关键步骤。通过Python代码示例,帮助读者快速掌握双目立体视觉技术,实现高精度的3D重建。特别适合机器人导航、工业检测等应用场景。

weixin_29100399的博客 588

redis geo hyperloglog zset

实现 Redis GEO、HyperLogLog 和 ZSET 的教程 在现代开发中,Redis 是一个非常强大的工具,可以有效地处理各种数据结构,如 GEO(地理位置)、HyperLogLog(计数基数)和 ZSET(有序集合)。本文将详细阐述如何实现这些数据结构的基本操作,帮助刚入行的小白开发者掌握其使用方法。 整体流...

weixin_37065388的博客 113

边缘AI工业落地:YOLO26-Seg + RK3588 NPU 极致部署(低功耗+实时实例分割,工业场景全覆盖)

本次实战汇总了「YOLO26-Seg+RK3588 NPU」工业边缘部署中最常见、最致命的8个坑点,所有坑点均来自真实工业项目,解决方案均为零代码/一键操作,无需复杂配置,能让你少走90%的弯路,节省大量时间,必看必记!❌ RKNN转换报错「算子不支持/模型加载失败」→ ✅ 导出ONNX时必须指定opset=12,重新导出即可,RK3588唯一兼容版本;❌ 分割mask错位/轮廓模糊 → ✅ 导出ONNX时加,并保证RKNN的归一化参数与YOLO26一致,零代码修复;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1719

redis之GEO 模块

redis之GEO 模块

SO_zxn的博客 915

YOLOv11模型改进全攻略:利用轻量化模块实现精度与速度双跃升

如果你在实操中遇到模块替换导致的精度骤降或部署报错,不妨尝试调整轻量化模块的替换比例,或针对性地保留关键层的原始结构。记住,轻量化的核心是“在精度损失可接受的范围内最大化提升效率”,只要结合业务场景灵活取舍,你也能让YOLOv11在资源受限的环境中大放异彩。接下来,我们从模块选型到代码集成,一步步带你打造“轻量且能打”的YOLOv11,真正帮你解决工业落地中的效率与精度痛点。训练过程中关注模型的mAP和推理速度,若精度下降过多,可调整模块替换的比例(如仅替换Backbone的部分卷积层)。

m0_64661770的博客 502

地理位置数据存储方案——Redis GEO

地理位置数据存储方案之redis-geo探索:基础介绍与源码解析。

程序员架构进阶 7794

Yocto系列讲解[入门篇] 2 - 演示运行qemux86-64虚拟机

手把手教大家怎么编译Yocto,并运行一个qemux86虚拟机

fulinux的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Redis——GEO讲解

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作

Onlylong1的博客 6533

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

redis系列-GEO

GEO是redis 3.2 版本新增的一种数据类型,主要用于存储地理空间位置信息,并且对这些信息进行操作。常见的应用场景就是位置信息服务,比如说最近的美食店铺,最近的出租车等等。一般位置信息服务底层使用的都是GEOHash编码方法,比如说ElasticSearch和Redis基于该编码方法提供了相关功能实现。

zhuohuashiyi 1123

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 操作系统——调度算法
下一篇: Redis实战——实现类附近商铺功能
486过于烦躁
博客等级 码龄6年 17粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值