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); }
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()); }
// -------------------------------------------------- // Region public List <GeoRegionInfo> NearbyRegions(IGeoLatLon point) { return(GeoRegionInfo.ListByLocation(point).OrderBy(x => GeoDistance.BetweenPoints(x.Center, point).Meters).ToList()); }
// -------------------------------------------------- // Country public GeoCountryInfo NearestCountry(IGeoLatLon point) { var countries = GeoCountryInfo.ListByLocation(point).OrderBy(x => GeoDistance.BetweenPoints(x.Center, point).Meters); return(countries.FirstOrDefault()); }