2014-01-10 136 views
5

我在我的數據庫100000個地址(這是記錄)。MySQL選擇範圍內的座標

他們每個人都有自己的座標(經度和緯度)。

現在,考慮到用戶的地理位置(緯度和經度),我想在地圖上僅顯示5英里範圍內的地址(使用Google地圖v3 API)。

這意味着通常只有5或6個地址必須在100 000個地址中顯示出來。

一種解決方案可以檢索所有記錄並應用Java中的公式計算每個地址的距離並僅在範圍內顯示該公式。

這會浪費處理能力,因爲我需要檢索所有記錄,而只需要在地圖上顯示5或6個記錄。

我該如何解決數據庫端(MySQL)的這個問題,以便只返回5英里範圍內的地址?

+0

可能重複的[Haversine計算:顯示用戶集內](http://stackoverflow.com/questions/20437225/haversine-calculation-show-users-within -組) –

回答

14

您可以使用所謂的Haversine formula

$sql = "SELECT *, (3959 * acos(cos(radians(" . $lat . ")) * cos(radians(lat)) * cos(radians(lng) - radians(" . $lng . ")) + sin(radians(" . $lat . ")) * sin(radians(lat)))) AS distance FROM your_table HAVING distance < 5"; 

$lat$lng是你點的座標和緯度/經度是你的表列。以上將列出5 nm範圍內的位置。將3959替換爲6371更改爲公里。

此鏈接可能是有用的:https://developers.google.com/maps/articles/phpsqlsearch_v3

編輯:我沒有看到你所提到的Java。這個例子是在PHP中,但查詢仍然是你需要的。

0

UpsideDown先生,我一直在尋找這個問題的答案好幾個星期,有一個非常好的解決方案,令人驚訝的是我沒有找到其他地方。你將不得不創建一個存儲過程,在將它應用到MySQL查詢之前限制與Java的接近度,並且查詢將在幾毫秒內返回結果,我在一個超過900K用戶的表中使用它您可以通過接近下100毫秒這一技術搜索(它與PHP解釋,但你需要的MySQL的技巧仍然存在):

http://cssshowcase.co.uk/mysql-get-distance-by-latitude-and-longitude-coordinates/

沒有其他的解決方案工作的好,一樣快以上,網絡上的其他解決方案使查詢花費15-20秒,這顯然不好。

0

我的做法 - 和我使用它 - 是這樣想一個技術人員,我很高興與+/- 5%

這種解決方案並不意味着控制火箭,船或類似的,只有下面〜百公里距離它就像Fermi problem

一個解決方案,以便讓我們開始一個務實的解決方案:

第一:對於很多問題,我們可以忽略地球不是平的(距離<〜100公里),

地球的周圍或多或少是40000公里(由於某些原因,或多或少都是由於某種原因)

一個圓圈恰好是360度。

所以1公里是:四萬分之三百六十度=> 0.00278度

然後只要選擇這個0.003每公里內的緯度/經度,它將是這樣的,其中長> 42 - 0.003和長< 42 + 0.003 - 拉特相同,其中42是您的緯度/長度作爲中點。數據庫將使用索引。

問題:你得到一個正方形的結果,而不是圓(不是真正的距離)

如果您需要的圈子,得到結果後腳本它。

我只是在2公里顯示官方toilette,所以一個正方形是可以的,並且準確性也是。究其原因,有街道和房屋,這樣的人不能直接走...

編輯:技術/數學解釋:

對於非常小的三角形(一個角度< < 5度)你可以忽略使用三角。所以sin(5度)〜= 5/180 * PI