/**
* 精确计算
* 基于椭球体形状的大地线段计算,由于涉及更复杂的数学计算和椭球体参数,它的计算速度可能相对较慢
* 原理:下面补充
*/
private static long getDistanceMBase(double longitudeFrom, double latitudeFrom, double longitudeTo, double latitudeTo) {
GlobalCoordinates source = new GlobalCoordinates(latitudeFrom, longitudeFrom);
GlobalCoordinates target = new GlobalCoordinates(latitudeTo, longitudeTo);
try {
return (long) new GeodeticCalculator().calculateGeodeticCurve(Ellipsoid.Sphere, source, target).getEllipsoidalDistance();
} catch (Exception e) {
return -1;
}
}
/**
* 近似计算: 如果只需要大致的距离估计而不是精确值,可以考虑使用一些近似算法,如快速距离估计法,以减少计算复杂度
*
* @return 两者相距的距离,计算的值 不是精确的值,这样计算的值 相同的几率很大
*/
public static long approximateDistance(double lat1, double lon1, double lat2, double lon2) {
double latDistance = Math.abs(lat1 - lat2);
double lonDistance = Math.abs(lon1 - lon2);
// 使用勾股定理近似计算距离
return (long) Math.sqrt(latDistance * latDistance + lonDistance * lonDistance);
}
private static final double EARTH_RADIUS = 6371.0; // 地球半径,单位为公里
/**
* 使用 Haversine 公式计算距离
* Haversine 公式是一个基于球体近似的计算方法,适用于小范围的距离计算。它的计算速度较快,适用于需要快速计算距离的情况,但它并不考虑地球的椭球体形状,可能在极端情况下精度较低
*/
public static long haversineDistance(double lat1, double lon1, double lat2, double lon2) {
double latRad1 = Math.toRadians(lat1);
double lonRad1 = Math.toRadians(lon1);
double latRad2 = Math.toRadians(lat2);
double lonRad2 = Math.toRadians(lon2);
double dLat = latRad2 - latRad1;
double dLon = lonRad2 - lonRad1;
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(latRad1) * Math.cos(latRad2) *
Math.sin(dLon / 2) * Math.sin(dLon / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return (long)(EARTH_RADIUS * c);
}
GeodeticCalculator 原理
这是一种计算两个地理坐标之间的大地线段的方法。它通常用于测量两个点之间的距离、方向和切线(azimuth、bearing)等信息,可以在地球表面上考虑椭球体的形状,提供更精确的结果。
这个方法的原理涉及到大地测量学和大地线段计算,以下是一个简要的解释:
-
大地测量学: 大地测量学是研究地球上的大地线段(大地弧)和测地线段(测地弧)的分支,涉及地球的曲率和椭球体的形状。大地线段是连接地球表面上的两点的弯曲路径,而测地线段是通过大地线段测量的实际线段。
-
大地线段计算:
GeodeticCalculator().calculateGeodeticCurve
方法通过考虑地球的椭球体形状,使用大地线段计算公式,计算两个地理坐标之间的大地线段的信息。这包括大地线段的长度、方向(azimuth)、切线(bearing)等。 -
椭球体模型: 地球并不是完全的球体,而是一个近似于椭球体的形状。在计算大地线段时,通常会使用一定的椭球体模型,例如 WGS84 椭球体模型,以便更准确地考虑地球的形状。
-
计算方法: 具体的计算方法会涉及椭球体的参数、地理坐标的经纬度、大地线段的起始点和终点等信息。计算中会使用椭球体参数计算大地线段的长度、方向和切线等信息,从而得出所需的测量结果。
总之,GeodeticCalculator().calculateGeodeticCurve
方法是基于大地测量学和大地线段计算原理,通过考虑地球的椭球体形状,计算地理坐标之间的距离、方向和切线等信息。这种方法可以在地球表面上提供更准确的测量结果。具体实现可能涉及复杂的数学计算和地理坐标系统的转换