• 关于两个经纬度之间的距离计算【更新至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 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 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) AS mi

    有兴趣的可以直接研究下自定义的函数与上面这个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 }
  • 相关阅读:
    fastjson 使用方法
    算法
    SHA算法
    MD5算法
    kindle推送服务
    DLL劫持
    Hook编程
    Hook技术
    权限验证
    虚拟机
  • 原文地址:https://www.cnblogs.com/exo5/p/13500684.html
Copyright © 2020-2023  润新知