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)
+++ src/org/openstreetmap/josm/gui/layer/GpxLayer.java  (working copy)
@@ -793,7 +793,7 @@
            {
                for (WayPoint w : data.waypoints) {
                        if (waypoints.contains(w)) { continue; }
-                       WayPoint wNear = nearestPointOnTrack(w.eastNorth, 
10.0e-7 /* about 25m */);
+                       WayPoint wNear = nearestPointOnTrack(w.eastNorth, 
1.0e-3/* 10.0e-7 too small */ /* about 25m */);
                        if (wNear != null) {
                                WayPoint wc = new WayPoint(w.latlon);
                                wc.time = wNear.time;
Index: src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxReader.java        (revision 800)
+++ src/org/openstreetmap/josm/io/GpxReader.java        (working copy)
@@ -223,14 +223,16 @@
                                }
                                break;
                        case wpt:
-                               if (qName.equals("ele") || qName.equals("desc")
-                                               || qName.equals("magvar") || 
qName.equals("geoidheight")
-                                               || qName.equals("name") || 
qName.equals("sym") 
-                                               || qName.equals("cmt") || 
qName.equals("type")) {
+                               if (qName.equals("ele") || 
qName.equals("magvar")
+                                               || qName.equals("geoidheight") 
|| qName.equals("name")
+                                               || qName.equals("sym") || 
qName.equals("type")) {
                                        currentWayPoint.attr.put(qName, 
accumulator.toString());
                                } else if (qName.equals("time")) {
                                        currentWayPoint.attr.put(qName, 
accumulator.toString());
                                        currentWayPoint.setTime();              
                        
+                               } else if (qName.equals("cmt") || 
qName.equals("desc")) {
+                                       currentWayPoint.attr.put(qName, 
accumulator.toString());
+                                       
currentWayPoint.setGarminCommentTime(qName);                                    
                                } else if (qName.equals("rtept")) {
                                        currentState = states.pop();
                                        
currentRoute.routePoints.add(currentWayPoint);

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Talk-de mailing list
Talk-de@openstreetmap.org
http://lists.openstreetmap.org/listinfo/talk-de

Antwort per Email an