当前位置: 首页 > news >正文

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 &#xff08;基于位置信息服务&#xff08;Location-Based Service&#xff0c;LBS&#xff09;&#xff09;应用访问的数据是和人 或物关联的一组经纬度信息&#xff0c;而且要能查询相邻的经纬度范围&#xff0c;GEO 就非常适合应用在 …...

PostgreSQL如何关闭自动commit

PostgreSQL如何关闭自动commit 在 PostgreSQL 中&#xff0c;默认情况下&#xff0c;每个 SQL 语句都会自动提交&#xff08;即 AUTOCOMMIT 是开启的&#xff09;。如果希望关闭自动提交&#xff0c;以便手动控制事务的提交和回滚&#xff0c;可以通过以下方法实现。 1 使用 …...

1、云原生写在前面

云原生技术是什么&#xff08;包含哪些组件&#xff09;&#xff1f;每个组件是负责什么&#xff1f;学习这些组件技术能解决什问题&#xff1f;哪些类企业需要用到&#xff1f; 这是标准系列的问题&#xff0c;通过 deepseek 的深度思考就能得到我们想要的易于理解的人话式的…...

Redis离线安装

Linux系统Centos安装部署Redis缓存插件 参考&#xff1a;Redis中文网&#xff1a; https://www.redis.net.cn/ 参考&#xff1a;RPM软件包下载地址&#xff1a; https://rpmfind.net/linux/RPM/index.html http://rpm.pbone.net/ https://mirrors.aliyun.com/centos/7/os…...

网络安全-攻击流程-应用层

应用层攻击针对OSI模型的第七层&#xff08;应用层&#xff09;&#xff0c;主要利用协议漏洞、业务逻辑缺陷或用户交互弱点&#xff0c;直接威胁Web应用、API、数据库等服务。以下是常见应用层攻击类型及其流程&#xff0c;以及防御措施&#xff1a; 1. SQL注入&#xff08;SQ…...

java八股文-spring

目录 1. spring基础 1.1 什么是Spring&#xff1f; 1.2 Spring有哪些优点&#xff1f; 1.3 Spring主要模块 1.4 Spring常用注解 1.5 Spring中Bean的作用域 1.6 Spring自动装配的方式 1.7 SpringBean的生命周期 1.8 多级缓存 1.9 循环依赖&#xff1f; 1 .8.1 原因 1.8…...

Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改

本文目录 前言功能预览样式特点总结&#xff1a;1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结&#xff1a;1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑Html代码Javascript代码 前言 能满…...

【Scrapy】Scrapy教程2——工作原理

文章目录 数据流组件引擎Engine调度器Scheduler下载器Downloader爬虫Spiders项目管道Item Pipeline下载器中间件Downloader Middlewares爬虫中间件Spider Middlewares 在学习Scrapy前&#xff0c;我们需要先了解其架构和工作原理&#xff0c;这样才能很好的去使用Scrapy。 Scra…...

探索 DeepSeek:AI 领域的璀璨新星

在人工智能飞速发展的当下&#xff0c;DeepSeek 作为行业内的重要参与者&#xff0c;正以独特的技术和广泛的应用备受瞩目。 DeepSeek 是一家专注于实现 AGI&#xff08;通用人工智能&#xff09;的中国人工智能公司。它拥有自主研发的深度学习框架&#xff0c;能高效处理海量…...

宏基传奇swift edge偶尔开机BIOS重置

电脑是acer swift edge&#xff0c; SFA16-41&#xff0c;出厂是Win11系统&#xff0c; BIOS版本出厂1.04&#xff0c;更新到了目前最新1.10。 问题是 会偶尔开机ACER图标变小跑到屏幕左上方&#xff0c;下次开机BIOS就会被重置&#xff0c;开机等待很长时间。 因为是偶尔现象的…...

自动驾驶---如何打造一款属于自己的自动驾驶系统

在笔者的专栏《自动驾驶Planning决策规划》中&#xff0c;主要讲解了行车的相关知识&#xff0c;从Routing&#xff0c;到Behavior Planning&#xff0c;再到Motion Planning&#xff0c;以及最后的Control&#xff0c;笔者都做了相关介绍&#xff0c;其中主要包括算法在量产上…...

【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&#xff1a;添加日志记录操作 步骤2&#xff1a;设置日志输出级别 步骤3&#xff1a;设置日志组 2. 知识小结 三、优化日志对象创建代码 1. 实例 2. 总结 四、日志输出格式控制 1. 实例 2. 总结 …...

centos部署open-webui

提示&#xff1a;本文将简要介绍一下在linux下open-webui的安装过程,安装中未使用虚拟环境。 文章目录 一、open-webui是什么&#xff1f;二、安装流程1.openssl升级2.Python3.11安装3.sqlite安装升级4.pip 下载安装open-webui 总结 一、open-webui是什么&#xff1f; Open W…...

UE求职Demo开发日志#32 优化#1 交互逻辑实现接口、提取Bag和Warehouse的父类

1 定义并实现交互接口 接口定义&#xff1a; // 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&#xff1b; 第二种方法&#xff1a; 用Blob 和 CogCopyRegionTool 三、 用预处理工具 加减常数&#xff0c;让图片变得更亮点 四、圆展开工具 五、模板匹配 六、代码分解 1.创建集合和文子显示工具 CogGraphicCollec…...

第1章大型互联网公司的基础架构——1.6 RPC服务

你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务&#xff0c;两者的定位不一样。一般来说&#xff0c;一个业务场景的核心逻辑都是在RPC服务中实现的&#xff0c;强调的是服务于后台系统内部&#xff0c;所谓的“微服务”主要指的就是RPC服务&#xff1b;而HTTP服…...

今日AI和商界事件(2025-02-15)

根据2025年2月15日的科技动态&#xff0c;以下是今日AI领域的重要事件及相关进展总结&#xff1a; 1. DeepSeek日活突破3000万&#xff0c;开源生态加速AI普惠 里程碑意义&#xff1a;开源大模型DeepSeek宣布日活跃用户数突破3000万&#xff0c;其R1模型凭借开源策略和低成本优…...

算法题(69):搜索插入位置

审题&#xff1a; 需要我们在有序数组中找到等于target值的元素的下标若没有则返回target按顺序会插入的位置的索引 思路 &#xff1a; 我们可以使用二分查找的方法 方法一&#xff1a;二分查找 和普通的二分查找不同&#xff0c;本题若没有找到就需要返回它按顺序插入的位置的…...

在 Linux 系统中,tc(Traffic Control) QoS 常用命令简介

在 Linux 系统中&#xff0c;tc&#xff08;Traffic Control&#xff09;命令是一个强大的工具&#xff0c;用于配置和管理网络流量控制。以下是 tc 命令的常用功能和基本用法&#xff1a; 1. 查看当前队列规则 使用以下命令查看指定网络接口上的队列规则&#xff1a; tc qd…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 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 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...