PHPWebサービスに経度と緯度を含むMySQLテーブルがあります。たとえば、5つの最も近い座標のみをユーザーに送信したいと思います。座標からユーザーがPOSTリクエストで送信した座標までの距離を計算するメソッドを作成しましたが、それを並べ替える方法がわからず、数個しか返送されません。
距離法は次のとおりです。
function distance($longToCompare,$latToCompare) {
$dlong = $request_long - $longToCompare;
$dlat = $request_lat - $latToCompare;
$a = pow(sin($dlat/2)) + cos($latToCompare)*cos($request_lat)*pow(sin($dlong/2));
$c = 2*atan2(sqrt($a),sqrt(1-$a));
return 6373*$c;
}
そして、ユーザーは現在DB全体を取得しています(今のところ、開発中は小さいですが、将来的にはかなり大きくなる可能性があります)
$q = mysql_query("SELECT * FROM Coordinates");
$coordinates = array ();
while ($e = mysql_fetch_assoc($q)) {
$coordinates[] = $e;
}
print (json_encode($coordinates));
誰かが私を正しい方向に向けることができますか?私はPHPにかなり慣れていないので、uasortを使用してカスタムの並べ替えを作成できることは知っていますが、この距離関数を使用してそれを使用する方法がよくわかりません。
編集:@Norseのソリューションを使用すると、現在のクエリは次のようになります。
$request_long = $_POST['longitude'];
$request_lat = $_POST['latitude'];
$km = 0.5;
$query = "SELECT *,
( 6373 * acos( cos( radians('$request_lat') ) *
cos( radians( latitude ) ) *
cos( radians( longitude ) -
radians('$request_long') ) +
sin( radians('$request_lat') ) *
sin( radians( latitude ) ) ) )
AS distance FROM Coordinates HAVING distance < '$km' ORDER BY distance ASC LIMIT 0, 5";
$coordinates = array ();
while ($e = mysql_fetch_assoc($query)) {
$coordinates[] = $e;
}
print (json_encode($coordinates));