用haversine和float计算距离......有点工作

Posted

技术标签:

【中文标题】用haversine和float计算距离......有点工作【英文标题】:distance calculation with haversine and float... kinda working 【发布时间】:2012-10-26 23:55:02 【问题描述】:

我正在使用 hasrsine 查询来提取最接近移动应用提供的纬度/经度的位置。

查询如下所示:

SELECT *,(((acos(sin(($latitude *pi()/180)) * sin((`lat`*pi()/180))+cos(($latitude *pi()/180)) * cos((`lat`*pi()/180))* cos((($longitude - `lon`)*pi()/180))))*180/pi())*60*1.1515) AS dist_x 
FROM `work_places`
HAVING dist_x <= '1'
ORDER BY dist_x ASC
LIMIT 10

这工作得很好,我得到的正是我应该得到的位置。

问题在于将 dist_x 转换为用户可读的内容。现在,假设 dist_x 读取为:0.00996273036944(floatval 和字符串显示相同,因此可以正确转换)

由于查询是在 1 英里范围内搜索,因此我尝试将其转换为英尺,因此我将 dist_x 除以 5280。

       $distance = (float)( $dist_x / 5280 );

我得到的是 $distance = 1.88688075179E-6

我做错了什么?

【问题讨论】:

换算系数略有错误:1852 m(海里)/1609.344 m(标准英里)~1,1508。只是一个小问题...... 我不明白你在哪里看到这些值... 在 SELECT 语句的末尾有“pi())*60*1.1515”。您将得到弧度的结果,将其转换为度数,然后乘以 60 转换为弧分。一角分是海里,海里是 1,1508 标准英里。 顺便说一句,谢谢...我将计算从 *5280 更改为 *6076.12,这要准确得多。 【参考方案1】:

我可能遗漏了一些东西,但是如果您想将英里转换为英尺,您不想乘以 5280 而不是除以吗?

【讨论】:

当你工作时间过长时会发生这种情况......当你应该走弯路并犯愚蠢的小错误时你会曲折,你无法弄清楚为什么你会得到你得到的错误你发布愚蠢的问题让其他人回答!大声笑谢谢!【参考方案2】:

一英里是 5280 英尺,所以应该是

$distance = (float)( $dist_x * 5280 );

【讨论】:

我给了 localhost 解决方案,因为......他先回答了......但是谢谢!

以上是关于用haversine和float计算距离......有点工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Haversine 公式计算行驶距离(不是位移)?

python - 如何使用python中的haversine库计算大距离矩阵?

Laravel中两点之间的Haversine距离计算

计算两个latitude-longitude点之间的距离? (Haversine公式)

在计算Haversine距离时,主for循环只运行一次

计算两个经纬度点之间的距离? (Haversine 公式)