我在中有一个包含经度和纬度的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创建一个自定义排序,但我不太确定如何使用这个distance函数。
编辑:使用@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));发布于 2012-05-27 09:28:35
使用谷歌的算法:
$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"此查询中latitude和longitude将是您的经度列名。
发布于 2012-05-27 09:23:26
我最近也遇到了同样的问题。我决定写一个mysql函数来计算距离,然后在sql查询中使用它。Mysql函数:
CREATE FUNCTION distance(lat1 float, lon1 float, lat2 float, lon2 float)
RETURNS float
RETURN ACOS(SIN(RADIANS(lat1))*SIN(RADIANS(lat2))+COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(lon2-lon1)))*6371如果您的Coordinates表包含列f.e.latitude和longitude,则代码可能如下所示:
$q = mysql_query("SELECT * FROM Coordinates ORDER BY
distance(latitude, longitude, $lat, $lon) LIMIT 5";其中$lat和$lon包含提供的位置。
发布于 2012-05-27 09:24:01
将排序嵌入到查询中效率更高。
本教程将对您有所帮助(并提供满足您需求的查询):https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql
https://stackoverflow.com/questions/10770893
复制相似问题