MySQL 使用 haversine 公式的地理空间搜索 returns 在同一点上为空
MySQL geospacial search using haversine formula returns null on same point
我正在尝试在 php 应用程序中实施地理空间搜索。目前,我正在使用以下查询查找给定纬度和经度 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
只要我不搜索存储在 POI table 中的确切纬度和经度,就可以正常工作。
例如,如果我的 poi table 中有以下条目
id name latitude longitude
1 Paris 48.856614 2.3522219000000177
我用 lat = 48.856614
和 long = 2.3522219000000177
调用查询,我不会得到任何结果。据我所知,这是因为以下操作 returns NULL and not 0 in mysql:
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 计算器中的相同 I get 0 rad.
查询中是否有问题,或者我是否需要使用 "OR IS NULL"
来包含 NULL 结果
问题是 acos 是用一个不在 -1 和 1 范围内的值调用的,所以它 return 是空的。
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 之间定义,您可能应该预先检查它的参数,或者准备好如果计算出现问题它可以 return null。
IFNULL( ... ),0) AS Distance 也将帮助您解决错误。
我正在尝试在 php 应用程序中实施地理空间搜索。目前,我正在使用以下查询查找给定纬度和经度 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
只要我不搜索存储在 POI table 中的确切纬度和经度,就可以正常工作。
例如,如果我的 poi table 中有以下条目
id name latitude longitude
1 Paris 48.856614 2.3522219000000177
我用 lat = 48.856614
和 long = 2.3522219000000177
调用查询,我不会得到任何结果。据我所知,这是因为以下操作 returns NULL and not 0 in mysql:
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 计算器中的相同 I get 0 rad.
查询中是否有问题,或者我是否需要使用 "OR IS NULL"
来包含 NULL 结果问题是 acos 是用一个不在 -1 和 1 范围内的值调用的,所以它 return 是空的。
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 之间定义,您可能应该预先检查它的参数,或者准备好如果计算出现问题它可以 return null。
IFNULL( ... ),0) AS Distance 也将帮助您解决错误。