Ejemplo n.º 1
0
        public void DegreesTest()
        {
            const int precision = 9;             // decimal digits

            Assert.Equal(180.0, Geodesy.Degrees(Math.PI), precision);
            Assert.Equal(-360.0, Geodesy.Degrees(-2.0 * Math.PI), precision);
        }
Ejemplo n.º 2
0
        public void WrapLatLonTest()
        {
            double lat = 0;
            double lon = 0;

            Geodesy.WrapLatLon(ref lat, ref lon);
            Assert.Equal(0.0, lat);
            Assert.Equal(0.0, lon);

            lat = 45;
            lon = 60;
            Geodesy.WrapLatLon(ref lat, ref lon);
            Assert.Equal(45.0, lat);
            Assert.Equal(60.0, lon);

            lat = 91;
            lon = 8;
            Geodesy.WrapLatLon(ref lat, ref lon);
            Assert.Equal(89.0, lat);
            Assert.Equal(-172.0, lon);

            lat = -181;
            lon = 12;
            Geodesy.WrapLatLon(ref lat, ref lon);
            Assert.Equal(1.0, lat);
            Assert.Equal(-168.0, lon);

            lat = 271;
            lon = 736;
            Geodesy.WrapLatLon(ref lat, ref lon);
            Assert.Equal(-89.0, lat);
            Assert.Equal(16.0, lon);
        }
Ejemplo n.º 3
0
        public void RadiansTest()
        {
            const int precision = 9;             // decimal digits

            Assert.Equal(Math.PI, Geodesy.Radians(180), precision);
            Assert.Equal(-2.0 * Math.PI, Geodesy.Radians(-360), precision);
        }
Ejemplo n.º 4
0
        public void HaversineSortKeyTest()
        {
            // Mathematically, HavMeters(HavSortKey(dist))==dist,
            // but we are faced with roundoff errors:

            const int precision = 9;             // decimal digits

            double s1 = Geodesy.HaversineSortKey(1234);
            double d1 = Geodesy.HaversineMeters(s1);

            Assert.Equal(1234, d1, precision);

            double s2 = Geodesy.HaversineSortKey(50);
            double d2 = Geodesy.HaversineMeters(s2);

            Assert.Equal(50, d2, precision);

            double s3 = Geodesy.HaversineSortKey(10 * 1000 * 1000);
            double d3 = Geodesy.HaversineMeters(s3);

            Assert.Equal(10 * 1000 * 1000, d3, precision);

            // Odessa
            const double lat5 = 46.46834;
            const double lon5 = 30.74066;
            // Istanbul
            const double lat6 = 41.03699;
            const double lon6 = 28.98509;

            double s56 = Geodesy.HaversineSortKey(lat5, lon5, lat6, lon6);
            double d56 = Geodesy.HaversineMeters(s56);

            Assert.Equal(620100, d56, Delta(500));
        }
Ejemplo n.º 5
0
 public void ClipLatitudeTest()
 {
     Assert.Equal(89.999999, Geodesy.ClipLatitude(89.999999));
     Assert.Equal(90.0, Geodesy.ClipLatitude(90.001));
     Assert.Equal(-89.999999, Geodesy.ClipLatitude(-89.999999));
     Assert.Equal(-90.0, Geodesy.ClipLatitude(-90.001));
 }
Ejemplo n.º 6
0
        public void HaversineDistanceAcross180()
        {
            const double lat1 = 60.0;
            const double lat2 = lat1;
            const double lon1 = 179.0;
            const double lon2 = -179.0;

            // expected distance on spherical Earth: dL * R * cos P
            double dLa = Geodesy.Radians(2.0);
            double phi = Geodesy.Radians(lat1);
            double e12 = dLa * Geodesy.EarthMeanRadiusMeters * Math.Cos(phi);
            double d12 = Geodesy.HaversineMeters(lat1, lon1, lat2, lon2);

            Assert.Equal(e12, d12, Delta(100));

            // Anadyr, 177 E
            const double lat3 = 64.0 + 44.0 / 60;
            const double lon3 = 177.0 + 31.0 / 60;
            // Egwekinot, 179 W
            const double lat4 = 66.0 + 20.0 / 60;
            const double lon4 = -179.0 - 7.0 / 60;

            double       d34 = Geodesy.HaversineMeters(lat3, lon3, lat4, lon4);
            const double e34 = 235000;

            Assert.Equal(e34, d34, Delta(1000));
        }
Ejemplo n.º 7
0
        public void EquirectangularDistanceTest()
        {
            // This is an approximation for short distances only!
            // So here's a short distance:

            const double lat1 = 47.394232;
            const double lon1 = 8.527658;
            const double lat2 = 47.387515;
            const double lon2 = 8.522760;

            double s12 = Geodesy.EquirectangularSquared(lat1, lon1, lat2, lon2);
            double d12 = Geodesy.EquirectangularMeters(s12);

            Assert.Equal(833.0, d12, Delta(833.0 * 0.01));

            Assert.Equal(833.0, Geodesy.EquirectangularMeters(lat1, lon1, lat2, lon2), Delta(833.0 * 0.1));

            const double lat5 = 48.137457;
            const double lon5 = 11.575532;
            const double lat6 = 48.137020;
            const double lon6 = 11.575331;

            double s56 = Geodesy.EquirectangularSquared(lat5, lon5, lat6, lon6);
            double d56 = Geodesy.EquirectangularMeters(s56);

            Assert.Equal(51.0, d56, Delta(51.0 * 0.01));
        }
Ejemplo n.º 8
0
            protected override bool Priority(Node a, Node b)
            {
                var pa = a.Point;
                var pb = b.Point;

                var ha = Geodesy.HaversineSortKey(_center.Y, _center.X, pa.Y, pa.X);
                var hb = Geodesy.HaversineSortKey(_center.Y, _center.X, pb.Y, pb.X);

                return(ha >= hb);
            }
Ejemplo n.º 9
0
            public override void AddNode(Node node)
            {
                var    p = node.Point;
                double h = Geodesy.HaversineSortKey(_center.Y, _center.X, p.Y, p.X);

                if (h <= _maxH)
                {
                    AddWithOverflow(node);
                }
                // else: inside search box but outside circle!
            }
Ejemplo n.º 10
0
        public void WrapLongitudeTest()
        {
            Assert.Equal(180.0, Geodesy.WrapLongitude(180.0));
            Assert.Equal(179.999999, Geodesy.WrapLongitude(179.999999));
            Assert.Equal(-179.999999, Geodesy.WrapLongitude(-179.999999));
            Assert.Equal(-180.0, Geodesy.WrapLongitude(-180.0));

            Assert.Equal(-170.0, Geodesy.WrapLongitude(190.0));
            Assert.Equal(179.999, Geodesy.WrapLongitude(-540.001), 7);
            Assert.Equal(89.0, Geodesy.WrapLongitude(-631.0));
        }
Ejemplo n.º 11
0
        public void DegMinSecTest()
        {
            double dec = Geodesy.ToDegrees(47, 20, 35);

            Geodesy.ToDegMinSec(dec, out var deg, out var min, out var sec);

            const int precision = 9;             // decimal digits

            Assert.Equal(47.0, deg, precision);
            Assert.Equal(20.0, min, precision);
            Assert.Equal(35.0, sec, precision);
        }
Ejemplo n.º 12
0
        public void HaversineDistanceAcrossPole()
        {
            const double lat1 = 45.0;
            const double lon1 = 90.0;
            const double lat2 = 45.0;
            const double lon2 = -90.0;

            double d12 = Geodesy.HaversineMeters(lat1, lon1, lat2, lon2);

            // On a spherical Earth, expect 1/4 of the circumpherence:
            double e12 = Geodesy.EarthMeanRadiusMeters * Math.PI / 2;

            Assert.Equal(e12, d12, Delta(100));
        }
Ejemplo n.º 13
0
        public void Elite_JsonStatus(object sender, Status e)
        {
            if (e.HasLatLong == true)
            {
                HeadingValue.Text        = e.Heading.ToString("F1");
                AltitudeVale.Text        = e.Altitude.ToString("F1");
                over.HeadingValule.Text  = e.Heading.ToString("F1");
                over.AltitudeValule.Text = e.Altitude.ToString("F1");

                Points.Add(LaTLongPoints(e.Latiude, e.Longitude));
                Time.Add(e.Timestamp);
                if (Points.Count < 1)
                {
                    Points.Add(LaTLongPoints(e.Latiude, e.Longitude));
                    Time.Add(e.Timestamp);
                }
                if (Points.Count == 2)
                {
                    double Dist = Geodesy.Distance(Points[0], Points[1], e.PlanetRadius);

                    double speed = Dist / Ponttimes(Time).TotalSeconds;

                    SpeedValule.Text     = Math.Abs(speed).ToString("F1");
                    over.SpeedValue.Text = Math.Abs(speed).ToString("F1");
                    Time.Clear();
                    Points.Clear();
                    Time.Add(e.Timestamp);
                    Points.Add(LaTLongPoints(e.Latiude, e.Longitude));
                }
            }
            if (e.HasLatLong == false)
            {
                HeadingValue.Text        = "In space";
                AltitudeVale.Text        = "In space";
                SpeedValule.Text         = "In space";
                over.SpeedValue.Text     = "In space";
                over.HeadingValule.Text  = "In space";
                over.AltitudeValule.Text = "In space";
                Points.Clear();
            }
        }
Ejemplo n.º 14
0
        public void HaversineDistanceTest()
        {
            // Short distance: within Zurich

            const double lat1 = 47.394232;
            const double lon1 = 8.527658;
            const double lat2 = 47.387515;
            const double lon2 = 8.522760;

            double d12 = Geodesy.HaversineMeters(lat1, lon1, lat2, lon2);

            Assert.Equal(833.0, d12, Delta(0.1));

            // Long distance: Esri Redlands .. Statue of Liberty New York

            const double lat3 = 34.056495;
            const double lon3 = -117.195699;
            const double lat4 = 40.689246;
            const double lon4 = -74.044540;

            double d34 = Geodesy.HaversineMeters(lat3, lon3, lat4, lon4);

            Assert.Equal(3848590.0, d34, Delta(4400));

            // Very short distance: across Marienplatz München

            const double lat5 = 48.137457;
            const double lon5 = 11.575532;
            const double lat6 = 48.137020;
            const double lon6 = 11.575331;

            double d56 = Geodesy.HaversineMeters(lat5, lon5, lat6, lon6);

            Assert.Equal(51.0, d56, Delta(0.2));

            // Note: perfect accuracy is not necessary for our purposes,
            // because we compare haversine distances against each other,
            // not against real-world distances.
        }
Ejemplo n.º 15
0
        public void PointRadiusBoxTest()
        {
            double west, south, east, north;

            const double minuteMeters = Geodesy.EarthMeanRadiusMeters * Math.PI / 180.0;

            Geodesy.PointRadiusBox(0.0, 0.0, minuteMeters, out west, out south, out east, out north);
            Assert.Equal(-1.0, west, Delta(0.000001));
            Assert.Equal(-1.0, south, Delta(0.000001));
            Assert.Equal(1.0, east, Delta(0.000001));
            Assert.Equal(1.0, north, Delta(0.000001));

            // Bern
            Geodesy.PointRadiusBox(46.94798, 7.44743, 500, out west, out south, out east, out north);
            Assert.Equal(7.44085, west, Delta(0.00001));
            Assert.Equal(46.94348, south, Delta(0.00001));
            Assert.Equal(7.45401, east, Delta(0.00001));
            Assert.Equal(46.95247, north, Delta(0.00001));

            // This circle contains north pole:
            Geodesy.PointRadiusBox(80.0, 0.0, 1200 * 1000, out west, out south, out east, out north);
            Assert.Equal(-180.0, west);
            Assert.Equal(180.0, east);
            Assert.Equal(90.0, north);
            Assert.Equal(69, south, Delta(1));

            // 200km around Anadyr: across date line, but still far from north pole
            Geodesy.PointRadiusBox(64.727638, 177.517991, 200 * 1000, out west, out _, out east, out north);
            Assert.True(west > east);             // across date line
            Assert.True(north < 90.0);

            // 11'000 km around Rwanda: both poles included => box is whole earth
            Geodesy.PointRadiusBox(-2.0, 30.0, 11 * 1000 * 1000, out west, out south, out east, out north);
            Assert.True(west <= -180 && south <= -90 && east >= 180 && north >= 90);
            Assert.False(west > east);             // not across date line
        }
Ejemplo n.º 16
0
        private static List <double> LaTLongPoints(double Latiude, double Longitude)
        {
            List <double> points = Geodesy.Vectores(Latiude, Longitude);

            return(points);
        }
Ejemplo n.º 17
0
 public NearestPointsGeo(Point center, double distanceMeters, int capacity)
     : base(capacity)
 {
     _center = center;
     _maxH   = Geodesy.HaversineSortKey(distanceMeters);
 }