• 计算两个经纬度之间的距离


    //计算两个经纬度之间的距离
    /**
    * 计算两点地理坐标之间的距离
    * @param Decimal $longitude1 起点经度
    * @param Decimal $latitude1 起点纬度
    * @param Decimal $longitude2 终点经度
    * @param Decimal $latitude2 终点纬度
    * @param Int $unit 单位 1:2:公里
    * @param Int $decimal 精度 保留小数位数
    * @return Decimal
    */

    function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=2){

    $EARTH_RADIUS = 6370.996; // 地球半径系数
    $PI = 3.1415926;

    $radLat1 = $latitude1 * $PI / 180.0;
    $radLat2 = $latitude2 * $PI / 180.0;

    $radLng1 = $longitude1 * $PI / 180.0;
    $radLng2 = $longitude2 * $PI /180.0;

    $a = $radLat1 - $radLat2;
    $b = $radLng1 - $radLng2;

    $distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
    $distance = $distance * $EARTH_RADIUS * 1000;

    if($unit==2){
    $distance = $distance / 1000;
    }

    return round($distance, $decimal);

    }



    //根据给的距离算出自己附近的经纬度范围,算出距离后排序
    public function vicinity()
    {
    if (!request()->isPost()) {
    return result_set(-1);
    }
    $page = input('post.page/d');
    $page_num = input('post.page_num/d') ? input('post.page_num/d') : 10;
    if (isset($page) && NULL !== $page) {
    $current_page = $page;
    } else {
    $current_page = 1;
    }
    $options = [
    'page' => $current_page,
    'path' => url('index')
    ];
    $uid = $this->uid;
    $lng = trim(input("post.lng"));
    $lat = trim(input("post.lat"));
    $distance = config('distance');


    $degree = (24901*1609)/360.0;
    $dpmLat = 1/$degree;

    $radiusLat = $dpmLat*$distance;
    $minLat = $lat - $radiusLat; // 最小纬度
    $maxLat = $lat + $radiusLat; // 最大纬度

    $mpdLng = $degree*cos($lat * (M_PI/180));
    $dpmLng = 1 / $mpdLng;
    $radiusLng = $dpmLng*$distance;
    $minLng = $lng - $radiusLng; // 最小经度
    $maxLng = $lng + $radiusLng; // 最大经度
    $condition['p.lng'] = ['between', [$minLng, $maxLng]];
    $condition['p.lat'] = ['between', [$minLat, $maxLat ]];


    $data = db('member_position') ->alias('p') ->join('member m', 'p.uid=m.uid')
    ->where('p.uid', '<>', $uid)
    ->where($condition)
    ->field('p.lng,p.lat,p.uid,m.authentication_status,m.thumb as thumb,m.nickname,m.start,m.brief')
    ->paginate($page_num, false, $options);
    $data = $data->toArray();
    foreach ($data['data'] as $k => $v) {
    $data['data'][$k]['thumb'] = 'http://' . config('DOMAIN') . '/' . $v['thumb'];
    $data['data'][$k]['distance'] = getDistance($lng, $lat, $v['lng'], $v['lat'], 1);
    }
    $arr = $data['data']; $date = array_column($arr, 'distance');
    array_multisort($date,SORT_ASC,$arr);
    return result_set(1, '成功', $arr);}
     
    
    
      









  • 相关阅读:
    java NIO ;mvn
    查询mysql当前连接数
    lifecycle of opensource products--x86-64
    docker squid---but git proxy should specify by git config --global http.proxy http:...
    java jmx
    zabbix basic concept
    智能手机,医疗诊断,云会议(gotomeeting/citrix)
    子网划分
    Cloudstack4.2之改变数据卷容量的大小(Resize Data Volumes)
    OCFS2 Fencing
  • 原文地址:https://www.cnblogs.com/nnhgd/p/9442430.html
Copyright © 2020-2023  润新知