项目中有个需求是需求是根据点与点之间的经纬度的数据,算出总距离。数据结构是二维数组。其实就是使用半正矢(Haversine)公式去做的计算。

 


import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

/**
 * <p>
 * 根据经纬度计算总距离
 * </p>
 *
 * @author Lch
 * @dateTime 2024/2/18 13:03
 */
public class HaversineDistance {

    /**
     * 地球的平均半径
     */
    private static final double EARTH_RADIUS = 6371.0;

    /**
     * 计算距离
     * @param points 数据
     * @return 米
     */
    public String haversineDistance(List<List<Double>> points) {
        BigDecimal totalDistance = BigDecimal.ZERO;
        for (int i = 0; i < points.size() - 1; i++) {
            List<Double> point1 = points.get(i);
            List<Double> point2 = points.get(i + 1);
            double lat1 = point1.get(0);
            double lon1 = point1.get(1);
            double lat2 = point2.get(0);
            double lon2 = point2.get(1);

            // 将经纬度转换为弧度
            double lat1Rad = Math.toRadians(lat1);
            double lon1Rad = Math.toRadians(lon1);
            double lat2Rad = Math.toRadians(lat2);
            double lon2Rad = Math.toRadians(lon2);

            // 计算经纬度差
            double dLat = lat2Rad - lat1Rad;
            double dLon = lon2Rad - lon1Rad;

            // 使用 Haversine 公式计算距离
            double a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.pow(Math.sin(dLon / 2), 2);
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            double distanceBetweenPoints = EARTH_RADIUS * c;

            // 计算距离并累加
            totalDistance = totalDistance.add(BigDecimal.valueOf(distanceBetweenPoints));
        }
        // 转换为米并保留两位小数
        return totalDistance.multiply(BigDecimal.valueOf(1000)).setScale(2, RoundingMode.UP).toString();
    }
}

测试:结果单位是米。 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐