2012-02-25 67 views
1

我正在使用mysql來計算鄰近度,爲此我創建了一個名爲distance的過程,如下所示,但該過程不能正常工作,但sql語句正在工作,因此這裏有什麼區別因爲兩者都是我猜Haversine formulas,但沒有給我正確的結果。我真的don't know wht i am missing in formula one.Haversine公式的不同結果

我的表中的數據

結構如下

式一個

id varchar(100)  
userid varchar(100)  
username varchar(100) 
currLoc point   
radius int(10) 

對於式2

方程式:reference

sql statement to execute distance function 

SELECT userid, username, distance(userstatus.currLoc, 
GeomFromText('POINT(23.039574 72.56602)')) AS cdist 
    FROM userstatus HAVING cdist <= 0.6 ORDER BY cdist LIMIT 10 


RETURN 6371 * 2 * 
    ASIN(SQRT(POWER(SIN(RADIANS(ABS(X(a)) - ABS(X(b)))), 2) + 
       COS(RADIANS(ABS(X(a)))) * COS(RADIANS(ABS(X(b)))) * 
        POWER(SIN(RADIANS(Y(a) - Y(b))), 2))); 

式2:reference

SELECT *,(((acos(sin((23.039574*pi()/180)) * 

     sin((lat *pi()/180))+cos((23.039574*pi()/180)) * 

     cos((lat *pi()/180)) * cos(((72.56602- lon)*pi()/180))))* 

    180/pi())*60*1.1515*1.609344) as distance 

FROM status HAVING distance <= 0.6 

這裏0.6是在表達的

回答

3

一個版本是使用ABS公里半徑(X(A))等,而另一個不是。使用ABS的那個是可疑的。你不能忽視角度上的標誌。在世界某些地區(例如赤道附近或主要子午線附近,或者在極點附近),你會得到不同的結果。

你的常量也不同。

60*1.1515*1.609344 

VS

6371 * 2 

一個表達涉及SQRT,其他沒有。

一個表達式涉及ASIN,另一個表達式使用ACOS。

有本質上沒有什麼共同點兩者之間...

看到維基百科'Haversine Formula'的討論,特別是引用數值穩定在兩點之間的距離很小。

您還可以通過將您的公式分爲多行來將您的公式用於半讀,從而提高人們幫助您的機會。

例如:

RETURN 6371 * 2 * 
     ASIN(SQRT(POWER(SIN(RADIANS(ABS(X(a)) - ABS(X(b)))), 2) + 
        COS(RADIANS(ABS(X(a)))) * COS(RADIANS(ABS(X(b)))) * 
         POWER(SIN(RADIANS(Y(a) - Y(b))), 2))); 

和:

(((acos(sin((23.039574*pi()/180)) * sin((lat *pi()/180)) + 
     cos((23.039574*pi()/180)) * cos((lat *pi()/180)) * 
     cos(((72.56602-lan)*pi()/180)) 
     ) 
    ) * 180/pi()) * 60 * 1.1515 * 1.609344) 

後者引用 'LAN';這是否意味着'lon'?在第二個示例中,您似乎將兩個位置中的一個編碼爲23.039574°N和72.56602°W,並且latlan來自SQL查詢中的表格。

+0

+1引起了我的注意,好吧,那麼我應該怎麼使用那麼哪個是標準和正確的? – Hunt 2012-02-25 17:58:39

+0

雖然二級方程式是一個有效的Haversine公式嗎? – Hunt 2012-02-25 19:28:07