mysql 计算两点之间距离
先说一下我们可能会用到的一些场景,这样同学们可以先评估,该篇文章是否对你有帮助!
场景:
假设 美团,我点外卖时,系统会让我先进行定位,比如我定位在了 A 点,系统就会给我推荐,离 A 点最近的商家们,我们先排除评分等等条件,只看距离,优先距离(最近的商家)。
所以这个时候,就需要用到"两点之间的距离"来处理
多分享一点:
曾经我的解决方案是这样的:请求"腾讯位置服务",因为里面有 Web端的 JavaScript ,也有服务端的 API,就可以解决我们的一些问题。
但是后来,又遇到甲方的需求是:希望能匹配最近的商家,按距离从小到大显示!
用以前的经验,直接拿"腾讯位置服务"里面的 API 来用,就可以满足的,但是我想了一下,在程序的性能上,这并不是一个比较好的方案,因为可能会遇到循环,我要将商家逐个的传过去,再拿到"腾讯位置服务"返回给我的结果,无论用不用循环,我都要将 N 个商家拿去请求外网,也还是会请求很多次,性能上也是一笔很大的开销!
并且,人家第三方提供的 API 免费次数是有限的,这里划重点!
所以我就思考了一下,一定有着我还未了解到的知识,有更好的方法,所以我去网上浏览,最终找到了,mysql 有 "geometry"数据类型,可以达到我的预期。
"geometry" 是 几何 的意思
在 MySQL 中,Geometry 等几何对象可以用来表示地理位置,即用几何对象表示地理空间数据。
在 MySQL 中支持的几何数据类型包括 Geometry、Point、LineString、Polygon 以及集合类型的 MultiPoint、MultiLineString、MultiPolygon、GeometryCollection。其中 Geometry 可以表示任意一种几何类型,即在 MySQL 中,如果一个字段类型是 Geometry,则可以存储 Point、LineString 等其它几何类型的值。其他的几种则需要固定有效的表示格式。
在MySQL中有3种表达几何对象的格式:
1. WKT(文本格式)
2. WKB(二进制格式)
3. MySQL 内部存储格式
WKT 是文本格式,因此可以直接使用文本来表示几何数据,实现数据的插入与编辑
小tips:我们本期 会涉及到数学上的一些计算
首先,可以看一下数据表:

上图,按照以往我这边一定是存在着 "经度"、"纬度" 两个字段的,因为传给 "腾讯" 或 "阿里" 等第三方处理,都是需要使用到 经纬度的。
而本次,我们可以自己在内部使用 mysql 自带的方法,就可以计算出结果。
所以我们追加了一个字段 "lng_lat",该字段的数据类型则为:geometry

上图,是 geometry 类型存储的值。它必须要这样存储,才能使用相关的方法 查出对比的位置来!
而存储时,这里并不是一个单纯的"字符串"数据,也是需要使用到一个方法来进行存储的: ST_GeomFromText
ST_GeomFromText: 用于将几何数据从可读的文本类型转换成内部存储的二进制类型
INSERT INTO table ( `lng`, `lat`, `lng_lat`) VALUES ('104.068544', '30.606452', ST_GeomFromText ( 'POINT(104.068544 30.606452)' ));
请要注意的是, "ST_GeomFromText" 里面还使用到了 "POINT"
"POINT" 代表一个点
所以我们理解为,计算时,就是"点与点之间的距离"
我们还需要注意一点:
只有 Point 中存储的是经纬度即第一第二坐标范围分别在 (-180,180) 与 (-90,90) 内时才可以转换成功
常用的方法是:
st_distance_sphere 计算出来的距离,默认单位是"米"
我这边就拿一个实际位置来做演示吧!

查询的 SQL 如下:
select site_name,st_distance_sphere(POINT(104.068544,30.606452),lng_lat) as distant from table_name

可以看到,因为我的 查询 经纬度,直接用的是 "成都南站站点",所以得出的结果就是 "0"米,就是代表原地!
st_distance_sphere(POINT(104.068544,30.606452),lng_lat)
上面的 104.068544,30.606452,就是我们的位置,我是直接拿 库中 "成都南站"的位置直接使用的,所以得出的结果,成都南站 和我的位置,相差为 0 米
同学可以这样理解:现在数据库里有 N 个商家,也都存好位置了,现在我们作为 用户(消费者) 需要找到最近商家,那么就需要先进行定位,定位后就会有经纬度,这时候将我们的经纬度 替换 上面的 "104.068544,30.606452" 就可以了
而成都北站,则距离 成都南站 约为 "10097.707"米,换算过来约为:"10.10"千米(公里)。
我这边使用 "高德地图" 查询了一下,"火车南站(地铁站)" 距离 "火车北站(地铁站)"
驾车模式:约为 11 公里;
骑行(电动车、自行车)模式:约为 11.4 公里;
步行模式:约为 11.2 公里
首先,这里没有达到百分百的准确,我认为是有两个原因:
1. 我的数据库中存储的 成都南站 和 高德地图中的 "成都南站(地铁站)" 应该不是百分百完美匹配的地址,就是说不是相同的一个 经纬度,所以一定会有偏差
2. 官方的计算应该是一个约值,并非全等值,因为这里涉及到圆周率"π",π 又为 3.1415926...
综合上述我的假设,所以我认为,最终就是相差1公里左右吧!如果第一点,能确定 高德地图 和 数据库中的 经纬度完全匹配,那么问题应该不大。这个可以放给同学们去实验!
为什么我这里不直接去高德扒一个经纬度一样的存储在数据库呢,一是这个经纬度是同事存储的,二是同事应该是用的腾讯地图,三是因为我以前做这一块的时候,相差一般都是几百米,偏差不会太大,所以我觉得差不多。
所以按照上述的,我们就可以得出 "distant" 字段的大小值了,就可以进行一个排序,做到 商家离我们最近的排序在最前面。。。。
扩展:
st_distance_sphere 是比较好用的,但有时考虑到 mysql 的版本,扩展等原因,所以如果出现 "st_distance_sphere " 这个方法不存在时,那么用不了这个方法时,我们又该如何是好呢?
那这个时候,就可以用到另外一个方法:st_distance
可以对比出 "st_distance" 、 "st_distance_sphere ",单词前面完全是一样的。
所以这两个方法,也很相似!
st_distance_sphere:该函数的计算结果要比使用 st_distance 再转换为米的结果更精确。不过该函数是 MySQL5.7 之后才引入的,5.7 之前还是需要通过计算转换成米
st_distance:该函数计算出来的结果单位,是"度",而不是"米"。
没错,就是 圆 的 度!因为地球是圆的
所以我们还要用到 圆周率 "π",还有地球的半径
我们假设:
地球半径:6371000米
π:3.1415926
圆的 180 度
因为 st_distance 计算出来的结果单位是"度",所以我们要转为"米",所以要这样:
最后的结果 乘 111195 将值转化为米
111195 的由来:地球半径 6371000*PI/180
所以 SQL 就是:
select site_name,st_distance(POINT(104.068544,30.606452),lng_lat)*111195 as distant from sp_site_config
结果为:

可以发现,两者相差的位置,其实并不远,我算了一下:
10101.64 - 10097.7 = 3.94
相差约 4 米,所以问题也不大!
相关文章:
mysql 计算两点之间距离
先说一下我们可能会用到的一些场景,这样同学们可以先评估,该篇文章是否对你有帮助! 场景: 假设 美团,我点外卖时,系统会让我先进行定位,比如我定位在了 A 点,系统就会给我推荐&…...
c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码?
c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码? C语言自定义头文件是一种用来封装函数和变量声明的文件,它通常用于将一组相关的函数和变量的声明集中在一个地方&#…...
electron应用打包成功纪念一下
electron应用打包成功纪念一下,以前曾经行过后来打包各种报错,现在有空就尝试解决一下 首先安装nvm能够方便切换node版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash 顺利安装后你用nvm list查看node列表时会…...
远程办公中安全远程访问解决方案
什么是安全远程访问 安全的远程访问是一个至关重要的过程,可让您使用互联网从远处完全控制某人的设备。为了确保安全,为受保护的远程访问采取了额外的身份验证和加密措施。 为什么安全远程访问解决方案很重要 当 IT 技术人员从远处帮助人们解决计算机…...
StartUp启动框架-Android启动性能
简述 当谈论Android应用程序的启动性能时,StartUp启动框架是一个不可忽视的关键工具。它旨在优化应用程序的启动过程,确保用户在打开应用时能够迅速获得流畅、高效的体验。让我们来深入了解StartUp框架的作用和重要性,以及它是如何改善Andro…...
Positive Technologies:五分之四的网络攻击具有针对性
Positive Technologies 对 2023 年第二季度的相关网络威胁进行了分析。报告显示,自今年年初以来,有针对性的攻击数量增加了 10%,目前占 78%。专家们注意到利用漏洞的大规模攻击和大量用户个人数据的泄露。此外,在此期间࿰…...
clickhouse的另类表引擎
clickhouse常用的MergeTree引擎外,还有特殊的引擎 1,memory引擎,顾名思义,数据是存储在内存中,数据不会被压缩也不会倍格式化转换数据在内存中保存的形态与查询时看到的如出一辙,重启ck数据丢失 2ÿ…...
Uniapp新版本打包后覆盖安装,新增的页面无法跳转,需退出重新启动才可以打开的解决方案
最近写uniapp项目,发现一个坑,在新版本覆盖安装后直接打开APP,新增的页面竟然无法跳转,需要重新启动才可以正常打开,在网上查了很多方法,最终总结下来有以下几点: 1.看打的是debug包还是releas…...
系统架构设计高级技能 · 面向服务架构设计理论与实践
点击进入系列文章目录 系统架构设计高级技能 面向服务架构设计理论与实践 一、SOA的相关概念1.1SOA的定义1.2 业务流程与业务流程执行语言 二、SOA的发展史三、SOA与微服务的区别三、SOA的参考架构四、SOA的主要协议规范五、SOA的设计标准要求六、SOA的作用与设计原则七、SOA的…...
QT注册界面练习(信号与槽实现页面跳转)
一、注册界面练习思路以及具体代码 在完成注册页面搭建的前提下,通过信号与槽机制实现多组件之间的相互通信,实现页面跳转。 基本步骤: 首先,将注册页面的登录按钮与成功登陆信号绑定,当用户名与密码均匹配时…...
MySQL从入门到精通【进阶篇】之 主从复制详解
文章目录 0.前言1. 主从复制简介2. 主从复制的工作流程主从复制过程中的日志文件作用(Binary Log)和中继日志(Relay Log) 3. MySQL主从复制的配置4. 参考资料 0.前言 MySQL的主从复制和读写分离是数据库领域的基本概念࿰…...
vue使用qrcodejs2生成二维码
目录 概要 构建展示的vue组件qrcode.vue 组件的使用 概要 项目中用到需要展示二维码的样式,想到了qrcode 例如: 前提:安装包 npm install qrcodejs2 --save 构建展示的vue组件qrcode.vue <template><div style"width: …...
python注释
任何编程语言都少不了注释,Python也不例外,以下是Python注释的具体用法: 单行注释 Python编程语言的单行注释常以#开头,单行注释可以作为单独的一行放在被注释代码行之上,也可以放在语句或者表达式之后。 实例&…...
update-alternatives详解
1.功能作用 update-alternatives是dpkg的实用工具,用来维护系统命令的符号链接,以决定系统默认使用什么命令。 在Debian系统中,我们可能会同时安装有很多功能类似的程序和可选配置,如Web浏览器程序(firefox,konquero…...
JavaScript 编写更好的条件语句
在任何编程语言中,代码需要根据不同的条件在给定的输入中做不同的决定和执行相应的动作。 例如,在一个游戏中,如果玩家生命点为0,游戏结束。在天气应用中,如果在早上被查看,显示一个日出图片,如…...
聊聊PBE算法
序 本文主要研究一下PBE算法 PBE PBE即Password Based Encryption,基于口令的加密,它是一种组合算法,即一般是哈希对称算法,比如PBEWithMD5AndDES,就是用MD5做哈希,用DES做加解密,而其密钥则…...
用MFC打开外部程序
在MFC(Microsoft Foundation Classes)中,你可以使用ShellExecute函数来打开Notepad并加载指定的文件。ShellExecute函数是Windows API的一部分,它可以执行与操作系统相关的操作,例如打开文件、运行程序等。 以下是在M…...
基于全新电脑环境安装pytorch的GPU版本
前言: 距离第一次安装深度学习的GPU环境已经过去了4年多(当时TensorFlow特别麻烦),现在发现安装pytorch的GPU版本还是很简单方便的,流程记录如下。 安装步骤: 步骤一:官网下载Anaconda Free…...
[当前就业]2023年8月25日-计算机视觉就业现状分析
计算机视觉就业现状分析 前言:超越YOLO:计算机视觉市场蓬勃发展 如今,YOLO(You Only Look Once)新版本的发布周期很快,每次迭代的性能都优于其前身。每 3 到 4 个月就会推出一个升级版 YOLO 变体…...
虚拟化技术原理
计算虚拟化 介绍 把物理主机上物理资源(CPU,内存,IO外设),通过虚拟化层抽象成超量、等量的逻辑资源(虚拟CPU,虚拟内存,虚拟IO设备),然后重新组合形成新的虚…...
别再傻傻匀速拖滑块了!用Python模拟真人鼠标轨迹,轻松过Geetest验证码
突破验证码防线:Python模拟人类行为轨迹的实战艺术 验证码系统正变得越来越智能,Geetest等平台已经能够通过分析用户行为模式来区分人类和机器。传统的匀速滑块操作在这些系统面前几乎无所遁形。本文将带你深入理解现代验证码系统的工作原理,…...
SMT贴片机核心构造与PCB组装效率提升全解析
1. SMT贴片机核心构造解析 SMT贴片机作为电子制造产线的"心脏",其构造精密程度直接决定了PCB组装的效率和质量。现代贴片机就像一台高度智能化的机器人,由机械系统、电子控制系统和视觉系统三大部分组成。我拆解过不少机型,发现它们…...
告别Zabbix!轻量级监控神器Netdata在Ubuntu 22.04上的花式玩法
告别Zabbix!轻量级监控神器Netdata在Ubuntu 22.04上的花式玩法 1. 为什么Netdata正在重新定义监控体验 凌晨三点,服务器告警短信惊醒睡梦中的你。手忙脚乱连上VPN,却发现只是Zabbix又一个误报——这样的场景是否似曾相识?传统监控…...
VCAM虚拟摄像头:革新移动设备视觉交互的技术探索
VCAM虚拟摄像头:革新移动设备视觉交互的技术探索 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam VCAM虚拟摄像头是一款基于Xposed框架的安卓应用,通过HOOK技术&…...
WRF风场后处理实战:用Python+Cartopy绘制500hPa风场矢量图(附完整代码)
WRF风场后处理实战:用PythonCartopy绘制500hPa风场矢量图(附完整代码) 气象数据分析中,风场可视化是理解大气环流特征的关键环节。WRF(Weather Research and Forecasting)模式输出的数据包含丰富的三维风场…...
Qwen3-TTS声音克隆入门指南:上传音频→选择语种→生成自然语音三步走
Qwen3-TTS声音克隆入门指南:上传音频→选择语种→生成自然语音三步走 想不想让AI用你自己的声音说话?或者,想不想用一段短短的录音,就克隆出能说十几种语言的“数字分身”?今天,我们就来手把手教你&#x…...
TinyXML2性能优化终极指南:10个技巧让XML处理速度飙升
TinyXML2性能优化终极指南:10个技巧让XML处理速度飙升 【免费下载链接】tinyxml2 TinyXML2 is a simple, small, efficient, C XML parser that can be easily integrated into other programs. 项目地址: https://gitcode.com/gh_mirrors/ti/tinyxml2 TinyX…...
告别BibTeX混乱:在LaTeX中精准控制单条参考文献格式(颜色、字体)的实战技巧
告别BibTeX混乱:在LaTeX中精准控制单条参考文献格式(颜色、字体)的实战技巧 学术写作中,参考文献的视觉呈现往往被忽视。当审稿人要求"突出显示新增文献"时,当需要区分自己的前期工作与奠基性研究时&#x…...
Pixel Dream Workshop 助力前端开发:Vue.js 项目动态视觉素材生成指南
Pixel Dream Workshop 助力前端开发:Vue.js 项目动态视觉素材生成指南 1. 为什么前端开发者需要关注视觉素材生成 作为一名Vue.js开发者,你可能经常遇到这样的困扰:产品经理突然要求给新功能加个炫酷的Banner图,设计师资源紧张排…...
Qwen3-Reranker-0.6B与Java后端服务集成实战
Qwen3-Reranker-0.6B与Java后端服务集成实战 1. 为什么需要在Java服务中集成重排序模型 在企业级搜索和推荐系统中,我们经常遇到这样的场景:用户输入一个查询词,系统从千万级文档库中召回前100个候选结果,但这些结果的排序质量往…...
