Php 使用haversine公式的MySQL geospacial搜索在同一点上返回null

Php 使用haversine公式的MySQL geospacial搜索在同一点上返回null,php,mysql,haversine,Php,Mysql,Haversine,我试图在php应用程序中实现geospacial搜索。目前,我正在使用以下查询查找给定纬度和经度10公里范围内的点: SELECT * FROM ( SELECT *, (6378.1 * ACOS( COS(RADIANS(48.856614)) * COS(RADIANS(latitude)) * COS(RADIANS(2.3522219) - RADIANS(longitude))

我试图在php应用程序中实现geospacial搜索。目前,我正在使用以下查询查找给定纬度和经度10公里范围内的点:

SELECT * FROM (
      SELECT *,
             (6378.1 * ACOS(
                  COS(RADIANS(48.856614)) * COS(RADIANS(latitude))
                * COS(RADIANS(2.3522219) - RADIANS(longitude))
                + SIN(RADIANS(48.856614))
                * SIN(RADIANS(latitude)))
             ) AS distance
      FROM `destinations_info`
      WHERE latitude BETWEEN 48.856614  - (10 / 69)
               AND 48.856614  + (10 / 69)
        AND longitude BETWEEN 2.3522219 - (10 / (69 * COS(RADIANS(48.856614))))
               AND 2.3522219 + (10 / (69 * COS(RADIANS(48.856614))))
      ) d
WHERE distance <= 10
LIMIT 1
我用
lat=48.856614
long=2.35222190000000177调用查询,我不会得到任何结果。据我所知,这是因为以下操作在mysql中返回NULL而不是0:

SELECT (6378.1 * acos(cos(radians(48.856614)) * cos(radians(48.856614)) * cos( radians(2.3522219) - radians(2.3522219)) + sin(radians(48.856614)) * sin(radians(48.856614)))) 
在Chrome计算器中运行相同的功能

查询中是否有错误,或者我是否需要使用“or Is NULL”包含NULL结果?问题是,调用的值不在-1和1的范围内,因此它返回NULL

SELECT cos(radians(48.856614)) * cos(radians(48.856614)) * cos( radians(2.3522219) - radians(2.3522219)) + sin(radians(48.856614)) * sin(radians(48.856614))

1.0000000000000002
这似乎是某种取舍问题


由于arc cos仅定义在-1和1之间,您可能应该预先检查它的参数,或者准备好如果计算有问题,它可以返回null。

如果null(…),0)作为距离也会帮助您避免错误。

我注意到我的纬度,经度列的类型为varchar 255 so,而不是float,因此允许在十进制后存储8个以上的数字。将类型更改为float,现在可以工作了,但我不知道它有多安全/准确。存储在varchar中的值会被转换,所以这不是问题所在。在您不需要比较浮点值之前,我认为这在这里很好。但是请注意,这并不能解决acos可能返回null的问题。机会很低,但您的示例中已经有一个。因此,同样的情况也可能再次发生。+1-当查询中指定的lat/lng与我要检索的数据库中的记录的lat/lng完全匹配时,我遇到了这个问题。好的,优雅的解决方案。
SELECT cos(radians(48.856614)) * cos(radians(48.856614)) * cos( radians(2.3522219) - radians(2.3522219)) + sin(radians(48.856614)) * sin(radians(48.856614))

1.0000000000000002