public static CheckPoint FindCheckPoint(List <Location> locations, Location location1, string country1, Location location2, string country2, Func <Geometry, string> getCountry, int callCount = 0) { callCount++; if (locations.Count < 4 || (location2.TimestampMsUnix - location1.TimestampMsUnix) < MinInterval || callCount > 10) { return(LocationToCheckPoint(location2, country2)); } var mid = (long)((location2.TimestampMsUnix + location1.TimestampMsUnix) / 2.0); var midLocation = locations.OrderBy(l => Math.Abs(l.TimestampMsUnix - mid)).First(); if (midLocation == null) { return(LocationToCheckPoint(location2, country2)); } var midCountry = getCountry(midLocation.Point); if (midCountry == country2) { var range = locations.Where(lh => lh.TimestampMsUnix >= location1.TimestampMsUnix && lh.TimestampMsUnix <= midLocation.TimestampMsUnix).ToList(); return(FindCheckPoint(range, location1, country1, midLocation, midCountry, getCountry, callCount)); } else { var range = locations.Where(lh => lh.TimestampMsUnix >= midLocation.TimestampMsUnix && lh.TimestampMsUnix <= location2.TimestampMsUnix).ToList(); return(FindCheckPoint(range, midLocation, midCountry, location2, country2, getCountry, callCount)); } }
public static CheckPoint LocationToCheckPoint(Location location, string country) { return(new CheckPoint { CountryName = country, Date = location.Date, Point = location.Point }); }