logo

Java中经纬度计算两点距离与区域校验的五种方法

作者:半吊子全栈工匠2024.01.18 05:39浏览量:58

简介:本文介绍了在Java中根据经纬度计算两点距离的五种方法,并提供了校验经纬度是否在圆/多边形区域内的算法推荐。通过这些方法,您可以轻松地处理地理空间数据,并进行相关的地理计算。

在Java中,根据经纬度计算两点之间的距离有多种方法。以下为您推荐五种常见的方法:

  1. 使用Haversine公式:Haversine公式是一个常用的计算两点之间球面距离的公式。它基于地球的近似椭球形状,适用于大多数情况。以下是一个使用Haversine公式的示例:
    1. public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
    2. double dLat = Math.toRadians(lat2 - lat1);
    3. double dLon = Math.toRadians(lon2 - lon1);
    4. lat1 = Math.toRadians(lat1);
    5. lat2 = Math.toRadians(lat2);
    6. double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    7. Math.cos(lat1) * Math.cos(lat2) *
    8. Math.sin(dLon / 2) * Math.sin(dLon / 2);
    9. double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    10. double distance = EARTH_RADIUS * c; // EARTH_RADIUS is the Earth radius in kilometers (6371km by default)
    11. return distance;
    12. }
  2. 使用Vincenty’s formulae:Vincenty’s formulae是一种更精确的计算两点之间距离的方法,适用于需要更高精度的应用。以下是一个使用Vincenty’s formulae的示例:
    ```java
    public static double calculateDistanceVincenty(double lat1, double lon1, double lat2, double lon2) {
    final int EARTH_RADIUS = 6371; // Earth radius in kilometers (by default)
    double a = 6086980; // major axis of Earth ellipsoid (in meters)
    double b = 6356300; // minor axis of Earth ellipsoid (in meters)
    double f = 1 / 298.257223563; // flattening of Earth ellipsoid
    double L = Math.toRadians(lon2 - lon1);
    double U1 = Math.atan((1 - f) Math.tan(Math.toRadians(lat1)));
    double U2 = Math.atan((1 - f)
    Math.tan(Math.toRadians(lat2)));
    double sinU1 = Math.sin(U1);
    double cosU1 = Math.cos(U1);
    double sinU2 = Math.sin(U2);
    double cosU2 = Math.cos(U2);
    double lambda = L;
    double lambdaP = 2 Math.PI;
    double sinSigma = 0;
    double cosSigma = 0;
    double sigma = 0;
    double cosSqAlpha = 0;
    double cos2SigmaM = 0;
    double C = f / 16384
    100000; // fictitious constant (arc seconds)
    int iterLimit = 100; // maximum number of iterations for Vincenty’s formulae
    while (Math.abs(lambda - lambdaP) > 1e-12 && —iterLimit > 0) {
    double sinLambda = Math.sin(lambda);
    double cosLambda = Math.cos(lambda);
    sinSigma = Math.sqrt((cosU2 sinLambda) (cosU2 sinLambda) +
    (cosU1
    sinU2 - sinU1 cosU2 cosLambda) (cosU1 sinU2 - sinU1 cosU2 cosLambda));
    if (sinSigma == 0) return 0; // co-incident points (infinity distance)
    cosSigma = sinU1 sinU2 + cosU1 cosU2 * cosLambda;
    sigma = Math.atan2(sinSigma, cosSigma); // calculate the arc length [rad] between two

相关文章推荐

发表评论