Redis 7.x 系列【13】数据类型之地理位置(Geospatial)

news2024/10/6 20:53:25

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2. 常用命令
      • 2.1 GEOADD
      • 2.2 GEODIST
      • 2.3 GEORADIUS
      • 2.4 GEOPOS
      • 2.5 GEORADIUSBYMEMBER
    • 3. 应用场景

1. 概述

Geospatial 简称GEO,翻译过来是地理空间的意思,是 Redis 3.2 版本新增一种数据类型,底层的索引结构是 ZSet。主要用于存储地理位置信息,并对存储的信息进行操作。

2. 常用命令

所有命令:

命名描述
GEOADD将指定的地理空间位置(纬度、经度、名称)添加到指定的key
GEODIST返回两个给定位置之间的距离
GEOHASH返回一个或多个位置元素的 Geo hash 表示
GEOPOSkey 里返回所有给定位置元素的位置(经度和纬度)
GEORADIUS以给定的经纬度为中心, 找出某一半径内的元素
GEORADIUS_ROGEORADIUS 命令的只读变体,只是它不支持可选的 STORESTOREDIST 参数
GEORADIUSBYMEMBER找出位于指定范围内的元素,中心点是由给定的位置元素决定
GEORADIUSBYMEMBER_ROGEORADIUSBYMEMBER 命令的只读变体,只是它不支持可选的 STORESTOREDIST 参数
GEOSEARCH扩展了 GEORADIUS 命令,因此除了支持在圆形区域内搜索外,还支持在矩形区域内搜索
GEOSEARCHSTORE类似于 GEOSEARCH,但它将结果存储在目标键中

2.1 GEOADD

GEOADD 用于将给定的空间元素(纬度、经度、名字)添加到指定的键中,这些数据会以有序集合的形式被储存。

命令语法:

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

注意事项:

  • GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。
  • GEOADD 能够记录的坐标是有限的,非常接近两极的区域是无法被索引的。

精确的坐标限制由 EPSG:900913 / EPSG:3785 / OSGEO:41001 等坐标系统定义, 具体如下:

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

示例:

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEORADIUS Sicily 15 37 100 km
1) "Catania"
redis> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"

2.2 GEODIST

GEODIST 命令用于返回两个给定位置之间的距离。

注意事项:

  • 如果两个位置之间的其中一个不存在, 那么命令返回空值。
  • 在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。
  • 计算出的距离会以双精度浮点数的形式被返回。 如果给定的位置元素不存在, 那么命令返回空值。

命令语法:

GEODIST key member1 member2 [m|km|ft|mi]

参数说明:

  • member1 member2 :两个地理位置
  • [m|km|ft|mi]:距离单位,默认使用米作为单位
    • m :米,默认单位。
    • km :千米。
    • mi :英里。
    • ft :英尺。

示例:

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEODIST Sicily Palermo Catania km
"166.2742"
redis> GEODIST Sicily Palermo Catania mi
"103.3182"
redis> GEODIST Sicily Foo Bar
(nil)

2.3 GEORADIUS

GEORADIUS 命令是用于根据给定的经纬度和半径,查询指定键中存储的地理位置信息的有序集合附近的元素。

允许你根据给定的经纬度和半径来查询附近的位置信息,并可以返回丰富的结果集,包括位置的经纬度、与查询点的距离以及Geohash值等。通过合理地使用这些选项,可以轻松地实现各种基于位置的搜索和查询功能。

命令语法:

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

参数说明:

  • keyRedis中存储地理位置信息的有序集合的名称。
  • longitudelatitude:查询点的经度和纬度。
  • radius:查询半径,可以指定单位(m表示米,km表示千米,ft表示英尺,mi表示英里)。
  • WITHCOORD:返回结果中包含元素的经纬度信息。
  • WITHDIST:返回结果中包含元素与查询点的距离。
  • WITHHASH:返回结果中包含元素的Geohash值。
  • COUNT count:限制返回结果的数量。
  • ASC|DESC:按距离排序结果,默认为升序(ASC),可选降序(DESC)。
  • STORE key:将结果存储到另一个键中,而不是直接返回。
  • STOREDIST key:将结果和对应的距离存储到另一个键中,结果是一个包含两个元素的数组(成员和距离)。

示例:

# 添加 Palermo、Catania的位置信息
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
# 查询 15.37 200千米内的所有位置
redis> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"
redis> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"

2.4 GEOPOS

GEOPOS 命令用于从给定的 key 里返回所有指定名称的位置(经度和纬度),不存在的返回 nil

命令语法:

GEOPOS key member [member ...]

注意事项:

  • 因为该命令接受可变数量的位置元素作为输入, 所以即使用户只给定了一个位置元素, 命令也会返回数组回复。
  • GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。 当给定的位置元素不存在时, 对应的数组项为 nil

示例:

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOPOS Sicily Palermo Catania NonExisting
1) 1) "13.36138933897018433"
   2) "38.11555639549629859"
2) 1) "15.08726745843887329"
   2) "37.50266842333162032"
3) (nil)

2.5 GEORADIUSBYMEMBER

GEORADIUSBYMEMBERGEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是其中心点是由给定的位置元素(位置名称)决定的, 而不是使用经度和纬度来决定中心点。

基本语法:

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]

示例:

redis> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"

3. 应用场景

Geospatial 提供了对地理位置信息的存储和查询能力,常用于基于位置的服务(LBS),例如:

  • 查找附近的商家、餐馆、景点,社交网络中展示附近的人或活动。
  • 根据经纬度计算两点距离
  • 按照距离排序查询景点、商家等

在地图应用中,搜索附近酒店、美食店等是一个很常用的功能,例如,在火车站附近所有酒店时,默认会显示一公里之内的所有酒店并按照距离进行排序:

在这里插入图片描述
在实际应用场景中,Geospatial 只适用于简单定位功能,针对复杂的导航、路线规划等地图相关功能,请选择专业的第三方导航产品,比如百度、高德地图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 和C#的差别

首先把眼睛瞪大,然后憋住一口气,读下去: 1、CPP 就是C plus plus的缩写,中国大陆的程序员圈子中通常被读做"C加加",而西方的程序员通常读做"C plus plus",它是一种使用非常广泛的计算…

​RAG与LLM原理及实践(8)--- Chroma 应用场景及限制

前言 通过前面几节的介绍,你应该对Chroma的运作原理有相当透彻的理解。Chroma的设计正如之前描述的: Chroma提供的工具: 存储文档数据和它们的元数据:store embeddings and their metadata 嵌入:embed documents an…

仓库管理系统25--数据导出

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.DataExportView"xmlns"http://schemas.microsof…

融云 CEO 董晗获颁 EqualOcean「2024 出海全球化服务 30 人」

6 月 26 日-27 日&#xff0c;EqualOcean 全球化百人论坛 &#xff08;GGF2024&#xff09;及颁奖盛典在深圳举办&#xff0c;融云 CEO 董晗荣登“2024 出海全球化服务 30 人”榜单。 作为全球商业信息平台和智库&#xff0c;EqualOcean 设立“出海全球化服务 30 人榜单”&am…

u盘里的数据全部不见了怎么恢复?这些方法你试过吗

在快节奏的工作和生活中&#xff0c;U盘作为我们随身携带的数据存储工具&#xff0c;承载了无数重要的文件和资料。然而&#xff0c;有时我们会突然发现U盘里的数据全部不见了&#xff0c;这无疑会给我们带来巨大的困扰和焦虑。面对这种情况&#xff0c;不要慌张&#xff0c;本…

2小时动手学习扩散模型(pytorch版)【入门版】【代码讲解】

2小时动手学习扩散模型&#xff08;pytorch版&#xff09; 课程地址 2小时动手学习扩散模型&#xff08;pytorch版&#xff09; 课程目标 给零基础同学快速了解扩散模型的核心模块&#xff0c;有个整体框架的理解。知道扩散模型的改进和设计的核心模块。 课程特色&#xf…

OpenCV 车牌检测

OpenCV 车牌检测 级联分类器算法流程车牌检测相关链接 级联分类器 假设我们需要识别汽车图像中车牌的位置&#xff0c;利用深度学习目标检测技术可以采取基于锚框的模型&#xff0c;但这需要在大量图像上训练模型。 但是&#xff0c;级联分类器可以作为预训练文件直接使用&…

云数据中心运维新纪元:让Linux服务器如虎添翼

文章目录 一、Linux系统管理的高级技巧1. 性能调优与监控&#xff1a;2. 自动化与脚本编写&#xff1a;3. 文件系统与存储管理&#xff1a; 二、服务器配置优化的策略1. 硬件选型与配置&#xff1a;2. 网络配置与优化&#xff1a;3. 应用部署与调优&#xff1a; 三、安全策略的…

FPGA程序设计

在设计FPGA时&#xff0c;多运用模块化的思想取设计模块&#xff0c;将某一功能设计成module。 设计之前要先画一下模块设计图&#xff0c;列出输入输出接口&#xff0c;再进一步设计内部功能。 状态机要画图&#xff0c;确定每个状态和状态之间怎么切换。状态用localparam定…

Taro + vue3 中微信小程序中实现拉起支付

在前端开发中 H5 的拉起支付和微信小程序的拉起支付 是不太一样的 现在分享一下微信小程序中的拉起支付 逻辑都在后端 我是用的Taro 框架 其实就是一个Api Taro 文档

Nacos2.3.x动态刷新不生效

1.日志分析 Ignore the empty nacos configuration and get it based on dataId[null.yaml] & group[DEFAULT_GROUP] Ignore the empty nacos configuration and get it based on dataId[null-local.yaml] & group[DEFAULT_GROUP] 从日志文件分析中可以得到 dataId[n…

JAVA 在服务器上创建文件夹

JAVA 在服务器上创建文件夹 在服务器端开发中&#xff0c;我们经常需要在服务器上创建文件夹来存储文件或其他资源。本文将介绍使用JAVA在服务器上创建文件夹的方法&#xff0c;并提供相应的示例代码。 创建文件夹的基本概念 在JAVA中&#xff0c;我们可以使用File类来操作文…

在C#中使用RabbitMQ做个简单的发送邮件小项目 _

前言 好久没有做项目了&#xff0c;这次做一个发送邮件的小项目。发邮件是一个比较耗时的操作&#xff0c;之前在我的个人博客里面回复评论和友链申请是会通过发送邮件来通知对方的&#xff0c;不过当时只是简单的进行了异步操作。那么这次来使用RabbitMQ去统一发送邮件&#x…

redhawk:tech file与lefdef layer name不匹配问题

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 一些工艺厂商给的redhawk tech file是加密的&#xff0c;读完tech file再读lef/def会报错&#xff0c;根本不知道问题在哪&#xff0c;他们一般会搭配给一个layer map&#xff…

【084】基于SpringBoot实现的家乡特色推荐系统

系统介绍 视频演示 点击查看演示视频 基于SpringBoot实现的家乡特色推荐系统主要采用SpringBootVue进行开发&#xff0c;系统整体分为管理员、用户两种角色&#xff0c;主要功能包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;文章分类管理&#xff0c;文章分…

【愤怒的小方块案例 Objective-C语言】

一、我们来做这个愤怒的小方块啊, 1.我们新建一个项目, Name:18-愤怒的小方块, Dynamic,不能够处理圆形的View,Dynamic都是方的,如果你想处理圆的View的话,需要用另外一个东西,什么Kit,专门做游戏的一个iOS框架, 首先,我们把这个项目的竖屏,去掉勾选,只留一个Lan…

ThreeJS-3D教学十四:ShaderMaterial(length、fract、step)

length() 内置函数可以获取向量的长度&#xff0c; 这里用 vUv 计算每个像素离原点(0.0, 0.0)位置的距离 dist&#xff0c;将其设置到颜色上&#xff0c; 会得到圆心在左下角的1/4渐变圆形效果&#xff0c;左上角(0.0, 1.0)和右下角(1.0, 0.0)离原点距离都是1&#xff0c; 对应…

雷池WAF+Modsecurity安装防护及系统加固

君衍. 一、雷池WAF1、什么是雷池2、什么是WAF3、雷池的功能4、WAF部署架构5、整体检测流程 二、雷池WAF环境依赖1、查看本地CPU架构2、Docker安装2.1 卸载旧版本2.2 安装yum-utils工具包2.3 设置镜像仓库2.4 安装docker2.5 启动docker并查看版本 3、Docker Compose安装3.1 卸载…

flex布局中子元素内容超出时,子元素本身出现滚动条实现方法

flex布局中子元素宽度平均分配&#xff0c;并且当子元素内容超出时&#xff0c;子元素本身出现滚动条实现方法&#xff1a; 将父元素设置为display: flex&#xff0c;以启用Flexbox布局。将每个子元素的flex属性设置为1&#xff0c;以使其宽度平均分配。设置子元素的overflow属…