在sql查询中的余弦/球面余弦法/ vincenty

时间:2016-06-13 13:33:50

标签: distance haversine cosine

我正在测试不同的公式,用于在给定的纬度/经度的给定半径内找到地球上的特定点。我一直在使用'余弦的球面定律'以及我认为是Haversine的实现。

对于以下公式,这些是变量:

[$ lat / $ lon] =原点

[纬度/经度] =第二点

[$ radius] = radius

余弦球面律

3959 * acos( cos( radians('.$lat.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$lon.') ) + sin( radians('.$lat.') ) * sin( radians( latitude ) ) ) ) <= '.$radius.';

Haversine(至少我认为是!)

3959*3.1415926*sqrt((latitude-'.$lat.')*(latitude-'.$lat.') + cos(latitude/57.29578)*cos('.$lat.'/57.29578)*(longitude-'.$lon.')*(longitude-'.$lon.'))/180) <= '.$radius.';';

我最初发现很多信息说,就准确性而言,Haversine是金标准。然而,似乎还有一种观点认为余弦的球面定律比Haversine更准确,只要测量的距离大于5米左右即可。此外,有人说文森特据称在准确性方面胜过双方。

三个问题:

我的Haversine公式实际上是Haversine还是其他东西?

哪种想法最准确?

根据上述论坛的说法,有人能为我提供Vincenty的表述吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

你所谓的Haversine公式是完全错误的。

首先它包含7个左括号和8个右括号。

其次从度数到弧度的转换在某些情况下通过除以57.29578完成,然后在前面有一个恒定的pi,在后面有一个常数180。

第三个haversine(x) = sin(x / 2) ** 2我在任何地方都看不到/ 2

第四,前面附近应该有一个asin函数调用。

更正公式here

答案 1 :(得分:-1)

我的回答将更具体针对您的第一和第二个答案

Q1:我的Haversine公式实际上是Haversine还是其他东西?

我不明白你做过的你的胡萝卜素配方 写一个或完全是针对hasrsine公式的SQl查询就是那个 来自Google开发人员网站Click Here For Details

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

这个SQL语句将找到距离37,-122坐标25英里半径范围内最近的20个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅询问距离值小于25的行,按距离对整个查询进行排序,并将其限制为20个结果。要按公里而不是英里搜索,请将3959替换为6371。

您可以对此SQL查询进行更改,使其完全符合您的要求。

Q2:有哪些想法最准确?

对谁来说,没有最终答案?!,但我们可以解决这个问题:

1.Haversine更快。

2.对于小距离,余弦的球面定律更准确。

关于Q3我知道vincenty Formula是最准确的但它是最慢的一个