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
    评论
计算两个经纬度相对的方向角可以使用以下公式: ``` double lat1 = Math.toRadians(lat1Degrees); double lat2 = Math.toRadians(lat2Degrees); double lon1 = Math.toRadians(lon1Degrees); double lon2 = Math.toRadians(lon2Degrees); double y = Math.sin(lon2 - lon1) * Math.cos(lat2); double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1); double bearing = Math.toDegrees(Math.atan2(y, x)); bearing = (bearing + 360) % 360; ``` 其中,`lat1Degrees`和`lon1Degrees`是第一个经纬度纬度经度,`lat2Degrees`和`lon2Degrees`是第二个经纬度纬度经度计算出的方向角`bearing`表示第一个经纬度指向第二个经纬度的方向,以度为单位,范围为0到360。 反算坐标方位角也可以使用类似的公式进行计算。假设已知点A和点B的经纬度坐标,以及点A与北极的方位角,要求点B与点A的方位角,则可以使用以下公式: ``` double lat1 = Math.toRadians(lat1Degrees); double lat2 = Math.toRadians(lat2Degrees); double lon1 = Math.toRadians(lon1Degrees); double lon2 = Math.toRadians(lon2Degrees); double bearing1 = Math.toRadians(bearing1Degrees); double y = Math.sin(lon2 - lon1) * Math.cos(lat2); double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1); double bearing2 = Math.toDegrees(Math.atan2(y, x)); bearing2 = (bearing2 + 360) % 360; double bearingAB = (bearing1 + bearing2) % 360; ``` 其中,`bearing1Degrees`表示点A与北极的方位角,`bearing2`表示点A指向点B的方向角,`bearingAB`表示点B与点A的方位角

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值