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

Mysql 根据半径从地图数据库中选择点,mysql,sql,sql-server,api,maps,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

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

我使用这个查询:

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:我可以创建另一个查询来选择位于半径中心的所有点,但这不是很有效,也许一些数学向导可以想出一个更好的公式。

有时,当距离很小时,ACOS的参数可能略大于1,略超出该函数的范围。由于Vincenty的原因,有一个更好的距离公式可用。它使用ATAN2y,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法定英里。将结果乘以其中一个数字,得到距离。 还有一个更完整的writeup,包括MySQL的存储函数定义


另一个解决方案是使用ISNULLACOSformula,0.0

MySQL——开源RDBMS还是SQL Server——微软的RDBMS?这两者是相互排斥的,即你应该从你的问题中删除一个或另一个标记。如果点位于中心,这意味着你可以在坐标上检查绝对匹配,而不是计算距离,对吗?@yeap说,但是我必须把这个查询做得更大,以选择范围内的所有查询和位于中心的所有查询。如果你找到更好的解决方案,请告诉我!如何将其转换为km?乘以111.045。请参阅我的编辑。