根據經緯度求距離(演算法)
阿新 • • 發佈:2019-01-04
public function howLang(Request $request){ $navi_id = $request->get('id');//分類id,或其他查詢條件 $storex = $request->get('longitude');//經度 $storey = $request->get('latitude');//緯度 $distance = $request->get('distance');//搜尋距離範圍 $result = DB::select("SELECT *,( 6371 * acos ( cos ( radians({$storey}) ) * cos( radians( latitude ) ) //表字段中緯度欄位 * cos( radians( longitude ) - radians({$storex}) ) //表字段中經度欄位 + sin ( radians({$storey}) ) * sin( radians( latitude ) ) //表字段中緯度欄位 )) AS distance FROM storelist WHERE navi_id = {$navi_id} //條件,這裡是分類id HAVING distance < {$distance} //一定範圍內的地點 ORDER BY distance //通過距離大小排序 LIMIT 0 , 20; "); //分段查詢,偏移量設為20 foreach($result as $k=>$v){ $result[$k] = (array)$v; //laravel框架,物件轉陣列 } $result = $this->distance($result,$storex,$storey); return json_encode($result,JSON_UNESCAPED_UNICODE); } /** * @param $result 陣列 * @param $storex 經度 * @param $storey 緯度 * @return mixed 計算出距離賦值到數組裡 */ public function distance($result,$storex,$storey){ foreach($result as $k=>$v){ $km = $this->km(round($this->getdistance($storex,$storey,$v['longitude'],$v['latitude']))); $result[$k]['km'] =$km ; } return $result; } /** *顯示方式,km 或 m */ public function km($km){ if($km < 1000){ return $km.'m'; }else{ return ($km/1000).'km'; } } /** * 求兩個已知經緯度之間的距離,單位為米 * @param lng1 $ ,lng2 經度 * @param lat1 $ ,lat2 緯度 * @return float 距離,單位米 */ function getdistance($lng1, $lat1, $lng2, $lat2) { // 將角度轉為狐度 $radLat1 = deg2rad($lat1); //deg2rad()函式將角度轉換為弧度 $radLat2 = deg2rad($lat2); $radLng1 = deg2rad($lng1); $radLng2 = deg2rad($lng2); $a = $radLat1 - $radLat2; $b = $radLng1 - $radLng2; $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6371 * 1000; return $s; }