Roland Ramthun wrote, on 19.08.2008 11:43:
Bodo Meissner schrieb:
Vielleicht könnte man in JOSM den Parser für GPX-Dateien erweitern, so
daß er diese Zeitangaben in cmt und desc auch versteht.
Das cmt-Attribut ist für Kommentare gedacht, exklusiv dort die Uhrzeit
reinzuschreiben ist nicht sinnvoll.
Hallo Roland,
da kann ich Dir nur zustimmen, aber das liegt wohl an Garmin. Wenn ich
die Daten mit MapSource aus meinem Gerät hole, bekomme ich auch kein
time-Feld, sondern die Zeit steht auch nur in cmt und desc.
MapSource versteht das time-Feld auch
Den Parser zu erweitern wäre also sehr komfortabel für den Benutzer,
aber im Grunde lt. Standard unnötig.
Da wir die Garmin-Firmware nicht ändern können, bleiben uns nur die
Möglichkeiten, den Konverter (gpsbabel?) oder JOSM entsprechend zu
erweitern.
Es wird doch noch jemand ein Garmin GPS mit Audio und JOSM benutzten?!
Wie macht ihr das?
Ich benutze ein Garmin, habe aber noch nie mit Audio gearbeitet, sondern
bisher nur mit Fotos. (Ich hätte sogar ein digitales Aufnahmegerät. Wäre
gut, wenn JOSM auch MP3-Dateien verwenden könnte.)
Ich hole die GPS-Datei über
gpsbabel -t -w -i garmin -f /dev/ttyUSB0 -o gpx -F track.gpx
Vorläufig könntest Du ein kleines Perl-Skript verwenden, das die
cmt-Zeilen auswertet und entsprechende time-Zeilen einfügt.
Ich habe mal probeweise mit einer von MapSource erzeugten GPX-Datei
experimentiert.
MapSource ist ziemlich unflexibel beim Auswerten, da kommt es auf die
Reihenfolge der Tags an. (vermutlich kein richtiger XML-Parser) Wenn die
time-Zeile nach der cmt-Zeile kommt, kann MapSource die Datei nicht
einlesen. NH-TopTrans kommt damit klar. Wenn ich dass aus NH-TopTrans
wieder eine GPX-Datei schreibe, ist MapSource mit dem Ergebnis
zufrieden, nur fehlen dann Garmin-spezifische Erweiterungen. Da steht
dann time zwischen ele und name. Wenn ich in der von MapSource
erzeugten GPX-Datei die time-Zeile an der gleichen Stelle einfüge,
kann MapSource die auch wieder lesen.
JOSM ist die Reihenfolge der XML-Tags egal.
Zusätzlich zu dem Problem, daß JOSM die Zeitangaben bisher nicht
auswerten kann, verwendet JOSM wohl ein zu kleines Limit für die
erlaubte Abweichung der Waypoints von den Trackpoints.
Ich habe das mal für den ersten Punkt 001 überprüft. JOSM erlaubt eine
Abweichung von 10.0e-7 (= 1.0e-6) mit einem Kommentar about 25m. Laut
GPS-Track-Analyse beträgt der Abstand ca. 0,4m. (Keine Ahnung, ob das
Programm richtig rechnet.)
Die größte Abweichung gibt es bei Punkt 036 mit ca. 2.9e-5, laut
GPS-Track-Analyse ca. 3,2m.
Durch experimentelles Verändern des Limits habe ich festgestellt, daß
bei 4.0e-4 nur noch Punkt 036 nicht zugeordnet wird, bei 5.0e-4 werden
sämtliche Punkte zugeordnet. (Weitere Zwischenwerte habe ich nicht
ausprobiert.)
Wenn ich die unterschiedliche Abweichung in x- und y-Richtung und die
Abhängigkeit von der geografischen Breite ignoriere, würde wohl ein
Limit von 3.5e-3 etwa 25m entsprechen.
Ich habe mal das Limit auf 1.0e-3 geändert und Code zum Parsen der
Garmin-Zeiteinträge in cmt und desc eingebaut.
Die unterschiedlichen Zeitzonen müssen aber außerhalb von JOSM
korrigiert werden. (keine Ahnung, ob gpsbabel das kann)
Bodo
Index: src/org/openstreetmap/josm/data/gpx/WayPoint.java
===
--- src/org/openstreetmap/josm/data/gpx/WayPoint.java (revision 800)
+++ src/org/openstreetmap/josm/data/gpx/WayPoint.java (working copy)
@@ -48,6 +48,30 @@
}
}
+ /**
+* Convert a time stamp of the waypoint from the cmt or desc field
+* into seconds from the epoch. Handles the date format as it is used
by
+* Garmin handhelds. Does not overwrite an existing timestamp (!= 0.0).
+* Does nothing if specified key does not exist or text cannot be
parsed.
+*
+* @param key The key that contains the text to convert.
+*/
+ public void setGarminCommentTime (String key) {
+ // do not overwrite time if already set
+ if (time != 0.0) {
+ return;
+ }
+ if (! attr.containsKey(key)) {
+ return;
+ }
+ // example date format 18-AUG-08 13:33:03
+ SimpleDateFormat f = new SimpleDateFormat(dd-MM-yy HH:mm:ss);
// ignore timezone
+ Date d = f.parse(attr.get(key).toString(), new
ParsePosition(0));
+ if (d != null /* parsing OK */) {
+ time = d.getTime() / 1000.0; /* ms = seconds */
+ }
+ }
+
public int compareTo(WayPoint w)
{
return Double.compare(time, w.time);
Index: src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===
--- src/org/openstreetmap/josm/gui/layer/GpxLayer.java (revision 805)
+++