【问题标题】:Nearest locations with latitude and longitude经纬度最近的位置
【发布时间】:2011-12-22 13:02:48
【问题描述】:

我只有一家商店的经纬度,现在我想在 1 小时车程内或说在 10 公里的距离内找出附近的所有商店。

我有桌子,

Id, storeName, store_lat, store_lng

假设我选择了商店 1 的 lat 和 lng,我想找出附近的所有商店。如何使用 php/mysql 做到这一点。

我检查了很多关于 SO 的帖子,但是当我运行查询时,它一直返回 0 个结果。

请帮忙,谢谢!

【问题讨论】:

标签: php mysql


【解决方案1】:

假设您得到 $lat 和 $long 作为起点的纬度/经度:

$sql = 'SELECT *, (6371 * acos(cos(radians(' . $lat . ')) * cos(radians(latitude)) * cos(radians(longitude) - radians(' . $lng . ')) + sin(radians(' . $lat . ')) * sin(radians(latitude)))) AS distance from table_name WHERE distance < 10';

【讨论】:

    【解决方案2】:
    SELECT * FROM `table` WHERE acos(sin(LATITUDE) * sin(`store_lat`) + cos(LATITUDE) * cos(`store_lat`) * cos(`store_lng` - (LONGITUDE))) * 6371 <= 1000;
    

    只需替换 LONGITUDE 和 LATITUDE。

    此处的距离以公里为单位 - 当前设置为 1000。这也可以根据需要进行更改。

    到目前为止,我已经在几个脚本中使用了它,似乎工作得很好,虽然有时会很慢。我认为的问题是它不能使用索引,因为 WHERE 子句太复杂了。

    【讨论】:

      【解决方案3】:

      一种方法是获取您的输入 lat/long 对,创建一个范围,然后查询该范围内的所有记录:

      Distance = 0.1; // Range in degrees (0.1 degrees is close to 11km)
      LatN = lat + Distance;
      LatS = lat - Distance;
      LonE = lon + Distance;
      LonW = lon - Distance;
      
      ...Query DB with something like the following:
      SELECT *
      FROM table_name
      WHERE 
      (store_lat BETWEEN LatN AND LatS) AND
      (store_lon BETWEEN LonE AND LonW)
      

      查询应该找到存储的 lat 小于 LatN 且大于 LatS,以及存储的 lon 小于 LonE 且大于 LonW 的所有内容。

      然后您可能会对返回的结果进行实际距离计算,因为上述搜索会为您提供一个框,并且角落中的位置将大于 0.1 度,因为乌鸦飞过。

      如果“如乌鸦飞”还不够好,请使用带有方向的地图 API 来获取行驶距离。

      【讨论】:

        【解决方案4】:
        function inRange ( $lat1, $lng1, $lat2, $lng2, $range = 100 )
        {
                return ( 6371 * acos( cos( deg2rad( $lat1 ) ) * 
                       cos( deg2rad( $lat2 ) ) * 
                       cos( deg2rad( $lng2 ) - 
                       deg2rad( $lng1 ) ) + 
                       sin( deg2rad( $lat1 ) ) * 
                       sin( deg2rad( $lat2 ) ) ) ) <= $range;
        }
        

        这会产生距离。您可以将其转换为 MySQL 查询。

        【讨论】:

          猜你喜欢
          • 2011-04-11
          • 1970-01-01
          • 2014-02-12
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多