根据两个经纬度坐标计算距离

本文介绍了如何使用Java编程语言,利用Haversine公式计算地球上两点之间的球面直线距离,以及如何结合高度差考虑进行更精确的直线距离计算。同时,还展示了如何将经纬度转换为弧度并应用欧几里得公式进行辅助计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

/**
     * 球面直线距离
     * @param lat1  纬度
     * @param lon1  经度
     * @param alt1  高度
     * @param lat2
     * @param lon2
     * @param alt2
     * @return
     */
    public static double calculateDistance(double lat1, double lon1, double alt1,
        double lat2, double lon2, double alt2) {

        // 根据Haversine公式计算地表距离
        double distanceOnEarth = calculateSurfaceDistance(lat1, lon1, lat2, lon2);

        // 计算高度差(需要确保高度单位和地表距离单位一致,这里假设都是千米)
        double heightDifference = Math.abs(alt1/1000 - alt2/1000);

        // 使用欧几里得公式计算直线距离
        double straightLineDist = Math.sqrt(Math.pow(distanceOnEarth, 2) + Math.pow(heightDifference, 2));

        double v = new BigDecimal(straightLineDist).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return v; // 返回结果
    }

    private static final int EARTH_RADIUS = 6371; // 地球平均半径,单位为千米
    /**
     * 平面直线距离
     * @param lat1
     * @param lon1
     * @param lat2
     * @param lon2
     * @return
     */
    private static double calculateSurfaceDistance(double lat1, double lon1,
        double lat2, double lon2) {
        // 转换角度到弧度
        double lat1Radians = Math.toRadians(lat1);
        double lon1Radians = Math.toRadians(lon1);
        double lat2Radians = Math.toRadians(lat2);
        double lon2Radians = Math.toRadians(lon2);

        // 根据Haversine公式计算
        double latDiff = lat2Radians - lat1Radians;
        double lonDiff = lon2Radians - lon1Radians;
        double a = Math.pow(Math.sin(latDiff / 2), 2)
            + Math.cos(lat1Radians) * Math.cos(lat2Radians)
            * Math.pow(Math.sin(lonDiff / 2), 2);

        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        return EARTH_RADIUS * c; // 返回结果
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值