【问题标题】:mysql select latitude longitude distance radiusmysql选择纬度经度距离半径
【发布时间】:2016-06-02 20:12:01
【问题描述】:

我有两张桌子

第一个是“tbl1”

ID  fullName    mobile
1   Aaaa        1234567890
2   Bbbb        9874563210
3   Cccc        1237894560

第二个是“tbl2”

ID  lalitude        longtitude      currentTime
2   26.90884600     75.79238500     2016-06-02 13:32:25
2   26.90884600     75.79238500     2016-06-02 13:32:25
1   26.90884600     75.79238500     2016-06-02 13:32:25

我输入了 ID = 2lalitude= 28.654490longtitude = 77.267117distance = 5 kilometer。 我想从lalitude(28.654490)longtitude(77.267117)tbl2 with join tbl1 table 获取5 kilometer distance 内部的用户列表。 我是基于地理信息的新手。

我正在使用 MySQL。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用 MySQL 的 spatial extensions 并将您的 lat / long 列转换为 POINT 并使用 st_distance() function 计算 2 点之间的距离。

    或者您使用存储为浮点数的 lat / long 值自己计算距离。有关解决方案,请参阅 SO 上的 mySQL longitude and latitude query for other rows within x mile radius 主题。接受的答案表明如何以公里为单位计算距离。

    【讨论】:

    • 实现这一目标的最佳方法是什么?
    • 从您的角度来看,我不可能告诉您什么是“最佳”方式。我为您概述了两种可能的解决方案。您可以根据您的业务需求决定选择哪一个,然后实施它。您可能想尝试这两种解决方案并比较它们的速度。您还需要评估使用空间数据类型相对于常规数据类型的开销。
    • 我发布了对我有用的答案,但我想知道,这是一个好的解决方案吗?
    • 您使用的公式与我链接的 SO 主题问题中的公式相同。
    • 你没有注意到我到目前为止所写的内容或链接主题中的内容。
    【解决方案2】:

    这是我的解决方案

    DELIMITER ;;
    CREATE PROCEDURE proc_getUsersByDistance(in _ID int, in _lat decimal(10,7), in _long decimal(10,7), in _distance int)
    BEGIN
        Declare _radius decimal(10,5);
        Declare _lng_min decimal(10,7);
        Declare _lng_max decimal(10,7);
        Declare _lat_min decimal(10,7);
        Declare _lat_max decimal(10,7);
    
        set _radius=_distance*0.621371;
        set _lng_min = _long - _radius/abs(cos(radians(_lat))*69);
        set _lng_max = _long + _radius/abs(cos(radians(_lat))*69);
        set _lat_min = _lat - (_radius/69);
        set _lat_max = _lat + (_radius/69);
    
        SELECT tbl1.*, tbl2.latitude, tbl2.longitude,tbl2.currentTime
        from tbl1 INNER JOIN tbl2 on tbl1.ID=tbl2.ID
        where tbl2.ID=_ID and ((tbl2.latitude between _lat_min and _lat_max) and (tbl2.longitude between _lng_min AND _lng_max))
        order by tbl2.currentTime;
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2011-10-01
      相关资源
      最近更新 更多