項目:我有一個儲存爲lng/lat的校友家庭地址位置的MySQL數據庫。我希望能夠確定15人或以上的校友居住在彼此15英里半徑範圍內的團體。定位最近的lng/lat地點而不是15英里半徑的方法?
給定一個lng/lat,如何選擇15英里範圍內的其他lng/lat位置?我在Linux上安裝了PEAR的PHP geonames軟件包。我不清楚我是否可以使用這個軟件包來實現這個功能。它包含半徑例程,但它們似乎用於返回信息,例如在lng/lat半徑內的郵政編碼。謝謝!
項目:我有一個儲存爲lng/lat的校友家庭地址位置的MySQL數據庫。我希望能夠確定15人或以上的校友居住在彼此15英里半徑範圍內的團體。定位最近的lng/lat地點而不是15英里半徑的方法?
給定一個lng/lat,如何選擇15英里範圍內的其他lng/lat位置?我在Linux上安裝了PEAR的PHP geonames軟件包。我不清楚我是否可以使用這個軟件包來實現這個功能。它包含半徑例程,但它們似乎用於返回信息,例如在lng/lat半徑內的郵政編碼。謝謝!
你需要看看使用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;
韋恩的回答很有趣,但我不知道是否超過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里程將必須從轉變緯度/長。