Example #1
0
        public void GeodSolve17()
        {
            // Check fix for LONG_UNROLL bug found on 2015-05-07
            GeodesicData dir =
                Geodesic.WGS84.Direct(40, -75, -10, 2e7,
                                      GeodesicMask.STANDARD | GeodesicMask.LONG_UNROLL);

            AssertEquals(dir.lat2, -39, 1);
            AssertEquals(dir.lon2, -254, 1);
            AssertEquals(dir.azi2, -170, 1);
            GeodesicLine line = Geodesic.WGS84.Line(40, -75, -10);

            dir = line.Position(2e7, GeodesicMask.STANDARD | GeodesicMask.LONG_UNROLL);
            AssertEquals(dir.lat2, -39, 1);
            AssertEquals(dir.lon2, -254, 1);
            AssertEquals(dir.azi2, -170, 1);
            dir = Geodesic.WGS84.Direct(40, -75, -10, 2e7);
            AssertEquals(dir.lat2, -39, 1);
            AssertEquals(dir.lon2, 105, 1);
            AssertEquals(dir.azi2, -170, 1);
            dir = line.Position(2e7);
            AssertEquals(dir.lat2, -39, 1);
            AssertEquals(dir.lon2, 105, 1);
            AssertEquals(dir.azi2, -170, 1);
        }
Example #2
0
        public void GeodSolve26()
        {
            // Check 0/0 problem with area calculation on sphere 2015-09-08
            Geodesic     geod = new Geodesic(6.4e6, 0);
            GeodesicData inv  = geod.Inverse(1, 2, 3, 4, GeodesicMask.AREA);

            AssertEquals(inv.S12, 49911046115.0, 0.5);
        }
Example #3
0
        public void GeodSolve4()
        {
            // Check fix for short line bug found 2010-05-21
            GeodesicData inv = Geodesic.WGS84.Inverse(36.493349428792, 0,
                                                      36.49334942879201, .0000008);

            AssertEquals(inv.s12, 0.072, 0.5e-3);
        }
Example #4
0
        public void GeodSolve1()
        {
            GeodesicData dir = Geodesic.WGS84.Direct(40.63972222, -73.77888889,
                                                     53.5, 5850e3);

            AssertEquals(dir.lat2, 49.01467, 0.5e-5);
            AssertEquals(dir.lon2, 2.56106, 0.5e-5);
            AssertEquals(dir.azi2, 111.62947, 0.5e-5);
        }
Example #5
0
        public void GeodSolve0()
        {
            GeodesicData inv = Geodesic.WGS84.Inverse(40.6, -73.8,
                                                      49.01666667, 2.55);

            AssertEquals(inv.azi1, 53.47022, 0.5e-5);
            AssertEquals(inv.azi2, 111.59367, 0.5e-5);
            AssertEquals(inv.s12, 5853226, 0.5);
        }
Example #6
0
        public void GeodSolve15()
        {
            // Initial implementation of Math::eatanhe was wrong for e^2 < 0.  This
            // checks that this is fixed.
            Geodesic     geod = new Geodesic(6.4e6, -1 / 150.0);
            GeodesicData dir  = geod.Direct(1, 2, 3, 4, GeodesicMask.AREA);

            AssertEquals(dir.S12, 23700, 0.5);
        }
Example #7
0
        public void GeodSolve78()
        {
            // An example where the NGS calculator fails to converge */
            GeodesicData inv = Geodesic.WGS84.Inverse(27.2, 0.0, -27.1, 179.5);

            AssertEquals(inv.azi1, 45.82468716758, 0.5e-11);
            AssertEquals(inv.azi2, 134.22776532670, 0.5e-11);
            AssertEquals(inv.s12, 19974354.765767, 0.5e-6);
        }
Example #8
0
        public void GeodSolve59()
        {
            // Check for points close with longitudes close to 180 deg apart.
            GeodesicData inv = Geodesic.WGS84.Inverse(5, 0.00000000000001, 10, 180);

            AssertEquals(inv.azi1, 0.000000000000035, 1.5e-14);
            AssertEquals(inv.azi2, 179.99999999999996, 1.5e-14);
            AssertEquals(inv.s12, 18345191.174332713, 4e-9);
        }
Example #9
0
        public void GeodSolve14()
        {
            // Check fix for inverse ignoring lon12 = nan
            GeodesicData inv = Geodesic.WGS84.Inverse(0, 0, 1, Double.NaN);

            Assert.True(IsNaN(inv.azi1));
            Assert.True(IsNaN(inv.azi2));
            Assert.True(IsNaN(inv.s12));
        }
Example #10
0
        public void GeodSolve9()
        {
            // Check fix for volatile x bug found 2011-06-25 (gcc 4.4.4 x86 -O3)
            GeodesicData inv =
                Geodesic.WGS84.Inverse(56.320923501171, 0,
                                       -56.320923501171, 179.664747671772880215);

            AssertEquals(inv.s12, 19993558.287, 0.5e-3);
        }
Example #11
0
        public void GeodSolve28()
        {
            // Check for bad placement of assignment of r.a12 with |f| > 0.01 (bug in
            // Java implementation fixed on 2015-05-19).
            Geodesic     geod = new Geodesic(6.4e6, 0.1);
            GeodesicData dir  = geod.Direct(1, 2, 10, 5e6);

            AssertEquals(dir.a12, 48.55570690, 0.5e-8);
        }
Example #12
0
        public void GeodSolve11()
        {
            // Check fix for bet2 = -bet1 bug found 2011-06-25 (Visual Studio
            // 10 rel + debug)
            GeodesicData inv =
                Geodesic.WGS84.Inverse(48.522876735459, 0,
                                       -48.52287673545898293, 179.599720456223079643);

            AssertEquals(inv.s12, 19989144.774, 0.5e-3);
        }
Example #13
0
        public void GeodSolve10()
        {
            // Check fix for adjust tol1_ bug found 2011-06-25 (Visual Studio
            // 10 rel + debug)
            GeodesicData inv =
                Geodesic.WGS84.Inverse(52.784459512564, 0,
                                       -52.784459512563990912, 179.634407464943777557);

            AssertEquals(inv.s12, 19991596.095, 0.5e-3);
        }
Example #14
0
        public void GeodSolve73()
        {
            // Check for backwards from the pole bug reported by Anon on 2016-02-13.
            // This only affected the Java implementation.  It was introduced in Java
            // version 1.44 and fixed in 1.46-SNAPSHOT on 2016-01-17.
            GeodesicData dir = Geodesic.WGS84.Direct(90, 10, 180, -1e6);

            AssertEquals(dir.lat2, 81.04623, 0.5e-5);
            AssertEquals(dir.lon2, -170, 0.5e-5);
            AssertEquals(dir.azi2, 0, 0.5e-5);
        }
Example #15
0
        public void GeodSolve76()
        {
            // The distance from Wellington and Salamanca (a classic failure of
            // Vincenty)
            GeodesicData inv = Geodesic.WGS84.Inverse(-(41 + 19 / 60.0), 174 + 49 / 60.0,
                                                      40 + 58 / 60.0, -(5 + 30 / 60.0));

            AssertEquals(inv.azi1, 160.39137649664, 0.5e-11);
            AssertEquals(inv.azi2, 19.50042925176, 0.5e-11);
            AssertEquals(inv.s12, 19960543.857179, 0.5e-6);
        }
Example #16
0
        public void GeodSolve33()
        {
            // Check max(-0.0,+0.0) issues 2015-08-22 (triggered by bugs in Octave --
            // sind(-0.0) = +0.0 -- and in some version of Visual Studio --
            // fmod(-0.0, 360.0) = +0.0.
            GeodesicData inv = Geodesic.WGS84.Inverse(0, 0, 0, 179);

            AssertEquals(inv.azi1, 90.00000, 0.5e-5);
            AssertEquals(inv.azi2, 90.00000, 0.5e-5);
            AssertEquals(inv.s12, 19926189, 0.5);
            inv = Geodesic.WGS84.Inverse(0, 0, 0, 179.5);
            AssertEquals(inv.azi1, 55.96650, 0.5e-5);
            AssertEquals(inv.azi2, 124.03350, 0.5e-5);
            AssertEquals(inv.s12, 19980862, 0.5);
            inv = Geodesic.WGS84.Inverse(0, 0, 0, 180);
            AssertEquals(inv.azi1, 0.00000, 0.5e-5);
            AssertEquals(Math.Abs(inv.azi2), 180.00000, 0.5e-5);
            AssertEquals(inv.s12, 20003931, 0.5);
            inv = Geodesic.WGS84.Inverse(0, 0, 1, 180);
            AssertEquals(inv.azi1, 0.00000, 0.5e-5);
            AssertEquals(Math.Abs(inv.azi2), 180.00000, 0.5e-5);
            AssertEquals(inv.s12, 19893357, 0.5);
            Geodesic geod = new Geodesic(6.4e6, 0);

            inv = geod.Inverse(0, 0, 0, 179);
            AssertEquals(inv.azi1, 90.00000, 0.5e-5);
            AssertEquals(inv.azi2, 90.00000, 0.5e-5);
            AssertEquals(inv.s12, 19994492, 0.5);
            inv = geod.Inverse(0, 0, 0, 180);
            AssertEquals(inv.azi1, 0.00000, 0.5e-5);
            AssertEquals(Math.Abs(inv.azi2), 180.00000, 0.5e-5);
            AssertEquals(inv.s12, 20106193, 0.5);
            inv = geod.Inverse(0, 0, 1, 180);
            AssertEquals(inv.azi1, 0.00000, 0.5e-5);
            AssertEquals(Math.Abs(inv.azi2), 180.00000, 0.5e-5);
            AssertEquals(inv.s12, 19994492, 0.5);
            geod = new Geodesic(6.4e6, -1 / 300.0);
            inv  = geod.Inverse(0, 0, 0, 179);
            AssertEquals(inv.azi1, 90.00000, 0.5e-5);
            AssertEquals(inv.azi2, 90.00000, 0.5e-5);
            AssertEquals(inv.s12, 19994492, 0.5);
            inv = geod.Inverse(0, 0, 0, 180);
            AssertEquals(inv.azi1, 90.00000, 0.5e-5);
            AssertEquals(inv.azi2, 90.00000, 0.5e-5);
            AssertEquals(inv.s12, 20106193, 0.5);
            inv = geod.Inverse(0, 0, 0.5, 180);
            AssertEquals(inv.azi1, 33.02493, 0.5e-5);
            AssertEquals(inv.azi2, 146.97364, 0.5e-5);
            AssertEquals(inv.s12, 20082617, 0.5);
            inv = geod.Inverse(0, 0, 1, 180);
            AssertEquals(inv.azi1, 0.00000, 0.5e-5);
            AssertEquals(Math.Abs(inv.azi2), 180.00000, 0.5e-5);
            AssertEquals(inv.s12, 20027270, 0.5);
        }
Example #17
0
        public void GeodSolve71()
        {
            // Check that DirectLine sets s13.
            GeodesicLine line = Geodesic.WGS84.DirectLine(1, 2, 45, 1e7);
            GeodesicData dir  =
                line.Position(0.5 * line.Distance(),
                              GeodesicMask.STANDARD | GeodesicMask.LONG_UNROLL);

            AssertEquals(dir.lat2, 30.92625, 0.5e-5);
            AssertEquals(dir.lon2, 37.54640, 0.5e-5);
            AssertEquals(dir.azi2, 55.43104, 0.5e-5);
        }
Example #18
0
        public void GeodSolve12()
        {
            // Check fix for inverse geodesics on extreme prolate/oblate
            // ellipsoids Reported 2012-08-29 Stefan Guenther
            // <*****@*****.**>; fixed 2012-10-07
            Geodesic     geod = new Geodesic(89.8, -1.83);
            GeodesicData inv  = geod.Inverse(0, 0, -10, 160);

            AssertEquals(inv.azi1, 120.27, 1e-2);
            AssertEquals(inv.azi2, 105.15, 1e-2);
            AssertEquals(inv.s12, 266.7, 1e-1);
        }
Example #19
0
        public void JFKToCANShouldPass()
        {
            Pair         jfk = new Pair(40.639801, -73.7789002);
            Pair         can = new Pair(23.3924007, 113.2990036);
            GeodesicData g   = Geodesic.WGS84.Inverse(jfk.First, jfk.Second, can.First, can.Second, GeodesicMask.ALL);

            Assert.NotNull(g);

            double expectedDistance = 12877.8358;
            double actualDistance   = g.Distance / 1000.0;

            Assert.True(Math.Abs(actualDistance - expectedDistance) <= 0.0001);
        }
Example #20
0
        public void GeodSolve2()
        {
            // Check fix for antipodal prolate bug found 2010-09-04
            Geodesic     geod = new Geodesic(6.4e6, -1 / 150.0);
            GeodesicData inv  = geod.Inverse(0.07476, 0, -0.07476, 180);

            AssertEquals(inv.azi1, 90.00078, 0.5e-5);
            AssertEquals(inv.azi2, 90.00078, 0.5e-5);
            AssertEquals(inv.s12, 20106193, 0.5);
            inv = geod.Inverse(0.1, 0, -0.1, 180);
            AssertEquals(inv.azi1, 90.00105, 0.5e-5);
            AssertEquals(inv.azi2, 90.00105, 0.5e-5);
            AssertEquals(inv.s12, 20106193, 0.5);
        }
Example #21
0
        public void GeodSolve55()
        {
            // Check fix for nan + point on equator or pole not returning all nans in
            // Geodesic::Inverse, found 2015-09-23.
            GeodesicData inv = Geodesic.WGS84.Inverse(Double.NaN, 0, 0, 90);

            Assert.True(IsNaN(inv.azi1));
            Assert.True(IsNaN(inv.azi2));
            Assert.True(IsNaN(inv.s12));
            inv = Geodesic.WGS84.Inverse(Double.NaN, 0, 90, 3);
            Assert.True(IsNaN(inv.azi1));
            Assert.True(IsNaN(inv.azi2));
            Assert.True(IsNaN(inv.s12));
        }
Example #22
0
        public void GeodSolve29()
        {
            // Check longitude unrolling with inverse calculation 2015-09-16
            GeodesicData dir = Geodesic.WGS84.Inverse(0, 539, 0, 181);

            AssertEquals(dir.lon1, 179, 1e-10);
            AssertEquals(dir.lon2, -179, 1e-10);
            AssertEquals(dir.s12, 222639, 0.5);
            dir = Geodesic.WGS84.Inverse(0, 539, 0, 181,
                                         GeodesicMask.STANDARD |
                                         GeodesicMask.LONG_UNROLL);
            AssertEquals(dir.lon1, 539, 1e-10);
            AssertEquals(dir.lon2, 541, 1e-10);
            AssertEquals(dir.s12, 222639, 0.5);
        }
Example #23
0
        public void GeodSolve6()
        {
            // Check fix for volatile sbet12a bug found 2011-06-25 (gcc 4.4.4
            // x86 -O3).  Found again on 2012-03-27 with tdm-mingw32 (g++ 4.6.1).
            GeodesicData inv =
                Geodesic.WGS84.Inverse(88.202499451857, 0,
                                       -88.202499451857, 179.981022032992859592);

            AssertEquals(inv.s12, 20003898.214, 0.5e-3);
            inv = Geodesic.WGS84.Inverse(89.262080389218, 0,
                                         -89.262080389218, 179.992207982775375662);
            AssertEquals(inv.s12, 20003925.854, 0.5e-3);
            inv = Geodesic.WGS84.Inverse(89.333123580033, 0, -89.333123580032997687,
                                         179.99295812360148422);
            AssertEquals(inv.s12, 20003926.881, 0.5e-3);
        }
Example #24
0
        public void TestJFKToLHR()
        {
            Pair         jfk = new Pair(40.639801, -73.7789002);
            Pair         lhr = new Pair(51.4706001, -0.461941);
            GeodesicData g   = Geodesic.WGS84.Inverse(jfk.First, jfk.Second, lhr.First, lhr.Second, GeodesicMask.ALL);

            Assert.IsNotNull(g);
            double expectedDistance = 5554.539; //in kilometers
            double actualDistance   = g.Distance / 1000.0;

            Assert.IsTrue(Math.Abs(actualDistance - expectedDistance) <= 0.001);

            double expectedInitialCourse = 51.38;
            double actualInitialCourse   = g.InitialAzimuth;

            Assert.IsTrue(Math.Abs(actualInitialCourse - expectedInitialCourse) <= 0.01);
        }
Example #25
0
        public void GeodSolve74()
        {
            // Check fix for inaccurate areas, bug introduced in v1.46, fixed
            // 2015-10-16.
            GeodesicData inv = Geodesic.WGS84.Inverse(54.1589, 15.3872,
                                                      54.1591, 15.3877,
                                                      GeodesicMask.ALL);

            AssertEquals(inv.azi1, 55.723110355, 5e-9);
            AssertEquals(inv.azi2, 55.723515675, 5e-9);
            AssertEquals(inv.s12, 39.527686385, 5e-9);
            AssertEquals(inv.a12, 0.000355495, 5e-9);
            AssertEquals(inv.m12, 39.527686385, 5e-9);
            AssertEquals(inv.M12, 0.999999995, 5e-9);
            AssertEquals(inv.M21, 0.999999995, 5e-9);
            AssertEquals(inv.S12, 286698586.30197, 5e-4);
        }
Example #26
0
        public void GeodSolve5()
        {
            // Check fix for point2=pole bug found 2010-05-03
            GeodesicData dir = Geodesic.WGS84.Direct(0.01777745589997, 30, 0, 10e6);

            AssertEquals(dir.lat2, 90, 0.5e-5);
            if (dir.lon2 < 0)
            {
                AssertEquals(dir.lon2, -150, 0.5e-5);
                AssertEquals(Math.Abs(dir.azi2), 180, 0.5e-5);
            }
            else
            {
                AssertEquals(dir.lon2, 30, 0.5e-5);
                AssertEquals(dir.azi2, 0, 0.5e-5);
            }
        }
Example #27
0
 /**
  * Solve the direct geodesic problem.
  *
  * This program reads in lines with lat1, lon1, azi1, s12 and prints out lines
  * with lat2, lon2, azi2 (for the WGS84 ellipsoid).
  **********************************************************************/
 public static void main(String[] args)
 {
     try
     {
         var    inp = (from arg in args select double.Parse(arg)).GetEnumerator();
         double lat1, lon1, azi1, s12;
         while (inp.MoveNext())
         {
             lat1 = inp.Current; inp.MoveNext();
             lon1 = inp.Current; inp.MoveNext();
             azi1 = inp.Current; inp.MoveNext();
             s12  = inp.Current;
             GeodesicData g = Geodesic.WGS84.Direct(lat1, lon1, azi1, s12);
             Console.WriteLine(g.lat2 + " " + g.lon2 + " " + g.azi2);
         }
     }
     catch (Exception e) { }
 }
Example #28
0
        public void GeodSolve69()
        {
            // Check for InverseLine if line is slightly west of S and that s13 is
            // correctly set.
            GeodesicLine line =
                Geodesic.WGS84.InverseLine(-5, -0.000000000000002, -10, 180);
            GeodesicData dir =
                line.Position(2e7, GeodesicMask.STANDARD | GeodesicMask.LONG_UNROLL);

            AssertEquals(dir.lat2, 4.96445, 0.5e-5);
            AssertEquals(dir.lon2, -180.00000, 0.5e-5);
            AssertEquals(dir.azi2, -0.00000, 0.5e-5);
            dir = line.Position(0.5 * line.Distance(),
                                GeodesicMask.STANDARD | GeodesicMask.LONG_UNROLL);
            AssertEquals(dir.lat2, -87.52461, 0.5e-5);
            AssertEquals(dir.lon2, -0.00000, 0.5e-5);
            AssertEquals(dir.azi2, -180.00000, 0.5e-5);
        }
Example #29
0
        public void GeodSolve61()
        {
            // Make sure small negative azimuths are west-going
            GeodesicData dir =
                Geodesic.WGS84.Direct(45, 0, -0.000000000000000003, 1e7,
                                      GeodesicMask.STANDARD | GeodesicMask.LONG_UNROLL);

            AssertEquals(dir.lat2, 45.30632, 0.5e-5);
            AssertEquals(dir.lon2, -180, 0.5e-5);
            AssertEquals(Math.Abs(dir.azi2), 180, 0.5e-5);
            GeodesicLine line = Geodesic.WGS84.InverseLine(45, 0, 80,
                                                           -0.000000000000000003);

            dir = line.Position(1e7, GeodesicMask.STANDARD | GeodesicMask.LONG_UNROLL);
            AssertEquals(dir.lat2, 45.30632, 0.5e-5);
            AssertEquals(dir.lon2, -180, 0.5e-5);
            AssertEquals(Math.Abs(dir.azi2), 180, 0.5e-5);
        }
Example #30
0
 public void ArcDirectCheck()
 {
     for (int i = 0; i < testcases.Length; ++i)
     {
         double
             lat1 = testcases[i][0], lon1 = testcases[i][1], azi1 = testcases[i][2],
             lat2 = testcases[i][3], lon2 = testcases[i][4], azi2 = testcases[i][5],
             s12 = testcases[i][6], a12 = testcases[i][7], m12 = testcases[i][8],
             M12 = testcases[i][9], M21 = testcases[i][10], S12 = testcases[i][11];
         GeodesicData dir = Geodesic.WGS84.ArcDirect(lat1, lon1, azi1, a12,
                                                     GeodesicMask.ALL |
                                                     GeodesicMask.LONG_UNROLL);
         AssertEquals(lat2, dir.lat2, 1e-13);
         AssertEquals(lon2, dir.lon2, 1e-13);
         AssertEquals(azi2, dir.azi2, 1e-13);
         AssertEquals(s12, dir.s12, 1e-8);
         AssertEquals(m12, dir.m12, 1e-8);
         AssertEquals(M12, dir.M12, 1e-15);
         AssertEquals(M21, dir.M21, 1e-15);
         AssertEquals(S12, dir.S12, 0.1);
     }
 }