【算法】基于Haversine公式计算地球上任意两点间的距离

import java.text.DecimalFormat;

public class DistanceCalculator {
    // 地球半径(单位:千米)
    private static final double R = 6371.0;
    // 计算地球球面距离方法
    public static void calculateSphericalDistance(double lng1, double lat1, double lng2, double lat2) {

        // 将经度和纬度转换为弧度表示
        double lng1Rad = Math.toRadians(lng1);
        double lat1Rad = Math.toRadians(lat1);
        double lng2Rad = Math.toRadians(lng2);
        double lat2Rad = Math.toRadians(lat2);

        // 使用Haversine公式计算球面距离
        double deltaLng = lng2Rad - lng1Rad;
        double deltaLat = lat2Rad - lat1Rad;
        double a = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) +
                Math.cos(lat1Rad) * Math.cos(lat2Rad) *
                        Math.sin(deltaLng/2) * Math.sin(deltaLng/2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        double distance = R * c;

        // 判断距离大小并进行单位转换
        String unit;
        if(distance >= 1.0) {  // 距离大于等于1千米时使用千米为单位
            unit = "千米";
        } else {
            distance = distance * 1000;  // 转换为米
            unit = "米";
        }
        // 保留两位小数并进行四舍五入
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        String formattedDistance = decimalFormat.format(distance);

        // 打印距离
        System.out.println("球面距离:" + formattedDistance + " " + unit);
    }

    public static double convertToDecimalDegrees(String coord) {
        // 判断方向(E/W 或 N/S)
        char directionChar = coord.charAt(coord.length() - 1);
        boolean isPositive = (directionChar == 'E' || directionChar == 'N');

        // 分割度分秒
        String[] parts = coord.split("[°'']+");

        // 提取度、分、秒的数值
        double degrees = Double.parseDouble(parts[0]);
        double minutes = Double.parseDouble(parts[1]);
        double seconds = Double.parseDouble(parts[2]);

        // 计算十进制度
        double decimalDegrees = degrees + minutes / 60 + seconds / 3600;

        // 根据方向确定正负号
        if (!isPositive) {
            decimalDegrees *= -1;
        }

        return decimalDegrees;
    }
}

end
  • 作者:dicraft(联系作者)
  • 更新时间:2023-11-01 17:42
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 评论

    新增邮件回复功能,回复将会通过邮件形式提醒,请填写有效的邮件!