小编典典

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

sql

我有一个数据库,该数据库具有点的纬度/经度。如果我要选择以特定点为中心的特定范围内的所有点,那么如果该点上有任何点,则可以正常工作,但是不会被选中!

我使用以下查询:

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在包括中心点的范围内选择点的问题?

EDIT2:我可以创建另一个查询来选择位于半径最中心的所有点,但这效率不高,也许某些数学向导可以提供更好的公式。


阅读 182

收藏
2021-03-23

共1个答案

小编典典

有时,ACOS()当距离很小时,to的参数可能只是略大于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,这里

另一个解决方案是使用ISNULL(ACOS(formula), 0.0)

2021-03-23