static void Main(string[] args) { TextDatei textDatei = new TextDatei(); int state = 0; bool exit = false; bool argsFertig = false; bool startWithArgs = false; string file_path_gesamt = ""; // Gesamter Pfad der Datei. Zum Beispiel: "F:\\Dropbox\\Schlapphut-Projekt\\GPS-Files\\20180628.SLP" string dir_path = ""; // Pfad zum Verzeichnis der Datei. Zum Beispiel: "F:\\Dropbox\\Schlapphut-Projekt\\GPS-Files" string file_name = ""; // Name der Datei. Zum Beispiel: "20180628" string file_type = ""; // Dateityp der Datei. Zum Beispiel: "SLP" const string dir_kml = "\\KML"; // Unterverzeichnis, in welchem die konvertierte KML-Datei gespeichert wird SlpType slpFileType = SlpType.None; // Der Typ der SLP-Datei List <String> file_lines = new List <string>(); // Fuer KML-Dokument var root = new Document(); root.Open = true; // Bei Google-Earth das Tree-Menu ausklappen // Erstelle Styles Style normalStyle = CreateNormalSyle(); Style highlightStyle = CreateHighlightSyle(); StyleSelector styleSelector = createPlacemarkLineStyleMap(normalStyle, highlightStyle); // Weise Styles zu root.AddStyle(normalStyle); root.AddStyle(highlightStyle); root.AddStyle(styleSelector); Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine("KML Converter v1.0 (c) Axfire123, June 2018\r\n"); Console.ResetColor(); while (!exit) { switch (state) { case -1: // Reset { Console.WriteLine("\r\n\r\n"); state = 0; break; } case 0: // Dateipfad einlesen { // Prüfen, ob beim Programmaufruf eine oder mehrere // Zeichenfolgen übergeben worden sind if ((args.Length == 0) || (argsFertig == true)) { Console.WriteLine("Bitte ziehe eine SLP-Datei in das Fenster und bestätige mit Enter\r\n"); //Console.ResetColor(); file_path_gesamt = Console.ReadLine(); if (file_path_gesamt == String.Empty) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Es wurde keine Datei ausgewählt!"); state = -1; } else { state = 1; } } else { file_path_gesamt = args[0]; state = 1; startWithArgs = true; } break; } case 1: // Untersuche einzulesende Datei { dir_path = getDirFromPath(file_path_gesamt); file_name = getNameFromPath(file_path_gesamt); file_type = getFileTypeFromPath(file_path_gesamt); // püfe auf richtiges Dateiformat if (file_type.ToLower() != "slp") { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Die gewählte Datei ist vom falschen Typ. Es werden nur .txt Dateien unterstützt!"); Console.ResetColor(); state = -1; } else { state = 2; } // break; } case 2: // Datei einlesen { try { // Lese Datei ein for (int i = 0; i < textDatei.getNumberOfLines(file_path_gesamt); i++) { file_lines.Add(textDatei.ReadLine(file_path_gesamt, i + 1)); } if (file_lines.Count != 0) { Console.WriteLine("Datei \"{0}.slp\" erfolgreich eingelesen", file_name); state = 6; } else { Console.WriteLine("Aus Datei \"{0}.slp\" konnte keine Zeilen gelesen werden", file_name); state = -1; } } catch (Exception ex) { Console.WriteLine("Datei \"{0}.slp\" konnte nicht gelesen werden", file_name); Console.WriteLine(ex.Message); state = -1; } break; } case 6: // Typ der SLP-Datei prüfen. Handelt es sich um Tracks oder Points? { // In der ersten Zeile der SLP-Datei sollte der Typ stehen if (file_lines[0] == "TYPE=TRACK") { state = 3; slpFileType = SlpType.Track; Console.WriteLine("TYPE=TRACK in \"{0}.slp\" gefunden", file_name); } else if (file_lines[0] == "TYPE=POINT") { state = 7; slpFileType = SlpType.Point; Console.WriteLine("TYPE=POINT in \"{0}.slp\" gefunden", file_name); } else { state = 3; slpFileType = SlpType.Track; Console.WriteLine("Keine Version in \"{0}.slp\" gefunden. Gehe von TYPE=TRACK aus", file_name); } break; } case 3: // Version Track: Zeilen der Datei konvertieren und zu Track hinzufuegen { double lat; double lon; DateTime dateTime; bool trackAnfang; bool ersterTrackGefunden = false; int placemarkNumber = 1; var track = new SharpKml.Dom.GX.Track(); Placemark placemark = new Placemark(); placemark.Name = "Track " + placemarkNumber; placemark.Open = true; // Bei Google-Earth das Tree-Menu ausklappen for (int i = 0; i < file_lines.Count; i++) { if (parseLine(file_lines[i], out lat, out lon, out dateTime, out trackAnfang)) { // Wurde ein Trackanfang gefunden if (trackAnfang) { // Handel es sich um den ertsen Track der Datei if (ersterTrackGefunden == false) { // ja => mache nichts ersterTrackGefunden = true; } else { // nein => speicher aktuellen Track ab // hat Track ueberhaupt Inhalt? if (track.Coordinates.Count() > 0) { // Weise Styleselector zu placemark.StyleUrl = new Uri(String.Format("#{0}", styleSelector.Id), UriKind.Relative); // Placemark Description DateTime start = track.When.ElementAt(0); // Hole das Startdatum des Tracks DateTime ende = track.When.ElementAt <DateTime>(track.When.Count() - 1); // Hole das Enddatum des Tracks SharpKml.Dom.Description description = new Description(); description.Text = String.Format("Start: {0}\nEnde: {1}\nZeit: {2} Minuten", start.ToLongTimeString(), ende.ToLongTimeString(), Convert.ToInt16(ende.Subtract(start).TotalMinutes)); placemark.Description = description; // Placemark Geometry / Inhalt placemark.Geometry = track; // Fuege Track hinzu root.AddFeature(placemark); // Placemark Nummer erhoehen placemarkNumber++; } // Neue Instanzen bilden track = new SharpKml.Dom.GX.Track(); placemark = new Placemark(); placemark.Name = "Track " + placemarkNumber; } } else { // speicher Koordinaten-Daten in Track var vector = new Vector(lat, lon); track.AddCoordinate(vector); track.AddWhen(dateTime); } } } // speicher ggf. letzten Track ab if (track.When.Count() > 0) { // Weise Styleselector zu placemark.StyleUrl = new Uri(String.Format("#{0}", styleSelector.Id), UriKind.Relative); // Placemark Description DateTime start = track.When.ElementAt(0); // Hole das Startdatum des Tracks DateTime ende = track.When.ElementAt <DateTime>(track.When.Count() - 1); // Hole das Enddatum des Tracks SharpKml.Dom.Description description = new Description(); description.Text = String.Format("Start: {0}\nEnde: {1}\nZeit: {2} Minuten", start.ToLongTimeString(), ende.ToLongTimeString(), Convert.ToInt16(ende.Subtract(start).TotalMinutes)); placemark.Description = description; // Placemark Geometry / Inhalt placemark.Geometry = track; // Fuege Track hinzu root.AddFeature(placemark); } state = 4; break; } case 7: // Type Point: Zeilen der Datei konvertieren und zu Point hinzufuegen { double lat; double lon; DateTime dateTime; bool trackAnfang; // Auch wenn es beim Poit keinen Trackanfang gibt, wird die Variabel fuer die Funktion gebraucht int placemarkNumber = 1; for (int i = 0; i < file_lines.Count; i++) { if (parseLine(file_lines[i], out lat, out lon, out dateTime, out trackAnfang)) { // Wurde ein Trackanfang gefunden if (trackAnfang) { continue; // es gibt beim Point keinen Trackanfang... } else { var point = new SharpKml.Dom.Point(); Placemark placemark = new Placemark(); placemark.Name = "Point " + placemarkNumber++; placemark.Open = true; // Bei Google-Earth das Tree-Menu ausklappen // Speicher Daten in Point Vector vector = new Vector(lat, lon); point.Coordinate = vector; // Erzeuge Placemark-Beschreibung SharpKml.Dom.Description description = new Description(); description.Text = String.Format("Datum: {0}\nUhrzeit: {1}", dateTime.ToLongDateString(), dateTime.ToLongTimeString()); placemark.Description = description; // Fuege den Point dem Placemark hinzu placemark.Geometry = point; // Fuege den Placemark dem Dokument hinzu root.AddFeature(placemark); } } } state = 4; break; } case 4: // KML-File erstellen { KmlFile kml = KmlFile.Create(root, false); try { String kmlDirPath = dir_path + dir_kml; // Pfad zum Verzeichnis // KML-File Name // konvertiere den "yyMMdd" Namen der SLP-Datei in das besser lesbare "yy-MM-dd" Format String kml_file_name = String.Empty; try { DateTime dateTime = DateTime.ParseExact(file_name, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); kml_file_name = dateTime.ToString("yyyy-MM-dd"); } catch { kml_file_name = file_name; } // // SLP-Typ als Name anhaengen if (slpFileType == SlpType.Track) { kml_file_name += " Track"; } else if (slpFileType == SlpType.Point) { kml_file_name += " Point"; } String kmlFilePath = kmlDirPath + "\\" + kml_file_name + ".kml"; // Pfad zur Datei // Directory erzeugen, falls nicht vorhanden if (!Directory.Exists(kmlDirPath)) { Directory.CreateDirectory(kmlDirPath); } // Speicher using (FileStream stream = File.OpenWrite(kmlFilePath)) { kml.Save(stream); } Console.WriteLine("KML-Datei \"{0}.kml\" wurde erfolgreich gespeichert", file_name); } catch (Exception ex) { Console.WriteLine("KML-Datei \"{0}.kml\" konnte nicht gespeichert werden", file_name); Console.WriteLine(ex.Message); } root = new Document(); root.Open = true; // Bei Google-Earth das Tree-Menu ausklappen state = 5; break; } case 5: // Wie gehts weiter? if (startWithArgs) { exit = true; // warte x Sekunden, bis Programm geschlossen wird Console.Write("Programm wird beendet "); System.Threading.Thread.Sleep(100); Console.Write("."); System.Threading.Thread.Sleep(100); Console.Write("."); System.Threading.Thread.Sleep(100); Console.Write("."); System.Threading.Thread.Sleep(100); Console.Write("."); System.Threading.Thread.Sleep(100); Console.Write("."); System.Threading.Thread.Sleep(100); Console.Write("."); System.Threading.Thread.Sleep(100); Console.Write("."); System.Threading.Thread.Sleep(100); Console.Write("\r\nBey!"); System.Threading.Thread.Sleep(500); } else { state = -1; } break; } } }
public static void GenerateTourKml(Track track, string kmlFilePath) { //var animationUpdate = new SharpKml.Dom.GX.AnimatedUpdate(); //animationUpdate.Duration = 6.5; //animationUpdate.Update = new Update(); //animationUpdate.Update.AddUpdate(new ChangeCollection //{ // new IconStyle { TargetId = "iconstyle", Scale = 10.0 } //}); var tour = new SharpKml.Dom.GX.Tour(); tour.Name = "Play"; tour.Playlist = new SharpKml.Dom.GX.Playlist(); //tour.Playlist.AddTourPrimitive(animationUpdate); var trackPoint = TrackPointDao.GetTrackPoints(track); if (trackPoint.Count == 0) { return; } for (int i = 0; i < trackPoint.Count; ++i) { var p = trackPoint[i]; if (p.Heading == 0) { continue; } var flyTo = new SharpKml.Dom.GX.FlyTo(); if (i == trackPoint.Count - 1) { flyTo.Duration = 10; } else { var ts = trackPoint[i + 1].GpsTime - p.GpsTime; flyTo.Duration = Math.Max(1, ts.TotalSeconds / 5); } flyTo.View = new Camera { Longitude = p.Longitude, Latitude = p.Latitude, Altitude = p.Altitude, Heading = p.Heading, Tilt = 80, Roll = 0 }; flyTo.Mode = SharpKml.Dom.GX.FlyToMode.Smooth; tour.Playlist.AddTourPrimitive(flyTo); //var wait = new SharpKml.Dom.GX.Wait(); //wait.Duration = 1; //tour.Playlist.AddTourPrimitive(wait); } var document = new Document(); document.Name = "PlayTrack " + track.ID.ToString(); document.Open = true; document.AddStyle( new Style { Id = "style0", Icon = new IconStyle { Id = "iconstyle", Scale = 1.0 } }); document.AddFeature( new Placemark { Id = "Track Start " + track.ID.ToString(), Name = "Start", StyleUrl = new Uri("#style0", UriKind.Relative), Geometry = new Point { Coordinate = new Vector(trackPoint[0].Latitude, trackPoint[0].Longitude, trackPoint[0].Altitude) } }); document.AddFeature(tour); SharpKml.Dom.GX.Track t = new SharpKml.Dom.GX.Track(); t.Id = "Track Track " + track.ID.ToString(); for (int i = 0; i < trackPoint.Count; ++i) { var p = trackPoint[i]; t.AddWhen(p.GpsTime.ToString("yyyy-MM-ddTHH:mm:ssZ")); t.AddCoordinate(new Vector(p.Latitude, p.Longitude, p.Altitude)); } Placemark placemark = new Placemark(); placemark.Name = "All"; placemark.Geometry = t; document.AddFeature(placemark); // Quick way to save the output var kml = new Kml { Feature = document }; AddNamespace(kml, "gx", "http://www.google.com/kml/ext/2.2"); KmlFile.Create(kml, false).Save(kmlFilePath); }