mysql 计算两点之间距离

这篇具有很好参考价值的文章主要介绍了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 计算两点之间距离,MYSQL,mysql,数据库

上图,按照以往我这边一定是存在着 "经度"、"纬度" 两个字段的,因为传给 "腾讯" 或 "阿里" 等第三方处理,都是需要使用到 经纬度的。

而本次,我们可以自己在内部使用 mysql 自带的方法,就可以计算出结果。

所以我们追加了一个字段 "lng_lat",该字段的数据类型则为:geometry

mysql 计算两点之间距离,MYSQL,mysql,数据库

上图,是 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  计算出来的距离,默认单位是"米"

我这边就拿一个实际位置来做演示吧!

mysql 计算两点之间距离,MYSQL,mysql,数据库

查询的 SQL 如下:

select site_name,st_distance_sphere(POINT(104.068544,30.606452),lng_lat) as distant from table_name

mysql 计算两点之间距离,MYSQL,mysql,数据库

可以看到,因为我的 查询 经纬度,直接用的是 "成都南站站点",所以得出的结果就是 "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

结果为:

mysql 计算两点之间距离,MYSQL,mysql,数据库

可以发现,两者相差的位置,其实并不远,我算了一下:

10101.64  - 10097.7 = 3.94

相差约 4 米,所以问题也不大!文章来源地址https://www.toymoban.com/news/detail-679586.html

到了这里,关于mysql 计算两点之间距离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决MySQL数据库拒绝远程计算机连接问题

    错误信息:Host is not allowed to connect to this mysql server 以前MySQL数据库部署在云服务器上,程序服务端也部署在云服务器上,连接服务器从没出现过问题。最近有一次需要做一个完全局域网的环境部署,我把数据库和程序服务端部署在里两台不同的电脑上,访问数据库的时候出现

    2024年02月09日
    浏览(28)
  • python实现d435i深度相机测量两点之间的距离

    本文介绍python方法实现intel公司realsense系列d435i深度相机测量彩色图像上两点之间的距离。 原理很简单,就是将相机获得的彩色图像流与深度流对齐,这样彩色图像上的每个像素就会对应一个深度值,作为z坐标,然后通过相机内参获得该像素的x坐标和y坐标。我们获得的x、

    2024年02月16日
    浏览(28)
  • 数据库sql 根据身份证计算年龄段mysql、oracle

    mysql: mysql通过函数可以精确到日 结果: Oracle: oracle只是年份相减,不够精确 结果:

    2024年02月12日
    浏览(44)
  • 数据库SQL函数 根据身份证号/出生年月 精确计算年龄(Oracle/MySQL)

    问题 根据身份证号统计年龄(18位) Oracle 思路 (1)Substr()函数在Oracle使用中表示被劫取的字符串表达式,截取字符串的内容。 (2)To_date()函数可以转换不同格式的日期,通过使用to_date函数可以将字符串类型的日期转换成date格式。 (3)Months_between()函数反悔两个日期之间的

    2024年02月11日
    浏览(38)
  • 【数理知识】求两个三维空间点的坐标矩阵之间,任意两两点之间的空间距离,matlab 实现

    假设有两个包含了三维空间点坐标的,三维向量集 A A A 和 B B B ,两集合中分别有 m m m 个和 n n n 个三维空间坐标点,可以用矩阵表示为 A = [ a 1 x a 2 x a 3 x ⋯ a m x a 1 y a 2 y a 3 y ⋯ a m y a 1 z a 2 z a 3 z ⋯ a m z ] 3 × m , B = [ b 1 x b 2 x b 3 x ⋯ b n x b 1 y b 2 y b 3 y ⋯ b n y b 1 z b 2 z b 3 z ⋯

    2024年02月11日
    浏览(35)
  • 云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

    机器配置 具体配置如下: 添加磁盘 磁盘分区 创建LV 格式化 分别给2台虚拟机添加2块5G的磁盘 查看物理卷 创建卷组 查看卷组大小 创建逻辑卷 两台主机都要做此项操作 具体操作如下: 安装MySQL软件 挂载LV分区 启动服务 管理员登录

    2024年01月25日
    浏览(33)
  • PHP 房产网站系统Dreamweaver开发mysql数据库web结构php编程计算机网页项目

    一、源码特点     PHP 房产网站系统是一套完善的WEB设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 源码 https://download.csdn.net/download/qq_41221322/88233553 论文 https://download.csdn.net/download/qq_41221322/88233555 PHP 房产网站系统Drea

    2024年02月12日
    浏览(41)
  • java碳排放数据信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

    一、源码特点     java Web碳排放数据信息管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环 境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发。 java Web碳排放数据信

    2024年01月22日
    浏览(41)
  • 算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

    可以三个条件 以此类推 (condition1)?x:(condition2)?y:z string变成int int 变成string 可以用循环 模运算展开式推导 我们要证明等式: (a * b) mod m = ((a mod m) * (b mod m)) mod m 假设 a = q1 * m + r1 ,其中 q1 是 a 除以 m 的商, r1 是 a 除以 m 的余数。类似地,假设 b = q2 * m + r2 ,其中

    2024年02月08日
    浏览(47)
  • PHP 旅游网站系统mysql数据库web结构apache计算机软件工程网页wamp

    一、源码特点     PHP 旅游网站系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为PHP APACHE,数据库为 mysql5.0,使用php语言开发。 代码下载  https://download.csdn.net/download/qq_41221322/87952564 视频

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包