MySQL根据距离过滤数据并计算该距离

时间:2018-11-26 04:34:35

标签: mysql geolocation geocoding geosphere

我有一个用例,其中用户将其位置(纬度和经度)传递到后端,我必须获取该位置并找到所有 同时以他所在位置为英里半径范围的餐厅,我必须给出距他所在位置的每个餐厅的距离 好吧。

我的餐厅桌子。

res_name    |   lat         |   lng
--------------------------------------------------------------
McDonalds'  |   6.8705452   |   79.884038
KFC     |   6.8705452   |   79.884038
Burger king |   6.8686279   |   79.8873961
--------------------------------------------------------------

为用户提供的坐标查找与英里半径匹配的记录 我可以使用这个查询

SELECT
  id, (
    3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

这也是我从stackoverflow问题得到的,它可以正常工作。 现在,我的问题是如何为每个匹配结果获取用户位置与餐厅位置之间的距离?

我希望我的问题对你很清楚。

用户将通过他的当前位置。 根据该位置,我需要过滤半径30英里范围内的餐馆。 同时我也不得不说餐馆离他当前位置的距离。

我的预期输出将是这样。 您在30英里范围内有两家餐厅。 对于肯德基,您的距离为12英里。 对于麦当劳,您的距离为29英里。

如何修改该查询以满足我的要求?

1 个答案:

答案 0 :(得分:0)

用于查找距离部分

SELECT test2.restaurants.res_name, 
   111.111 *
    DEGREES(ACOS(COS(RADIANS(6.9117))
         * COS(RADIANS(test2.restaurants.lat))
         * COS(RADIANS(79.8646 - test2.restaurants.lng))
         + SIN(RADIANS(6.9117))
         * SIN(RADIANS(test2.restaurants.lat)))) AS distance_in_km
  FROM test2.restaurants;