SpringBoot查询指定范围内的坐标点

使用Redis geo实现

redis geo是基于Sorted Set来实现的

Redis 3.2 版本新增了geo相关命令,用于存储和操作地理位置信息。提供的命令包括添加、计算位置之间距离、根据中心点坐标和距离范围来查询地理位置集合等,说明如下:

geoadd:添加地理位置的坐标。

geopos:获取地理位置的坐标。

geodist:计算两个位置之间的距离。

georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。

geohash:返回一个或多个位置对象的 geohash 值

测试:

添加坐标点: geoadd region 117.130313 31.84504 "shuxihu" 117.143635 31.838962 "chanyeyuan" 117.143635 31.838962 "shiyanxiaoxue" 117.123423 31.842912 "aolai" 117.207504 31.879882 "zhiwuyuan"

// 查询距离117.130313 31.84504半径1000米地点信息

georadius region 117.130313 31.84504 1000 m

执行结果:

SpringBoot与redis geo整合

springframework中已经加入了对redis geo的支持,相关的类都在org.springframework.data.geo包下。而对redis的命令行交互,也提供了org.springframework.data.redis相关的类来支持相关开发。

为了在项目中方便使用,整理工具代码如下,主要封装了:

1、添加元素到redisgeo;

2、计算某指定集合下,给定中心和查询范围,获取区域内成员的方法;

3、计算两个成员的距离

4、查询某指定成员(数组)的位置信息

package com.octv.cloud.ota.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author xiaoss* @since 1.0, 2023年02月27日 11:31:45*/
@RestController
@RequestMapping("test")
public class TestController {@Autowiredprivate RedisTemplate<String,String> redisTemplate;/*** 添加节点及位置信息* @param geoKey 位置集合* @param pointName 位置点标识* @param longitude 经度* @param latitude 纬度*/public void geoAdd(String geoKey, double longitude, double latitude,String pointName){Point point = new Point(longitude, latitude);redisTemplate.opsForGeo().add(geoKey, point, pointName);}/**** @param longitude* @param latitude* @param radius* @param geoKey* @param metricUnit 距离单位,例如 Metrics.KILOMETERS* @param metricUnit* @return*/public List<GeoResult<RedisGeoCommands.GeoLocation<String>>> findRadius(String geoKey, double longitude, double latitude, double radius, Metrics metricUnit, int limit){// 设置检索范围Point point = new Point(longitude, latitude);Circle circle = new Circle(point, new Distance(radius, metricUnit));// 定义返回结果参数,如果不指定默认只返回content即保存的member信息RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs().includeDistance().includeCoordinates().sortAscending().limit(limit);GeoResults<RedisGeoCommands.GeoLocation<String>> results = redisTemplate.opsForGeo().radius(geoKey, circle, args);List<GeoResult<RedisGeoCommands.GeoLocation<String>>> list = results.getContent();return list;}/*** 计算指定key下两个成员点之间的距离* @param geoKey* @param member1* @param member2* @param unit 单位* @return*/public Distance calDistance(String geoKey, String member1, String member2, RedisGeoCommands.DistanceUnit unit){Distance distance = redisTemplate.opsForGeo().distance(geoKey, member1, member2, unit);return distance;}/*** 根据成员点名称查询位置信息* @param geoKey geo key* @param members 名称数组* @return*/public List<Point> geoPosition(String geoKey, String[] members){List<Point> points = redisTemplate.opsForGeo().position(geoKey, members);return points;}@GetMapping("test")public void test(){geoAdd("region",117.130313, 31.84504,"shuxihu");geoAdd("region",117.143635,31.838962,"chanyeyuan");geoAdd("region",117.143635,31.838962,"shiyanxiaoxue");geoAdd("region", 117.123423,31.842912,"aolai");geoAdd("region",117.207504,31.879882,"zhiwuyuan");List<GeoResult<RedisGeoCommands.GeoLocation<String>>> list=findRadius("region",117.130313 ,31.84504 ,0.5,Metrics.KILOMETERS,5);for(GeoResult<RedisGeoCommands.GeoLocation<String>> object:list){System.out.println(object.getContent().getName());}}
}

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

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

相关文章

DCDC前馈电容与RC串并联电路

一、RC串并联电路特性分析 1、RC串联电路 RC 串联的转折频率&#xff1a; f01/&#xff08;2πR1C1&#xff09;&#xff0c;当输入信号频率大于 f0 时&#xff0c;整个 RC 串联电路总的阻抗基本不变了&#xff0c;其大小等于 R1。 2、RC并联电路 RC 并联电路的转折频率&…

零基础学Python的第五天||字符串(2)

raw_input和print 自从本课程开始以来&#xff0c;我们还没有感受到computer姑娘的智能。最简单的智能应该体现在哪里呢&#xff1f;想想小孩子刚刚回说话的时候情景吧。 小孩学说话&#xff0c;是一个模仿的过程&#xff0c;孩子周围的人怎么说&#xff0c;她&#xff08;他&…

redis源码从头深入分析(1)--acl文件

此篇为对redis源码的个人理解和分析,以一个初看源码的视角从头阅读源码,对各个函数,定义的类型进行解释并阐明其作用,让初读源码的人能够完全理解该定义类型及函数,最后形成对redis总体的一个认知。希望此篇能为初读redis源码的人提供一些帮助。 acl.c文件 acl是 Access…

02、Tensorflow实现手写数字识别(数字0-9)

02、Tensorflow实现手写数字识别&#xff08;数字0-9&#xff09; 01、Tensorflow实现二元手写数字识别&#xff08;二分类问题&#xff09; 02、Tensorflow实现手写数字识别&#xff08;数字0-9&#xff09; 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&…

zookeeper集群和kafka集群

&#xff08;一&#xff09;kafka 1、kafka3.0之前依赖于zookeeper 2、kafka3.0之后不依赖zookeeper&#xff0c;元数据由kafka节点自己管理 &#xff08;二&#xff09;zookeeper 1、zookeeper是一个开源的、分布式的架构&#xff0c;提供协调服务&#xff08;Apache项目&…

Shell 脚本自动化备份与恢复实践

文章目录 引言自动化备份脚本详解备份脚本示例恢复脚本示例 设置定时任务 crontab 自动备份总结 引言 在系统管理中&#xff0c;自动化备份与恢复流程是至关重要的一环。借助 Shell 脚本&#xff0c;我们能够轻松编写脚本实现数据备份和恢复&#xff0c;确保数据的安全性和完整…

【Openstack Train安装】二、NTP安装

网络时间协议&#xff1a;Network Time Protocol&#xff08;NTP&#xff09;是用来使计算机时间同步化的一种协议&#xff0c;它可以使计算机对其服务器或时钟源&#xff08;如石英钟&#xff0c;GPS等等)做同步化&#xff0c;它可以提供高精准度的时间校正&#xff08;LAN上与…

ACM程序设计课内实验(2) 排序问题

基础知识‘ sort函数 C中的sort函数是库中的一个函数&#xff0c;用于对容器中的元素进行排序。它的原型如下&#xff1a; template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);参数…

IC设计简单概述

IC设计行业是一个高科技行业&#xff0c;有着复杂而细致的分工&#xff0c;严格的流程规范、多种不同类型的EDA工具。下面简单概述以下几个方面。 IC设计公司的分类 IC设计公司有多种分类方法。若按有无芯片生产能力来分&#xff0c;可以分为兼具设计与生产能力&#xff08;I…

在linux下在官网的nginxtar包 的安装方式并配置全局变量

在Linux系统中&#xff0c;Nginx是一种流行的Web服务器和反向代理服务器&#xff0c;它可以提供高性能的静态内容服务和动态内容服务。本文将详细介绍如何在Linux系统中安装Nginx&#xff0c;并配置全局变量。 安装Nginx 以下是在Linux系统中安装Nginx的步骤&#xff1a; 1.…

Shopee引流妙招!Shopee产品标签重要吗?教你有效打标签引爆流量!

对Shopee平台的卖家来说&#xff0c;在新产品上架时除了要注重产品title、介绍以及图文的优化&#xff0c;还有一件事情很重要&#xff0c;那就是——产品打标签。 对于每个跨境电商卖家来讲&#xff0c;对产品打标签都是必不可少的一个运营环节 下面小宇就来告诉大家&#xf…

SpringSecurity的默认登录页的使用

SpringSecurity的默认登录页的使用 01 前期准备 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysql驱动--><dependency><grou…

主机的容器化技术介绍

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、什么是容器 容器是一个标准化的单元&#xff0c;是一种轻量级、可移植的软件打包技术&#xff0c;容器将软件代码及其相关依赖打包&#xff0c;使应用程序可以在任何计算介质运行。例如开发人员在自己的…

python pytorch实现RNN,LSTM,GRU,文本情感分类

python pytorch实现RNN,LSTM&#xff0c;GRU&#xff0c;文本情感分类 数据集格式&#xff1a; 有需要的可以联系我 实现步骤就是&#xff1a; 1.先对句子进行分词并构建词表 2.生成word2id 3.构建模型 4.训练模型 5.测试模型 代码如下&#xff1a; import pandas as pd im…

命名管道:简单案例实现

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了什么是命名管道&#xff0c;匿名管道和命名管道的…

【GraphQL 】将GraphQL API添加到Postgres数据库的六种简单方法,比较Hasura、Prisma和其他

PostgreSQL是世界上最流行的开源SQL数据库之一&#xff0c;GraphQL是一种日益流行的API规范。 将经过验证和众所周知的PostgreSQL与GraphQL带来的API创建新方式集成在一起不是很好吗&#xff1f; 在本文中&#xff0c;我们讨论了六个不同的项目&#xff0c;它们试图将SQL与Gr…

深入了解Rabbit加密技术:原理、实现与应用

一、引言 在信息时代&#xff0c;数据安全愈发受到重视&#xff0c;加密技术作为保障信息安全的核心手段&#xff0c;得到了广泛的研究与应用。Rabbit加密技术作为一种新型加密方法&#xff0c;具有较高的安全性和便捷性。本文将对Rabbit加密技术进行深入探讨&#xff0c;分析…

【动态规划】LeetCode-面试题08.01三步问题

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

六、初识FreeRTOS之FreeRTOS的任务挂起和恢复函数介绍

本节需要掌握以下内容&#xff1a; 1&#xff0c;任务的挂起与恢复的API函数&#xff08;熟悉&#xff09; 2&#xff0c;任务挂起与恢复实验&#xff08;掌握&#xff09; 3&#xff0c;课堂总结&#xff08;掌握&#xff09; 一、任务的挂起与恢复的API函数&#xff08;熟…

exceljs读取el-upload上传的excle数据并转为json输出

当使用 Element UI 的 el-upload 组件上传 Excel 文件时&#xff0c;您可以使用 exceljs 库将上传的 Excel 数据转换为 JSON 格式。以下是一个示例代码&#xff0c;演示了如何在 Vue 项目中实现这一功能&#xff1a; <template><el-uploadclass"upload-demo&quo…