noqqe » blog | sammelsurium | photos | projects | about

Vor einer Weile hatte ich bereits mal einen Post über GPX Files mittels R zu visualisieren. Also wieder über Strava Einstellungen ein Archiv aller Aktivitäten anfordern, dann auspacken und im Ordner activities die GPX Dateien finden. Abhängigkeiten installieren:

$ R
> p <- c("plotKML", "maps", "ggmap")
> install.packages(p)

und die leicht aktualisierte Version als gist nach angepassten Einstellungen ausführen. Der Unterschied ist eigentlich nur das ich diesmal pro Jahr ein einzelnes File bekomme:

Sinn dahinter ist eigentlich, dass ich gerne ein GIF erstellt hätte, welches dann die Jahre einzeln durchscrollt. Das (mich immer wieder überraschende) ImageMagick gibt einem dafür convert zur Hand.

$ ls
.rw-r--r--  1.4M strava-progress-2011.png
.rw-r--r--  1.4M strava-progress-2012.png
.rw-r--r--  1.4M strava-progress-2013.png
.rw-r--r--  1.4M strava-progress-2014.png
.rw-r--r--  1.4M strava-progress-2015.png
.rw-r--r--  1.4M strava-progress-2016.png
.rw-r--r--  1.4M strava-progress-2017.png
.rw-r--r--  1.4M strava-progress-2018.png
$ convert  -delay 70 -loop 100 strava-progress-*.png strava-progress.gif

und das Ergebnis schaut ganz gut aus :)

Alles schön und gut, nur dauert die Erstellung der einzelnen Dateien ultra lange… Fast 40 Minuten muss man wie innerlich tot auf den Bildschirm starrend Lebenszeit verschwenden. Aber dann erinnerte ich mich an ein Gespräch <Werbung> am letzten Chaostreff Nürnberg </Werbung>.

Mittels GPS Simplification sollte es eigentlich möglich sein die Rechenzeit zu reduzieren. Wie viele Trackpoints brauche ich wohl um das Bild halbwegs repräsentativ darstellen zu können? TL;DR: 3%.

Um alle Trackpoints (<trkpt>) aller Jahre zu rendern brauche ich 38 Min. Wenn ich nun gpsbabel benutze um ein GPX File zu verkleinern,

gpsbabel -rt -i gpx -f 20180505-123412.gpx -x simplify,count=2000 -o gpx -F smoothed.gpx

Spannend dabei ist, dass man nicht einfach Werte in % bei count= angeben kann, sondern man eine absolute Zahl an Trackpoints angeben muss. Um meine Tracks angemessen reduzieren zu können muss ich die Gesamtzahl kennen und dann einen Prozentwert ausrechnen.

$ grep -c "trkpt" 20180505-123412.gpx
> 4000

Da ich aber mehr als 300 Aktivitäten von Strava heruntergeladen habe wollte ich das automatisieren. Zeit für etwas fish Shell.

for f in *-Ride.gpx
  set -l points (math (grep -c "trkpt" $f) / 30)
  gpsbabel -rt -i gpx -f $f -x simplify,count={$points} -o gpx -F SIMPLIFIED-$f
end

Natürlich hab ich etwas herumprobiert mit verschiedenen Verhältnissen, aber bei der Auflösung in denen ich meine Bilder generiere reichen mir gerade einmal ~3% der Trackpoints um nahezu das gleiche Bild zu erzeugen:

… und die Dauer des Erzeugens sank von 38 auf 3 Minuten.