【发布时间】:2015-03-31 01:10:09
【问题描述】:
我正在尝试在 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 表中的确切纬度和经度,此方法就可以正常工作。
例如,如果我的 poi 表中有以下条目
id name latitude longitude
1 Paris 48.856614 2.3522219000000177
我用lat = 48.856614 和long = 2.3522219000000177 调用查询我不会得到任何结果。据我所知,这是因为以下操作在 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 计算器I get 0 rad 中运行相同的操作。
查询中是否有问题,或者我是否还需要使用“OR IS NULL”来包含 NULL 结果
【问题讨论】: