首頁 > 後端開發 > php教程 > 关于距离排序的问题

关于距离排序的问题

WBOY
發布: 2016-06-23 13:46:32
原創
1132 人瀏覽過

比如说根据一系列条件查询数据 数据是分页的

$sql =  "select id,xpoint,ypoint, deal_cate_id,ratio  from ".DB_PREFIX."supplier_location where ".$where;
登入後複製

其中xpoint,ypoint 代表经度纬度 ,其中外部会传过来一个用户所在地的经纬度 $xpoint,$ypoint
查询出数据以后 循环列表 根据用户所在地的经纬度算出用户跟商家的距离
foreach($info as $k=>$v){			   	$info[$k]['Distance']  =intval(GetDistance($ypoint,$xpoint,$v['ypoint'],$v['xpoint'])*1000);}
登入後複製


其中 GetDistance 函数 代码为
// 本函数为获取两坐标之间的距离 // a纬度 a经度 b纬度 b经度 function GetDistance($lat1, $lng1, $lat2, $lng2)   {       $EARTH_RADIUS = 6378.137;	$radLat1 = rad($lat1);	$radLat2 = rad($lat2);	$a = $radLat1 - $radLat2;	$b = rad($lng1) - rad($lng2);       $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));    $s = $s * $EARTH_RADIUS;     $s = round($s * 10000) / 10000;    return $s;}
登入後複製


现在的问题 想根据距离Distance排序 但是因为数据分页导致排序不准确 ,因为涉及搜索条件  每个用户所在地及所使用的搜索条件不同, 如果使用临时表 或者 使用缓存会造成数据量过大 ,请教大家有什么好的方法,求建议


回复讨论(解决方案)

排序
order by abs(xpoint-$xpoint), abs(ypoint-$ypoint)
即按两点经纬度差的绝对值进行排序

查的结果后再行计算

或直接将算式 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))
放到 sql 语句中,涉及的函数 mysql 都有
度化弧是 RADIANS

排序
order by abs(xpoint-$xpoint), abs(ypoint-$ypoint)
即按两点经纬度差的绝对值进行排序

查的结果后再行计算

或直接将算式 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))
放到 sql 语句中,涉及的函数 mysql 都有
度化弧是 RADIANS

     谢谢版主帮了大忙,问题已解决
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板