データベース内のすべてのユーザーは、緯度と経度を 2 つのフィールド (緯度、経度) に保存しています。
各フィールドの形式は次のとおりです。
lon | -1.403976
lat | 53.428691
ユーザーがたとえば 100 マイル以内で他のユーザーを検索する場合、適切な緯度/経度の範囲を計算するために次の手順を実行します ($lat と $lon は現在のユーザーの値です)。
$R = 3960; // earth's mean radius
$rad = '100';
// first-cut bounding box (in degrees)
$maxLat = $lat + rad2deg($rad/$R);
$minLat = $lat - rad2deg($rad/$R);
// compensate for degrees longitude getting smaller with increasing latitude
$maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat)));
$minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat)));
$maxLat=number_format((float)$maxLat, 6, '.', '');
$minLat=number_format((float)$minLat, 6, '.', '');
$maxLon=number_format((float)$maxLon, 6, '.', '');
$minLon=number_format((float)$minLon, 6, '.', '');
次に、次のようなクエリを実行できます。
$query = "SELECT * FROM table WHERE lon BETWEEN '$minLon' AND '$maxLon' AND lat BETWEEN '$minLat' AND '$maxLat'";
これは正常に機能し、関数を使用して出力段階でユーザー間の実際の距離を計算して表示しますが、クエリ段階で距離を増減して結果を並べ替えられるようにしたいと考えています。
これを行う方法はありますか?