public static WorkoutDomain DecodeGpxFile(IFormFile file) { XmlDocument gpxDoc = new XmlDocument(); gpxDoc.Load(new StreamReader(file.OpenReadStream())); XmlNamespaceManager nsmgr = new XmlNamespaceManager(gpxDoc.NameTable); nsmgr.AddNamespace("x", "http://www.topografix.com/GPX/1/1"); XmlNodeList nl = gpxDoc.SelectNodes("//x:trkpt", nsmgr); WorkoutDomain workoutDomain = new WorkoutDomain(); DateTimeOffset?dto = null; for (int i = 0; i < nl.Count; i++) { workoutDomain.Localizations.Add(new Coordinate( double.Parse(nl[i].Attributes["lat"].InnerText, CultureInfo.InvariantCulture), double.Parse(nl[i].Attributes["lon"].InnerText, CultureInfo.InvariantCulture), DateTimeOffset.Parse(nl[i]["time"].InnerText).DateTime ) ); } workoutDomain.TrainingTime = workoutDomain.Localizations.First().Measurement; workoutDomain.Type = ExtractTrainingDetailType(gpxDoc, nsmgr); var duration = ExtractTrainingDetailDuration(workoutDomain); var distance = CalculateDistance(workoutDomain); workoutDomain.WorkoutDetail = new WorkoutDetail(distance, duration); return(workoutDomain); }
public async Task <bool> InsertTraining(IFormFile file, string userName) { WorkoutDomain workoutDomain = GpxFileManager.DecodeGpxFile(file); workoutDomain.UserId = await _accountDataAccess.GetUserIdAsync(userName); _trainingDataAccess.InsertTraining(workoutDomain); return(true); }
private static double CalculateDistance(WorkoutDomain workoutDomain) { double distance = default; for (int i = 1; i < workoutDomain.Localizations.Count; i++) { distance += workoutDomain.Localizations[i].DistanceTo(workoutDomain.Localizations[i - 1]); } return(distance); }
public void InsertTraining(WorkoutDomain workoutDomain) { Training training = new Training { Type = (int)workoutDomain.Type, UserId = workoutDomain.UserId, TrainingTime = workoutDomain.TrainingTime, Detail = JsonConvert.SerializeObject(workoutDomain.WorkoutDetail), Gps = JsonConvert.SerializeObject(workoutDomain.Localizations) }; ApplicationContext.Trainings.Add(training); ApplicationContext.SaveChanges(); }
private static double ExtractTrainingDetailDuration(WorkoutDomain workoutDomain) { return((workoutDomain.Localizations.Last().Measurement - workoutDomain.Localizations.First().Measurement) .TotalSeconds); }