2016-06-13 56 views
0

我正在测试不同的公式,用于查找给定经度/纬度范围内给定半径内地球上的特定点。我一直在使用'余弦球形法则',我相信这是实施Haversine。SQL查询中的半正定/球形定律/ vincenty查询

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

[$纬度/ $经度] =原点

[纬度/经度] =第二点的点

[$半径] =余弦

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

半正矢半径

球法(至少我觉得是!)

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

我最初遇到了很多的信息说,半正弦波是黄金标准尽可能准确度来了。然而,似乎也有一种观点认为,余弦的球形定律比Haversine更准确,只要被测量的距离大于5米左右即可。此外,有人说,文森特被称为在准确性方面胜出。

三个问题:

是我haversine公式实际上是半正弦波或别的东西?

任何想法都胜出最准确?

任何人都可以为我提供Vincenty的配方,沿着上述论坛的路线吗?

谢谢!

回答

-1

我的回答将是你的第一个和第二个答案

Q1更具体:是我haversine公式实际上是半正弦波或别的东西?

我唐不明白你的haversine公式你成功了 写一个或正是为了haversine公式SQL查询是 从谷歌的开发者网站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查询进行更改即可完成您想要的操作。

问题2:任何想法都能赢得最准确的结果吗?

谁能胜出没有最终答案?,但是,我们可以处理如下:

1.Haversine是来得更快。

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

约Q3我知道vincenty公式是最准确的,但它是最慢的一个

+0

Q1:你的推荐配方开始与'SELECT ID,(3959个* ACOS('...了'acos'品牌作为余弦公式的球形规律,绝对不是haversine公式Q2.1半胱氨酸的速度并不快,Q2.2球形的余弦定律在小的差异上是LESS准确的。 –

0

你所谓的半正矢公式是完全不正确的。

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

其次从度转换为弧度在某些情况下,通过分割57.29578完成然后有一个常数pi了前部和一恒定向下180的背面。

第三haversine(x) = sin(x/2) ** 2,我没有看到任何地方/ 2

第四应该是前面附近asin函数调用。

正确的公式here