martin-ueding / geo-activity-playground

Data analysis and visualization based on GPS tracked outdoor activities.
https://martin-ueding.github.io/geo-activity-playground/
MIT License
35 stars 14 forks source link

GPX Datei bearbeiten #156

Open ragnar76 opened 2 months ago

ragnar76 commented 2 months ago

Hallo,

denkst du es wäre möglich geo-activity-playground dahingehend zu erweitern dass man "Kind", "Commute" und "Equipment" hinzufügen kann? Es muss ja nicht inder GPX Datei selber sein, es würde evtl auch eine Liste in den Settings reichen in der ein paar (editierbare) Einträge stehen die man dann mit einer Select Box auswählen kann. Dann würde im Sharepic auch nicht überall "Unknown" stehen.

martin-ueding commented 2 months ago

Bisher war mein Ansatz, dass man keine Metadaten parallel pflegt, sondern diese alle in den Dateien oder der Ordnerstruktur stecken. Ich habe meine Dateien in zwei Ebenen Ordnern drin:

Bildschirmfoto_20240907_120801

Und dann nutze ich Reguläre Ausdrücke, um aus den Pfaden die Metadaten zu extrahieren:

Bildschirmfoto_20240907_120844

Bildschirmfoto_20240907_120854

Das hier sind meine:

(?P<kind>[^/]+)/(?P<equipment>[^/]+)/(?P<name>[^/]+)/
(?P<kind>[^/]+)/(?P<equipment>[^/]+)/[-\d_ .]+(?P<name>[^/\.]+)
(?P<kind>[^/]+)/[-\d_ .]+(?P<name>[^/\.]+)

Der erste extrahiert aus der dritten Ebene. Wenn ich Strecken regelmäßig fahre, habe ich noch einen Ordner ganz tief drin. Also etwas wie Radfahrt/Radon/Zuhause zu Büro/2024-01-01 00-00-00.fit. Der zweite macht dann die anderen Fahrten, wie Radfahrt/Radon/2024-01-01 00-00-00 Zuhause zu Büro.fit. Und der letzte macht jene, bei denen es kein Equipment gibt.

Kannst du damit etwas anfangen?

ragnar76 commented 2 months ago

Hmmm.... Ich hab bisher alles in Activities reingekippt. Auch die Uploads landen ja dort. Was würden denn passieren wenn ich nach dem Beispiel oben sortieren würde?

martin-ueding commented 1 month ago

Bei den Uploads kannst du einen Unterordner auswählen, falls diese schon existieren.

Wenn du das nach dem Beispiel sortierst und die "metadata extraction regexes" entsprechend einträgst, dann sollten die Variablen Kind und Equipment entsprechend aus den Pfaden ausgelesen werden.

Eine Abbildung für Commute habe ich damit bisher nicht sinnvoll bekommen. Da müsste ich noch eine Kleinigkeit einbauen. Wahrscheinlich ist es von der Struktur her am einfachsten, dass man sich einen Ordner Commute noch anlegt und die Anwesenheit dieses Namens im Pfad dann das ganze auf commute stellt. Ehrlich gesagt werden Commutes aktuell aber nicht gesondert behandelt. Falls du dir da eine Unterscheidung an anderer Stelle konkret wünscht, kannst du gerne ein Ticket aufmachen; bisher hatte ich da keine Fantasie wie man das gut nutzen kann.

ragnar76 commented 1 month ago

Ich hab jetzt die Unterordner erstellt und die GPX Datein nach dem Beispiel oben verschoben. Das hat erst funktioniert nachdem ich das "Cache" Verzeichniss gelöscht und neu erstellt habe. Nun wird aber der Dateiname nur noch mit "gpx" angegeben. Ich glaube, beim regex ist irgendwas faul aber ich bin da nicht so der Profi :face_with_diagonal_mouth:

grafik

martin-ueding commented 1 month ago

Das Problem ist, dass dein Dateiname nur aus Datum besteht und keinen Text enthält. Daher ist "gpx" der einzige Text.

Willst du, dass dann als Name dieses Datum genutzt wird?

ragnar76 commented 1 month ago

Das macht die Android APP die ich nutze und aus Faulheit kippe ich die in den playground rein und benenne die dann nicht um. Also ja, als Name dann das Datum

beautiful-orca commented 1 month ago

Dieses Regex müsste name nach dem letzten / bis zum nächsten . extrahieren: (?P<kind>[^/]+)/(?P<equipment>[^/]+)/(?P<name>[^/.]+)

ragnar76 commented 1 month ago

Probier ich heute im laufe des Tages. (Hättest dir deswegen nicht die Nacht um die Ohren hauen brauchen :smile: )

ragnar76 commented 1 month ago

Dieses Regex müsste name nach dem letzten / bis zum nächsten . extrahieren: (?P<kind>[^/]+)/(?P<equipment>[^/]+)/(?P<name>[^/.]+)

Läuft :smile:

beautiful-orca commented 1 month ago

erweitern dass man "Kind", "Commute" und "Equipment" hinzufügen kann

Um das im Live-Betrieb zu ändern müsste das Program in den Playground Ordner schreiben können und in die Ordnerstruktur sortieren. Änderungen würden dann vermutlich nicht sofort umgesetzt, da die Dateien neu eingelesen werden müssten??

Um die Dateien selbst nicht zu ändern könnte man sidecar Dateien verwenden (kenne ich vom Bilder sortieren in digiKam). Die Metadaten des sidecars müssten dann Vorrang vor den in den Aktivitäts-Dateien eventuell enthaltenen Metadaten und der durch Ordnerstruktur/Regex festgelegten Variablen (Kind,Equipment) haben.

Ich finde das macht es doch etwas kompliziert. Die Ordnerstruktur ist sehr in Ordnung.

Eine Konfiguration, die Commute (außer bei Strava exports?) berücksichtigt fehlt allerdings oder kann man das jetzt schon über eine Regex capture group? Es gibt Vor und Nachteile wierum man directories ordnet, es sollte also kein Standard sein, aber dennoch dokumentiert werden. Also zb. /kind/commute/equipment/name oder/kind/equipment/commute/name.

In der Dokumentation zu activity files steht bisher der Vorschlag alle Commutes in einen Ordner zu packen, sodass der Name für alle Aktivitäten darin gleich ist.

ragnar76 commented 1 month ago

Ich würde gar nicht so kompliziert denken und dachte eher an eine Lösung innerhalb der Datenbank (sofern eine genutzt wird)

beautiful-orca commented 1 month ago

Ich weiß nicht wie persistent die Änderungen in der Datenbank sind. Wird die Datenbank nicht unter Umständen neu angelegt wenn Dateien neu eingelesen werden oder gelöscht wurden? Martin weiß aber besser was technisch möglich ist.

martin-ueding commented 1 month ago

Bei mir ist gerade privat viel los, daher komme ich aktuell nicht so ganz hinterher. Danke, dass ihr schon so fleißig diskutiert habt.

Anfänglich habe ich mit das Programm als reinen Betrachter von einer festen Datenstruktur konzipiert. Mir war wichtig, dass es nicht die Daten der Nutzer:innen verändert oder merkwürdige Dinge tut. Daher werden die Dateien nicht verändert.

Die Datenbank enthält nur Informationen, die aus den Dateien und der Verzeichnisstruktur extrahiert worden sind. Wenn man nun Einträge in der Datenbank verändert, ist sie nicht nur ein Zwischenspeicher sondern Teil der Daten. Das habe ich bisher versucht zu vermeiden.

Eine zusätzliche Datei mit Änderungen könnte man machen, erzeugt aber auch wieder zusätzliche Komplexität, wo ich auch erstmal vorsichtig wäre. Man könnte auch die Dateien verschieben, aber das kann auch wieder zu Problemen führen, weil ja keine Orderstruktur vorgegeben ist.

Es geht euch darum, dass man die Metadaten aus dem Web-Frontend verändern kann, oder?

ragnar76 commented 1 month ago

Alles gut, kein Stress! Das ist schließlich unser Hobby und keine Zwangsveranstaltung ;)

Ich glaube, wenn man zusätzliche Metadaten im Web-Frontend eintragen kann, dann wäre das wohl am einfachsten.

Am 9. Oktober 2024 20:41:25 MESZ schrieb Martin Ueding @.***>:

Bei mir ist gerade privat viel los, daher komme ich aktuell nicht so ganz hinterher. Danke, dass ihr schon so fleißig diskutiert habt.

Anfänglich habe ich mit das Programm als reinen Betrachter von einer festen Datenstruktur konzipiert. Mir war wichtig, dass es nicht die Daten der Nutzer:innen verändert oder merkwürdige Dinge tut. Daher werden die Dateien nicht verändert.

Die Datenbank enthält nur Informationen, die aus den Dateien und der Verzeichnisstruktur extrahiert worden sind. Wenn man nun Einträge in der Datenbank verändert, ist sie nicht nur ein Zwischenspeicher sondern Teil der Daten. Das habe ich bisher versucht zu vermeiden.

Eine zusätzliche Datei mit Änderungen könnte man machen, erzeugt aber auch wieder zusätzliche Komplexität, wo ich auch erstmal vorsichtig wäre. Man könnte auch die Dateien verschieben, aber das kann auch wieder zu Problemen führen, weil ja keine Orderstruktur vorgegeben ist.

Es geht euch darum, dass man die Metadaten aus dem Web-Frontend verändern kann, oder?

-- Reply to this email directly or view it on GitHub: https://github.com/martin-ueding/geo-activity-playground/issues/156#issuecomment-2403040072 You are receiving this because you authored the thread.

Message ID: @.***>

martin-ueding commented 2 weeks ago

Ich habe jetzt für 0.31.0 etwas eingebaut, mit dem man das bearbeiten kann:

Bildschirmfoto_20241101_190701

Bildschirmfoto_20241101_190710

Dabei ist die Idee, dass man dort nur die Metadaten ändert, die man überschreiben will. Den Rest lässt man leer.

So richtig glücklich bin ich damit aber noch nicht. Diese Änderungen werden in zusätzlichen Dateien abgelegt. Damit ist jetzt noch eine Ebene vorhanden. Allerdings ist bisher auch immer die Prämisse gewesen, dass man den Ordner Cache löschen kann. Und dort liegt keine echte Datenbank, da liegt eine Parquet-Datei mit einem Data Frame. Es ist also letztlich nur eine Tabelle, die anhand der Metadaten aufgebaut wird. Dieser Data Frame enthält nichts, was nicht aus den Dateien rekonstruierbar ist. Um Dinge zu ändern, sie gleichzeitig aber rekonstruierbar halten bedeutet dann, dass man diese zusätzlichen Daten dann nochmal separat ablegen muss.

Strava macht es halt anders, es vereinnahmt die Daten und zwingt einen dann über deren System die Metadaten zu ändern. Danach ist die Strava-Datenbank die Quelle der Wahrheit. Bisher wollte ich vermeiden, dass diese Datenbank hier eine Quelle der Wahrheit wird und wollte die Aktivitäts-Dateien als jene nutzen.

Irgendwie wäre ein Drop-Down mit Kind/Equipment schick, aber wenn man dann etwas neues angeben will, braucht man doch wieder ein Textfeld. Bei Strava wird man gezwungen das Equipment anzulegen und dann kann man es auswählen. Das ist hier ja anders, weil es aus den Ordnern und Dateinamen konstruiert wird. Ich selbst habe wenig Lust meine ~3000 Aktivitäten über ein Web-Frontend zu sortieren und will das über das Dateisystem machen.

Schaut mal, ob das so etwas ist, was euch näher kommt.

ragnar76 commented 2 weeks ago

Irgendwas crasht da

Traceback (most recent call last): File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1473, in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 882, in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 880, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 865, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(*view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/geo_activity_playground/webui/authenticator.py", line 39, in wrapped_route return route(args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^ File "/app/geo_activity_playground/webui/activity/blueprint.py", line 98, in edit repository.save() File "/app/geo_activity_playground/core/activities.py", line 168, in save self._meta.to_parquet(activities_file()) ^^^^^^^^^^ AttributeError: 'ActivityRepository' object has no attribute '_meta'. Did you mean: 'meta'?

martin-ueding commented 1 day ago

Sorry about that, that will be fixed in 0.33.1 which I'll release later in the evening.