<?php
class Angle
{
/**
* @param $d 转化为弧度(rad)
* @return float
*/
public function rad($d)
{
return $d * PI() / 180.0;
}
/**
* 求两经纬度方向角
*
* @param lon1
* 第一点的经度
* @param lat1
* 第一点的纬度
* @param lon2
* 第二点的经度
* @param lat2
* 第二点的纬度
* @return 方位角,角度(单位:°)
* */
public function GetAngle($lon1, $lat1, $lon2, $lat2) {
$lat1 = $this->rad($lat1);
$lat2 = $this->rad($lat2);
$lon1 = $this->rad($lon1);
$lon2 = $this->rad($lon2);
$angle = sin($lat1) * sin($lat2) + cos($lat1)
* cos($lat2) * cos($lon2 - $lon1);
$angle = sqrt(1 - $angle * $angle);
$angle = cos($lat2) * sin($lon2 - $lon1) / $angle;
$angle = asin($angle) * 180 / PI();
if (is_nan($angle)) {
if ($lon1 < $lon2) {
$angle = 90.0;
} else {
$angle = 270.0;
}
return $angle;
}
if (($lat1 < $lat2) && ($lon1 <= $lon2)) {
//一象限
$angle = $lon1 == $lon2 ? 0: $angle;
} elseif (($lat1 >= $lat2) && ($lon1 < $lon2)) {
//二象限
$angle=180-$angle;
} elseif (($lat1 > $lat2) && ($lon1 >= $lon2)) {
//三象限
$angle=abs($angle)+180;
} else {
//四象限
$angle = $lat1 == $lat2 ? $angle : 360-abs($angle);
}
return $angle;
}
}
//坐标点1
$lon1 = 116.538512;//经度
$lat1 = 39.997896;//纬度
//坐标点2
$lon2 = 116.530463;//经度
$lat2 = 39.986177;//纬度
echo (new Angle())->GetAngle($lon1, $lat1, $lon2, $lat2);//207.75621111667
根据在线计算方位角工具所得结果和以上代码执行结果一致, 在线计算方位角工具计算结果如下图所示: