酬劳网用户【破千】^_^ 欢迎更多的程序员加入进来~

  • 当前位置:
  • 实战经验
  • ->
  • 开发语言分类
根据经纬度计算附近的经纬度范围和获取两个坐标之间的距离

       实战经验->开发语言        类型:原创        作者:酬劳网        浏览数:1382        发布日期:2018-10-07 20:16:03
       根据经纬度计算附近的经纬度范围和获取两个坐标之间的距离

TP框架下的方法,部分函数请自行区分,具体看看思路

/**

     * 根据经纬度计算附近的人的经纬度范围---------------跨经纬度为0的区域可能有BUG
     
     * 有偏差,需要进一步数据测试
     
     * @param string $lat       我的纬度
     
     * @param string $lng       我的经度
     
     * @param string $range     附近的人-范围(单位KM)
     
     * @param string $radius    地球半径(单位KM)
     
     * @return array            0:纬度下限;1:纬度上限;2:经度下限;3:经度上限
     
     */
     
    private function getNearByRange($lat, $lng, $range = NULL, $radius = NULL) {
 
 
        if (is_null($range)) {
        
            $range = C('NEARBY_RANGE');
            
        }
        
        if (is_null($radius)) {
        
            $radius = C('NEARBY_RADIUS');
            
        }
        
 
        /* 计算偏移的角度并转化为弧度 */
        
        $dlng = rad2deg(2 * asin(sin($range / (2 * $radius)) / cos($lat)));
        
        $dlat = rad2deg($range * 10 / $radius);
        
 
        /* 计算实际搜索的四边形的四个边界范围 */
        
        $res[0] = round($lat - $dlat, 6);
        
        $res[1] = round($lat + $dlat, 6);
        
        $res[2] = round($lng + $dlng, 6);
        
        $res[3] = round($lng - $dlng, 6);
        
        return $res;
    }


计算两组经纬度坐标之间的距离

/** 
    * 计算两组经纬度坐标 之间的距离 
    
    * params :lat1 纬度1; lng1 经度1; lat2 纬度2; lng2 经度2; len_type (1:m or 2:km); 
    
    * return m or km 
    
    * $this->GetDistance($latitude,$longitude, 39.908452,116.450479,1)."m";
    
    *  EARTH_RADIUS'='6378.137',//地球半径 
    
    *  PI'='3.1415926',//π值 
    
    */ 
    function GetDistance($lat1, $lng1, $lat2, $lng2, $len_type = 1, $decimal = 2) 
    
    { 
    
        $radLat1 = $lat1 * C('PI') / 180.0; 
        
        $radLat2 = $lat2 * C('PI') / 180.0; 
        
        $a = $radLat1 - $radLat2; 
        
        $b = ($lng1 * C('PI') / 180.0) - ($lng2 * C('PI') / 180.0); 
        
        $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2))); 
        
        $s = $s * C('EARTH_RADIUS'); 
        
        $s = round($s * 1000); 
        
        if ($len_type > 1) 
        
        { 
        
            $s /= 1000; 
            
        } 
        
        return round($s, $decimal); 
        
    }