Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        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);
        }