2012-08-03 129 views
1

的方法,我需要實現一個基於位置的搜索功能,用戶將能夠選擇一個城市和地區(城市內),進行提的關鍵詞,然後點擊搜索。所以說,我們有10個城市,每個城市平均有100個地方。結果將顯示考慮到用戶提供的地點作爲起點,並訂購遠離用戶所在地的其他結果(以這種方式,特定關鍵字的城市結果將是恆定的,只有排序會改變)。將是什麼最好的方法在PHP?搜索基於位置的搜索

1)計算各地之間的距離,預先將它們存儲在mySqldatabase。這意味着一個100X100的地區矩陣(每個地區與其他地區的距離)。與db中的城市一樣多的表格。所以10個這樣的表格+添加更多的可能性。這僅用於訂購。

2)把所有的數據放在一個XML而不是mysql數據庫。

3)使用位圖和壓縮圖像?

考慮性能和可擴展性作爲主要標準。

+1

也許你會想看看:http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html – 2012-08-03 17:35:46

+0

希望它可以幫助... http://stackoverflow.com/問題/ 11586708/GET-結果 - 即墜落在之內標記半徑,從數據庫 – Shubhansh 2012-08-03 17:40:04

回答

0

你首先由城市和標籤過濾您的數據,然後想爲了結果通過遠觀而不可過濾的距離。即即使是最遠的點也應該從數據庫中檢索。在這種情況下,如果您在執行請求時計算距給定位置的距離,則不會有太多的損失。畢竟,每行只有一個公式評估,然後按照該值對結果進行排序。

如果你的數據是利用緯度和經度座標給出,那麼理論上這將意味着使用複雜的公式球computating測地線的長度。但是在一個城市內,地理信息網格可以合理地假定爲矩形(不是方形)。所以,如果你存儲緯度的一個度,每個城市的經度1度的比例,則可以將所有的座標轉換爲方格網,從Xÿ方向輸入的位置計算差異,方形,並添加那些。無需採取平方根,因爲正方形的排序工作也一樣。

東西沿着這些路線:

SELECT location.name, location.lat, location.lon, … 
    FROM locations, cities 
    WHERE location.city = city.id 
    AND city.name = ? 
    AND location.tag = ? 
ORDER BY POW((location.lat - ?), 2) + POW((location.lon - ?)*city.geoaspect, 2) 

,其中的參數是城市名稱,選擇的標籤和輸入的經度和緯度。

0

也可以計算與矩形網格和沒有mercantor突起和harvesine式一個地理散列,或使用從MySQL點和空間索引數據結構。然後計算查詢中的距離會快一點。