2012-01-31 49 views
1

我有一個php腳本和一個地理定位數據庫。使用PHP和MySQL來計算地理位置距離

此刻我的用戶可以輸入自己的郵政編碼,使用Yahaa我得到他們的地理位置信息。

現在,我有自己的地理位置,我想寫加載在距離的順序與其本地商家的腳本。我猜這樣做我需要加載數據庫中與用戶當前地理位置座標最相似的記錄。我試過這個代碼:

$sql = "SELECT * FROM dirlistings WHERE ABS(latitude - $lat) AND ABS(longitude - $long)"; 

但是它只是以正常順序顯示結果。

我錯過了什麼嗎?

+0

**警告**您的代碼易受sql注入攻擊。 – 2012-01-31 17:54:18

+0

我正在做這樣的事情,事情是它存儲在家裏的電腦,我不在那裏,我可以提供你需要的所有信息。因爲地球是一個球體,所以不僅僅是減法。 – Grigor 2012-01-31 18:00:00

回答

2

需要注意的是圓的距離不會是精確不夠的,如果你在談論大距離(例如數千英里),因爲地球表面不平坦。如果您需要爲地理距離計算更好的公式,你可以使用這樣的事情:

$dlat = ((double)$lat)/57.29577951; 
$dlon = ((double)$lon)/57.29577951; 

$sql = "SELECT * 
     FROM dirlistings 
     WHERE 3963.0 * acos(sin(latitude/57.29577951) * sin($dlat) + cos(latitude/57.29577951) * cos($dlat) * cos($dlon - longitude/57.29577951)) < MAX_DIST 
     ORDER BY acos(sin(latitude/57.29577951) * sin($dlat) + cos(latitude/57.29577951) * cos($dlat) * cos($dlon - longitude/57.29577951)) 
     "; 

的位置距離英里 - 確保指定正確的最大距離 - 這公式將給予非常密切的結果甚至一萬英里的距離。請注意,這樣的計算相當耗時且耗能,如果你不處理大距離(即不超過幾百英里),那麼你應該使用更快的近似。

+0

我已經指定了最大距離,什麼都沒有出現? – 2012-01-31 18:18:14

+0

在這種情況下,我建議你實際檢查你的數據。我們已經使用這個公式和我們的(有效)數據已經有好幾年了,並取得了巨大的成功。 – 2012-01-31 23:58:14

+0

對不起,需要一段時間才能回覆。隨着一些搞亂我得到它的工作。我可以問我應該把我的max_dist設置爲什麼嗎?它只在價值很高時纔有用,當我只尋找最大40英里的地點時,價值應該是多少。 – 2012-02-04 16:00:36

1

嘗試ORDER BY latitude, longitude結束。這應該做或大致做到這一點。

+0

我不認爲這會有用。排序必須通過使用經度和緯度的公式的結果完成,而不是單獨進行。 – 2012-01-31 18:07:36

+0

你是完全正確的。哇。我幾年沒有這樣做了,我忘記了這個公式。 – Tim 2012-01-31 18:43:36

3

我想你想在某個地方有一個ORDER條款。

但你真的是什麼haversine公式:MySQL Great Circle Distance (Haversine formula)

+1

在短距離(任何小於〜50英里的距離)內,爲了計算距離(至少在該域中),可以將地球視爲平面。 – 2012-01-31 18:02:46

2

你已經錯過了不少東西。爲了做你想做的事情,你需要計算(使用畢達哥拉斯定理)兩點之間的距離,然後按這個距離排序。

您可以通過計算距離((lat - $lat)^2 + (lon - $lon)^2)^0.5

SQRT(
    POW(latitude - ' . $lat . ',2) 
    + 
    POW(longitude - ' . $lon . ',2) 
) AS distance 

然後,它的那樣簡單:

ORDER BY distance ASC