LCOV - code coverage report
Current view: top level - great_circle_distance-0.0.6/lib/src/formula - vincenty.dart (source / functions) Hit Total Coverage
Test: coverage.lcov Lines: 50 50 100.0 %
Date: 2017-10-10 20:17:03 Functions: 0 0 -

          Line data    Source code
       1             : import 'dart:math';
       2             : 
       3             : class Vincenty {
       4             :     static double distance(double lat1, lon1, lat2, lon2) {
       5             :         // Port from the existing Android version in method: computeDistanceAndBearing
       6             :         // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/location/java/android/location/Location.java
       7             : 
       8             :         // Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
       9             :         // using the "Inverse Formula" (section 4)
      10             :         int MAXITERS = 20;
      11             : 
      12             :         double a = 6378137.0; // WGS84 major axis
      13             :         double b = 6356752.3142; // WGS84 semi-major axis
      14           4 :         double f = (a - b) / a;
      15          10 :         double aSqMinusBSqOverBSq = (a * a - b * b) / (b * b);
      16           2 :         double L = lon2 - lon1;
      17             :         double A = 0.0;
      18           8 :         double U1 = atan((1.0 - f) * tan(lat1));
      19           8 :         double U2 = atan((1.0 - f) * tan(lat2));
      20           2 :         double cosU1 = cos(U1);
      21           2 :         double cosU2 = cos(U2);
      22           2 :         double sinU1 = sin(U1);
      23           2 :         double sinU2 = sin(U2);
      24           2 :         double cosU1cosU2 = cosU1 * cosU2;
      25           2 :         double sinU1sinU2 = sinU1 * sinU2;
      26             :         double sigma = 0.0;
      27             :         double deltaSigma = 0.0;
      28             :         double cosSqAlpha = 0.0;
      29             :         double cos2SM = 0.0;
      30             :         double cosSigma = 0.0;
      31             :         double sinSigma = 0.0;
      32             :         double cosLambda = 0.0;
      33             :         double sinLambda = 0.0;
      34             :         double lambda = L; // initial guess
      35           4 :         for (int iter = 0; iter < MAXITERS; iter++) {
      36             :             double lambdaOrig = lambda;
      37           2 :             cosLambda = cos(lambda);
      38           2 :             sinLambda = sin(lambda);
      39           2 :             double t1 = cosU2 * sinLambda;
      40           8 :             double t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;
      41           6 :             double sinSqSigma = t1 * t1 + t2 * t2; // (14)
      42           2 :             sinSigma = sqrt(sinSqSigma);
      43           4 :             cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda; // (15)
      44           2 :             sigma = atan2(sinSigma, cosSigma); // (16)
      45           2 :             double sinAlpha = (sinSigma == 0) ? 0.0 :
      46           4 :             cosU1cosU2 * sinLambda / sinSigma; // (17)
      47           4 :             cosSqAlpha = 1.0 - sinAlpha * sinAlpha;
      48           2 :             cos2SM = (cosSqAlpha == 0) ? 0.0 :
      49           6 :             cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha; // (18)
      50           2 :             double uSquared = cosSqAlpha * aSqMinusBSqOverBSq; // defn
      51           6 :             A = 1 + (uSquared / 16384.0) * // (3)
      52           4 :                 (4096.0 + uSquared *
      53           8 :                     (-768 + uSquared * (320.0 - 175.0 * uSquared)));
      54           4 :             double B = (uSquared / 1024.0) * // (4)
      55           4 :                 (256.0 + uSquared *
      56           8 :                     (-128.0 + uSquared * (74.0 - 47.0 * uSquared)));
      57           4 :             double C = (f / 16.0) *
      58           2 :                 cosSqAlpha *
      59           8 :                 (4.0 + f * (4.0 - 3.0 * cosSqAlpha)); // (10)
      60           2 :             double cos2SMSq = cos2SM * cos2SM;
      61           4 :             deltaSigma = B * sinSigma * // (6)
      62           6 :                 (cos2SM + (B / 4.0) *
      63           8 :                     (cosSigma * (-1.0 + 2.0 * cos2SMSq) -
      64           6 :                         (B / 6.0) * cos2SM *
      65           8 :                             (-3.0 + 4.0 * sinSigma * sinSigma) *
      66           4 :                             (-3.0 + 4.0 * cos2SMSq)));
      67           2 :             lambda = L +
      68           8 :                 (1.0 - C) * f * sinAlpha *
      69           6 :                     (sigma + C * sinSigma *
      70           6 :                         (cos2SM + C * cosSigma *
      71           6 :                             (-1.0 + 2.0 * cos2SM * cos2SM))); // (11)
      72           4 :             double delta = (lambda - lambdaOrig) / lambda;
      73           4 :             if (delta.abs() < 1.0e-12) {
      74             :                 break;
      75             :             }
      76             :         }
      77           6 :         double distance = (b * A * (sigma - deltaSigma));
      78             :         return distance;
      79             :     }
      80             : }

Generated by: LCOV version 1.13