public void GeoDistance_BetweenPoints()
        {
            GeoPosition a = new GeoPosition(12.34, 56.78);
            GeoPosition b = new GeoPosition(43.21, 87.65);

            GeoDistance g = GeoDistance.BetweenPoints(a, b);

            Assert.AreEqual(4532161, Math.Round(g.Meters, 0));
        }
        public void GeoDistance_BetweenMultiplePoints()
        {
            List <GeoPosition> p = new List <GeoPosition>();

            p.Add(new GeoPosition(0.0, 0.0));
            p.Add(new GeoPosition(12.34, 56.78));
            p.Add(new GeoPosition(43.21, 87.65));

            GeoDistance g = GeoDistance.BetweenPoints(p);

            Assert.AreEqual(6409572 + 4532161, Math.Round(g.Meters, 0));
        }
        public static TopoStats FromTracks(IEnumerable <ITopoTrackInfo> tracks)
        {
            var stats = new TopoStats();

            if ((tracks?.Count() ?? 0) == 0)
            {
                return(stats);
            }

            var points   = 0;
            var hours    = 0.0;
            var ascent   = 0.0;
            var descent  = 0.0;
            var distance = 0.0;
            var distanceWithElevation = 0.0;
            var start  = DateTime.MaxValue;
            var finish = DateTime.MinValue;

            foreach (var track in tracks)
            {
                points   += track.TopoPoints.Count();
                hours    += track.FinishUTC.Subtract(track.StartUTC).TotalHours;
                ascent   += GeoDistance.ElevationBetweenPoints(track.TopoPoints, 1).Meters;
                descent  += GeoDistance.ElevationBetweenPoints(track.TopoPoints, -1).Meters;
                distance += GeoDistance.BetweenPoints(track.TopoPoints, true).Meters;
                distanceWithElevation += GeoDistance.BetweenPoints(track.TopoPoints, true).Meters;
                if (track.TopoPoints.First().LocalTime < start)
                {
                    start = track.TopoPoints.First().LocalTime;
                }
                if (track.TopoPoints.Last().LocalTime > finish)
                {
                    finish = track.TopoPoints.Last().LocalTime;
                }
            }

            if (points == 0)
            {
                return(stats);
            }

            stats.ElapsedTime            = TimeSpan.FromHours(hours);
            stats.Distance               = GeoDistance.FromMeters(distance);
            stats.DistanceWithElevation  = GeoDistance.FromMeters(distanceWithElevation);
            stats.EstimatedMetersAscent  = ascent;
            stats.EstimatedMetersDescent = descent;
            stats.SecondsBetweenPoints   = (hours * 60 * 60) / points;
            stats.PointCount             = points;
            stats.DayCount               = (finish.DayOfYear - start.DayOfYear) + 1;

            return(stats);
        }
        public static TopoStats FromTrack(ITopoTrackInfo track)
        {
            var stats = new TopoStats();

            if (track == null || track.TopoPoints.Count() == 0)
            {
                return(stats);
            }

            stats.ElapsedTime            = track.FinishUTC.Subtract(track.StartUTC);
            stats.Distance               = GeoDistance.BetweenPoints(track.TopoPoints, true);
            stats.DistanceWithElevation  = GeoDistance.BetweenPoints(track.TopoPoints, true);
            stats.EstimatedMetersAscent  = GeoDistance.ElevationBetweenPoints(track.TopoPoints, 1).Meters;
            stats.EstimatedMetersDescent = GeoDistance.ElevationBetweenPoints(track.TopoPoints, -1).Meters;
            stats.SecondsBetweenPoints   = stats.ElapsedTime.TotalSeconds / track.TopoPoints.Count();
            stats.PointCount             = track.TopoPoints.Count();
            stats.DayCount               = track.FinishLocal.DayOfYear - track.StartLocal.DayOfYear;

            return(stats);
        }
Esempio n. 5
0
        public static string[] FromPoints(IEnumerable <IGpxPoint> points)
        {
            var tags  = new List <string>();
            var count = points.Count();

            // is closed loop
            var loop = GeoDistance.BetweenPoints(points.First(), points.Last());

            if (loop.Meters <= 200)
            {
                tags.Add("Loop");
            }

            // average speed
            var km   = GeoDistance.BetweenPoints(points).KM;
            var time = points.Max(x => x.Timestamp.Value).Subtract(points.Min(x => x.Timestamp.Value));
            var kmh  = km / time.TotalHours;

            if (kmh <= 5)             // km/h
            {
                tags.Add("Walk");
            }
            else if (kmh <= 15)             // km/h
            {
                tags.Add("Bike");
            }

            // max speed (of data)
            var max = points.Max(x => x.Speed ?? 0);

            if (max > 5)
            {
                tags.Add("Fast");                      // m/s
            }
            // number of stops
            var stops = points.Count(x => x.Speed == 0);

            if ((stops / count) >= 0.01)
            {
                tags.Add("Stops");                                      // 1%
            }
            // few options
            if (count < 30)
            {
                tags.Add("Short");
            }

            // bad data points
            var bad = max > 33;             // m/s

            if (!bad)
            {
                bad = points.Average(x => (x.Sats ?? 0)) <= 5;
            }
            if (!bad)
            {
                bad = points.Count(x => !x.HDOP.HasValue) >= 20;                   // TODO: fix this threshold for old files without DOP data
            }
            if (bad)
            {
                tags.Add("Bad");
            }

            return(tags.ToArray());
        }
 /// <summary>
 /// Finds the place which is nearest to the given point
 /// </summary>
 public CartoPlaceInfo NearestPlace(IGeoLatLon point)
 {
     return(_cache.All.Where(x => x.Bounds.Contains(point)).OrderBy(x => GeoDistance.BetweenPoints(point, x.Center).Meters).FirstOrDefault());
 }
Esempio n. 7
0
 // --------------------------------------------------
 // Region
 public List <GeoRegionInfo> NearbyRegions(IGeoLatLon point)
 {
     return(GeoRegionInfo.ListByLocation(point).OrderBy(x => GeoDistance.BetweenPoints(x.Center, point).Meters).ToList());
 }
Esempio n. 8
0
        // --------------------------------------------------
        // Country
        public GeoCountryInfo NearestCountry(IGeoLatLon point)
        {
            var countries = GeoCountryInfo.ListByLocation(point).OrderBy(x => GeoDistance.BetweenPoints(x.Center, point).Meters);

            return(countries.FirstOrDefault());
        }