我使用mysql来计算邻近度,为此,我创建了一个名为using的过程,如下所示,但该过程不能正常工作,但是sql语句工作正常,所以这里的区别是什么,因为我猜两者都是Haversine formulas,但没有给出正确的结果。我真的don't know wht i am missing in formula one.
表的数据结构如下
一级方程式
id varchar(100)
userid varchar(100)
username varchar(100)
currLoc point
radius int(10)对于第二方程式
id varchar(30)
userid varchar(30)
username varchar(40)
lat float(10,6)
lan float(10,6)
radius varchar(100)一级方程式: 参考文献
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)));二级方程式: 参考文献
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是半径,以公里为单位
发布于 2012-02-25 17:49:58
表达式的一个版本使用ABS(X(a))等,而另一个则不使用。那个用ABS的人是可疑的。你不能忽视角度上的标志。你会得到不同的结果,在世界上的某些地区(如赤道附近,或质点子午线,或接近两极)。
你的常量也不一样。
60*1.1515*1.609344vs
6371 * 2一个表达式涉及SQRT,另一个表达式不涉及SQRT。
一个表达式涉及ASIN,另一个使用ACOS。
从本质上说,两者之间没有共同点.
请参阅维基百科“'Haversine公式”上的讨论,特别是当点之间的距离很小时,对数值稳定性的引用。
你也可以提高人们帮助你的机会,你使用的公式是半可读的,并将它们分割成行。
例如:
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,lat和lan来自SQL中的表。
https://stackoverflow.com/questions/9446068
复制相似问题