using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using ZedGraph; using GMap.NET; using System.Xml; // GE xml alt reader namespace ArdupilotMega { public partial class ElevationProfile : Form { List gelocs = new List(); List planlocs = new List(); PointPairList list1 = new PointPairList(); PointPairList list2 = new PointPairList(); int distance = 0; double homealt = 0; public ElevationProfile(List locs, double homealt) { InitializeComponent(); planlocs = locs; if (planlocs.Count <= 1) { MessageBox.Show("Please plan something first"); return; } // get total distance distance = 0; PointLatLngAlt lastloc = null; foreach (PointLatLngAlt loc in planlocs) { if (lastloc != null) { distance += (int)loc.GetDistance(lastloc); } lastloc = loc; } this.homealt = homealt / MainV2.cs.multiplierdist; Form frm = Common.LoadingBox("Loading", "Downloading Google Earth Data"); gelocs = getGEAltPath(planlocs); frm.Close(); } private void ElevationProfile_Load(object sender, EventArgs e) { if (planlocs.Count <= 1) { this.Close(); return; } // GE plot double a = 0; double increment = (distance / (gelocs.Count - 1)); foreach (PointLatLngAlt geloc in gelocs) { list2.Add(a,geloc.Alt); Console.WriteLine(geloc.Lng + "," + geloc.Lat + "," + geloc.Alt); a+=increment; } // Planner Plot a=0; int count = 0; PointLatLngAlt lastloc = null; foreach (PointLatLngAlt planloc in planlocs) { if (lastloc != null) { a += planloc.GetDistance(lastloc); } list1.Add(a, planloc.Alt / MainV2.cs.multiplierdist, 0, planloc.Tag); // homealt lastloc = planloc; count++; } // draw graph CreateChart(zg1); } List getGEAltPath(List list) { double alt = 0; double lat = 0; double lng = 0; int pos = 0; List answer = new List(); //http://code.google.com/apis/maps/documentation/elevation/ //http://maps.google.com/maps/api/elevation/xml string coords = ""; foreach (PointLatLngAlt loc in list) { coords = coords + loc.Lat.ToString(new System.Globalization.CultureInfo("en-US")) + "," + loc.Lng.ToString(new System.Globalization.CultureInfo("en-US")) + "|"; } coords = coords.Remove(coords.Length - 1); if (list.Count <= 2 || coords.Length > (2048 - 256) || distance > 50000) { MessageBox.Show("To many/few WP's or to Big a Distance " + (distance/1000) + "km"); return answer; } try { using (XmlTextReader xmlreader = new XmlTextReader("http://maps.google.com/maps/api/elevation/xml?path=" + coords + "&samples=" + (distance / 100).ToString(new System.Globalization.CultureInfo("en-US")) + "&sensor=false")) { while (xmlreader.Read()) { xmlreader.MoveToElement(); switch (xmlreader.Name) { case "elevation": alt = double.Parse(xmlreader.ReadString(), new System.Globalization.CultureInfo("en-US")); Console.WriteLine("DO it " + lat + " " + lng + " " + alt); PointLatLngAlt loc = new PointLatLngAlt(lat,lng,alt,""); answer.Add(loc); pos++; break; case "lat": lat = double.Parse(xmlreader.ReadString(), new System.Globalization.CultureInfo("en-US")); break; case "lng": lng = double.Parse(xmlreader.ReadString(), new System.Globalization.CultureInfo("en-US")); break; default: break; } } } } catch { MessageBox.Show("Error getting GE data"); } return answer; } public void CreateChart(ZedGraphControl zgc) { GraphPane myPane = zgc.GraphPane; // Set the titles and axis labels myPane.Title.Text = "Elevation above ground"; myPane.XAxis.Title.Text = "Distance (m)"; myPane.YAxis.Title.Text = "Elevation (m)"; LineItem myCurve; myCurve = myPane.AddCurve("Planner", list1, Color.Red, SymbolType.None); myCurve = myPane.AddCurve("GE", list2, Color.Green, SymbolType.None); foreach (PointPair pp in list1) { // Add a another text item to to point out a graph feature TextObj text = new TextObj((string)pp.Tag, pp.X, pp.Y); // rotate the text 90 degrees text.FontSpec.Angle = 90; text.FontSpec.FontColor = Color.White; // Align the text such that the Right-Center is at (700, 50) in user scale coordinates text.Location.AlignH = AlignH.Right; text.Location.AlignV = AlignV.Center; // Disable the border and background fill options for the text text.FontSpec.Fill.IsVisible = false; text.FontSpec.Border.IsVisible = false; myPane.GraphObjList.Add(text); } // Show the x axis grid myPane.XAxis.MajorGrid.IsVisible = true; myPane.XAxis.Scale.Min = 0; myPane.XAxis.Scale.Max = distance; // Make the Y axis scale red myPane.YAxis.Scale.FontSpec.FontColor = Color.Red; myPane.YAxis.Title.FontSpec.FontColor = Color.Red; // turn off the opposite tics so the Y tics don't show up on the Y2 axis myPane.YAxis.MajorTic.IsOpposite = false; myPane.YAxis.MinorTic.IsOpposite = false; // Don't display the Y zero line myPane.YAxis.MajorGrid.IsZeroLine = true; // Align the Y axis labels so they are flush to the axis myPane.YAxis.Scale.Align = AlignP.Inside; // Manually set the axis range //myPane.YAxis.Scale.Min = -1; //myPane.YAxis.Scale.Max = 1; // Fill the axis background with a gradient //myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f); // Calculate the Axis Scale Ranges try { zg1.AxisChange(); } catch { } } } }