zoukankan      html  css  js  c++  java
  • 地图 计算2点距离等

        /**
        *计算某个经纬度的周围某段距离的正方形的四个点
        *
        *@param lng float 经度
        *@param lat float 纬度
        *@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
        *@return array 正方形的四个点的经纬度坐标
         用法
         使用此函数计算得到结果后,带入sql查询。
         $squares = returnSquarePoint($lng, $lat);
        */
        private function returnSquarePoint($lng, $lat,$distance = 1){
           $dlng =  2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));
           $dlng = rad2deg($dlng);
           $dlat = $distance/EARTH_RADIUS;
           $dlat = rad2deg($dlat);
           return array(
               'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
               'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
               'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
               'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
            );
        }
        
        //获取2点之间的距离
        private function GetDistance($lat1, $lng1, $lat2, $lng2){
            $radLat1 = $lat1 * (PI / 180);
            $radLat2 = $lat2 * (PI / 180);
            $a = $radLat1 - $radLat2;
            $b = ($lng1 * (PI / 180)) - ($lng2 * (PI / 180));
            $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));
            $s = $s * EARTH_RADIUS;
            $s = round($s * 10000) / 1000;//10000
            return $s;
        }

        //每一次电工打开app会想我传一个坐标位置   用户查看附近的电工时会根据这个经纬度查看附近的电工
        public function ssdg(){
            $only_label = I('only_label');
            $lat = I('lat');
            $longs = I('longs');
            if($lat == "" || $longs == ""){// || $id == ""
                $this->json('10003','参数缺少');
            }
            $res = M("user")->where("only_label = '$only_label'")->find();
            if($res){
                $datainfo['lat'] = $lat;
                $datainfo['longs'] = $longs;
                M("user")->where("only_label = '$only_label'")->save($datainfo);
                $this->json('10001');
            }else{
                $this->json('10009','没有这个电工的id');
            }
        }
        
        //用户查看电工的
        public function yhcdg(){
            //纬度
            $lat = I('lat');
            //经度
            $longs = I('longs');
            if($lat == "" || $longs == ""){
                $this->json('10003','参数缺少');
            }
            $squares = $this->returnSquarePoint($longs, $lat);
            $arr_info = M("user_address")
                ->where("(lat > {$squares['right-bottom']['lat']} and lat < {$squares['left-top']['lat']})
                and (longs > {$squares['left-top']['lng']} and longs < {$squares['right-bottom']['lng']})")
                ->select();
            foreach ($arr_info as $k=>$v){
                $arr_info[$k]['juli'] = $this->GetDistance($lat, $longs, $v['lat'], $v['longs']);
            }
            $skill_label = M("skill")->select();
            //dump($skill_label);die;
            foreach($skill_label as $key => $val){
                $skl[$val['id']] = $val['name'];
            }
            //dump($skl);die;
            foreach ($arr_info as $key => $val){
                if($val['skill_label'] == ''){
                    $arr_info[$key]['skill_label'] = '***';
                } else {
                    $label = explode(',', $val['skill_label']);
                    foreach($label as $key => $val){
                        $data1[$val['id']] = $skl[$val];
                    }
                    foreach ($arr_info as $k=>$v){
                        $arr_info[$k]['skill_label'] = implode(',',$data1);
                    }
                }
            }
            foreach($arr_info as $key=> $val){
                $f_id = $val['uid'];
                $wan = M("order")->where("f_id='$f_id' and statics='11'")->count();//完成总数
                $zcment_sum = M("order_comment")->where("f_id='$f_id'")->sum("zcment");//求和
                $zcment_num = M("order_comment")->where("f_id='$f_id'")->count();//总数
                $zcment = $zcment_sum/$zcment_num;//综合评价
                if($zcment){
                    $arr_info[$key]['zcment'] = $zcment;
                } else {
                    $arr_info[$key]['zcment'] = '***';
                }
                $arr_info[$key]['dan'] = $wan;
            }
            //dump($arr_info);die;
            $this->json(10001,array("data"=>$arr_info));
        }

       //电工首页
        public function dgshouye(){
            //用户id
            $uid = I("uid");
            //纬度
            $lat = I('lat');
            //经度
            $longs = I('longs');
            if($lat == ""){
                //纬度为空
                $this->json('10003','参数缺少');
            }
            if($longs == ""){
                //经度为空
                $this->json('10003','参数缺少');
            }
            if($uid == ''){
                //用户为空
                $this->json('10003','参数缺少');
            }
            //获取附近0.5千米的所有订单
            $squares = $this->returnSquarePoint($longs, $lat);
            $res = M("order_offer")->where("uid='$uid'")->find();
            if($res){
                $o_id = $res['o_id'];
                //返回的电工坐标附近1千米的所有订单
                $arr_info = M("user_address d")
                        ->join("dian_order o on d.id = o.address_id")
                        ->field("*,o.id o_id")
                        ->where("(d.lat > {$squares['right-bottom']['lat']} and
                        d.lat < {$squares['left-top']['lat']}) and
                        (d.longs > {$squares['left-top']['lng']} and
                                d.longs < {$squares['right-bottom']['lng']}) and o.id!='$o_id' and o.statics=1")//and 0.f_id == ''
                        ->select();
            } else {
                //返回的电工坐标附近1千米的所有订单
                $arr_info = M("user_address d")
                        ->join("dian_order o on d.id = o.address_id")
                        ->field("*,o.id o_id")
                        ->where("(d.lat > {$squares['right-bottom']['lat']} and
                        d.lat < {$squares['left-top']['lat']}) and
                        (d.longs > {$squares['left-top']['lng']} and
                                d.longs < {$squares['right-bottom']['lng']}) and o.statics=1 ")//and 0.f_id == ''
                        ->select();
            }        
            $this->json(10001,array("info"=>$arr_info));
        }

  • 相关阅读:
    大数据分析
    爬取所有校园新闻
    用requests库和BeautifulSoup4库爬取新闻列表
    中文词频统计及词云制作
    组合数据类型练习,英文词频统计实例
    条件,循环,函数定义,字符串小练习
    一个完整的大作业
    数据结构化与保存
    字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
    大数据在游戏领域的应用
  • 原文地址:https://www.cnblogs.com/jhy-ocean/p/6086368.html
Copyright © 2011-2022 走看看