Suche Tool, um Trackpunkte in GPX-Dateien automatisiert zu reduzieren

Garmin fenix 7X und epix Gen 2 im Test

Der Schwerpunkt dieses Tests und Vergleichs der Garmin Fenix 7X Solar und Garmin Epix Gen 2 liegt auf den Sensoren wie Höhenmesser, Positionsbestimmung und Herzfrequenz. Was unterscheidet die beiden GPS-Outdoor-Smartwatches? Und wie gut ist die Taschenlampe der Fenix 7X für den Outdoorbereich? Hier geht es zum Test der Outdoor-Smartwatches ...
  • Hallo zusammen,


    kennt jemand ein (Windows-) Programm, um per Script die Anzahl der Trackpunkte in GPX-Dateien nach diversen Kriterien zu reduzieren, beispielsweise von vielen zu nahe beieinanderliegende Punkten alle bis auf einen entfernen?


    GPSBabel kann das über seine Filter, macht es auch recht gut, zerstört allerdings reproduzierbar die Struktur der GPX-Dateien bei XML-Elementen, die es nicht kennt. Und ich habe eben teilweise solche selbstgebauten Elemente drin, um sie automatisiert per PowerShell auszuwerten oder per Leaflet.js auf einer OSM-Karte anzuzeigen.


    Danke :)

  • Hm, schwierig. Mir fällt kein fertiges Tool ein, das wirklich Wert darauf legt die komplette Datenstruktur der GPX Datei so weit wie möglich zu erhalten. Das ist auch nicht ganz trivial. In der Regel will man ja nicht auf dem XML Baum arbeiten sondern auf einem Vektor der in einen Algorithmus passt.


    Wenn nicht noch jemand eine Idee hat wirst Du dir wahrscheinlich selber etwas in einer Scriptsprache wie z.B. Python schreiben müssen. Ein Anfang wäre vielleicht: https://github.com/Andrii-D/optimize-gpx


    Dort wird der Douglas-Peucker Algorithmus verwendet, der sehr gut beim Ausdünnen von Tracks ist. Für Pausenknödel ist der aber auch nicht wirklich geeignet.


    QMapShack hat einen Filter um Tracks auszudünnen (Douglas-Peucker) und auch einen Filter für die Pausenknödel. Zudem versucht es die Struktur der Trackdaten soweit wie möglich zu erhalten. Aber QMapShack ist leider eine GUI Applikation also kein scripting.

  • Datenschutz ist uns & Euch wichtig, daher verzichten wir auf Bannerwerbung & Web-Analysetools! Um das Forum zu unterstützen bitten wir Euch über diesen Link: bei Amazon zu bestellen....
    Für Euch ist das nur ein Klick, uns hilft es das Forum langfristig und werbefrei für Euch zu betreiben! Vielen vielen Dank...
  • Danke für den Tipp mit dem Python-Script, das werde ich mir auf alle Fälle mal genauer anschauen, zumal es nicht lang ist und die Hauptarbeit von einem Modul namens "rdp" gemacht wird, das genau diesen Algorithmus implementiert. Vielleicht kann ich das Script für meine Zwecke anpassen.


    GPSBabel löscht im übrigen unbekannte XML-Elemente nicht (wie es die meisten anderen Programme machen, die GPX-Dateien verarbeiten), sondern es hängt sie im XML-Baum an andere Stellen. "Meine" Erweiterungen, die unterhalb eines <trkseg> eingehängt sind, liegen anschließend entweder unterhalb von <trk> oder, ganz skurril, unterhalb irgendeines <trkpt> (!)


    (Zur Not muss ich da auf XML-Ebene rumpfuschen: Meine Erweiterungen rausschmeißen, gpsbabel drüberlaufen lassen, meine Erweiterungen wieder einbauen, oder so ähnlich.)

  • Falls es für nachfolgenden Zweck gedacht ist:


    Kein fertiges Programm zum Installieren und leider kostenpflichtig, aber m. W. passt MyRoutes hochgeladene GpX beim Upload der Strecke auf Navis von TT und Garmin auf die maximal erlaubte Menge von Zwischenzielen an.

  • Nochmals ich: Habe nun ein wenig mit dem Python-Script optimize-gpx.py herumgebastelt, und das Ding ist ein Volltreffer! Es basiert im Wesentlichen auf zwei Python-Modulen (gpxpy für das generelle Handling von GPX-Dateien und rdp für den Douglas-Peucker-Algorithmus). gpxpy behält explizit Extensions bei. optimize-gpx.py schreibt so wie es ist nur Extensions von Tracks und Trackpunkten, nicht aber diejenigen von Segmenten heraus, doch das konnte ich für meinen Bedarf fixen.


    Als Sahnehäubchen gibt's vom Autor von gpxpy noch ein Modul SRTM.py, das ebenfalls von optimize-gpx.py verwendet wird und das allen Trackpunkten eine Höhenangabe verpassen kann.


    gpxpy kann übrigens selbst auch Douglas-Peucker, ebenfalls mit Erhaltung der Extensions, damit wird das Ganze dann zum Zehnzeiler:


    Code
    import gpxpy
    
    filename_old = 'old.gpx'
    filename_simplified = 'simplified.gpx'
    gpx_file = open(filename_old, 'r')
    gpx = gpxpy.parse(gpx_file)
    gpx.simplify(max_distance=1)
    with open(filename_simplified, "w") as f:
        f.write(gpx.to_xml())


    (Etwas ausführlicher, falls es noch jemand brauchen kann.)


    Danke, @kiozen!

  • Datenschutz ist uns & Euch wichtig, daher verzichten wir auf Bannerwerbung & Web-Analysetools! Um das Forum zu unterstützen bitten wir Euch über diesen Link: bei Amazon zu bestellen....
    Für Euch ist das nur ein Klick, uns hilft es das Forum langfristig und werbefrei für Euch zu betreiben! Vielen vielen Dank...