2011-10-04 96 views
1

可能重複:
Get polygons close to a lat,long in MySQL什麼是進行附近搜索的最佳方法? (PHP和MySQL)

是什麼做的是> = 500萬個數據附近搜索(最好的辦法,也可以是通過地方類別過濾器(例如想要搜索附近的「加油站」)& &按關鍵字過濾),並按距離ASC排序。

是任何教程/算法來做到這一點?數據庫結構如何,可能必須做羣集?因爲如果我們在一張大桌子上搜索,這將需要時間。

注意:假設裏面有10個字段(地名,地址,類別,長,經緯度等)。 實際上,我試過http://www.arubin.org/files/geo_search.pdf,但它仍然很慢。

+0

fosmaki,歡迎SO。一個問題:你真的認爲你是第一個在這裏問這個問題的人嗎?請閱讀[FAQ](http://stackoverflow.com/faq)。 – hakre

回答

0

如果您想要進行附近的搜索,首先需要確定要比較的每個位置的地理位置以及要比較的用戶的地理位置。要獲取您所在位置的座標,您可以使用隨地理位置信息附帶的郵政編碼數據庫。網上有很多可用的價格非常合理(整個美國平均價格約爲90美元)。

然後,您需要對用戶進行地理定位,這可以使用geoip例程完成,或者只需使用HTML5地理定位API即可完成。

當您獲得用戶的位置時,可以使用「簡單」距離計算函數來計算lat/long 1和lat/long 2之間的距離:(Lat1 = user,Lat2 =要比較的位置的dbfield )

SELECT ((ACOS(SIN($lat * PI()/180) * SIN(lat * PI()/180) + COS($lat * PI()/180) * COS(lat * PI()/180) * COS(($lon – lon) * PI()/180)) * 180/PI()) * 60 * 1.1515) AS `distance` FROM `members` HAVING `distance`<=’10′ ORDER BY `distance` ASC 

通過在HAVING或限制結果的數量,你想指定距離限制就適應查詢您的需要。

+0

雖然這可能有效,但它非常不合適。必須爲每一行計算'距離'。這是一個複雜的計算,運行500萬次。 – barryhunter

相關問題