我在包含经度和纬度的 PHP Web 服务中有一个 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;
}
并且用户当前获得了整个数据库(目前,虽然开发它很小,但将来它可能会相当大)
$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));