您好,欢迎来到微智科技网。
搜索
您的当前位置:首页关于两个经纬度之间的距离计算【更新至2021.01.04】

关于两个经纬度之间的距离计算【更新至2021.01.04】

来源:微智科技网
关于两个经纬度之间的距离计算【更新⾄2021.01.04】

⼀般来说 我们通常见到的经纬度计算时两点之间的直线距离 随着app对接地图,公众号⼩程序等对接地图插件,直接显⽰的是驾车或者骑车的曲线距离,所以两者⽆法等同需要注意

⼀下提供两种直线距离的写法调取前请先注意⼀下问题经度 longitude纬度 latitude

数据调⽤不出来或者距离不对 先考虑是不是经纬度写反了喔

1 公共⽅法调⽤

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 Decimal10 */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 function getdistance2($lng1,$lat1,$lng2,$lat2){ 2 //将⾓度转为狐度

3 $radLat1=deg2rad($lat1);//deg2rad()函数将⾓度转换为弧度 4 $radLat2=deg2rad($lat2); 5 $radLng1=deg2rad($lng1); 6 $radLng2=deg2rad($lng2); 7 $a=$radLat1-$radLat2; 8 $b=$radLng1-$radLng2;

9 $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137*1000;10 return $s;11 }

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 }

关于sql语句,如果看不懂的 也可以直接以下⽅sql带⼊

1 ROUND(6370.996 * 2 * ASIN(SQRT(POW(SIN(($latitude * PI() / 180 - latitude * PI() / 180) / 2),2) + COS($latitude * PI() / 180) * COS(latitude * PI() / 180) * POW(SIN(($longitude * PI() / 180 - longitude * PI() / 180) / 2),2))) * 1000)

有兴趣的可以直接研究下⾃定义的函数与上⾯这个sql语句的带⼊关系

以上两种形式的算法有轻微差别 ⼤差不差另外涉及⽅法

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 }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务