2012-09-21 34 views
1

項目:我有一個儲存爲lng/lat的校友家庭地址位置的MySQL數據庫。我希望能夠確定15人或以上的校友居住在彼此15英里半徑範圍內的團體。定位最近的lng/lat地點而不是15英里半徑的方法?

給定一個lng/lat,如何選擇15英里範圍內的其他lng/lat位置?我在Linux上安裝了PEAR的PHP geonames軟件包。我不清楚我是否可以使用這個軟件包來實現這個功能。它包含半徑例程,但它們似乎用於返回信息,例如在lng/lat半徑內的郵政編碼。謝謝!

回答

4

你需要看看使用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; 
0

韋恩的回答很有趣,但我不知道是否超過15英里的球形部分可以忽略不計,利用三角函數呢?僞代碼:

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里程將必須從轉變緯度/長。

相關問題