La *_*bla 10 php mysql sorting
我在包含经度和纬度的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;
}
Run Code Online (Sandbox Code Playgroud)
并且用户当前获得整个数据库(目前,虽然开发它很小,但将来可能会相当大)
$q = mysql_query("SELECT * FROM Coordinates");
$coordinates = array ();
while ($e = mysql_fetch_assoc($q)) {
$coordinates[] = $e;
}
print (json_encode($coordinates));
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?我对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));
Run Code Online (Sandbox Code Playgroud)
Nor*_*rse 23
使用谷歌的算法:
$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"
Run Code Online (Sandbox Code Playgroud)
latitude
并且longitude
在此查询中将是您的lat/lon列名称.
归档时间: |
|
查看次数: |
10442 次 |
最近记录: |