php计算两个坐标(经度,纬度)之间的方位角

4 篇文章 0 订阅

<?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

根据在线计算方位角工具所得结果和以上代码执行结果一致, 在线计算方位角工具计算结果如下图所示:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值