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

时间:2017-03-01 02:15:03

标签: mysql sql sql-server api maps

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

我使用此查询:

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

在上述情况下,半径为&#34; 2&#34;地图的中心位于[-27.5796498,-27.5796498]。这个查询工作得很好但是如果某个点位于这个非常精确的中心,它将不会被选中。为什么呢?

编辑:我发现上面的公式为所有点返回一个好的值但是位于中心的点MYSQL将值NULL返回到列&#34;距离&#34;!专业人士如何处理这种或使用SQL来选择包括中心点的范围内的点的问题?

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

1 个答案:

答案 0 :(得分:0)

有时,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))))

有一个更完整的写法,包括MySQL的存储函数定义,here

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