private static void inheritLegacy(TaxiRunningStatistics heritor, TaxiRunningStatistics legacy) { if (legacy != null) { heritor.EmptyRunningDistance += legacy.EmptyRunningDistance; heritor.EmptyRunningDuration += legacy.EmptyRunningDuration; heritor.LoadedRunningDistance += legacy.LoadedRunningDistance; heritor.LoadedRunningDuration += legacy.LoadedRunningDuration; Console.WriteLine("----预估空车行驶时间:" + legacy.EmptyRunningDuration + "s"); Console.WriteLine("----预估空车行驶距离:" + legacy.EmptyRunningDistance + "m"); Console.WriteLine("----预估重车行驶时间:" + legacy.LoadedRunningDuration + "s"); Console.WriteLine("----预估重车行驶距离:" + legacy.LoadedRunningDistance + "m"); Console.WriteLine(); } }
public static List <List <TaxiRunningStatistics> > analyse(TaxiRunningSnapshot[] snapshots) { List <List <TaxiRunningStatistics> > result = new List <List <TaxiRunningStatistics> >(); int i = 0; while (i < snapshots.Length) { List <TaxiRunningStatistics> statisticInOneDay = new List <TaxiRunningStatistics>(); DateTime currentDay = snapshots[i].Timestamp.Date, nextDay = currentDay.AddDays(1); TaxiRunningStatistics lastHourLegacy = null; Boolean hasLegacy = false; while (i < snapshots.Length && between(snapshots[i].Timestamp, currentDay, nextDay)) { TaxiRunningStatistics statisticInOneHour = new TaxiRunningStatistics(); DateTime[] floorAndCeiling = GetFloorAndCeiling(snapshots[i].Timestamp); statisticInOneHour.TaxiId = snapshots[i].TaxiId; statisticInOneHour.StartTime = floorAndCeiling[0]; statisticInOneHour.EndTime = floorAndCeiling[1]; Console.WriteLine("开始统计:" + statisticInOneHour.StartTime + "到" + statisticInOneHour.EndTime + "的空驶率..."); if (hasLegacy) { inheritLegacy(statisticInOneHour, lastHourLegacy); hasLegacy = false; } TaxiRunningSnapshot lastSnapshot = null, currentSnapshot = null; while (i < snapshots.Length && between(snapshots[i].Timestamp, statisticInOneHour.StartTime, statisticInOneHour.EndTime)) { currentSnapshot = snapshots[i]; if (lastSnapshot != null) { double duration = currentSnapshot.Timestamp.Subtract(lastSnapshot.Timestamp).TotalSeconds; double distance = DistanceCalculator.Measure(lastSnapshot.Location, currentSnapshot.Location); if (lastSnapshot.TaxiState == TaxiState.Empty) { statisticInOneHour.EmptyRunningDuration += duration; statisticInOneHour.EmptyRunningDistance += distance; } else { statisticInOneHour.LoadedRunningDuration += duration; statisticInOneHour.LoadedRunningDistance += distance; } printMessage(lastSnapshot.TaxiState, duration, distance); } lastSnapshot = currentSnapshot; i++; } if (i < snapshots.Length) { //currentSnapshot为一个新小时的开始,对上一个小时的末尾进行预测 currentSnapshot = snapshots[i]; if (currentSnapshot.Timestamp.Subtract(lastSnapshot.Timestamp).TotalSeconds <= Config.GetPredictableRange()) { Console.WriteLine("正在预估行驶时间和行驶距离..."); lastHourLegacy = new TaxiRunningStatistics(); double extraInDuration = statisticInOneHour.EndTime.Subtract(lastSnapshot.Timestamp).TotalSeconds; double duration = currentSnapshot.Timestamp.Subtract(lastSnapshot.Timestamp).TotalSeconds; double legacyInDuration = duration - extraInDuration; double distance = DistanceCalculator.Measure(lastSnapshot.Location, currentSnapshot.Location); double legacyInDistance = distance * legacyInDuration / duration; double extraInDistance = distance * extraInDuration / duration; if (lastSnapshot.TaxiState == TaxiState.Empty) { statisticInOneHour.EmptyRunningDuration += extraInDuration; statisticInOneHour.EmptyRunningDistance += extraInDistance; lastHourLegacy.EmptyRunningDuration = legacyInDuration; lastHourLegacy.EmptyRunningDistance = legacyInDistance; } else { statisticInOneHour.LoadedRunningDuration += extraInDuration; statisticInOneHour.LoadedRunningDistance += extraInDistance; lastHourLegacy.LoadedRunningDuration = legacyInDuration; lastHourLegacy.LoadedRunningDistance = legacyInDistance; } printMessage(lastSnapshot.TaxiState, extraInDuration, extraInDistance); hasLegacy = true; } } Console.WriteLine(statisticInOneHour.StartTime + "到" + statisticInOneHour.EndTime + "的数据统计完毕:"); Console.WriteLine(statisticInOneHour); Console.WriteLine(); statisticInOneDay.Add(statisticInOneHour); } result.Add(statisticInOneDay); } return(result); }