關於兩個經緯度之間的距離計算

通常來講 咱們一般見到的經緯度計算時兩點之間的直線距離 隨着app對接地圖,公衆號小程序等對接地圖插件,直接顯示的是駕車或者騎車的曲線距離,因此二者沒法等同須要注意git

一下提供兩種直線距離的寫法算法

調取前請先注意一下問題小程序

經度 longitude
緯度 latitudeapp

 

 數據調用不出來或者距離不對 先考慮是否是經緯度寫反了喔this

 

1 公共方法調用spa

 1 /**
 2  * 計算兩點地理座標之間的距離
 3  * @param Decimal $longitude1 起點經度
 4  * @param Decimal $latitude1 起點緯度
 5  * @param Decimal $longitude2 終點經度
 6  * @param Decimal $latitude2 終點緯度
 7  * @param Int   $unit    單位 1:米 2:千米
 8  * @param Int   $decimal  精度 保留小數位數
 9  * @return Decimal
10  */
11 
12 function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=1, $decimal=2){
13     $EARTH_RADIUS = 6370.996; // 地球半徑係數
14     $PI = 3.1415926;
15     $radLat1 = $latitude1 * $PI / 180.0;
16     $radLat2 = $latitude2 * $PI / 180.0;
17     $radLng1 = $longitude1 * $PI / 180.0;
18     $radLng2 = $longitude2 * $PI /180.0;
19     $a = $radLat1 - $radLat2;
20     $b = $radLng1 - $radLng2;
21     $distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
22     $distance = $distance * $EARTH_RADIUS * 1000;
23     if($unit==2){
24         $distance = $distance / 1000;
25     }
26     return round($distance, $decimal);
27 }

2 分頁顯示距離遠近數據插件

 1 public function list(){
 2         $data = $this->request->param();
 3         $page=$data['page'];
 4         $where['status']= 1;
 5 
 6         $lat=$data['lat'];
 7         $lng=$data['lng'];
 8 
 9         $order='mi asc';
10         $list= StoreApply::field("*,ROUND(6378.138*2*ASIN(SQRT(POW(SIN(({$lat}*PI()/180-lng*PI()/180)/2),2)+COS({$lat}*PI()/180)*COS(lng*PI()/180)*POW(SIN(({$lng}*PI()/180-lat*PI()/180)/2),2)))*1000) as mi")
11             ->where($where)
12             ->order($order)
13             ->page($page,16)
14             ->select();
15 
16         $this->success('請求成功',compact('list'));
17     }     

以上兩種形式的算法有輕微差異 大差不差code

另外涉及方法blog

 1 /*
 2  * 獲取當前位置附近N範圍
 3  * */
 4 
 5 function SquarePoint($lng, $lat,$distance = 5){
 6     $dlng =  2 * asin(sin($distance / (2 * 6371)) / cos(deg2rad($lat)));
 7     $dlng = rad2deg($dlng);
 8     $dlat = $distance/6371;
 9     $dlat = rad2deg($dlat);
10     return array(
11         'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
12         'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
13         'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
14         'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
15     );
16 }
相關文章
相關標籤/搜索