根据半径从地图数据库中选择点

2024-02-27

我有一个包含点的纬度/经度的数据库。如果我想选择以特定点为中心的特定范围内的所有点,它可以正常工作,但是如果有任何点位于该中心,则它将不会被选择!

我使用这个查询:

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(使用前将#替换为@)

根据半径从地图数据库中选择点 的相关文章

随机推荐