查询找到给定坐标的特定半径内的所有位置

时间:2016-01-05 11:41:17

标签: mysql sql geospatial

我的数据库有一个'answer yes|no'个表,其中包含两个十进制列organisationlat,用于指示组织的位置。我试图找到距坐标lon 800公里范围内的所有组织(这大致相当于英国的利兹)。

我使用的查询是

53.6771, -1.62958

然而,这将返回法国里昂的位置,距离英国利兹约970公里。我意识到像上面这样的公式做了一些简化的假设(例如将地球的形状视为球体),所以我不希望结果绝对准确,但我应该能做得比这更好?

2 个答案:

答案 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