php 根据经纬度计算范围

/**
     *计算某个经纬度的周围某段距离的正方形的四个点
     *@param lng float 经度
     *@param lat float 纬度
     *@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米
     *@return array 正方形的四个点的经纬度坐标
     */
    private function returnSquarePoint($lng, $lat,$distance = 5)
    {
        $earthdata=6371;//地球半径,平均半径为6371km
        $dlng =  2 * asin(sin($distance / (2 * $earthdata)) / cos(deg2rad($lat)));
        $dlng = rad2deg($dlng);
        $dlat = $distance/$earthdata;
        $dlat = rad2deg($dlat);
        $arr=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)
        );
        return $arr;
    }
    //使用此函数计算得到结果后,带入sql查询。
    $point = $this->returnSquarePoint($lng,$lat,5);        //计算经纬度的周围某段距离的正方形的四个点
    $right_bottom_lat = $point['right_bottom']['lat'];   //右下纬度
    $left_top_lat = $point['left_top']['lat'];           //左上纬度
    $left_top_lng = $point['left_top']['lng'];           //左上经度
    $right_bottom_lng = $point['right_bottom']['lng'];   //右下经度
    $sql = "SELECT * FROM `表名` WHERE LastGpsWei<>0 AND latitude>$right_bottom_lat AND latitude<$left_top_lat AND longitude>$left_top_lng AND longitude<$right_bottom_lng";

第二种方法

/**
     * 
     * @param  $latitude    纬度    
     * @param  $longitude    经度
     * @param  $raidus        半径范围(单位:米)
     * @return multitype:number
     */
    public function getAround($latitude,$longitude,$raidus){
        $PI = 3.14159265;
        $degree = (24901*1609)/360.0;
        $dpmLat = 1/$degree;
        $radiusLat = $dpmLat*$raidus;
        $minLat = $latitude - $radiusLat;
        $maxLat = $latitude + $radiusLat;
        $mpdLng = $degree*cos($latitude * ($PI/180));
        $dpmLng = 1 / $mpdLng;
        $radiusLng = $dpmLng*$raidus;
        $minLng = $longitude - $radiusLng;
        $maxLng = $longitude + $radiusLng;
        return array (minLat=>$minLat, maxLat=>$maxLat, minLng=>$minLng, maxLng=>$maxLng);
    }

 

构造语句

$condition['latitude']  = array(array('EGT',$array['minLat']),array('ELT',$array['maxLat']),'and');//(`latitude` >= minLat) AND (`latitude` <=maxLat) 

$condition['longitude'] = array(array('EGT',$array['minLng']),array('ELT',$array['maxLng']),'and');//(`longitude` >= minLng) AND (`longitude` <= maxLng)

 计算两个经纬度之间距离

 

/**
 * 根据起点坐标和终点坐标测距离
 * @param  [array]   $from     [起点坐标(经纬度),例如:array(118.012951,36.810024)]
 * @param  [array]   $to     [终点坐标(经纬度)]
 * @param  [bool]    $km        是否以公里为单位 false:米 true:公里(千米)
 * @param  [int]     $decimal   精度 保留小数位数
 * @return [string]  距离数值
 */
function get_distance($from,$to,$km=true,$decimal=2){
    sort($from);
    sort($to);
    $EARTH_RADIUS = 6370.996; // 地球半径系数
    
    $distance = $EARTH_RADIUS*2*asin(sqrt(pow(sin( ($from[0]*pi()/180-$to[0]*pi()/180)/2),2)+cos($from[0]*pi()/180)*cos($to[0]*pi()/180)* pow(sin( ($from[1]*pi()/180-$to[1]*pi()/180)/2),2)))*1000;
    
    if($km){
        $distance = $distance / 1000;
    }
 
    return round($distance, $decimal);
}

 

posted @ 2019-06-29 11:39  hanyudanei  阅读(714)  评论(0编辑  收藏  举报