2016-06-13 35 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