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); }
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; } } }
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()); } } } } }