使用MongoDB存储和计算距离

一、MongoDB 计算距离的优势

优势说明
原生地理空间索引支持 2dsphere 索引,高效处理地理坐标查询(毫秒级响应)。
内置地理计算函数提供 $near$geoWithin$geoNear 等操作符,无需手动实现复杂计算。
高性能基于B树索引优化,海量数据下仍能快速返回结果(如亿级点位数据)。
灵活的数据模型直接存储GeoJSON格式坐标,支持点、线、多边形等复杂地理形状。
与Spring生态集成通过Spring Data MongoDB可简化开发。

二、实现步骤(Spring Boot + MongoDB)

1. 添加依赖

略,可参照前面MongoDB的博客。

2.定义地理位置实体

存储带有经纬度的文档(以“商家”为例):

import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexType;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "places")
@Data
public class Place {private String id;private String name;@GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE) // 关键:创建地理空间索引private GeoJsonPoint location; // 格式: { type: "Point", coordinates: [经度, 纬度] }}
3. 初始化地理空间索引

确保集合已创建 2dsphere 索引(若未自动创建,可手动执行):

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.index.GeospatialIndex;@PostConstruct
public void initIndex() {mongoTemplate.indexOps(Place.class).ensureIndex(new GeospatialIndex("location"));
}
4. 实现距离查询
场景1:查询附近5公里内的商家(按距离排序)
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.Query;public List<Place> findNearbyPlaces(double longitude, double latitude, double maxDistanceKm) {Point userLocation = new Point(longitude, latitude);Distance distance = new Distance(maxDistanceKm, Metrics.KILOMETERS);NearQuery nearQuery = NearQuery.near(userLocation).maxDistance(distance).spherical(true); // 使用球面几何计算return mongoTemplate.find(new Query(Criteria.where("location").nearSphere(userLocation).maxDistance(distance.getNormalizedValue())),Place.class);
}
场景2:查询多边形区域内的点位
import org.springframework.data.geo.Polygon;public List<Place> findWithinPolygon(List<Point> polygonPoints) {return mongoTemplate.find(Query.query(Criteria.where("location").within(new Polygon(polygonPoints))),Place.class);
}

三、MongoDB地理查询原理解析

  1. 索引类型

    • 2dsphere:支持球面几何计算(地球曲率),适合真实地理场景。

    • 2d:平面计算(简化模型),适用于小范围地图(如游戏地图)。

  2. 距离算法
    MongoDB默认使用 Haversine公式 计算球面距离,精度高。

  3. 性能对比

    • MySQL:需手动计算 ST_Distance_Sphere,无专用索引,性能随数据量下降。

    • MongoDB:利用地理索引,查询时间稳定在毫秒级。

四、注意事项

  1. 坐标格式标准化

    • 始终使用 [经度, 纬度] 顺序(GeoJSON标准),避免混淆。

    • 示例:new GeoJsonPoint(116.404, 39.915)(北京天安门)。

  2. 单位一致性

    • MongoDB默认返回距离单位为米,需在业务层统一转换(如公里/英里)。

  3. 分页优化

NearQuery.near(userLocation).maxDistance(distance).skip(20) // 跳过前20条.limit(10); // 每页10条

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

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

相关文章

鸿蒙开发-ArkUI中@Type作用详细解答

在鸿蒙&#xff08;HarmonyOS&#xff09;应用开发中&#xff0c;Type 是 ArkUI 框架中用于 类型定义和类型检查 的关键注解&#xff08;装饰器&#xff09;。它的主要作用是为自定义组件的属性提供明确的类型约束&#xff0c;确保数据传递的类型安全性。 核心作用解析&#xf…

MCU中的存储器映射(Memory Map)

MCU中的存储器映射(Memory Map) 在MCU(微控制器单元)中,存储器映射(Memory Map)是指将不同类型的存储器(如Flash、RAM、外设寄存器等)和功能模块分配到统一的地址空间的过程。这种映射方式使得CPU可以通过访问特定地址来读写数据或控制外设,而无需关心物理存储介质的…

Rust面试题及详细答案120道(11-18)-- 控制流与函数

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

数据结构-排序(2)

一、堆排序 &#xff08;借助树&#xff09;1.利用完全二叉树构建大顶堆 2.堆顶元素和堆底元素进行交换&#xff0c;堆底元素不再参与构建&#xff0c;剩余元素继续构建大顶堆3.时间复杂度 O(nlogn)1.完全二叉树&#xff1a;按照从上到下&#xff0c;从左到右的顺序进行排序2.…

Qt-信号和槽

一.信号和槽概念1. 信号&#xff08;Signal&#xff09;概念&#xff1a;信号是 Qt 对象在状态发生变化或事件发生时自动发出的通知。比如按钮被点击、文本框内容变化、定时器超时等&#xff0c;都会发出相应信号。本质&#xff1a;它只是一个函数声明&#xff08;没有函数体&a…

NLP学习开始-02逻辑回归

逻辑回归什么是逻辑回归逻辑回归的应用场景逻辑回归几个重要概念Sigmoid 函数损失函数构建逻辑回归模型的步骤举个例子参数解释模型优化什么是逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广泛应用于分类问题的统计学习方法&#xff0c;尽管名字中带有…

【运维进阶】LAMPLNMP 最佳实践

LAMP/LNMP 最佳实践 LAMP/LNMP 组件 LAMP&#xff1a;LinuxApacheMysql/MariadbPHP/Python/Perl。 LNMP&#xff1a;LinuxNginxMysql/MariadbPHP/Python/Perl。 Linux&#xff1a;操作系统&#xff0c;提供程序运行基础。Apache/Nginx&#xff1a;Web 服务器&#xff0c;提供网…

深入解析 resolv.conf 文件:DNS 配置的核心

/etc/resolv.conf 文件是 Linux 和类 Unix 系统中 DNS 配置的核心组件。它决定了系统如何将域名解析为 IP 地址&#xff0c;这是网络通信的关键环节。本文将深入探讨 resolv.conf 文件的核心内容&#xff0c;重点讲解 nameserver 指令以及 options 配置中的 attempts 和 rotate…

【LeetCode】102 - 二叉树的层序遍历

题目描述 给你二叉树的根节点 root&#xff0c;返回其节点值的层序遍历&#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 解题思路 使用 BFS&#xff08;广度优先搜索&#xff09;的思想&#xff0c;维护当前层的所有节点&#xff0c;逐层处理&#xff1a;…

计算机网络1-5:计算机网络的性能指标

目录 常用性能指标 速率 带宽 吞吐量 时延 时延带宽积 ​往返时间 ​利用率 ​丢包率 常用性能指标 性能指标可以从不同的方面来度量计算机网络的性能 常用的计算机网络的性能指标有8个:速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率 速率 比特…

TDengine IDMP 文档介绍

TDengine IDMP (Industrial Data Management Platform) 是一款 AI 原生的物联网、工业数据管理平台。它通过经典的树状层次结构组织传感器、设备采集的数据&#xff0c;建立数据目录&#xff0c;对数据提供语境化、标准化的处理、并提供实时分析、可视化、事件管理与报警等功能…

使用 iFLOW-CLI GitHub Action 和 Qwen3-Coder 给 GitHub 仓库生成幻灯片风格的文档站点

阿里的心流 https://www.iflow.cn/ 团队最近开源了一款基于终端的 AI Agent 工具 iFLOW CLI, 目前可以免费使用到强大的 Qwen3-Coder、Kimi K2 等模型。又是一款类似 Anthropics Claude Code 的产品。 iFlow CLI 是一款直接在终端中运行的强大 AI 助手。它能够无缝分析代码仓库…

【2025最新】在 macOS 上构建 Flutter iOS 应用

推荐超级课程&#xff1a; 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 目录软件要求操作系统开发工具文本编辑器或集成开发环境安装 Flutter SDK下载并安装 Flutter将 Flutter 添加到您的PATH配置 i…

MySQL 临时表详细说明

目录 MySQL 临时表详细说明 1. 定义 2. 核心特性 3. 创建与使用 4. 典型应用场景 5. 生命周期管理 6. 注意事项 7. 性能优化建议 MySQL 临时表详细说明 1. 定义 临时表是存储在内存或磁盘上的临时性数据表&#xff0c;仅在当前数据库会话中存在。会话结束时自动销毁&a…

深入解析 Apache APISIX 在微服务网关中的性能优化实践指南

深入解析 Apache APISIX 在微服务网关中的性能优化实践指南 文章类型&#xff1a;性能优化实践指南 技术领域&#xff1a;微服务架构 —— API 网关 文章结构&#xff1a;原理深度解析型 目标读者&#xff1a;有一定微服务与运维基础的后端开发工程师一、技术背景与应用场景 随…

【Spring Boot刷新上下文核心流程详解】

Spring Boot 刷新上下文核心流程详解 一、前言 在使用 Spring Boot 启动应用时&#xff0c;控制台会打印出一大串日志&#xff0c;其中最核心的启动动作之一就是 刷新上下文&#xff08;refresh&#xff09;。 refresh 方法不仅负责 Bean 的创建与初始化&#xff0c;还涉及监…

关于过滤器(Filter)的学习

过滤器&#xff08;Filter&#xff09;概述 过滤器是 Java Servlet 规范的一部分&#xff0c;用于在请求到达 Servlet 之前或响应返回客户端之前拦截请求和响应。它可以用于执行各种任务&#xff0c;如请求预处理、响应后处理、身份验证、日志记录等。 过滤器的作用 预处理请…

Spring AI 打造智能面试人实战

Spring AI人工智能面试机器人相关实例 以下是与Spring AI人工智能面试机器人相关的实用案例,涵盖技术实现、功能设计及常见问题解决方案,按应用场景分类呈现: 技术集成案例 调用Hugging Face模型库处理专业领域问题 通过Spring Security添加面试会话身份验证 结合WebSoc…

QT 程序发布时候调用自定义动态库

1、需要在pro文件中增加下面的内容&#xff1a;QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/lib\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/../lib\"其中lib为动态库的文件夹名称&#xff0c;可以根据自己喜好…

SpringBoot学习日记 Day6:解锁微服务与高效任务处理

一、开篇&#xff1a;从单体到微服务的思维转变刚开始接触微服务时&#xff0c;我总习惯把所有功能写在一个项目里。直到项目越来越臃肿&#xff0c;每次修改都要全量部署&#xff0c;才意识到微服务架构的价值。今天我们就来探索SpringBoot在微服务场景下的强大能力&#xff0…