public static void WriteSummaryKml(IEnumerable<Waypoint> points, string filename, ApOrganization groupby, bool showLabels) { XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml xmlns=\"http://www.opengis.net/kml/2.2\"><Document><name>Summary</name></Document></kml>"); switch(groupby) { case ApOrganization.EncryptionThenChannel: //Group APs by encryption var priGroup = points.GroupBy(wp => wp.Extensions.Privacy).OrderBy(gd => gd.Key); //Loop through all security groups foreach (IGrouping<string, Waypoint> priWp in priGroup) { //Create primary group folder XmlElement xePriFolder = XmlHelper.CreateKmlFolderWithName(doc, priWp.Key); //Group by Channel var secGroup = priWp.GroupBy(wp => wp.Extensions.Channel).OrderBy(gd => gd.Key); //Loop through all channel groups foreach (IGrouping<uint, Waypoint> secWp in secGroup) { //Create the secondary sub-folder XmlElement xeChannel = XmlHelper.CreateKmlFolderWithName(doc, "Channel " + secWp.Key); //Group all APs by mac address var apGroup = secWp.GroupBy(wp => wp.Extensions.MacAddress); //Loop to find the strongest points for each access point in this group foreach (IGrouping<string, Waypoint> apG in apGroup) { //Find the highest signal points int maxRssi = apG.Max(wp => wp.Extensions.Rssi); IEnumerable<Waypoint> wps = apG.Where(wp => wp.Extensions.Rssi == maxRssi); double avgLat = wps.Average(wp => wp.Latitude); double avgLon = wps.Average(wp => wp.Longitude); double avgEle = wps.Average(wp => wp.Elevation); xeChannel.AppendChild(XmlHelper.CreatePlacemark(doc, wps.First(), true, showLabels, false, true, avgLat, avgLon, avgEle)); } xePriFolder.AppendChild(xeChannel); } doc.GetElementsByTagName("Document").Item(0).AppendChild(xePriFolder); } break; case ApOrganization.ChannelThenEncryption: //Group APs by encryption var priGroup2 = points.GroupBy(wp => wp.Extensions.Channel).OrderBy(gd => gd.Key); //Loop through all security groups foreach (IGrouping<uint, Waypoint> priWp in priGroup2) { //Create primary group folder XmlElement xePriFolder = XmlHelper.CreateKmlFolderWithName(doc, "Channel " + priWp.Key); //Group by Channel var secGroup = priWp.GroupBy(wp => wp.Extensions.Privacy).OrderBy(gd => gd.Key); //Loop through all channel groups foreach (IGrouping<string, Waypoint> secWp in secGroup) { //Create the secondary sub-folder XmlElement xeChannel = XmlHelper.CreateKmlFolderWithName(doc, secWp.Key); //Group all APs by mac address var apGroup = secWp.GroupBy(wp => wp.Extensions.MacAddress); //Loop to find the strongest points for each access point in this group foreach (IGrouping<string, Waypoint> apG in apGroup) { //Find the highest signal points int maxRssi = apG.Max(wp => wp.Extensions.Rssi); IEnumerable<Waypoint> wps = apG.Where(wp => wp.Extensions.Rssi == maxRssi); double avgLat = wps.Average(wp => wp.Latitude); double avgLon = wps.Average(wp => wp.Longitude); double avgEle = wps.Average(wp => wp.Elevation); xeChannel.AppendChild(XmlHelper.CreatePlacemark(doc, wps.First(), true, showLabels, false, true, avgLat, avgLon, avgEle)); } xePriFolder.AppendChild(xeChannel); } doc.GetElementsByTagName("Document").Item(0).AppendChild(xePriFolder); } break; default: break; } doc.Save(filename); }
public static void WriteComprehensiveKml(IEnumerable<Waypoint> points,string filename,ApOrganization groupby,bool showLabels) { XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version=\"1.0\" ?><kml><Document><name>Comprehensive Data</name></Document></kml>"); XmlElement xe; //XmlElement xe2; XmlElement xe3; switch (groupby) { case ApOrganization.EncryptionThenChannel: var grouped = points.GroupBy(wp => wp.Extensions.Privacy).OrderBy(gd => gd.Key); foreach (IGrouping<string, Waypoint> waypoint in grouped) { //Create folder element xe = XmlHelper.CreateKmlFolderWithName(doc, waypoint.Key);//doc.CreateElement("Folder"); var g2 = waypoint.GroupBy(wp => wp.Extensions.Channel).OrderBy(ch => ch.Key); foreach (IGrouping<uint, Waypoint> grouping in g2) { //Create sub-folder xe3 = XmlHelper.CreateKmlFolderWithName(doc, "Channel " + grouping.Key);//doc.CreateElement("Folder"); //Group all points by mac address var apgroup = grouping.GroupBy(wp => wp.Extensions.MacAddress); //Add points to parent element WriteSubItems(doc, apgroup, xe3, showLabels); //Add the channel folder to the parent security folder xe.AppendChild(xe3); } //Add the security folder to the main document doc.GetElementsByTagName("Document").Item(0).AppendChild(xe); } //Save kml file doc.Save(filename); break; case ApOrganization.ChannelThenEncryption: var groupedc = points.GroupBy(wp => wp.Extensions.Channel).OrderBy(gd => gd.Key); foreach (IGrouping<uint, Waypoint> waypoint in groupedc) { //Create folder element xe = XmlHelper.CreateKmlFolderWithName(doc,"Channel " + waypoint.Key);//doc.CreateElement("Folder"); var g2 = waypoint.GroupBy(wp => wp.Extensions.Privacy).OrderBy(ch => ch.Key); foreach (IGrouping<string, Waypoint> grouping in g2) { //Create sub-folder xe3 = XmlHelper.CreateKmlFolderWithName(doc, grouping.Key);//doc.CreateElement("Folder"); //Group all points by mac address var apgroup = grouping.GroupBy(wp => wp.Extensions.MacAddress); //Add points to parent element WriteSubItems(doc, apgroup, xe3, showLabels); //Add the channel folder to the parent security folder xe.AppendChild(xe3); } //Add the security folder to the main document doc.GetElementsByTagName("Document").Item(0).AppendChild(xe); } //Save kml file doc.Save(filename); break; default: break; } }
public static void WriteSummaryKml(IEnumerable <Waypoint> points, string filename, ApOrganization groupby, bool showLabels) { XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml xmlns=\"http://www.opengis.net/kml/2.2\"><Document><name>Summary</name></Document></kml>"); switch (groupby) { case ApOrganization.EncryptionThenChannel: //Group APs by encryption var priGroup = points.GroupBy(wp => wp.Extensions.Security).OrderBy(gd => gd.Key); //Loop through all security groups foreach (IGrouping <string, Waypoint> priWp in priGroup) { //Create primary group folder XmlElement xePriFolder = XmlHelper.CreateKmlFolderWithName(doc, priWp.Key); //Group by Channel var secGroup = priWp.GroupBy(wp => wp.Extensions.Channel).OrderBy(gd => gd.Key); //Loop through all channel groups foreach (IGrouping <uint, Waypoint> secWp in secGroup) { //Create the secondary sub-folder XmlElement xeChannel = XmlHelper.CreateKmlFolderWithName(doc, "Channel " + secWp.Key); //Group all APs by mac address var apGroup = secWp.GroupBy(wp => wp.Extensions.MacAddress); //Loop to find the strongest points for each access point in this group foreach (IGrouping <string, Waypoint> apG in apGroup) { //Find the highest signal points int maxRssi = apG.Max(wp => wp.Extensions.Rssi); IEnumerable <Waypoint> wps = apG.Where(wp => wp.Extensions.Rssi == maxRssi); double avgLat = wps.Average(wp => wp.Latitude); double avgLon = wps.Average(wp => wp.Longitude); double avgEle = wps.Average(wp => wp.Elevation); xeChannel.AppendChild(XmlHelper.CreatePlacemark(doc, wps.First(), true, showLabels, false, true, avgLat, avgLon, avgEle)); } xePriFolder.AppendChild(xeChannel); } doc.GetElementsByTagName("Document").Item(0).AppendChild(xePriFolder); } break; case ApOrganization.ChannelThenEncryption: //Group APs by encryption var priGroup2 = points.GroupBy(wp => wp.Extensions.Channel).OrderBy(gd => gd.Key); //Loop through all security groups foreach (IGrouping <uint, Waypoint> priWp in priGroup2) { //Create primary group folder XmlElement xePriFolder = XmlHelper.CreateKmlFolderWithName(doc, "Channel " + priWp.Key); //Group by Channel var secGroup = priWp.GroupBy(wp => wp.Extensions.Security).OrderBy(gd => gd.Key); //Loop through all channel groups foreach (IGrouping <string, Waypoint> secWp in secGroup) { //Create the secondary sub-folder XmlElement xeChannel = XmlHelper.CreateKmlFolderWithName(doc, secWp.Key); //Group all APs by mac address var apGroup = secWp.GroupBy(wp => wp.Extensions.MacAddress); //Loop to find the strongest points for each access point in this group foreach (IGrouping <string, Waypoint> apG in apGroup) { //Find the highest signal points int maxRssi = apG.Max(wp => wp.Extensions.Rssi); IEnumerable <Waypoint> wps = apG.Where(wp => wp.Extensions.Rssi == maxRssi); double avgLat = wps.Average(wp => wp.Latitude); double avgLon = wps.Average(wp => wp.Longitude); double avgEle = wps.Average(wp => wp.Elevation); xeChannel.AppendChild(XmlHelper.CreatePlacemark(doc, wps.First(), true, showLabels, false, true, avgLat, avgLon, avgEle)); } xePriFolder.AppendChild(xeChannel); } doc.GetElementsByTagName("Document").Item(0).AppendChild(xePriFolder); } break; default: break; } doc.Save(filename); }
private void ExportButtonClick(object sender, EventArgs e) { if (txtInFiles.Text.Trim() == string.Empty) { MessageBox.Show(Localizer.GetString("ErrorNoLogFileSelected"), Localizer.GetString("Error"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (txtOutDir.Text.Trim() == string.Empty) { MessageBox.Show(Localizer.GetString("ErrorKmlDirectoryMissing"), Localizer.GetString("Error"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!txtOutDir.Text.EndsWith("\\")) { txtOutDir.AppendText("\\"); } _outPath = txtOutDir.Text; //Append the log filename to the directory path int lastS = _inFiles[0].LastIndexOf('\\'); int lastP = _inFiles[0].Substring(lastS).LastIndexOf('.'); _outPath += _inFiles[0].Substring(lastS).Remove(lastP) + "\\"; try { //Create the output directory System.IO.Directory.CreateDirectory(_outPath); } catch (UnauthorizedAccessException ex) { MessageBox.Show(string.Format("{0}\r\n\r\n{1}", ex.Message, Localizer.GetString("ErrorExportDirectory")), Localizer.GetString("Error")); return; } catch (DirectoryNotFoundException ex) { MessageBox.Show(ex.Message, Localizer.GetString("Error")); return; } //All is well, let's go Waypoint[] allPoints; try { //Load all files. An array is required because all KML classes accept arrays allPoints = GpxIO.ReadGpxFiles(_inFiles).ToArray(); } catch (IOException) { //This happens when the file is locked by another process or WirelessFireless is still logging to it. MessageBox.Show( Localizer.GetString("GpxFileOpenError"), Localizer.GetString("Error"), MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //Filter data WaypointFilterArgs farg = new WaypointFilterArgs { GpsFixLost = chGPSFixLost.Checked, GpsLockedUp = chGPSLockup.Checked, MaximumSpeedKmh = chMaxSpeed.Checked ? (int)numMaxSpeed.Value : -1, MaxSignal = chMaxSignal.Checked ? (int)numMaxSignal.Value : -1, MinimumSatsVisible = chGPSsatCount.Checked ? (int)numSatCount.Value : -1 }; allPoints = KmlWriter.FilterData(allPoints, farg); ApOrganization group = (ApOrganization)cmbOrganize.SelectedIndex; if (chExportSummary.Checked) //Export a summary file { if (!System.IO.File.Exists(_outPath + "Summary.kml") || MessageBox.Show(Localizer.GetString("WarningSummaryKmlExists"), Localizer.GetString("FileExists"), MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { KmlWriter.WriteSummaryKml(allPoints, _outPath + "Summary.kml", group, chShowRssiMarkers.Checked); } } if (chExportComp.Checked) //Comprehensive { if (!System.IO.File.Exists(_outPath + "Comprehensive.kml") || MessageBox.Show(Localizer.GetString("WarningComprehensiveKmlExists"), Localizer.GetString("FileExists"), MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { KmlWriter.WriteComprehensiveKml(allPoints, _outPath + "Comprehensive.kml", group, chShowRssiMarkers.Checked); } } if (chExportEachAp.Checked) //Export each AP to ./APs/{SSID}.kml { KmlWriter.WriteAccessPointKml(allPoints, _outPath, chShowRssiMarkers.Checked); } MessageBox.Show(Localizer.GetString("ExportComplete"), Localizer.GetString("Finished"), MessageBoxButtons.OK); }
public static void WriteComprehensiveKml(IEnumerable <Waypoint> points, string filename, ApOrganization groupby, bool showLabels) { XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version=\"1.0\" ?><kml><Document><name>Comprehensive Data</name></Document></kml>"); XmlElement xe; //XmlElement xe2; XmlElement xe3; switch (groupby) { case ApOrganization.EncryptionThenChannel: var grouped = points.GroupBy(wp => wp.Extensions.Security).OrderBy(gd => gd.Key); foreach (IGrouping <string, Waypoint> waypoint in grouped) { //Create folder element xe = XmlHelper.CreateKmlFolderWithName(doc, waypoint.Key); //doc.CreateElement("Folder"); var g2 = waypoint.GroupBy(wp => wp.Extensions.Channel).OrderBy(ch => ch.Key); foreach (IGrouping <uint, Waypoint> grouping in g2) { //Create sub-folder xe3 = XmlHelper.CreateKmlFolderWithName(doc, "Channel " + grouping.Key); //doc.CreateElement("Folder"); //Group all points by mac address var apgroup = grouping.GroupBy(wp => wp.Extensions.MacAddress); //Add points to parent element WriteSubItems(doc, apgroup, xe3, showLabels); //Add the channel folder to the parent security folder xe.AppendChild(xe3); } //Add the security folder to the main document doc.GetElementsByTagName("Document").Item(0).AppendChild(xe); } //Save kml file doc.Save(filename); break; case ApOrganization.ChannelThenEncryption: var groupedc = points.GroupBy(wp => wp.Extensions.Channel).OrderBy(gd => gd.Key); foreach (IGrouping <uint, Waypoint> waypoint in groupedc) { //Create folder element xe = XmlHelper.CreateKmlFolderWithName(doc, "Channel " + waypoint.Key); //doc.CreateElement("Folder"); var g2 = waypoint.GroupBy(wp => wp.Extensions.Security).OrderBy(ch => ch.Key); foreach (IGrouping <string, Waypoint> grouping in g2) { //Create sub-folder xe3 = XmlHelper.CreateKmlFolderWithName(doc, grouping.Key); //doc.CreateElement("Folder"); //Group all points by mac address var apgroup = grouping.GroupBy(wp => wp.Extensions.MacAddress); //Add points to parent element WriteSubItems(doc, apgroup, xe3, showLabels); //Add the channel folder to the parent security folder xe.AppendChild(xe3); } //Add the security folder to the main document doc.GetElementsByTagName("Document").Item(0).AppendChild(xe); } //Save kml file doc.Save(filename); break; default: break; } }