예제 #1
0
        public static ActivityModel Activity(Entities.Activity activity, AppUser user)
        {
            //var locations = activity.Locations?.ToArray();
            //var locationCount = locations?.Length ?? 0;
            //double[,] locationsArray = new double[locationCount, 3];
            //for (int i = 0; i < locationCount; i++)
            //{
            //    var location = locations[i];
            //    for (int j = 0; j < 3; j++)
            //    {
            //        double value;
            //        switch (j)
            //        {
            //            case 0:
            //                value = location.Latitude;
            //                break;
            //            case 1:
            //                value = location.Longitude;
            //                break;
            //            default:
            //                value = location.Timestamp;
            //                break;
            //        }
            //        locationsArray[i, j] = value;
            //    }
            //}

            var locations = TrackSimplifier.Simplify(activity.Locations?.ToList(), 0.00001);

            return(new ActivityModel
            {
                ActivityId = activity.ActivityId,
                Name = activity.Name,
                ActivityType = ((ActivityTypeEnum)activity.TypeId).ToString(),
                ThumbnailUrl = $"https://api.mapbox.com/styles/v1/bradstiff/ck82jifv21bd01iphcban53j2/static/path-2+44f-1({activity.Polyline})/auto/450x300@2x?access_token=pk.eyJ1IjoiYnJhZHN0aWZmIiwiYSI6ImNrODI2MHFoNjB4ODIzbGxudmwwbnZrOHUifQ.17nFSlgt8O9-mFOpeiqMhg",
                ImageUrl = $"https://api.mapbox.com/styles/v1/bradstiff/ck82jifv21bd01iphcban53j2/static/path-2+44f-1({activity.Polyline})/auto/900x600@2x?access_token=pk.eyJ1IjoiYnJhZHN0aWZmIiwiYSI6ImNrODI2MHFoNjB4ODIzbGxudmwwbnZrOHUifQ.17nFSlgt8O9-mFOpeiqMhg",
                Athlete = $"{user.FirstName} {user.LastName}",
                AthletePhotoUrl = user.PhotoUrl,
                StartDateTime = activity.StartDateTime,
                EndDateTime = activity.EndDateTime,
                TotalTimeSeconds = activity.TotalTimeSeconds,
                TotalDistanceMeters = activity.TotalDistanceMeters,
                SkiTimeSeconds = activity.SkiTimeSeconds,
                SkiDistanceMeters = activity.SkiDistanceMeters,
                SkiVerticalMeters = activity.SkiVerticalMeters,
                AscentTimeSeconds = activity.AscentTimeSeconds,
                AscentDistanceMeters = activity.AscentDistanceMeters,
                AscentVerticalMeters = activity.AscentVerticalMeters,
                MaxSpeedMps = activity.MaxSpeedMps,
                AverageSpeedMps = activity.AverageSpeedMps,
                MaxAltitudeMeters = activity.MaxAltitudeMeters,
                MaxGradeDegrees = activity.MaxGradeDegrees,
                RunsCount = activity.RunsCount,
                Source = ((ActivitySourceTypeEnum)activity.SourceTypeId).ToString(),
                Timestamp = activity.Timestamp,
                Segments = activity.Segments?
                           .Select(s => new ActivitySegmentModel
                {
                    ActivitySegmentId = s.ActivitySegmentId,
                    Name = s.Name,
                    StartTimestamp = s.StartTimestamp,
                    EndTimestamp = s.EndTimestamp,
                    TotalTimeSeconds = s.TotalTimeSeconds,
                    MovingTimeSeconds = s.MovingTimeSeconds,
                    VerticalMeters = s.VerticalMeters,
                    StartAltitude = s.StartAltitude,
                    EndAltitude = s.EndAltitude,
                    DistanceMeters = s.DistanceMeters,
                    MaxSpeedMps = s.MaxSpeedMps,
                    AverageSpeedMps = s.AverageSpeedMps,
                    MaxGradeDegrees = s.MaxGradeDegrees,
                    IsRun = s.IsRun
                })
                           .OrderBy(s => s.StartTimestamp)
                           .ToList(),
                Locations = locations
                            .Select(l => new ActivityLocationModel
                {
                    Latitude = l.Latitude,
                    Longitude = l.Longitude,
                    Timestamp = l.Timestamp,
                })
                            .OrderBy(l => l.Timestamp)
                            .ToList(),
                //LocationsArray = locationsArray,
            });
        }
예제 #2
0
        public async Task <IActionResult> SaveActivity(Guid activityId, [FromBody] ActivitySaveRequestModel model)
        {
            try
            {
                var activity = await _context.Activities
                               .Include(a => a.Locations)
                               .SingleAsync(a => a.ActivityId == activityId);

                activity.Name                 = model.Name;
                activity.TypeId               = (byte)Enum.Parse <ActivityTypeEnum>(model.ActivityType, true);
                activity.StartDateTime        = model.StartDateTime;
                activity.EndDateTime          = model.EndDateTime;
                activity.TotalTimeSeconds     = Convert.ToInt32(model.TotalTimeSeconds);
                activity.TotalDistanceMeters  = Convert.ToSingle(model.TotalDistanceMeters);
                activity.SkiTimeSeconds       = Convert.ToInt32(model.SkiTimeSeconds);
                activity.SkiDistanceMeters    = Convert.ToSingle(model.SkiDistanceMeters);
                activity.SkiVerticalMeters    = Convert.ToInt32(model.SkiVerticalMeters);
                activity.AscentTimeSeconds    = Convert.ToInt32(model.AscentTimeSeconds);
                activity.AscentDistanceMeters = Convert.ToSingle(model.AscentDistanceMeters);
                activity.AscentVerticalMeters = Convert.ToInt32(model.AscentVerticalMeters);
                activity.MaxSpeedMps          = Convert.ToSingle(model.MaxSpeedMps);
                activity.AverageSpeedMps      = Convert.ToSingle(model.AverageSpeedMps);
                activity.MaxAltitudeMeters    = Convert.ToInt32(model.MaxAltitudeMeters);
                activity.MaxGradeDegrees      = Convert.ToSingle(model.MaxGradeDegrees);
                activity.RunsCount            = model.RunsCount ?? 0;
                activity.UserId               = this.UserId;
                activity.SourceTypeId         = (byte)Enum.Parse <ActivitySourceTypeEnum>(model.Source, true);
                activity.Timestamp            = model.Timestamp;

                activity.Segments = model.Segments?
                                    .Select(s => new ActivitySegment
                {
                    Name              = s.Name,
                    StartTimestamp    = s.StartTimestamp ?? 0,
                    EndTimestamp      = s.EndTimestamp ?? 0,
                    TotalTimeSeconds  = Convert.ToInt32(s.TotalTimeSeconds),
                    MovingTimeSeconds = Convert.ToInt32(s.MovingTimeSeconds),
                    VerticalMeters    = Convert.ToInt32(s.VerticalMeters),
                    StartAltitude     = Convert.ToSingle(s.StartAltitude),
                    EndAltitude       = Convert.ToSingle(s.EndAltitude),
                    DistanceMeters    = Convert.ToSingle(s.DistanceMeters),
                    MaxSpeedMps       = Convert.ToSingle(s.MaxSpeedMps),
                    AverageSpeedMps   = Convert.ToSingle(s.AverageSpeedMps),
                    MaxGradeDegrees   = Convert.ToSingle(s.MaxGradeDegrees),
                    IsRun             = s.IsRun ?? false
                })
                                    .ToList();

                var locations = TrackSimplifier.Simplify(activity.Locations.OrderBy(l => l.Timestamp).ToList(), 0.00005);
                var polyline  = WebUtility.UrlEncode(Geometry.Encode(locations));
                activity.Polyline = polyline;

                await _context.SaveChangesAsync();

                return(Ok(new SuccessResponse()));
            }
            catch (Exception e)
            {
                Console.WriteLine("Error saving activity", e);
                _logger.LogError(e, "Error saving activity");
                return(ErrorResponse.AsStatusCodeResult(HttpStatusCode.InternalServerError, "Error saving activity"));
            }
        }