当前位置: 代码迷 >> PHP >> 关于距离排序的有关问题
  详细解决方案

关于距离排序的有关问题

热度:56   发布时间:2016-04-28 18:20:27.0
关于距离排序的问题
比如说根据一系列条件查询数据 数据是分页的
$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
  相关解决方案