關於距離排序的問題

來源:互聯網
上載者:User
比如說根據一系列條件查詢資料 資料是分頁的
$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

謝謝版主幫了大忙,問題已解決
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.