PHP排序最近的坐标

我在包含经度和纬度的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));

解决方法:

使用谷歌的算法:

$lon = //your longitude
$lat = //your latitude
$miles = //your search radius

$query = "SELECT *, 
( 3959 * acos( cos( radians('$lat') ) * 
cos( radians( latitude ) ) * 
cos( radians( longitude ) - 
radians('$lon') ) + 
sin( radians('$lat') ) * 
sin( radians( latitude ) ) ) ) 
AS distance FROM yourtable HAVING distance < '$miles' ORDER BY distance ASC LIMIT 0, 5"

查询中的纬度和经度将成为您的纬度/经度列名称.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...