【问题标题】:How to query all locations that are near a user's position(latitude, longitude) in mysql如何在mysql中查询用户位置(纬度,经度)附近的所有位置
【发布时间】:2014-04-14 00:47:56
【问题描述】:

我有表用户,其中包含其他列、纬度和经度(双)。 我有另一个名为 Locations 的表,它具有相同的结构(纬度和经度)(也是双精度类型)。

如何查询用户周围10公里圆周上的所有位置?(或直径为10公里的圆)。

我已经看到 mysql 有一些 Point 数据类型,但我从未使用过它,所以很难理解。

例如随机坐标: 用户(纬度=23.102131,经度=-21.1231241)

谢谢!

【问题讨论】:

    标签: mysql geolocation


    【解决方案1】:

    这看起来很像 Stack Overflow 上的一个热门问题。例如,您可以查阅此问题的答案:Fastest Way to Find Distance Between Two Lat/Long Points 以及与该问题相关的问题的答案。

    这是使用 Haversine 公式解决您的具体问题的基本 MySQL 查询:

    SELECT loc.id
    FROM `User` u, Locations loc
    WHERE u.id = @user_id
      AND (6371 * acos(cos(radians(u.latitude)) * cos(radians(loc.latitude )) * cos(radians(loc.longitude ) - radians(u.longitude)) + sin(radians(u.latitude)) * sin(radians(loc.latitude )))) <= @circle_diameter / 2;
    

    它没有使用任何优化,因此在大数据上可能会很慢。

    【讨论】:

    • 我已经看到几个要求类似答案的问题,但我正在寻找具有精确答案的东西。例如,如果我在表用户中有一个纬度和一个经度,我如何设法获取所有附近的位置?完全一样
    • 好的,我的回答更具体了。
    【解决方案2】:

    MySQL 具有空间查询功能。我建议你read about them.

    【讨论】:

    • 没有办法让它更简单吗?
    • 不是一个好方法,不。 GIS功能的使用并不难,一旦学会了这些功能,就能完成更多的工作。值得学习...
    猜你喜欢
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2019-08-31
    • 2014-02-12
    相关资源
    最近更新 更多