文章目录

  • Redis学习笔记-GEO经纬度编码原理&地理划分
    • 1.笔记图
    • 2.GEO 应用场景
    • 3.GEO 数据特点举例
    • 4.GeoHash 的编码方法(二分区间,区间编码)
    • 5.GEO 经纬度编码组合
    • 6.地理位置划分举例
    • 7.GEO 相关命令

Redis学习笔记-GEO经纬度编码原理&地理划分

在日常生活中,我们经常使用手机搜索附近的餐馆,或者在打车软件上打车,都需要获取用户和服务商之间位置信息,而 Redis 提供了一种可以查询地理位置信息的数据结构 GEO,其底层实现原理和 有序集合(Sorted Set) 的原理一样,我们知道有序集合数据特点就是每个值有对应的权重(score),这篇文章学习一下 GEO 如何对经纬度编码,然后通过这种编码实现 有序集合(Sorted Set)中就有了权重(score)了,这样就能快速找到相邻经纬度信息的数据了。

1.笔记图

2.GEO 应用场景

  • 搜索附近的餐馆
  • 在打车软件上叫车

3.GEO 数据特点举例

  • 网约车都有编号(如 33),网约车要将自己的经纬度信息(如 116.034579 39.000452)发给叫车应用
  • 用户叫车的时候,叫车应用会根据用户的位置(如 116.054579,39.030452)查找附近车辆
  • key(例如车 ID)对应一个 value(一组经纬度)

4.GeoHash 的编码方法(二分区间,区间编码)

  • 对经度值的范围做多次分区,当做完 N 次二分区后,经度值就可以用 N bit 的数来表示了
  • 第一次二分区:经度范围 [-180,180] 会被分成两个子区间:[-180,0)[0,180](左、右分区),要查询的经度落在左分区就用 0``表示,否则用1表示,如经度115第一次二分区编码1`
  • 第二次分区:如经度 115 第一次落在 [0,180] 区间,第二次二分区就把 [0,180] 分成 [0,90)[90,180]115 落在 [90,180] ,第二次分区的编码 1
  • 第三次二分区:如经度 115 第二次落在 [90,180] 区间,第三次二分区就把 [90,180] 分成 [90,135)[135,180]115 落在 [90,135),第三次分区的编码 0
  • 第四次二分区:如经度 115 第三次落在 [90,135) 区间,第四次二分区就把 [90,135) 分成 [90,112.5)[112.5,135]115 落在 [112.5,135],第四次分区的编码 1
  • 第五次二分区:如经度 115 第四次落在 [112.5,135] 区间,第五次二分区就把 [112.5,135] 分成 [112.5,123.75)[123.75,135]115 落在 [112.5,123.75),第五次分区的编码 0
  • 五次编码综合11010

Tips:维度的编码和经度类似,维度范围是 [-90,90]

5.GEO 经纬度编码组合

  • 组合规则:最终编码值的偶数位上依次是经度的编码值,奇数位上依次是纬度的编码值,偶数从第 0 位开始,奇数从第 1 位开始
  • 作用:原来无法用一个权重分数表示的一组经纬度(116.37,39.86)就可以用 1110011101 这一个值来表示,就可以保存为 Sorted Set 的权重分数了,这样在查找附近的数据时就很方便了。

6.地理位置划分举例

  • 使用 GeoHash 编码后,相当于把整个地球地理空间划分成了一个个方格,每个方格对应了 GeoHash 中的一个分区,举例:

  • 把经度区间 [-180,180] 做一次二分区,把纬度区间 [-90,90] 做一次二分区,就会得到 4 个分区

    • 分区一[-180,0)[-90,0),编码 00
    • 分区一[-180,0)[-90,0),编码 00
    • 分区二[-180,0)[0,90],编码 01
    • 分区三[0,180][-90,0),编码 10
    • 分区四[0,180][0,90],编码 11
  • 作用:使用 Sorted Set 范围查询得到的相近编码值,在实际的地理空间上,也是相邻的方格,这就可以实现 搜索附近的人或物 的功能了

  • 特殊情况处理

    • 有的编码值虽然在大小上接近,但实际对应的方格却距离比较远

    • 为了避免查询不准确问题,我们可以同时查询给定经纬度所在的方格周围的 4 个或 8 个方格

7.GEO 相关命令

  • GEOADD 命令
  • 用于把一组经纬度信息和相对应的一个 ID 记录到 GEO 类型集合中
  • 假设车辆 ID33,经纬度位置是(116.034579,39.030452),我们可以用一个 GEO 集合保存所有车辆的经纬度,集合 keycars:locations
GEOADD cars:locations 116.034579 39.030452 33
  • GEORADIUS 命令
  • 用户想要寻找自己附近的网约车时,LBS 应用就可以使用 GEORADIUS 命令
  • 查找以这个经纬度为中心的 5 公里内的车辆信息,并返回给 LBS 应用
GEORADIUS cars:locations 116.054579 39.030452 5 km ASC COUNT 10

扫码关注

Redis学习笔记-GEO经纬度编码原理地理划分相关推荐

  1. Redis学习笔记(B站狂神说)(自己总结方便复习)

    Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...

  2. Redis学习笔记(一) 数据类型事务异常Jredis

    Redis学习笔记(一) NoSql概述 Nosql四大分类 Redis入门 简介 Windows安装 基础使用 问题 Redis4.0之前为什么是单线程 单线程为什么这么快 Redis4.0后的多线 ...

  3. Redis学习笔记②实战篇_黑马点评项目

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  4. Redis学习笔记1-理论篇

    目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...

  5. Redis(学习笔记)

    Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...

  6. Redis学习笔记①基础篇_Redis快速入门

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  7. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

  8. Redis学习笔记---Redis的主从复制

    Redis学习笔记-Redis的主从复制 1.Redis的高可用性 高可用性(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性. Rei ...

  9. 宽带接入与无线网络(学习笔记一)——VLAN原理

    宽带接入与无线网络(学习笔记一)--VLAN原理 1. VLAN的概念及作用 1.1 VLAN的概念 1.2 VLAN的作用 2. 广播域的分割 2.1为什么需要隔离广播域 2.2 如何分割广播域 3 ...

最新文章

  1. byte转文件流 下载到本地
  2. 《CUDA C编程权威指南》——3.4 避免分支分化
  3. C#自动弹出窗口并定时自动关闭
  4. 华为笔记本Win11更新时由于驱动问题引起蓝牙鼠标经常断开问题解决方法
  5. flask blueprint
  6. python机器学习彩票_Python机器学习及实战kaggle从零到竞赛PDF电子版分享
  7. 百面机器学习—8.概率图模型之HMM模型
  8. 每日N题—数据结构题集
  9. 统一建模语言 UML
  10. 记录自己装AMD黑苹果安装
  11. 《wifi加密破解论文》翻译介绍-wifi不再安全
  12. 网站被微信屏蔽的原因及微信域名防封的办法
  13. tc7102路由器虚拟服务器,国内电信推首款WiFi 6+路由器TC7102,5G和WiFi 6成黄金搭档-贤集网...
  14. IP协议详解【IP报文头部结构、IP分片、IP路由、IP转发】
  15. centos下的vim安装
  16. 安装Phoenix时,执行./splline.py报错File “./sqlline.py“, line 25, in <module> import phoenix_utils File
  17. stpcpy和stpncpy用法 strcpy和strncpy用法
  18. Python——报错:WindowsError:[Error 1(...)](WindowsError错误码解释)
  19. 查看U盘、移动硬盘是否被分区(windows)
  20. 数据治理专业认证CDMP学习笔记(思维导数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第11章数据仓库和商务智能篇...

热门文章

  1. 生理期是女孩变美的黄金期
  2. Java String类概述
  3. 除了IPv4,还有IPv5、IPv6、IPv7和IPv9,IPv10
  4. uniapp 画布绘制二维码,图片,文字的方法
  5. 有哪些有趣、有教育性的模拟黑客游戏?
  6. mysql unique 重复_Mysql中 unique列插入重复值该怎么解决呢
  7. java中实现方法重试机制
  8. Android - 分转元、元转分 金额工具类
  9. 视频下载神器you-get使用方法
  10. 什么是适配器模式?适配器模式的优点和缺点?