【问题标题】:How to find nearest location using latitude and longitude from SQL database?如何使用 SQL 数据库中的经纬度查找最近的位置?
【发布时间】:2012-06-20 04:42:06
【问题描述】:

我想从以下数据库表中找到最近的位置

Address                            Latitude                longitude 

Kathmandu 44600, Nepal              27.7                   85.33333330000005
Los, Antoniterstraße                37.09024               -95.71289100000001
Sydney NSW, Australia               49.7480755             8.111794700000019
goa india                           15.2993265             74.12399600000003

我已从 Google 地图中获取了所有这些数据。 在这里,我必须找到离某个地方最近的位置。 假设我在 Surkhet,它的纬度是 28.6,经度是 81.6, 我怎样才能找到离 Surkhet 地方最近的地方。

【问题讨论】:

  • 你看过左边的相关链接吗>>>其中一些为你寻找主题。
  • 我相信你需要做一些类似地理空间搜索的事情。请看这篇论文scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
  • @Dagon - 我猜你的意思是 other 左边?
  • @Damien_The_Unbeliever 嗯,我住在南半球,我们的左边是你的右边 :-)
  • 详细博客:goo.gl/oU7Krf

标签: mysql


【解决方案1】:

使用 MySQL 查找附近的位置

下面的 SQL 语句将查找距离 37, -122 坐标 25 英里半径范围内最近的 20 个位置。它根据该行的纬度/经度和目标纬度/经度计算距离,然后仅询问距离值小于 25 的行,按距离对整个查询进行排序,并将其限制为 20 个结果。要按公里而不是英里搜索,请将 3959 替换为 6371。

表结构:

id,name,address,lat,lng

注意 - 这里纬度 = 37 & 经度 = -122。所以你只需传递你自己的。

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * 
sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING
distance < 25 ORDER BY distance LIMIT 0 , 20;

您可以找到详细信息here

【讨论】:

  • 也通过这个。它以很好的方式解释了一切。 developers.google.com/maps/articles/phpsqlsearch
  • 非常感谢您的询问。我必须找到距离 Surkhet 最近的位置,纬度是 28.6,经度是 81.6。如何在此查询中包含这一点..请建议我..:)
  • 见注释。我编辑了我的答案。您需要通过 lat & lng 代替 37 & -122,
  • 这对你有用吗?还要记住,我使用的是 3959,它会按英里搜索。如果要按公里搜索,请将其更改为 6371。
  • 选择地址, lng, SQRT( POW(69.1 * (lat -21.0486), 2) + POW(69.1 * ( 76.5344 - lng) * COS(lat/ 57.3), 2)) AS 距离FROM partner_locations HAVING distance
【解决方案2】:
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

【讨论】:

  • 距离 25 以英里为单位??
  • 是的。 3959 - 英里,6371 - 公里
  • @Krishna Karki,如果我把它放在函数中,它会返回纬度和经度吗?
  • 距离哪里?
  • 您能否告诉我们这是否适用于数千条记录。谢谢
【解决方案3】:

要查找附近的位置,您可以使用 Geocoder 类。由于您有地理点(纬度和经度),因此可以使用反向地理编码。 反向地理编码是将(纬度、经度)坐标转换为(部分)地址的过程。 查看this 了解更多信息。

【讨论】:

    【解决方案4】:
    SELECT latitude, longitude, SQRT(
        POW(69.1 * (latitude - [startlat]), 2) +
        POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
    FROM TableName HAVING distance < 25 ORDER BY distance;
    

    其中 [starlat][startlng] 是开始测量距离的位置,25 是以公里为单位的距离。

    建议使用存储过程来使用查询,因为它会检查很多行来查找结果。

    【讨论】:

      【解决方案5】:

      SQL 有问题。在表格中:

      `ubicacion` (
        `id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
        `latitud` DOUBLE NOT NULL ,
        `longitud` DOUBLE NOT NULL ,
        PRIMARY KEY (`id_ubicacion`) )
      

      使用时id_ubicacion变化:

      SELECT  `id_ubicacion` , ( 3959 * ACOS( COS( RADIANS( 9.053933 ) ) * COS( RADIANS( latitud ) ) * COS( RADIANS( longitud ) - RADIANS( - 79.421215 ) ) + SIN( RADIANS( 9.053933 ) ) * SIN( RADIANS( latitud ) ) ) ) AS distance
      FROM ubicacion
      HAVING distance <25
      ORDER BY distance
      LIMIT 0 , 20
      

      【讨论】:

        【解决方案6】:
        sesach : ( 3959 * acos( cos( radians('.$_REQUEST['latitude'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$_REQUEST['longitude'].') ) + sin( radians('.$_REQUEST['latitude'].') ) * sin( radians( latitude ) ) ) ) <='.$_REQUEST['mile'];
        

        【讨论】:

          【解决方案7】:

          当该方法应该执行时,最好先过滤纬度和经度,然后计算平方距离近似值。对于北欧国家,1000 公里范围内会有 0.3% 的折扣。

          所以不要将距离计算为:

          dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)
          

          可以计算出近似值(假设lat = lat 1接近lat 2)为

          const cLat2 = cos lat ^ 2
          const r_earth2 = r_earth ^ 2
          dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2)
          

          按 Dist_App 2 排序,然后简单地从结果中取平方根。

          【讨论】:

            猜你喜欢
            • 2019-01-20
            • 1970-01-01
            • 1970-01-01
            • 2012-08-14
            • 1970-01-01
            • 2016-10-16
            • 1970-01-01
            • 1970-01-01
            • 2021-01-05
            相关资源
            最近更新 更多