Пример #1
0
        public double distanceBetween(gpsFix otherFix)
        {
            // returns distance in meters between two positions, both specified
            // as signed decimal-degrees latitude and longitude. Uses great-circle
            // distance computation for hypothetical sphere of radius 6372795 meters.
            // Because Earth is no exact sphere, rounding errors may be up to 0.5%.
            // Courtesy of Maarten Lamers
            double radians(double degree)
            {
                return(Math.PI * degree / 180.0);
            }

            double delta  = radians(this.loclng - otherFix.loclng);
            double sdlong = Math.Sin(delta);
            double cdlong = Math.Cos(delta);
            double lat1   = radians(this.loclat);
            double lat2   = radians(otherFix.loclat);
            double slat1  = Math.Sin(lat1);
            double clat1  = Math.Cos(lat1);
            double slat2  = Math.Sin(lat2);
            double clat2  = Math.Cos(lat2);

            delta  = (clat1 * slat2) - (slat1 * clat2 * cdlong);
            delta *= delta; // zum Quadrat
            delta += Math.Pow(clat2 * sdlong, 2);
            delta  = Math.Sqrt(delta);
            double denom = (slat1 * slat2) + (clat1 * clat2 * cdlong);

            delta = Math.Atan2(delta, denom);
            return(delta * 6372795);
        }
Пример #2
0
        void extractDT()
        {
            int Jahr = 0, Monat = 0, Tag = 0, Stunde = 0, Minute = 0, Sekunde = 0;

            // nach Länge kann nicht gefragt werden, da beide Längen gleich sind
            int nPos = Name.IndexOf('-');

            //if (Name.Length == "JJJJMMTT-HHMM.dat".Length)  // neues Format
            if (nPos == 8) // neues Format
            {              // JJJJMMTT-HHMM.dat
                isNewNameFormat = true;
                Jahr            = int.Parse(Name.Substring(0, 4));
                Monat           = int.Parse(Name.Substring(4, 2));
                Tag             = int.Parse(Name.Substring(6, 2));
                Stunde          = int.Parse(Name.Substring(9, 2));
                Minute          = int.Parse(Name.Substring(11, 2));
                Sekunde         = 0;
            }
            else if (nPos == 6) // altes Format
            {                   // JJMMTT-HHMMSS.dat
                Jahr    = 2000 + int.Parse(Name.Substring(0, 2));
                Monat   = int.Parse(Name.Substring(2, 2));
                Tag     = int.Parse(Name.Substring(4, 2));
                Stunde  = int.Parse(Name.Substring(7, 2));
                Minute  = int.Parse(Name.Substring(9, 2));
                Sekunde = int.Parse(Name.Substring(11, 2));
            }
            else
            {
                Console.WriteLine("FEHLER: Dateiname '{0}' hat ein unbekanntes Format...", Name);
            }

            // Damit versuchen wirs zunächst:
            try
            {
                Startzeit = new DateTime(Jahr, Monat, Tag, Stunde, Minute, Sekunde);
            }
            catch (Exception)
            {
                IsValid = false;
            }
            if (!IsValid)
            {
                gpsFix fix = new gpsFix();
                IsValid = true;
                long counter = 0;
                using (FileStream s = File.OpenRead(Pfad + Path.DirectorySeparatorChar + Name))
                    using (BinaryReader r = new BinaryReader(s))
                    {
                        try
                        {
                            while (s.Position < s.Length && !fix.IsValidTimestamp)
                            {
                                fix = new gpsFix(r);
                                counter++;
                            }
                        }
                        catch
                        {
                            Console.WriteLine("FEHLER: Datei {0} konnte nicht gelesen werden...", Pfad + Path.DirectorySeparatorChar + Name);
                        }
                        try
                        {
                            Startzeit = new DateTime(fix.Timestamp.Year, fix.Timestamp.Month, fix.Timestamp.Day, Stunde, Minute, Sekunde);
                        }
                        catch (Exception)
                        {
                            IsValid = false;
                        }
                    }
                if (!fix.IsValidTimestamp)
                {
                    Console.WriteLine("FEHLER: Datum der Datei {0} konnte nicht bestimmt werden.", Pfad + Path.DirectorySeparatorChar + Name);
                    Console.WriteLine("        Insgesamt {0} Wegpunkt{1} und keine Datumsangabe. Datei wird ignoriert ({2} bytes)", counter, counter > 1 ? "e" : "", Groesse);
                    IsValid = false;
                }
            }
        }
Пример #3
0
        static void Main(string[] args)
        {
            Configuration conf = new Configuration(args);

            if (conf.IsValid)
            {
                /**
                 * Quelle:
                 * - Q1: (einzelne) Datei
                 * - Q3: Dateisuchmuster (z.B. "D:\temp\*.dat")
                 * Ziel:
                 * - Z1: (einzelne) Datei (bei Q1, Q3 = alle zusammenfassen)
                 * - Z2: Verzeichnis (Q1 = Dateiname wie Quelle mit .gpx, Q3 = alle Dateien wie Quelle mit .gpx)
                 *
                 * overwrite: bei allen Möglichkeiten
                 * daily: bei Q3, Zieldateiname wird aus Tagesdatum gebildet
                 */

                /**
                 * foreach Sourcefile
                 *   bilde Ausgabedateiname
                 *   wenn anders als aktiver:
                 *     neuen Namen bilden, footer in alte Datei und schließen, neue öffnen und header schreiben
                 */
                String       OutFilename    = "";
                String       oldOutFilename = "";
                StreamWriter outfile        = null;
                long         inFileCounter  = 0;
                long         outFileCounter = 0;
                gpsFix       oldfix         = new gpsFix();

                foreach (BinaryTrackFile trackFile in conf.SourceFiles)
                {
                    if (!conf.TargetIsDirectory)    // feste Ausgabedatei wurde angegeben - könnte also zum konnektieren kommen
                    {
                        OutFilename = conf.TargetPath;
                    }
                    else if (conf.DailyConnect)     // konnektieren gewünscht (auf täglicher Basis)
                    {
                        OutFilename = conf.TargetPath + Path.DirectorySeparatorChar + trackFile.DateString() + ".gpx";
                    }
                    else   // Einzelbehandlung - keine Konnektierung:
                    {
                        OutFilename = conf.TargetPath + Path.DirectorySeparatorChar + trackFile.OnlyName() + ".gpx";
                        //Console.WriteLine("Creating file '{0}'", OutFilename);
                    }
                    //-------------------
                    if (OutFilename != oldOutFilename)
                    {
                        // alte Datei schließen, neue öffnen
                        CloseOutFile(outfile);
                        outfile        = OpenOutFile(OutFilename, conf.ForceOverwrite);
                        oldOutFilename = OutFilename;
                        outFileCounter++;
                    }

                    // hier jetzt conversion...
                    using (FileStream s = File.OpenRead(trackFile.CurrentFullPath()))
                        // and BinaryReader to read values
                        using (BinaryReader r = new BinaryReader(s))
                        {
                            inFileCounter++;
                            Console.WriteLine("Converting {0} ({1}) -> {2}", trackFile.Name, trackFile.Startzeit, OutFilename);

                            // stop when reached the file end
                            while (s.Position < s.Length)
                            {
                                try
                                {
                                    gpsFix fix      = new gpsFix(r);
                                    double distance = fix.distanceBetween(oldfix);
                                    //TODO: wenn der Abstand zu groß ist, könnte der Track aufgeteilt werden...
                                    if (fix.IsValidTimestamp)
                                    {
                                        outfile.WriteLine(fix.getGPXstring());
                                    }
                                    oldfix = fix;
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine("ERROR READING FILE {0} - unerwartetes Ende des aufgezeichneten Tracks...{1} von {2}", trackFile.CurrentFullPath(), e.Message, e.Source);
                                    foreach (String key in e.Data.Keys)
                                    {
                                        Console.WriteLine("{0} = {1}", key, e.Data[key]);
                                    }
                                    Console.WriteLine("outfile = {0}", outfile.ToString());
                                    Console.WriteLine(e.StackTrace);
                                }
                            }
                        }
                }
                CloseOutFile(outfile);
                Console.WriteLine("{0} Datei{1} konvertiert. {2} Ausgabedatei{3} erzeugt.", inFileCounter, inFileCounter != 1 ? "en" : "", outFileCounter, outFileCounter != 1 ? "en" : "");
                foreach (BinaryTrackFile trackFile in conf.SourceFiles)
                {
                    // überprüfen, ob Dateiname mit Startzeit übereinstimmt - wenn nicht, dann Datei umbenennen
                    if (!trackFile.CurrentFullPath().Equals(trackFile.StartTimeFullPath()))
                    {
                        if (conf.Rename)
                        {
                            Console.WriteLine("Datei '{0}' wird umbenannt in '{1}'", trackFile.CurrentFullPath(), trackFile.StartTimeFullPath());
                            if (File.Exists(trackFile.StartTimeFullPath()))
                            {
                                Console.WriteLine("Fehler: Datei schon vorhanden - Umbennung wird nicht vorgenommen... (geht ja auch nicht)");
                            }
                            else
                            {
                                File.Move(trackFile.CurrentFullPath(), trackFile.StartTimeFullPath());
                            }
                        }
                        else
                        {
                            Console.WriteLine("Warnung: die Datei '{0}' sollte so heißen: '{1}' - ggf. /rename Option nutzen...", trackFile.CurrentFullPath(), trackFile.StartTimeFullPath());
                        }
                    }
                }
            }
        }