1

プロジェクト: 卒業生の自宅住所の MySQL データベースを lng/lat として保存しています。互いに半径 15 マイル以内に住んでいる 15 人以上の同窓生のグループを特定できるようにしたいと考えています。

経度/緯度が与えられた場合、半径 15 マイル以内にある他の経度/緯度の場所を選択するにはどうすればよいですか? PEAR の PHP geonames パッケージを Linux にインストールしました。この機能を支援するためにこのパッケージを使用できるかどうかはわかりません。radius ルーチンが含まれていますが、それらは lng/lat 半径内の郵便番号などの情報を返すためのもののようです。ありがとう!

4

2 に答える 2

4

Haversine Formulaの使用を検討する必要があります。PHP と SQL の両方で数式を実装する方法を示すオンラインの例がたくさんあります。

Googleには 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;
于 2012-09-21T09:11:50.270 に答える
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 マイルは緯度/経度から変換する必要があります。

于 2012-09-21T09:46:33.737 に答える