2012-02-25 68 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