2012-12-05 144 views
4

如果您的數據庫中存儲了緯度和經度,並且需要計算兩個座標之間的距離。你如何使用MySQL函數來計算它?用於計算兩個緯度和經度之間距離的MySQL函數

+5

這裏有什麼問題? –

+0

可以回答你自己的問題,但你需要提出一個問題。你還需要解釋你正在做什麼假設。例如,你可能用英里表示距離,而不是說公里。它看起來像你的座標用度來表示。你的函數文檔應該這樣說。你也假設一個球形地球而不是球形地球。 –

+2

@SashiKant我編輯的帖子是我回答的問題。 – jpgunter

回答

8

經過四處尋找,我放棄了,自己寫了。我能夠將一些其他代碼調整爲以下MySQL函數。

DELIMITER $$ 
/* 
Takes two latitudes and longitudes in degrees. You could comment out the conversion if you want to pass as radians. 
Calculate the distance in miles, change the radius to the earth's radius in km to get km. 
*/ 

DROP FUNCTION IF EXISTS GETDISTANCE$$ 
CREATE FUNCTION GETDISTANCE 
    (deg_lat1 FLOAT, deg_lng1 FLOAT, deg_lat2 FLOAT, deg_lng2 FLOAT) 
    RETURNS FLOAT 
    DETERMINISTIC 
BEGIN 
    DECLARE distance FLOAT; 
    DECLARE delta_lat FLOAT; 
    DECLARE delta_lng FLOAT; 
    DECLARE lat1 FLOAT; 
    DECLARE lat2 FLOAT; 
    DECLARE a FLOAT; 

    SET distance = 0; 

    /*Convert degrees to radians and get the variables I need.*/ 
    SET delta_lat = radians(deg_lat2 - deg_lat1); 
    SET delta_lng = radians(deg_lng2 - deg_lng1); 
    SET lat1 = radians(deg_lat1); 
    SET lat2 = radians(deg_lat2); 

    /*Formula found here: http://www.movable-type.co.uk/scripts/latlong.html*/ 
    SET a = sin(delta_lat/2.0) * sin(delta_lat/2.0) + sin(delta_lng/2.0) * sin(delta_lng/2.0) * cos(lat1) * cos(lat2); 
    SET distance = 3956.6 * 2 * atan2(sqrt(a), sqrt(1-a)); 

    RETURN distance; 
END$$ 
DELIMITER ; 
相關問題