项目中有个需求是需求是根据点与点之间的经纬度的数据,算出总距离。数据结构是二维数组。其实就是使用半正矢(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();
}
}
测试:结果单位是米。