Java 实现 Redis中的GEO数据结构
Java 实现 Redis中的GEO数据结构
LBS (基于位置信息服务(Location-Based Service,LBS))应用访问的数据是和人
或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在
LBS 服务的场景中
import java.util.ArrayList;
import java.util.List;// 定义一个表示地理位置的类,用于存储地理位置的相关信息
public class GeoLocation {// 成员名称,用于标识这个地理位置,比如某个地点的名称private String member;// 地理位置的经度private double longitude;// 地理位置的纬度private double latitude;// 构造函数,用于初始化 GeoLocation 对象// 参数 member 为成员名称,longitude 为经度,latitude 为纬度public GeoLocation(String member, double longitude, double latitude) {this.member = member;this.longitude = longitude;this.latitude = latitude;}// 获取成员名称的方法public String getMember() {return member;}// 获取经度的方法public double getLongitude() {return longitude;}// 获取纬度的方法public double getLatitude() {return latitude;}
}// 定义一个用于计算两个地理位置之间距离的工具类class GeoDistanceCalculator {// 地球的平均半径,单位为千米,在计算距离时会用到private static final int EARTH_RADIUS = 6371;// 静态方法,使用 Haversine 公式计算两个经纬度之间的距离// 参数 lat1 和 lon1 是第一个地点的纬度和经度// 参数 lat2 和 lon2 是第二个地点的纬度和经度public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {// 计算两个纬度之间差值的弧度double dLat = Math.toRadians(lat2 - lat1);// 计算两个经度之间差值的弧度double dLon = Math.toRadians(lon2 - lon1);// 将第一个地点的纬度转换为弧度lat1 = Math.toRadians(lat1);// 将第二个地点的纬度转换为弧度lat2 = Math.toRadians(lat2);// Haversine 公式的一部分,用于计算球面距离double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);// 计算反三角函数,得到球面距离的弧度值double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));// 最终距离等于地球半径乘以弧度值return EARTH_RADIUS * c;}
}// 定义一个模拟 Redis Geo 数据结构的类,用于管理地理位置信息class GeoDataStructure {// 用于存储所有地理位置信息的列表private List<GeoLocation> locations;// 构造函数,初始化存储地理位置信息的列表public GeoDataStructure() {this.locations = new ArrayList<>();}// 向数据结构中添加一个新的地理位置信息// 参数 member 为成员名称,longitude 为经度,latitude 为纬度public void addLocation(String member, double longitude, double latitude) {// 创建一个新的 GeoLocation 对象GeoLocation location = new GeoLocation(member, longitude, latitude);// 将新的地理位置信息添加到列表中locations.add(location);}// 根据给定的经纬度和距离范围,查找附近的成员// 参数 longitude 和 latitude 是查询的中心点的经度和纬度// 参数 distance 是查询的距离范围,单位为千米public List<String> findNearbyMembers(double longitude, double latitude, double distance) {// 用于存储附近成员名称的列表List<String> nearbyMembers = new ArrayList<>();// 遍历所有存储的地理位置信息for (GeoLocation location : locations) {// 计算当前地理位置与查询中心点之间的距离double dist = GeoDistanceCalculator.calculateDistance(latitude, longitude,location.getLatitude(), location.getLongitude());// 如果计算出的距离小于等于查询的距离范围if (dist <= distance) {// 将该地理位置的成员名称添加到附近成员列表中nearbyMembers.add(location.getMember());}}// 返回附近成员列表return nearbyMembers;}
}// 测试 GeoDataStructure 类功能的测试类class GeoDataStructureTest {public static void main(String[] args) {// 创建一个 GeoDataStructure 对象,用于管理地理位置信息GeoDataStructure geoData = new GeoDataStructure();// 向 GeoDataStructure 对象中添加一些地理位置信息// 这里添加了三个地点,分别是 place1、place2 和 place3geoData.addLocation("place1", 116.4074, 39.9042);geoData.addLocation("place2", 121.4737, 31.2304);geoData.addLocation("place3", 113.2644, 23.1291);// 定义查询的中心点的经度double targetLongitude = 116.4074;// 定义查询的中心点的纬度double targetLatitude = 39.9042;// 定义查询的距离范围,单位为千米double searchDistance = 10000;// 调用 findNearbyMembers 方法,查找附近的成员List<String> nearbyMembers = geoData.findNearbyMembers(targetLongitude, targetLatitude, searchDistance);// 输出附近的成员名称列表System.out.println("附近的地点: " + nearbyMembers);}
}
相关文章:
Java 实现 Redis中的GEO数据结构
Java 实现 Redis中的GEO数据结构 LBS (基于位置信息服务(Location-Based Service,LBS))应用访问的数据是和人 或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在 …...
PostgreSQL如何关闭自动commit
PostgreSQL如何关闭自动commit 在 PostgreSQL 中,默认情况下,每个 SQL 语句都会自动提交(即 AUTOCOMMIT 是开启的)。如果希望关闭自动提交,以便手动控制事务的提交和回滚,可以通过以下方法实现。 1 使用 …...
1、云原生写在前面
云原生技术是什么(包含哪些组件)?每个组件是负责什么?学习这些组件技术能解决什问题?哪些类企业需要用到? 这是标准系列的问题,通过 deepseek 的深度思考就能得到我们想要的易于理解的人话式的…...
Redis离线安装
Linux系统Centos安装部署Redis缓存插件 参考:Redis中文网: https://www.redis.net.cn/ 参考:RPM软件包下载地址: https://rpmfind.net/linux/RPM/index.html http://rpm.pbone.net/ https://mirrors.aliyun.com/centos/7/os…...
网络安全-攻击流程-应用层
应用层攻击针对OSI模型的第七层(应用层),主要利用协议漏洞、业务逻辑缺陷或用户交互弱点,直接威胁Web应用、API、数据库等服务。以下是常见应用层攻击类型及其流程,以及防御措施: 1. SQL注入(SQ…...
java八股文-spring
目录 1. spring基础 1.1 什么是Spring? 1.2 Spring有哪些优点? 1.3 Spring主要模块 1.4 Spring常用注解 1.5 Spring中Bean的作用域 1.6 Spring自动装配的方式 1.7 SpringBean的生命周期 1.8 多级缓存 1.9 循环依赖? 1 .8.1 原因 1.8…...
Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改
本文目录 前言功能预览样式特点总结:1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结:1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑Html代码Javascript代码 前言 能满…...
【Scrapy】Scrapy教程2——工作原理
文章目录 数据流组件引擎Engine调度器Scheduler下载器Downloader爬虫Spiders项目管道Item Pipeline下载器中间件Downloader Middlewares爬虫中间件Spider Middlewares 在学习Scrapy前,我们需要先了解其架构和工作原理,这样才能很好的去使用Scrapy。 Scra…...
探索 DeepSeek:AI 领域的璀璨新星
在人工智能飞速发展的当下,DeepSeek 作为行业内的重要参与者,正以独特的技术和广泛的应用备受瞩目。 DeepSeek 是一家专注于实现 AGI(通用人工智能)的中国人工智能公司。它拥有自主研发的深度学习框架,能高效处理海量…...
宏基传奇swift edge偶尔开机BIOS重置
电脑是acer swift edge, SFA16-41,出厂是Win11系统, BIOS版本出厂1.04,更新到了目前最新1.10。 问题是 会偶尔开机ACER图标变小跑到屏幕左上方,下次开机BIOS就会被重置,开机等待很长时间。 因为是偶尔现象的…...
自动驾驶---如何打造一款属于自己的自动驾驶系统
在笔者的专栏《自动驾驶Planning决策规划》中,主要讲解了行车的相关知识,从Routing,到Behavior Planning,再到Motion Planning,以及最后的Control,笔者都做了相关介绍,其中主要包括算法在量产上…...
【C语言】第一期——数据类型变量常量
目录 1 字面量 2 整数类型 2.1 整数类型的取值范围 2.1.1 sizeof 运算符 2.2 GB、MB、KB、B之间的关系 2.3 定义整数类型的变量并打印 2.4 整数类型代码演示 3 浮点类型 3.1 浮点类型的取值范围 3.2 定义浮点类型变量并打印 3.3 保留2位小数点 4 char字符型 4.1…...
04运维实用篇(D4_日志)
目录 一、简介 二、代码中使用日志工具记录日志 1. 操作步骤 步骤1:添加日志记录操作 步骤2:设置日志输出级别 步骤3:设置日志组 2. 知识小结 三、优化日志对象创建代码 1. 实例 2. 总结 四、日志输出格式控制 1. 实例 2. 总结 …...
centos部署open-webui
提示:本文将简要介绍一下在linux下open-webui的安装过程,安装中未使用虚拟环境。 文章目录 一、open-webui是什么?二、安装流程1.openssl升级2.Python3.11安装3.sqlite安装升级4.pip 下载安装open-webui 总结 一、open-webui是什么? Open W…...
UE求职Demo开发日志#32 优化#1 交互逻辑实现接口、提取Bag和Warehouse的父类
1 定义并实现交互接口 接口定义: // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "UObject/Interface.h" #include "MyInterActInterface.generated.h…...
Visonpro 检测是否有缺齿
一、效果展示 二、上面是原展开工具CogPolarUnwrapTool; 第二种方法: 用Blob 和 CogCopyRegionTool 三、 用预处理工具 加减常数,让图片变得更亮点 四、圆展开工具 五、模板匹配 六、代码分解 1.创建集合和文子显示工具 CogGraphicCollec…...
第1章大型互联网公司的基础架构——1.6 RPC服务
你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务,两者的定位不一样。一般来说,一个业务场景的核心逻辑都是在RPC服务中实现的,强调的是服务于后台系统内部,所谓的“微服务”主要指的就是RPC服务;而HTTP服…...
今日AI和商界事件(2025-02-15)
根据2025年2月15日的科技动态,以下是今日AI领域的重要事件及相关进展总结: 1. DeepSeek日活突破3000万,开源生态加速AI普惠 里程碑意义:开源大模型DeepSeek宣布日活跃用户数突破3000万,其R1模型凭借开源策略和低成本优…...
算法题(69):搜索插入位置
审题: 需要我们在有序数组中找到等于target值的元素的下标若没有则返回target按顺序会插入的位置的索引 思路 : 我们可以使用二分查找的方法 方法一:二分查找 和普通的二分查找不同,本题若没有找到就需要返回它按顺序插入的位置的…...
在 Linux 系统中,tc(Traffic Control) QoS 常用命令简介
在 Linux 系统中,tc(Traffic Control)命令是一个强大的工具,用于配置和管理网络流量控制。以下是 tc 命令的常用功能和基本用法: 1. 查看当前队列规则 使用以下命令查看指定网络接口上的队列规则: tc qd…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
