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

关于距离排序的问题

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

比如说根据一系列条件查询数据 数据是分页的
$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

谢谢版主帮了大忙,问题已解决

人气教程排行