【发布时间】:2012-06-02 00:12:42
【问题描述】:
我在 PHP 网络服务中有一个 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));
【问题讨论】:
-
你有没有考虑写mysql函数并在sql查询中使用?
-
我对这整个数据库很陌生。你能详细说明一下吗?
-
是 Junaio AR 平台的吗?
-
不知道它是什么,所以我猜不是。它最终适用于 iPhone 和 Android 应用
-
@WojtekT 的意思是您使用 PHP 编写函数,但您可以使用 MySQL 的编程语言将其编写为 MySQL 存储函数。这样您就可以直接在查询中使用它,如下所示:SELECT * FROM table ORDER BY shortest_distance_to(X1, Y1, X2, Y2) ASC,这比从数据库中检索所有坐标到 PHP 快得多解释器并在那里比较它们,特别是如果您的数据集非常大。