当前位置:Gxlcms > PHP教程 > 关于距离排序的有关问题

关于距离排序的有关问题

时间:2021-07-01 10:21:17 帮助过:22人阅读

关于距离排序的问题
比如说根据一系列条件查询数据 数据是分页的
$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

人气教程排行