WalkerDi的技术专栏 PHP and SQL Coder

地图坐标之间的计算

2020-08-01

阅读:

PHP  baidu  map
   

地图坐标之间的计算

/**
*  地图坐标之间的计算
*/
class Coords {
    public $EARTH_RADIUS = 6371.393,    // 地球平均半径(km)
            $PI = 3.1415926;            // 拍

    /**
     *  计算两个坐标之间的距离(米)
     *
     * @param mixed $fP1Lat
     * @param mixed $fP1Lon
     * @param mixed $fP2Lat
     * @param mixed $fP2Lon
    */
    public function distance_between($fP1Lat, $fP1Lon, $fP2Lat, $fP2Lon) {
        $fP1Lat = floatval($fP1Lat);
        $fP1Lon = floatval($fP1Lon);
        $fP2Lat = floatval($fP2Lat);
        $fP2Lon = floatval($fP2Lon);
        
        // 角度换算成弧度
        $fRadLon1 = deg2rad($fP1Lon);
        $fRadLon2 = deg2rad($fP2Lon);
        $fRadLat1 = deg2rad($fP1Lat);
        $fRadLat2 = deg2rad($fP2Lat);
        
        // 计算经纬度的差值
        $fD1 = abs($fRadLat1 - $fRadLat2);
        $fD2 = abs($fRadLon1 - $fRadLon2);
        
        // 距离计算
        $fP = pow(sin($fD1 / 2), 2) + cos($fRadLat1) * cos($fRadLat2) * pow(sin($fD2 / 2), 2);
        
        return intval($this->EARTH_RADIUS * 2000 * asin(sqrt($fP)) + 0.5);
    }

    /**
     * 计算指定距离的坐标范围
     */ 
    public function coords_range($lat, $lng, $distance = 2) {
        $dlng = rad2deg(2 * asin(sin($distance / (2 * 6371)) / cos(deg2rad($lat))));
        $dlat = rad2deg($distance / 6371);

        $data = array(
            'coords_lng_low'  => $lng - $dlng,
            'coords_lng_high' => $lng + $dlng,
            'coords_lat_low'  => $lat - $dlat,
            'coords_lat_high' => $lat + $dlat
        );
        
        return $data;
    }

    /**
     * 计算两个坐标的航向
     * @param $start_lat
     * @param $start_lon
     * @param $end_lat
     * @param $end_lon
     * @return int
     */
    public function get_degree($start_lat,$start_lon,$end_lat,$end_lon){
        $rad_lat_a = deg2rad($start_lat); //将角度转换为弧度
        $rad_lon_a = deg2rad($start_lon);
        $rad_lat_b = deg2rad($end_lat);
        $rad_on_b = deg2rad($end_lon);

        $d_lon = $rad_on_b - $rad_lon_a;
        $y = sin($d_lon) * cos($rad_lat_b);
        $x = cos($rad_lat_a) * sin($rad_lat_b) - sin($rad_lat_a) * cos($rad_lat_b) * cos($d_lon);
        $brng = rad2deg(atan2($y, $x)); //将弧度数转换为相应的角度数
        $brng = ($brng + 360) % 360;
        return $brng;

    }
}

Similar Posts

Comments