SQL 实战:基于经纬度的距离计算与位置查询

在位置服务(LBS)系统中,基于地理位置查询和距离计算是核心功能之一。例如:

  • 查找附近的商铺、加油站或医院。
  • 计算两点之间的实际直线距离。
  • 筛选出指定范围内的用户或设备位置。

MySQL 提供了多种方式实现地理位置查询,包括 ST_Distance_Sphere() 和经典的 Haversine 公式。本文将介绍如何使用这两种方式在 MySQL 中进行距离计算与位置筛选。


一、经纬度距离计算原理

1. 地球模型与球面距离

在这里插入图片描述


二、方法 1:使用 ST_Distance_Sphere() 计算球面距离

函数介绍
  • ST_Distance_Sphere(point1, point2) 直接返回两点之间的球面距离,结果以米为单位。
  • POINT(lng, lat) 将经纬度转换为点对象。

案例 1:计算两点之间的直线距离

需求
计算从北京天安门到上海外滩的直线距离。

天安门坐标(39.9087, 116.3975)
外滩坐标(31.2335, 121.4920)


SQL 实现
SELECT ST_Distance_Sphere(  POINT(116.3975, 39.9087),  POINT(121.4920, 31.2335)  
) AS distance_meters;

查询结果
distance_meters
1064695.78

解释

  • 结果显示北京到上海外滩的直线距离约为 1064 公里。
  • POINT(lng, lat) 将经纬度转换为地理点,ST_Distance_Sphere 计算两点的球面距离。


案例 2:查询当前位置 5 公里范围内的商铺

需求
查询距离当前定位(广州塔 23.1056, 113.32485 公里范围内的商铺信息。


表结构 shops
shop_idnamelatlng
1星巴克23.1100113.3300
2肯德基23.0920113.3100
3麦当劳23.1500113.3700
4德克士23.0900113.2500

SQL 实现
SELECT shop_id, name,  ST_Distance_Sphere(POINT(lng, lat), POINT(113.3248, 23.1056)) AS distance_meters  
FROM shops  
WHERE ST_Distance_Sphere(POINT(lng, lat), POINT(113.3248, 23.1056)) <= 5000  
ORDER BY distance_meters;

查询结果
shop_idnamedistance_meters
1星巴克566.43
2肯德基1887.29

解释

  • 查询范围限定为 5000 米(5 公里)。
  • 使用 WHERE 过滤距离条件,同时按照距离升序排序,方便查看最近的商铺。


三、方法 2:Haversine 公式计算距离

在不支持 ST_Distance_Sphere 的 MySQL 版本中,可以使用 Haversine 公式 实现经纬度距离计算。


案例 3:Haversine 公式计算两点间距离

SQL 实现
SELECT  6371000 * 2 * ASIN(  SQRT(  POWER(SIN(RADIANS((39.9087 - 31.2335) / 2)), 2) +   COS(RADIANS(39.9087)) * COS(RADIANS(31.2335)) *  POWER(SIN(RADIANS((116.3975 - 121.4920) / 2)), 2)  )  ) AS distance_meters;

结果

distance_meters
1064695.78

解释

  • 手动实现 Haversine 公式,使用三角函数计算地球表面的两点距离。
  • 6371000 表示地球平均半径,单位为米。


四、复杂位置查询:筛选指定范围内的对象


案例 4:查询用户 10 公里范围内的餐厅

需求
用户当前位置 (30.5702, 104.0648),查询 10 公里内的餐厅。


表结构 restaurants
rest_idnamelatlng
1火锅店30.5800104.0700
2烧烤店30.5000104.0000
3自助餐厅30.6100104.1100
4小吃店30.4000103.9500

SQL 实现
SELECT rest_id, name,  6371000 * 2 * ASIN(  SQRT(  POWER(SIN(RADIANS((30.5702 - lat) / 2)), 2) +   COS(RADIANS(30.5702)) * COS(RADIANS(lat)) *  POWER(SIN(RADIANS((104.0648 - lng) / 2)), 2)  )  ) AS distance_meters  
FROM restaurants  
HAVING distance_meters <= 10000  
ORDER BY distance_meters;

查询结果
rest_idnamedistance_meters
1火锅店1200.43
2烧烤店7890.10


五、性能优化与注意事项

  1. 建立空间索引
    如果表中存储大量地理位置数据,可以使用 空间索引 提升查询速度:
ALTER TABLE shops ADD SPATIAL INDEX (lat, lng);
  1. 限制结果集大小
    在大数据量环境下,添加 LIMIT 和分页,提高查询效率:
ORDER BY distance_meters LIMIT 10;

六、总结

  • MySQL 提供了两种方式实现基于经纬度的距离计算:
    • ST_Distance_Sphere():直接计算,简单高效,推荐使用。
    • Haversine 公式:适用于不支持 ST_Distance_Sphere 的旧版本。
  • 通过位置查询可以实现商铺筛选、附近用户查找等功能,广泛应用于 LBS 场景。

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

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

相关文章

SpringCloudAlibaba技术栈-Higress

1、什么是Higress? 云原生网关&#xff0c;干啥的&#xff1f;用通俗易懂的话来说&#xff0c;微服务架构下Higress 就像是一个智能的“交通警察”&#xff0c;它站在你的网络世界里&#xff0c;负责指挥和调度所有进出的“车辆”&#xff08;也就是数据流量&#xff09;。它的…

虚幻引擎结构之AActor

在虚幻引擎中&#xff0c;AActor 是一个核心类&#xff0c;作为游戏世界内所有可交互对象的基础。任何可以在关卡中放置或动态生成的对象&#xff0c;几乎都是从 AActor 类派生而来。这包括但不限于角色、道具、特效、静态和动态物体等。 1. AActor 的基本概念 AActor 作为基类…

现代图形API综合比较:Vulkan DirectX Metal WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

工业大数据分析算法实战-day19

文章目录 day19讨论范畴介绍知识工程 知识沉淀方法的维度模型模型要素维度传感器异常报警异常预警的范式&#xff1a;特征量-征兆量-研判规则健康评估的范式&#xff1a;劣化度-健康度-综合评价故障类型研判范式&#xff1a;特征量-证据/现象-推理逻辑故障处理效果监控范式&…

Elasticsearch-模糊查询

模糊查询 前缀搜索&#xff1a;prefix 概念&#xff1a;以xx开头的搜索&#xff0c;不计算相关度评分。 注意&#xff1a; 前缀搜索匹配的是term&#xff0c;而不是field。 前缀搜索的性能很差 前缀搜索没有缓存 前缀搜索尽可能把前缀长度设置的更长 语法&#xff1a; GET &…

轮胎识别数据集,可对生产流水线里的轮胎图片标注,支持yolo,coco json,voc xml格式的标注,一共785张采集图片

轮胎识别数据集&#xff0c;可对生产流水线里的轮胎图片标注&#xff0c;支持yolo&#xff0c;coco json&#xff0c;voc xml格式的标注&#xff0c;一共785张采集图片 数据集分割 训练组90&#xff05; 706图片 有效集6% 46图片 测试集4% 33图片 预处理…

【RabbitMQ的死信队列】

死信队列 什么是死信队列死信队列的配置方式死信消息结构 什么是死信队列 消息被消费者确认拒绝。消费者把requeue参数设置为true(false)&#xff0c;并且在消费后&#xff0c;向RabbitMQ返回拒绝。channel.basicReject或者channel.basicNack。消息达到预设的TTL时限还一直没有…

Unity Dots理论学习-2.ECS有关的模块(1)

Unity的实体组件系统&#xff08;ECS&#xff09;是支撑DOTS模块和技术的面向数据架构。ECS为Unity中的内存数据和runtime进程调度提供了高度的控制和确定性。 ECS for Unity 2022 LTS 配备了两个兼容的物理引擎&#xff0c;一个高级的Netcode package&#xff0c;以及一个用来…

YOLOv10目标检测-训练自己的数据

yolov10 https://github.com/THU-MIG/yolov10?tabreadme-ov-file 1. 数据集 模型的建立需要收集图片并且进行标注。YOLOv10标注的文件格式如下&#xff08;每张图片对应一个标签文件&#xff09;&#xff1a; 0 0.441753 0.815461 0.061021 0.042763 1 0.395895 0.759868 …

《机器学习》——KNN算法

文章目录 KNN算法简介KNN算法——sklearnsklearn是什么&#xff1f;sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors&#xff0c;通过寻找k个距…

C++ 设计模式:单例模式(Singleton Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 享元模式 单例模式&#xff08;Singleton Pattern&#xff09;是创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。单例模式在需要全局共享资源或控制实例数量的…

底层解析v-modle和v-bind在绑定数据时的内存模型上的区别

在Vue.js中&#xff0c;v-model和v-bind在内存和指针层面上的主要区别在于它们的数据绑定方式。 v-bind的内存模型 v-bind指令用于将父组件的数据绑定到子组件的某个属性上&#xff0c;这是一种单向的数据绑定。在内存模型中&#xff0c;v-bind只是将父组件中的数据值复制到子…

如何在 Ubuntu 22.04 上安装和使用 Composer

简介 如果你是一名 PHP 开发者&#xff0c;想要简化你的项目依赖管理&#xff0c;那么 Composer 是一个必不可少的工具。Composer 可以简化包管理&#xff0c;并允许你轻松地将外部库集成到你的项目中。 本教程将向你展示如何在 Ubuntu 22.04 操作系统上安装 Composer&#x…

139.《python中的正则详解》

文章目录 什么是正则正则表达式语法正则demo1.匹配模式2.finditer3.正则分组4.非捕获组5.分组的引用6. 正则替换7.正则切割7.正则「或」7.枚举取反 面试题 前言: 拉开差距的不是上班的8小时,而是下班后的16小时,同志们,加油,卷起!!! 什么是正则 1.正则表达式是一种高级文本处理…

大语言模型(LLM)中大数据的压缩存储及其重要性

在大型语言模型&#xff08;LLM&#xff09;中&#xff0c;KV Cache&#xff08;键值缓存&#xff09;的压缩方法及其重要性。 为什么要压缩KV Cache&#xff1f; 计算效率&#xff1a;在生成文本的过程中&#xff0c;每个生成的token都需要与之前所有的token的键值&#xff…

『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释

评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释 文章目录 一. ELO Rating大模型的elo得分如何理解1. Elo评分的基本原理2. 示例说明3. 大模型中的Elo得分总结3个模型之间如何比较计算,给出示例进行解释1. 基本原理扩展到三方2. 示例计算第一场: A A…

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及&#xff0c;即便是零编程基础或基础薄弱的用户&#xff0c;也可以借助AI完成许多技术任务。然而&#xff0c;要高效地使用AI完成编程任务&#xff0c;关键在于如何清晰表达需求&#xff0c;并逐步引导AI实现目标。 在本文中&#xff0c;我们将通过开发…

【视觉惯性SLAM:四、相机成像模型】

相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容&#xff0c;它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型&#xff0c;以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源&#xff0c;请执行以下操作&#xff1a; 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录&#xff08;例如&#xff0c;深色 UI 主题或本地化字符串的不同图像&#xff09;。 依赖项和目录设置 要访问多平台项目中的资源…

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式&#xff08;工作队列&#xff09;10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 10.5 订阅模式广播模式路由模式主题模式&#xff08;通配符模式&#xff09; 10.6 消息确认机制1…