我有一个包含点的纬度/经度的数据库。如果我想选择以特定点为中心的特定范围内的所有点,它可以正常工作,但是如果有任何点位于该中心,则它将不会被选择!
我使用这个查询:
SELECT *, ( 6371 * acos( cos( radians(-27.5796498) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-48.543221) ) + sin( radians(-27.5796498) ) * sin( radians( latitude ) ) ) ) AS distance FROM map HAVING distancia <= 2
在上述情况下,半径为“2”,地图中心位于 [-27.5796498,-27.5796498]。这个查询工作得很好,但是如果某个点位于这个非常精确的中心,它将不会被选择。为什么?
编辑:我发现上面的公式为所有点返回一个很好的值,但对于位于中心的点,MYSQL 将值 NULL 返回到“距离”列!专业人士如何处理这种使用SQL在包括中心点的范围内选择点的问题?
编辑2:我可以创建另一个查询来选择位于半径正中心的所有点,但这效率不高,也许一些数学向导可以想出一个更好的公式。
有时参数为ACOS()
当距离很小时,可以稍微大于 1——稍微超出该函数的域。由于 Vincenty,有一个更好的距离公式可用。它使用ATAN2(y,x)
函数而不是ACOS()
函数,因此在数值上更加稳定。
就是这个。
DEGREES(
ATAN2(
SQRT(
POW(COS(RADIANS(lat2))*SIN(RADIANS(lon2-lon1)),2) +
POW(COS(RADIANS(lat1))*SIN(RADIANS(lat2)) -
(SIN(RADIANS(lat1))*COS(RADIANS(lat2)) *
COS(RADIANS(lon2-lon1))) ,2)),
SIN(RADIANS(lat1))*SIN(RADIANS(lat2)) +
COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1))))
该函数返回以度为单位的结果。一度有 111.045 公里。 60海里。 69 法定英里。因此,将结果乘以这些数字之一即可得到距离。
有一个更完整的文章,包括 MySQL 的存储函数定义,here http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/.
另一种解决方案是使用ISNULL(ACOS(formula), 0.0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)