使用经纬度查找距离的Sql返回错误的距离

Posted

技术标签:

【中文标题】使用经纬度查找距离的Sql返回错误的距离【英文标题】:Sql for finding the distance between using latitude and longitude returns wrong distance 【发布时间】:2018-06-04 18:19:56 【问题描述】:

我需要获取纬度和经度位置之间的距离, mysql 查询工作没有错误,但它返回错误的距离值

当我输入与数据库中相同的纬度和经度时,它给出的距离为“2590.4238273460855”而不是零,我不知道这有什么问题

mysql查询如下 这里的纬度和经度是我的表格列名

$sql = "SELECT id,(3956 * 2 * ASIN(SQRT( POWER(SIN(( $latitude - latitude) *  pi()/180 / 2), 2) +COS( $latitude * pi()/180) * COS(latitude * pi()/180) * POWER(SIN(( $longitude - longitude ) * pi()/180 / 2), 2) ))) as distance  
from table_name ORDER BY distance limit 100";

谁能帮帮我..

【问题讨论】:

当我运行这个查询时,我得到一个非常接近零的数字(由于转换为弧度时不精确,所以不完全为零)。您还可以显示设置变量并执行查询的代码吗? 请告诉我们导致 2590 的 $lat, $lng, lat, lng 的值... 【参考方案1】:

Haversine 公式中存在错误。正弦公式为:

Haversine_distance= r * 2 * ASIN(SQRT(a))

在哪里

a = POW(SIN(latDiff / 2), 2) + COS(lat1) * COS(lat2) * POW(SIN(LonDiff / 2), 2)

因此,要更正您的代码,请将您的查询更改为:

"SELECT id,(3956 * 2 * ASIN(SQRT( POWER(SIN(( $latitude - latitude) / 2), 2) +COS( $latitude) * COS(latitude) * POWER(SIN(( $longitude - longitude ) / 2), 2) ))) as distance from table_name ORDER BY distance limit 100";

【讨论】:

当我执行这个查询时,我得到一个 sql 错误 - #1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '"' 附近使用正确的语法 我的查询和你的查询一样,我只是在你的查询中删除了所有 * pi()/180 的实例。所以理论上它不应该失败。尝试从您自己的查询中删除它们,如果可行,请告诉我。 您的代码是正确的,这是我输入错误的错误,对不起,感谢您分享您的时间 我希望我的回答是正确的,它可以帮助您解决问题。

以上是关于使用经纬度查找距离的Sql返回错误的距离的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 中使用纬度和经度查找两点之间的距离

使用纬度和经度返回 SQL Server 2008 中两个位置之间的距离

sql语句怎么写算坐标经纬度之间的距离?我是mysql数据库。 请详细点!谢谢!

给定初始纬度 lng,距离和方位角,在 php 中查找纬度经度点

查找提供的纬度和经度的最近距离记录的程序[重复]

2020-06-03 两点经纬度计算距离-原理及SQL