【问题标题】:Method to locate nearest lng/lat locations without a 15 mile radius?在没有 15 英里半径的情况下找到最近的 lng/lat 位置的方法?
【发布时间】:2012-09-21 09:10:35
【问题描述】:

项目:我有一个存储为 lng/lat 的校友家庭地址位置的 MySQL 数据库。我希望能够识别居住在彼此 15 英里半径范围内的 15 名或更多成员的校友组。

给定一个 lng/lat,我如何选择半径 15 英里范围内的其他 lng/lat 位置?我已经在 Linux 上安装了 PEAR 的 PHP geonames 包。我不清楚我是否可以使用这个包来辅助这个功能。它包含半径例程,但它们似乎用于返回 lng/lat 半径内的邮政编码等信息。谢谢!

【问题讨论】:

    标签: php mysql latitude-longitude


    【解决方案1】:

    您需要考虑使用Haversine Formula。您会发现大量在线示例向您展示如何在 PHP 和 SQL 中实现公式。

    谷歌has a nice example for MySQL

    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;
    

    【讨论】:

      【解决方案2】:

      Wayne 的回答很有趣,但我想知道是否可以忽略超过 15 英里的球形分量,而是使用 trig?伪代码:

      For every (x1, y1) row:
          Loop through every (x2, y2):
              Distance = SQRT ( ( x2 - x1 ) ^ 2 + ( y2 - y1 ) ^ 2 )
              If (Distance <= 15)
                  // ...
              End If
          End
      End
      

      或者一个 SQL 版本(不确定我的权限是否正确,但你明白了):

      SELECT
          SQRT ( ( a2.x - a1.x ) ^ 2 + ( a2.y - a1.y ) ^ 2 ) AS distance
      FROM alumni a1, alumni a2
      WHERE a1.id != a2.id
      HAVING distance <= 15;
      

      考虑一下,15 英里将不得不从纬度/经度转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-18
        • 2013-06-19
        相关资源
        最近更新 更多