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, }); }
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")); } }