예제 #1
0
    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);
        }
예제 #3
0
    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);
    }
예제 #4
0
        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();
        }
예제 #5
0
 private static double ExtractTrainingDetailDuration(WorkoutDomain workoutDomain)
 {
     return((workoutDomain.Localizations.Last().Measurement - workoutDomain.Localizations.First().Measurement)
            .TotalSeconds);
 }