两种根据经纬度计算转向角的方法 Java 工具类

两种根据经纬度计算转向角的方法 Java 工具类

本Java工具类提供了两种根据经纬度计算转向角的方法,其中第二种方法经测试是可以的。

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class AngleUtil {


    private static final int EARTH_RADIUS_IN_KILOMETERS = 6371;
    
    public static double getAngle(double lat1, double lon1, double lat2, double lon2){
//        return calculateAngle1(lon1, lat1, lon2, lat2);
        return calculateAngle2(lat1, lon1, lat2, lon2);
    }

    /**
     * 获取两点之间的角度,用于:历史回放
     * 2023-11-21 10:22:56
     * @param x1 第一个点经度
     * @param y1 第一个点纬度
     * @param x2 第二个点经度
     * @param y2 第二个点纬度
     * @return
     */
    private static double calculateAngle1(double x1, double y1, double x2, double y2) {
        if (x1 ==0 || x2==0 || y1==0||y2==0){
            // 初始化数据不做角度计算
            return 0;
        }
        double x = Math.abs(x1 - x2);
        double y = Math.abs(y1 - y2);
        double z = Math.sqrt(x * x + y * y);

        double angle = Math.round((Math.asin(y / z) / Math.PI * 180));
        if (Double.isNaN(angle)) {
            return 0;
        } else {
            if (angle == 0) {
                if (x2 - x1 > 0) {
                    angle = 90; //目标方向横轴正向
                } else {
                    angle = -90; //目标方向横轴反向
                }
            } else if (angle == 90) {
                if (y2 - y1 > 0) {
                    angle = 0; //目标方向纵轴正向
                } else {
                    angle = 180; //目标方向纵轴反向
                }
            } else {
                if (x2 - x1 > 0 && y2 - y1 > 0) {
                    angle = 90 - angle; //目标方向第一象限
                } else if (x2 - x1 < 0 && y2 - y1 < 0) {
                    angle = -90 - angle; //目标方向第三象限
                } else if (x2 - x1 > 0 && y2 - y1 < 0) {
                    angle = 90 + angle; //目标方向第四象限
                } else if (x2 - x1 < 0 && y2 - y1 > 0) {
                    angle = angle - 90; //目标方向第二象限
                }
            }
        }
        angle = Math.PI / 180 * angle;
        return angle;
    }

    private static double calculateAngle2(double lat1, double lon1, double lat2, double lon2) {
        if (lat1 ==0 || lon1==0 || lat2==0||lon2==0){
            // 初始化数据不做角度计算
            return 0;
        }
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);

        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
                * Math.sin(dLon / 2) * Math.sin(dLon / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // Distance in kilometers
        double distance = EARTH_RADIUS_IN_KILOMETERS * c;

        // Bearing in degrees
        double bearing = Math.toDegrees(Math.atan2(
                Math.sin(dLon) * Math.cos(Math.toRadians(lat2)),
                Math.cos(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2)) -
                        Math.sin(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(dLon)));

        // Normalize bearing to 0-360 degrees
        bearing = (bearing + 360) % 360;

        return bearing;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值