地图 计算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));
    }

原文地址:https://www.cnblogs.com/jhy-ocean/p/6086368.html