public LogDetailPage(RunData runData) { InitializeComponent(); foreach (var segment in runData.Segments.OrderBy(s => s.StartDate)) { foreach (var loc in segment.Locations.OrderBy(l => l.Timestamp)) { RunMap.AddPosition(loc.GetPosition()); } } var(minLat, minLng, maxLat, maxLng) = RunMap.RouteCoordinates.GetMinsAndMaxes(); var distance = DependencyService.Get <ILocationService>().GetDistance(minLat.Value, minLng.Value, maxLat.Value, maxLng.Value); var useMiles = true; var convertedDistance = useMiles ? (distance / 1609.344) : (distance / 1000); RunDistanceLabel.Text = convertedDistance.ToString("N2"); StatsDistanceLabel.Text = convertedDistance.ToString("N2"); StatsPaceLabel.Text = TimeSpan.FromMinutes(runData.Elapsed.TotalMinutes / convertedDistance).ToString("mm':'ss"); StatsCaloriesLabel.Text = ((int)(convertedDistance * 190 * 1.036)).ToString(); MapTimeLabel.Text = runData.Elapsed.ToString(runData.Elapsed.Hours > 0 ? "hh':'mm':'ss" : "mm':'ss"); StatsTimeLabel.Text = MapTimeLabel.Text; RunMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position((minLat.Value + maxLat.Value) / 2, (minLng.Value + maxLng.Value) / 2), Distance.FromKilometers(distance / 800d))); }
public Plugins(Plugins original) { foreach (var kv in original.OperatorMap) { OperatorMap.Add(kv.Key, kv.Value); } foreach (var kv in original.RunMap) { RunMap.Add(kv.Key, kv.Value); } }
private void _locationService_LocationChanged(object sender, Models.Run.LocationData e) { if (_isTracking == true) { var newPos = new Position(e.Latitude, e.Longitude); if (_locations.Count() > 0 && _locations.Last() is LocationData lastLoc && lastLoc.IsTracked == true) { RunMap.AddPosition(newPos); RunMap.MoveToRegion(MapSpan.FromCenterAndRadius(newPos, Distance.FromKilometers(GetMaxDistance() / 1000d))); _minElevation = Math.Min(_minElevation ?? lastLoc.Altitude, lastLoc.Altitude); _maxElevation = Math.Max(_maxElevation ?? lastLoc.Altitude, lastLoc.Altitude); var useMiles = true; // should be a setting later var meters = _locationService.GetDistance(lastLoc.GetPosition(), newPos); _totalDistance += useMiles ? (meters / 1609.344) : (meters / 1000); var pace = _totalDistance > 0d ? TimeSpan.FromMinutes((DateTime.UtcNow - (_startTime + _pauseOffset)).TotalMinutes / _totalDistance) : TimeSpan.FromMinutes(0); Device.BeginInvokeOnMainThread(() => { ElevationLabel.Text = (_maxElevation.Value - _minElevation.Value).ToString("N1"); RunDistanceLabel.Text = _totalDistance.ToString("N2"); StatsDistanceLabel.Text = _totalDistance.ToString("N2"); if (_totalDistance > 0.1d) { StatsPaceLabel.Text = pace.ToString("mm':'ss"); } else { StatsPaceLabel.Text = "∞"; } //https://fitness.stackexchange.com/a/36045 // distance * weight * constant // should be in metric StatsCaloriesLabel.Text = ((int)(_totalDistance * 190 * 1.036)).ToString(); }); } if (_justUnpaused == true) { _justUnpaused = false; RunMap.AddPosition(newPos, false); } } e.IsTracked = _isTracking; _locations.Add(e); }
public RunTabbedPage() { InitializeComponent(); NavigationPage.SetHasNavigationBar(this, false); _locationService = DependencyService.Get <ILocationService>(); _locationService.AddLocationChangedListener(_locationService_LocationChanged); RunStartRunButton.Clicked += StartRunButton_Clicked; StatsStartRunButton.Clicked += StartRunButton_Clicked; RunPauseButton.Clicked += PauseButton_Clicked; StatsPauseButton.Clicked += PauseButton_Clicked; RunCancelButton.Clicked += RunCancelButton_Clicked; StatsCancelButton.Clicked += RunCancelButton_Clicked; RunResumeButton.Clicked += PauseButton_Clicked; StatsResumeButton.Clicked += PauseButton_Clicked; RunFinishButton.Clicked += FinishButton_Clicked; StatsFinishButton.Clicked += FinishButton_Clicked; _timer = new Timer() { Interval = 1000 }; _timer.Elapsed += _timer_Elapsed; _timer.Start(); _locations = new List <LocationData>(); if (_locationService.GetQuickLocation() is LocationData currentLoc) { RunMap.MoveToRegion(MapSpan.FromCenterAndRadius(currentLoc.GetPosition(), Distance.FromKilometers(0.1d))); } }
private void Current_PositionChanged(object sender, PositionEventArgs e) { var newPosition = new Xamarin.Forms.Maps.Position(e.Position.Latitude, e.Position.Longitude); var mapSpan = new MapSpan(newPosition, 0.1, 0.1); RunMap.MoveToRegion(mapSpan); var pin = new Pin(); pin.Position = newPosition; pin.Type = PinType.Generic; pin.Label = "test"; RunMap.Pins.Add(pin); Coordinate coordinate = new Coordinate(e.Position.Latitude, e.Position.Longitude); if (_lastPosition == null) { _lastPosition = coordinate; return; } distanceCalculator = new DistanceCalculator(_lastPosition); var distance = distanceCalculator.GetDistanceInKilometers(coordinate); DistanceInKilometers += distance; Distance = Math.Round(DistanceInKilometers, 2); _lastPosition = coordinate; var now = DateTime.Now; TimeSpan result = now.Subtract(initialTime); Minutes = (int)result.TotalMinutes; Seconds = result.Seconds; }