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

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

本系列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.mzph.cn/news/864568.shtml

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

相关文章

半导体工艺的完美搭档 —— PEEK晶片夹

PEEK(聚醚醚酮 Polyetheretherketone)是一种高性能的工程塑料,以其耐高温、耐磨性、尺寸稳定性、低释气性和低吸湿性等特性,在电子半导体、光伏及液晶光电工业中得到广泛应用。 PEEK晶片夹作为其中的一种应用,具有以下…

液压件工厂的MES解决方案:智能生产,高效未来

一、引言 虽然我国液压件行业发展迅速,但是大多数液压件生产企业规模小、自主创新能力不足,大部分液压产品处于价值链中低端。且由于技术、工艺、设备及管理等多方面的限制,高端液压件产品研发生产水平不足,无法形成有效的供给&a…

如何在工作中应用六西格玛绿带培训所学的知识和技能?

近年来,六西格玛作为一种被广泛认可的质量管理工具,为企业提供了一种系统的、数据驱动的方法来优化流程、提高产品质量并减少成本。然而,仅仅接受培训是不够的,如何在工作中有效应用六西格玛绿带培训所学的知识和技能,…

力扣爆刷第1567之TOP100五连刷51-55(滑动窗口、零钱兑换、最小覆盖子串)

力扣爆刷第1567之TOP100五连刷51-55(滑动窗口、零钱兑换、最小覆盖子串) 文章目录 力扣爆刷第1567之TOP100五连刷51-55(滑动窗口、零钱兑换、最小覆盖子串)一、239. 滑动窗口最大值二、41. 缺失的第一个正数三、LCR 140. 训练计划…

录屏软件哪个好用?分享5款(2024最新)

随着网络时代的发展,电脑的使用频率也越来越高,还有近些年出现的网课、直播等,这让电脑的录屏功能显得更重要。随之而来的录屏软件也越来越多样化,选择一款好的软件是录屏至关重要的环节。 在数字浪潮汹涌的时代,录屏…

前端利用vue如何实现导入和导出功能.md

1. 前端利用vue如何实现导入和到处功能 1.1. 导入功能&#xff08;以导入Excel文件为例&#xff09; 1.1.1. 实现步骤: 1.1.1.1. 安装依赖: 首先&#xff0c;你需要安装处理Excel文件的库&#xff0c;如xlsx。1.1.1.2. 创建上传组件: 使用Element UI的<el-upload>组件或其…

【JavaScript脚本宇宙】从发票生成到网页保存:JavaScript PDF库指南

探索顶级JavaScript PDF库&#xff1a;高效处理PDF文档的利器 前言 随着数字化信息的普及和无纸化办公理念的深入&#xff0c;PDF文档因其高度兼容性和稳定性成为了存储、分享和展示信息的首选格式。为了满足不同用户对PDF文档生成和处理的需求&#xff0c;各类功能强大的Jav…

绘唐3一键追爆款文刻创作聚星文社

聚星文社是一个中国的文学社交平台&#xff0c;提供了一个让作家和读者相互交流和分享作品的平台。 在聚星文社&#xff0c;作家可以在平台上发布自己的作品&#xff0c;获得读者的阅读和评论&#xff0c;同时也可以与其他作家进行交流与学习。 点击下载即可 读者可以在平台上…

用质因数求解最大公约数(gcd)和最小公倍数(lcm)

用质因数求解最大公约数&#xff08;gcd&#xff09; 思路分析&#xff1a; 1、质因数&#xff1a;(素因数或质因子)他指的是能整除给定正整数的质数。例如&#xff1a;36可以分解为223*3&#xff0c;其中2和3就是质因数。 2、质因数求解最大公约数&#xff1a; 对每个数进行…

ai和数据分析常用工具:jupyer基本使用

jupyter使用 打开终端cmd windowr&#xff1a;在弹出的对话款里输入cmd&#xff0c;就会打开你的电脑终端。 虚拟环境搭建 不同项目或许需要的环境的版本或者包的版本不同&#xff0c;因此可以给指定项目创建指定的虚拟环境进行开发环境和所使用包的管理。 列出所有环境&a…

一、安全完善度等级SIL(Safety Integrity Level)介绍

目录 一、背景 二、定义 2.1 相关概念介绍如下&#xff1a; 2.2 扩展 2.3 注意事项 一、背景 在轨道交通行业中&#xff0c;安全完善度等级&#xff08;SIL&#xff0c;Safety Integrity Level&#xff09;是一个至关重要的概念&#xff0c;它用于评估安全相关系统&#x…

Linux基础IO操作详解

C文件IO相关接口 fopen函数 pathname: 要打开的文件名字符串mode: 访问文件的模式 模式描述含义“r”读文件不存在失败返回null“r”读写文件不存在打开失败返回null&#xff0c;文件存在则从头开始覆盖现有的数据&#xff08;不会清空数据&#xff09;“w”写文件不存在创建…

【报错】【Ubuntu】/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34‘ not found

1 报错 /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34 not found 2 分析 系统中的GNU C Library(glibc)版本不满足要求。 具体来说,该程序或库需要使用2.34版本的glibc,但系统中当前的glibc版本不满足这个要求。 首先,查看版本: strings /lib/x86_64-linux…

接口响应和预览id不一样

解决方案 让后端加上这个注解 ]sonserialize(using Tostringserializer.class) private Long id;

第6天:文件操作和异常处理

学习目标 掌握如何在Python中进行文件读写操作理解文件的打开模式学习如何处理文件中的数据理解异常处理的基本概念掌握使用try、except、else和finally进行异常处理 学习内容 1. 文件操作 在Python中&#xff0c;文件操作包括打开文件、读写文件内容和关闭文件。 文件的打…

马斯克公布xAI Grok-2大语言模型将于8月推出;GPT-5仍需时日

&#x1f989; AI新闻 &#x1f680; 马斯克公布xAI Grok-2大语言模型将于8月推出 摘要&#xff1a;7月1日&#xff0c;马斯克在X平台宣布&#xff0c;其人工智能初创公司xAI的新大语言模型Grok-2将于8月推出。此前&#xff0c;xAI已发布了Grok-1.5和Grok-1.5 Vision模型。马…

运营商如何通过PCDN技术提高用户服务?

着互联网的快速发展&#xff0c;用户对网络速度和质量的要求越来越高。为了满足这些需求&#xff0c;内容分发网络(CDN)成为了关键的基础设施。而在CDN技术中&#xff0c;PCDN(PersonalCDN)作为一种新兴的技术&#xff0c;为运营商和用户提供了新的解决方案。本文将重点介绍PCD…

Drools开源业务规则引擎(一)- 安装与介绍

文章目录 [toc] Drools开源业务规则引擎&#xff08;一&#xff09;- 安装与介绍0.何为规则引擎1.Drools介绍1.1.依赖模块1.2.规则引擎 2.Drools安装2.1.依赖导入2.2.规则的输入和输出类型输入类型输出类型 2.3.创建规则文件2.4.构建可执行规则库2.5.执行结果&#xff1a; 3.Dr…

FreeRTOS的任务操作

文章目录 3 FreeRTOS任务操作3.1 创建task3.2 删除task3.2.1 空闲&#xff08;idle&#xff09;任务&#xff08;守护任务&#xff09;3.2.2 钩子&#xff08;Hook&#xff09;函数 3.3 设置&#xff0c;获取&#xff0c;task优先级3.3.1 设置任务优先级3.3.2 获取任务优先级 3…

自动驾驶---Motion Planning之多段五次多项式

1 前言 在之前的博客系列文章中和读者朋友们聊过Apollo的 Motion Planning方案: 《自动驾驶---Motion Planning之LaneChange》 《自动驾驶---Motion Planning之Path Boundary》 《自动驾驶---Motion Planning之Speed Boundary》 《自动驾驶---Motion Planning之轨迹Path优化》…