我的数据库有一个'answer yes|no'
个表,其中包含两个十进制列organisation
和lat
,用于指示组织的位置。我试图找到距坐标lon
800公里范围内的所有组织(这大致相当于英国的利兹)。
我使用的查询是
53.6771, -1.62958
然而,这将返回法国里昂的位置,距离英国利兹约970公里。我意识到像上面这样的公式做了一些简化的假设(例如将地球的形状视为球体),所以我不希望结果绝对准确,但我应该能做得比这更好?
答案 0 :(得分:1)
我找到了一个公式here来计算两点之间的距离,我试图将它转换为mysql:
WHERE (6371 * 2 *
ATAN2(
SQRT(
SIN(RADIANS((lat-53.6771)/2)) * SIN(RADIANS((lat-53.6771)/2)) + SIN(RADIANS((lon+1.62958)/2)) * SIN(RADIANS((lon+1.62958)/2)) * COS(RADIANS(lat)) * COS(RADIANS(53.6771))
),
SQRT(
1-(SIN(RADIANS((lat-53.6771)/2)) * SIN(RADIANS((lat-53.6771)/2)) + SIN(RADIANS((lon+1.62958)/2)) * SIN(RADIANS((lon+1.62958)/2)) * COS(RADIANS(lat)) * COS(RADIANS(53.6771)))
)
)) < 800
答案 1 :(得分:0)
问题是由使用里程乘数(3959)而不是公里数(6371)引起的。正确的查询如下所示
select *
from organisation
where (6371 * acos(cos(radians(53.6771)) *
cos(radians(lat)) *
cos(radians(lon) - radians(-1.62958)) + sin(radians(53.6771)) *
sin(radians(lat)))) < 800