void loadActivity() { zedActivityChart.GraphPane.Legend.IsVisible = true; zedActivityChart.GraphPane.Title.Text = "Activity Chart"; zedActivityChart.GraphPane.XAxis.Title.Text = "Duration from Activity Start"; zedActivityChart.GraphPane.YAxis.Title.Text = ""; SetStatusProgressThreadSafe(statusBar, "Value", 0); SetStatusProgressThreadSafe(statusBar, "Maximum", 6); SetStatusTextThreadSafe(statusBar, "Loading selected activity..."); if (listViewSelectedCountItems(lstActivities) > 0) { int wId = Convert.ToInt32(GetListViewSelectedItemValue(lstActivities, 0, 0)); RideWithGpsActivitySummary summary = _rwgps.retrieveWorkoutData(wId, ref zedActivityChart); // apply the ride summary information SetControlPropertyThreadSafe(lblAvgSpeed, "Text", summary.avgSpeed); SetControlPropertyThreadSafe(lblAvgCadence, "Text", summary.avgCadence); SetControlPropertyThreadSafe(lblAvgHeartRate, "Text", summary.avgHeartRate); SetControlPropertyThreadSafe(lblActivityDateTime, "Text", summary.name); SetControlPropertyThreadSafe(lblTotalAscent, "Text", summary.elevationGain); SetControlPropertyThreadSafe(lblDuration, "Text", summary.durationTotal); SetControlPropertyThreadSafe(lblMovingTime, "Text", summary.durationMoving); SetControlPropertyThreadSafe(lblDistance, "Text", summary.distance); SetControlPropertyThreadSafe(txtNotes, "Text", summary.notes); ClearListView(lstSplits); for (int s = 0; s < summary.mileSplits.Count; s++) { string[] row = { summary.mileSplits[s].label, summary.mileSplits[s].speed, summary.mileSplits[s].pace }; AddListViewItem(lstSplits, new ListViewItem(row)); } // finalise SetControlPropertyThreadSafe(lstActivities, "Enabled", true); // set active tab, and tell the MAP browser component to reload the route map setTab(tabChart, "tabSummary"); NavigateWebControl(webBrowser1, Application.StartupPath + "\\rwgps_route.html"); } SetStatusTextThreadSafe(statusBar, "Done."); }
public RideWithGpsActivitySummary retrieveWorkoutData(int wId, ref ZedGraph.ZedGraphControl zedActivityChart) { RideWithGpsActivitySummary summary = new RideWithGpsActivitySummary(); string wUrl = string.Format("http://ridewithgps.com/trips/{0}.json", wId); HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(wUrl); httpWebRequest.Proxy = null; httpWebRequest.Credentials = CredentialCache.DefaultCredentials; httpWebRequest.CookieContainer = this._cookies; // get response HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); System.IO.Stream responseStream = httpWebResponse.GetResponseStream(); if (responseStream != null) { System.IO.StreamReader streamReader = new System.IO.StreamReader(responseStream); string text = streamReader.ReadToEnd(); dynamic jsonResult = JsonValue.Parse(text); PointPairList graphListHeart = new PointPairList(); PointPairList graphListAltitude = new PointPairList(); PointPairList graphListSpeed = new PointPairList(); PointPairList graphListCadence = new PointPairList(); zedActivityChart.GraphPane.CurveList.Clear(); zedActivityChart.GraphPane.GraphObjList.Clear(); zedActivityChart.GraphPane.YAxisList.Clear(); zedActivityChart.GraphPane.AddYAxis("Heart (bpm)"); zedActivityChart.GraphPane.AddYAxis("Cadence"); zedActivityChart.GraphPane.AddYAxis("Speed"); zedActivityChart.GraphPane.AddYAxis("Altitude (ft)"); zedActivityChart.GraphPane.Y2Axis.Scale.FontSpec.Size = 8; // set custom formatting for X-Axis in charts zedActivityChart.GraphPane.XAxis.ScaleFormatEvent += new Axis.ScaleFormatHandler(Axis_ScaleFormatEvent); // set the ride summary details summary.avgSpeed = "- mph"; summary.avgCadence = " - rpm"; summary.avgHeartRate = "- bpm"; summary.distance = "- miles"; summary.elevationGain = "- ft"; summary.durationTotal = "-"; summary.durationMoving = "-"; if (jsonResult.metrics.ContainsKey("speed")) { summary.avgSpeed = string.Format("{0:0.00} mph", (double)jsonResult.metrics.speed.avg * 0.621371); } if (jsonResult.metrics.ContainsKey("cad")) { summary.avgCadence = string.Format("{0:0} rpm", (double)jsonResult.metrics.cad.avg); } if (jsonResult.metrics.ContainsKey("hr")) { summary.avgHeartRate = string.Format("{0:0} bpm", (double)jsonResult.metrics.hr.avg); } if (jsonResult.metrics.ContainsKey("distance")) { summary.distance = string.Format("{0:0.00} miles", ((double)jsonResult.distance / 1000) * 0.621371); } if (jsonResult.metrics.ContainsKey("elevation_gain")) { summary.elevationGain = string.Format("{0:0.00} ft", (double)jsonResult.elevation_gain * 3.2808399); } summary.name = (string)jsonResult.name; if (jsonResult.metrics.ContainsKey("duration")) { TimeSpan tDuration = TimeSpan.FromSeconds((double)jsonResult.metrics.duration); summary.durationTotal = string.Format("{0:D2} h {1:D2} m {2:D2} s", tDuration.Hours, tDuration.Minutes, tDuration.Seconds); } if (jsonResult.metrics.ContainsKey("movingTime")) { TimeSpan tMoving = TimeSpan.FromSeconds((double)jsonResult.metrics.movingTime); summary.durationMoving = string.Format("{0:D2} h {1:D2} m {2:D2} s", tMoving.Hours, tMoving.Minutes, tMoving.Seconds); } summary.notes = (string)jsonResult.description; summary.mileSplits = new List <RideWithGpsMileSplit>(); double firstTimestamp = (double)jsonResult.track_points[0].t; double distance = 0; double duration = 0; double speed = 0; int currentMileSearch = 1; double runningMileDistance = 0; double runningDuration = 0; // google map strings double lat_min = -1; double lat_max = -1; double lng_min = -1; double lng_max = -1; double lat = 0; double lng = 0; double start_lat = 0; double start_lng = 0; double finish_lat = 0; double finish_lng = 0; string js_coords = ""; string js_mile_markers = ""; string js_bounds = ""; //string js_centre = ""; for (int tp = 0; tp < jsonResult.track_points.Count; tp++) { if (tp == 0) { start_lat = (double)jsonResult.track_points[tp].y; start_lng = (double)jsonResult.track_points[tp].x; } // update the last point coordinates finish_lat = (double)jsonResult.track_points[tp].y; finish_lng = (double)jsonResult.track_points[tp].x; if (tp > 0) { js_coords += ","; duration = (double)jsonResult.track_points[tp].t - (double)jsonResult.track_points[tp - 1].t; distance = GeoMath.Distance( (double)jsonResult.track_points[tp].y, (double)jsonResult.track_points[tp].x, (double)jsonResult.track_points[tp - 1].y, (double)jsonResult.track_points[tp - 1].x, GeoMath.MeasureUnits.Miles ); speed = distance / (duration / 3600); // increment the running totals runningDuration += duration; runningMileDistance += distance; // check if we've reached threshold for current search miles if (runningMileDistance > currentMileSearch) { TimeSpan tsPace = TimeSpan.FromSeconds(runningDuration); RideWithGpsMileSplit mileSplit = new RideWithGpsMileSplit(); mileSplit.label = string.Format("Mile {0}", currentMileSearch); mileSplit.speed = string.Format("{0:0.00} mph", (1 / (runningDuration / 3600))); mileSplit.pace = string.Format("{0:D2} h {1:D2} m {2:D2} s", tsPace.Hours, tsPace.Minutes, tsPace.Seconds); summary.mileSplits.Add(mileSplit); TimeSpan tmp_ts = TimeSpan.FromSeconds((double)jsonResult.track_points[tp].t); string mile_marker_tag = "Time since start of ride: " + string.Format("{0:D2} h {1:D2} m {2:D2} s", tmp_ts.Hours, tmp_ts.Minutes, tmp_ts.Seconds ); js_mile_markers += "\r\nnew google.maps.Marker({icon:'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=" + (currentMileSearch) + "|95E978|004400',position: new google.maps.LatLng(" + (string)jsonResult.track_points[tp].y + "," + (string)jsonResult.track_points[tp].x + "),map: map,title: 'Mile " + (currentMileSearch) + "\\r\\n" + mile_marker_tag + "'});"; // reset the running duration // and increment the mile search counter for the next mile runningDuration = 0; currentMileSearch++; } } // update the max / min longitude / latitude lat = (double)jsonResult.track_points[tp].y; lng = (double)jsonResult.track_points[tp].x; if (lat_min == -1) { lat_min = lat; } if (lat_max == -1) { lat_max = lat; } if (lng_min == -1) { lng_min = lng; } if (lng_max == -1) { lng_max = lng; } if (lat < lat_min) { lat_min = lat; } if (lat > lat_max) { lat_max = lat; } if (lng < lng_min) { lng_min = lng; } if (lng > lng_max) { lng_max = lng; } js_coords += "\r\nnew google.maps.LatLng(" + (string)jsonResult.track_points[tp].y + "," + (string)jsonResult.track_points[tp].x + ")"; TimeSpan ts = TimeSpan.FromSeconds((double)jsonResult.track_points[tp].t - firstTimestamp); string tagCadence = ""; string tagHR = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s", ts.Hours, ts.Minutes, ts.Seconds ) + "\r\nHR: " + (string)jsonResult.track_points[tp].h + " bpm"; string tagAltitude = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s", ts.Hours, ts.Minutes, ts.Seconds ) + "\r\n" + string.Format("Altitude: {0:0.00} ft", (double)jsonResult.track_points[tp].e * 3.2808399); if (jsonResult.track_points[tp].ContainsKey("c")) { tagCadence = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s", ts.Hours, ts.Minutes, ts.Seconds ) + "\r\n" + string.Format("Cadence: {0:0.00} rpm", (double)jsonResult.track_points[tp].c); } string tagSpeed = "Duration : " + string.Format("{0:D2} h {1:D2} m {2:D2} s", ts.Hours, ts.Minutes, ts.Seconds ) + "\r\n" + string.Format("Speed: {0:0.00} mph", speed); if (jsonResult.track_points[tp].ContainsKey("h") && jsonResult.track_points[tp].ContainsKey("t")) { graphListHeart.Add( (double)jsonResult.track_points[tp].t - firstTimestamp, (double)jsonResult.track_points[tp].h, tagHR ); } if (jsonResult.track_points[tp].ContainsKey("e") && jsonResult.track_points[tp].ContainsKey("t")) { graphListAltitude.Add( (double)jsonResult.track_points[tp].t - firstTimestamp, (double)jsonResult.track_points[tp].e * 3.2808399, tagAltitude ); } if (jsonResult.track_points[tp].ContainsKey("c") && jsonResult.track_points[tp].ContainsKey("t")) { graphListCadence.Add( (double)jsonResult.track_points[tp].t - firstTimestamp, (double)jsonResult.track_points[tp].c, tagCadence ); } graphListSpeed.Add( (double)jsonResult.track_points[tp].t - firstTimestamp, speed, tagSpeed ); } LineItem ln_heart_heart = zedActivityChart.GraphPane.AddCurve("Heart Rate", graphListHeart, Color.Red, SymbolType.None); ln_heart_heart.Line.Width = 1; ln_heart_heart.YAxisIndex = 0; LineItem ln_cadence = zedActivityChart.GraphPane.AddCurve("Cadence", graphListCadence, Color.Magenta, SymbolType.None); ln_cadence.Line.Width = 1; ln_cadence.YAxisIndex = 1; LineItem ln_speed = zedActivityChart.GraphPane.AddCurve("Speed", graphListSpeed, Color.Blue, SymbolType.None); ln_speed.Line.Width = 1; ln_speed.YAxisIndex = 2; LineItem ln_altitude = zedActivityChart.GraphPane.AddCurve("Altitude", graphListAltitude, Color.Green, SymbolType.None); ln_altitude.Line.Fill = new Fill(Color.LightGreen); ln_altitude.YAxisIndex = 3; zedActivityChart.AxisChange(); if (jsonResult.track_points.Count != 0) { zedActivityChart.GraphPane.XAxis.Scale.Max = (double)jsonResult.track_points[(int)jsonResult.track_points.Count - 1].t - firstTimestamp; } zedActivityChart.GraphPane.XAxis.MajorGrid.IsVisible = true; zedActivityChart.GraphPane.YAxis.MajorGrid.IsVisible = true; zedActivityChart.AxisChange(); js_mile_markers = "\r\nnew google.maps.Marker({icon:'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=S|000088|FFFFFF',position: new google.maps.LatLng(" + start_lat + "," + start_lng + "),map: map,title: 'Start'});" + "\r\nnew google.maps.Marker({icon:'https://chart.googleapis.com/chart?chst=d_map_pin_letter&chld=F|000088|FFFFFF',position: new google.maps.LatLng(" + finish_lat + "," + finish_lng + "),map: map,title: 'Finish'});" + js_mile_markers; // create a bounding box for the map - so it can auto-zoom to the best level of detail js_bounds = @" var latlngbounds = new google.maps.LatLngBounds(); latlngbounds.extend(new google.maps.LatLng(" + lat_min + @"," + lng_min + @")); latlngbounds.extend(new google.maps.LatLng(" + lat_max + @"," + lng_max + @")); map.fitBounds(latlngbounds); " ; // build the route html string routeHTML = @" <html> <head> <meta name=""viewport"" content=""initial-scale=1.0, user-scalable=no""> <meta charset=""utf-8""> <title>Cycle Route</title> <style> #map_canvas{ width:100%; height:100%; } </style> <script src=""https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false""></script> <script type=""text/javascript"" language=""javascript""> var map; function initialize() { var mapOptions = { mapTypeId: google.maps.MapTypeId.TERRAIN }; map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); var cycleRouteCoords = [ " + js_coords + @" ]; var cycleRoute = new google.maps.Polyline({ path: cycleRouteCoords, strokeColor: '#FF0000', strokeOpacity: 1.0, strokeWeight: 2 }); cycleRoute.setMap(map); " + js_mile_markers + @" " + js_bounds + @" } window.onresize = pageresize; function pageresize() { google.maps.event.trigger(map, 'resize'); " + js_bounds + @" } </script> </head> <body onload=""initialize()"" > <div id=""map_canvas""></div> </body> </html> " ; try{ if (System.IO.File.Exists(Application.StartupPath + "\\rwgps_route.html")) { System.IO.File.Delete(Application.StartupPath + "\\rwgps_route.html"); } FileStream fs = System.IO.File.OpenWrite(Application.StartupPath + "\\rwgps_route.html"); StreamWriter writer = new StreamWriter(fs); writer.Write(routeHTML); writer.Close(); writer.Dispose(); fs.Dispose(); //tabMap.Enabled = true; } catch { MessageBox.Show("Map Update Failed. Try re-selecting the activity.", "Error loading map", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } finally{ //tabMap.Enabled = true; } } return(summary); }