比如說根據一系列條件查詢資料 資料是分頁的
$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
謝謝版主幫了大忙,問題已解決