/**
* 地图坐标之间的计算
*/
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;
}
}