【问题标题】:MySQL filter data based on distance and calculate that distanceMySQL 根据距离过滤数据并计算该距离
【发布时间】:2019-04-27 17:27:46
【问题描述】:

我有一个用例,用户将他的位置(纬度和经度)传递给后端,我必须获取该位置并找到所有 位于 Miles 半径区域内的餐厅,同时我必须给出从他的位置到每家餐厅的距离 好吧。

我的餐桌。

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 英里的距离。

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

【问题讨论】:

  • id从何而来?

标签: mysql geolocation geocoding geosphere


【解决方案1】:

用于查找距离部分

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2021-06-09
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多