在没有15英里半径的情况下定位最近的lng / lat位置的方法?

时间:2012-09-21 09:10:35

标签: php mysql latitude-longitude

项目:我有一个存储为lng / lat的校友家庭地址位置的MySQL数据库。我希望能够识别出15个或更多校友的团体,这些校友的生活在15英里范围内。

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

2 个答案:

答案 0 :(得分:4)

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

Google 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;

答案 1 :(得分:0)

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英里必须从纬度/经度转换。