public static Dictionary<DayOfWeek, double> Distance(Int16 carId) { Dictionary<DayOfWeek, double> distancePerDay = new Dictionary<DayOfWeek, double>(); distancePerDay.Add(DayOfWeek.Monday, 0); distancePerDay.Add(DayOfWeek.Tuesday, 0); distancePerDay.Add(DayOfWeek.Wednesday, 0); distancePerDay.Add(DayOfWeek.Thursday, 0); distancePerDay.Add(DayOfWeek.Friday, 0); distancePerDay.Add(DayOfWeek.Saturday, 0); distancePerDay.Add(DayOfWeek.Sunday, 0); TimeSpan day = new TimeSpan(24, 0, 0); DBController dbc = new DBController(); List<Int64> tripIds = dbc.GetTripIdsByCarId(carId); dbc.Close(); foreach (Int64 tripId in tripIds) { List<Fact> entries = dbc.GetSpatioTemporalByCarIdAndTripId(carId, tripId); for (int i = 1; i < entries.Count; i++) { distancePerDay[entries[i].Temporal.Timestamp.DayOfWeek] += entries[i].Spatial.DistanceToLag; } } return distancePerDay; }
public static Dictionary<SpatialInformation, SpatialInformation> ByDistance(Int16 carId, Int64 tripId, double MinimumGapDistance) { Dictionary<SpatialInformation, SpatialInformation> tripGaps = new Dictionary<SpatialInformation, SpatialInformation>(); DBController dbc = new DBController(); List<Fact> facts = new List<Fact>(dbc.GetSpatioTemporalByCarIdAndTripId(carId, tripId)); dbc.Close(); for (int i = 1; i < facts.Count; i++) { if (facts[i].Spatial.Point.GetDistanceTo(facts[i - 1].Spatial.Point) > MinimumGapDistance) { tripGaps.Add(facts[i - 1].Spatial, facts[i].Spatial); } } return tripGaps; }
public static Dictionary<SpatialInformation, SpatialInformation> ByTime(Int16 carId, Int64 tripId, TimeSpan MinimumGapTime) { Dictionary<SpatialInformation, SpatialInformation> tripGaps = new Dictionary<SpatialInformation, SpatialInformation>(); DBController dbc = new DBController(); List<Fact> facts = new List<Fact>(dbc.GetSpatioTemporalByCarIdAndTripId(carId, tripId)); dbc.Close(); for (int i = 1; i < facts.Count; i++) { if (facts[i].Temporal.Timestamp - facts[i - 1].Temporal.Timestamp > MinimumGapTime) { tripGaps.Add(facts[i-1].Spatial, facts[i].Spatial); } } return tripGaps; }
//Returns average kilometers per trip for each week number public static Dictionary<KeyValuePair<int, int>, double> AverageTripDistance(Int16 carId) { //Get calendar for week number reference DateTimeFormatInfo formatInformation = DateTimeFormatInfo.CurrentInfo; Calendar calendar = formatInformation.Calendar; //Dictionary of <Year, Week>, <TripCount, Distance> Dictionary<KeyValuePair<int, int>, KeyValuePair<int, double>> results = new Dictionary<KeyValuePair<int, int>, KeyValuePair<int, double>>(); //Get trips to get distances from DBController dbc = new DBController(); List<Int64> tripIds = dbc.GetTripIdsByCarId(carId); foreach (Int64 tripId in tripIds) { List<Fact> facts = dbc.GetSpatioTemporalByCarIdAndTripId(carId, tripId); //Save starting points of trip, in case trip is split up later int startIndex = 0; double distanceForWeek = 0; int startWeek = calendar.GetWeekOfYear(facts[0].Temporal.Timestamp, formatInformation.CalendarWeekRule, formatInformation.FirstDayOfWeek); int startYear = facts[0].Temporal.Timestamp.Year; for (int i = 1; i < facts.Count; i++) { //If week or year changes in the trip, save that part from startIndex to current index int week = calendar.GetWeekOfYear(facts[i].Temporal.Timestamp, formatInformation.CalendarWeekRule, formatInformation.FirstDayOfWeek); int year = facts[i].Temporal.Timestamp.Year; if (week != startWeek || year != startYear) { for (int j = startIndex; j <= i; j++) { distanceForWeek += facts[j].Spatial.DistanceToLag; } KeyValuePair<int, int> tripPartKey = new KeyValuePair<int, int>(startYear, startWeek); if (results.ContainsKey(tripPartKey)) { results[tripPartKey] = new KeyValuePair<int, double>(results[tripPartKey].Key + 1, results[tripPartKey].Value + distanceForWeek); } else { results.Add(new KeyValuePair<int, int>(startYear, startWeek), new KeyValuePair<int, double>(1, distanceForWeek)); } //Update starting points for new part of trip startIndex = i; startWeek = week; startYear = year; distanceForWeek = 0; } } //At the end of the trip, save current part from startIndex to current index. for (int j = startIndex; j < facts.Count; j++) { distanceForWeek += facts[j].Spatial.DistanceToLag; } KeyValuePair<int, int> key = new KeyValuePair<int, int>(startYear, startWeek); if (results.ContainsKey(key)) { results[key] = new KeyValuePair<int, double>(results[key].Key + 1, results[key].Value + distanceForWeek); } else { results.Add(new KeyValuePair<int, int>(startYear, startWeek), new KeyValuePair<int, double>(1, distanceForWeek)); } } dbc.Close(); //Calculate average distance per week, and return result Dictionary<KeyValuePair<int, int>, double> weeklyAverageTripDistance = new Dictionary<KeyValuePair<int, int>, double>(); foreach (KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, double>> kvp in results) { weeklyAverageTripDistance.Add(kvp.Key, (kvp.Value.Value / kvp.Value.Key)); } return weeklyAverageTripDistance; }