首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haversine公式的不同结果

Haversine公式的不同结果
EN

Stack Overflow用户
提问于 2012-02-25 17:01:39
回答 1查看 508关注 0票数 1

我使用mysql来计算邻近度,为此,我创建了一个名为using的过程,如下所示,但该过程不能正常工作,但是sql语句工作正常,所以这里的区别是什么,因为我猜两者都是Haversine formulas,但没有给出正确的结果。我真的don't know wht i am missing in formula one.

表的数据结构如下

一级方程式

代码语言:javascript
复制
id  varchar(100)    
userid  varchar(100)    
username varchar(100)
currLoc point           
radius  int(10)

对于第二方程式

代码语言:javascript
复制
id  varchar(30)
userid  varchar(30)
username varchar(40)
lat float(10,6)
lan float(10,6)
radius  varchar(100)

一级方程式: 参考文献

代码语言:javascript
复制
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)));

二级方程式: 参考文献

代码语言:javascript
复制
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是半径,以公里为单位

EN

回答 1

Stack Overflow用户

发布于 2012-02-25 17:49:58

表达式的一个版本使用ABS(X(a))等,而另一个则不使用。那个用ABS的人是可疑的。你不能忽视角度上的标志。你会得到不同的结果,在世界上的某些地区(如赤道附近,或质点子午线,或接近两极)。

你的常量也不一样。

代码语言:javascript
复制
60*1.1515*1.609344

vs

代码语言:javascript
复制
6371 * 2

一个表达式涉及SQRT,另一个表达式不涉及SQRT。

一个表达式涉及ASIN,另一个使用ACOS。

从本质上说,两者之间没有共同点.

请参阅维基百科“'Haversine公式”上的讨论,特别是当点之间的距离很小时,对数值稳定性的引用。

你也可以提高人们帮助你的机会,你使用的公式是半可读的,并将它们分割成行。

例如:

代码语言:javascript
复制
 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)));

和:

代码语言:javascript
复制
(((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中的表。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9446068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档