{"id":129,"date":"2025-09-17T05:07:47","date_gmt":"2025-09-17T05:07:47","guid":{"rendered":"https:\/\/blog.ruedt.ch\/?p=129"},"modified":"2025-09-17T05:07:47","modified_gmt":"2025-09-17T05:07:47","slug":"joggingrouten-vergleichen-mit-ki-so-habe-ich-den-gpx-route-clustering-viewer-gebaut","status":"publish","type":"post","link":"https:\/\/blog.ruedt.ch\/?p=129","title":{"rendered":"Joggingrouten vergleichen mit KI: So habe ich den GPX Route Clustering Viewer gebaut"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ich wollte schon lange eine M\u00f6glichkeit haben, meine <strong>Joggingrouten zu vergleichen<\/strong>. Meine Idee: Eine Webseite, die meine vom iPhone (Apple Health) aufgezeichneten <strong>GPX-Daten<\/strong> so aufbereitet, dass ich auf einen Blick sehe, ob ich auf derselben Strecke schneller geworden bin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Grundidee war da \u2013 aber die Umsetzung? Ziemlich komplex.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der Anfang: GPX-Daten aus dem iPhone<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ich konnte meine <a href=\"https:\/\/support.apple.com\/de-de\/guide\/iphone\/iph3f64f3b99\/ios\" target=\"_blank\" rel=\"noreferrer noopener\">iPhone-Daten aus Apple Health<\/a> exportieren. Sie enthalten alle GPS-Punkte meiner L\u00e4ufe. Doch die Analyse war m\u00fchsam: Welche Routen geh\u00f6ren zusammen? Wie erkenne ich Unterschiede zwischen \u00e4hnlichen Strecken?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obwohl ich programmieren kann, war klar: Das ist ein grosses Projekt. Genau hier kam die Idee ins Spiel, <strong>k\u00fcnstliche Intelligenz<\/strong> f\u00fcr die Umsetzung zu nutzen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der Wendepunkt: KI als Programmierpartner<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Durch einen kleinen Impuls \u2013 jemand zeigte mir, wie man mit KI ein Spiel programmieren kann \u2013 habe ich es einfach versucht. Ich exportierte meine Joggingdaten und fragte <a href=\"https:\/\/chat.openai.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">ChatGPT<\/a>, wie ich daraus Routen extrahieren und clustern kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und tats\u00e4chlich: Schon beim ersten Versuch kam etwas Brauchbares heraus. Das Clustering war zwar noch ungenau, aber der Weg war klar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Upload als ZIP-Datei funktionierte nicht fehlerfrei. Also entpackte ich die Daten manuell und arbeitete damit weiter. Erste Ergebnisse waren da \u2013 aber viele Routen, die am selben Punkt starteten, wurden f\u00e4lschlicherweise als identisch erkannt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">KI-Wechsel: Von ChatGPT zu Claude<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ich verbrachte Stunden damit, ChatGPT um Optimierungen zu bitten. Doch oft traten neue Fehler auf. Ein Kollege riet mir dann, ein zweites Tool auszuprobieren: <a href=\"https:\/\/claude.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Claude<\/a> von Anthropic, spezialisiert auf Programmieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ergebnis: Claude lieferte sofort eine fehlerfreie L\u00f6sung, die meine Routen deutlich besser clustern konnte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als mein Zeitlimit dort erreicht war, wechselte ich mit der funktionierenden Version zur\u00fcck zu ChatGPT \u2013 und baute sie weiter aus.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Feinschliff und Ver\u00f6ffentlichung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zur\u00fcck bei ChatGPT konnte ich neue Features einbauen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sortierung<\/strong>: neueste Routen zuerst<\/li>\n\n\n\n<li><strong>Design<\/strong>-Verbesserungen f\u00fcr die Benutzeroberfl\u00e4che<\/li>\n\n\n\n<li>eine klare <strong>Anleitung<\/strong><\/li>\n\n\n\n<li>ein <strong>FAQ<\/strong> f\u00fcr typische Fragen<\/li>\n\n\n\n<li>sogar eine <strong>SEO-Optimierung<\/strong> f\u00fcr die Webseite<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">So entstand Schritt f\u00fcr Schritt die Plattform, die ich mir urspr\u00fcnglich ertr\u00e4umt hatte.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das Ergebnis: GPX Route Clustering Viewer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der fertige <a href=\"https:\/\/www.ruedt.ch\/jogging\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>GPX Route Clustering Viewer<\/strong><\/a> erm\u00f6glicht es, GPX-Dateien direkt im Browser zu analysieren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 <strong>Upload von GPX-Daten<\/strong> aus <a href=\"https:\/\/support.apple.com\/de-de\/guide\/iphone\/iph3f64f3b99\/ios\" target=\"_blank\" rel=\"noreferrer noopener\">Apple Health<\/a>, <a href=\"https:\/\/www.strava.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Strava<\/a>, <a href=\"https:\/\/connect.garmin.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Garmin<\/a> oder <a href=\"https:\/\/www.komoot.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Komoot<\/a><\/li>\n\n\n\n<li>\u2705 <strong>Automatische Clustering-Analyse<\/strong>: \u00e4hnliche Routen werden gruppiert<\/li>\n\n\n\n<li>\u2705 <strong>Vergleich<\/strong>: Geschwindigkeit und Zeiten auf derselben Strecke gegen\u00fcberstellen<\/li>\n\n\n\n<li>\u2705 <strong>Datenschutz<\/strong>: Die Analyse l\u00e4uft komplett lokal im Browser. Es werden <strong>keine Daten hochgeladen oder gespeichert<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Alles funktioniert direkt \u2013 einfach GPX-Dateien oder den Apple-Health-Export in die Seite ziehen und loslegen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Meine wichtigsten Learnings<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>KI funktioniert auch bei komplexen Projekten.<\/strong> Mit <a href=\"https:\/\/chat.openai.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">ChatGPT<\/a> (hier GPT-5) und <a href=\"https:\/\/claude.ai\/\" target=\"_blank\" rel=\"noreferrer noopener\">Claude<\/a> konnte ich eine voll funktionsf\u00e4hige Web-App entwickeln.<\/li>\n\n\n\n<li><strong>Nicht festfahren, sondern wechseln.<\/strong> Wenn man mit einer KI nicht weiterkommt, lohnt es sich, ein zweites Tool einzusetzen.<\/li>\n\n\n\n<li><strong>Zwischenschritte sichern.<\/strong> Immer eine funktionierende Version behalten, damit man eine stabile Basis f\u00fcr Verbesserungen hat.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Probiere es selbst aus<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udc49 Hier geht\u2019s zum Tool: <a href=\"https:\/\/www.ruedt.ch\/jogging\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>GPX Route Clustering Viewer<\/strong><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teste deine eigenen Routen \u2013 egal ob von iPhone, Garmin, Strava oder Komoot \u2013 und finde heraus, ob du auf denselben Strecken schneller geworden bist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich freue mich sehr \u00fcber Feedback: Funktioniert es f\u00fcr dich? Welche Features fehlen dir noch? Schreib mir gerne deine Eindr\u00fccke!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich wollte schon lange eine M\u00f6glichkeit haben, meine Joggingrouten zu vergleichen. Meine Idee: Eine Webseite, die meine vom iPhone (Apple Health) aufgezeichneten GPX-Daten so aufbereitet, dass ich auf einen Blick sehe, ob ich auf derselben Strecke schneller geworden bin. Die Grundidee war da \u2013 aber die Umsetzung? Ziemlich komplex. Der Anfang: GPX-Daten aus dem iPhone [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":132,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-129","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ausprobiert"],"_links":{"self":[{"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=\/wp\/v2\/posts\/129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=129"}],"version-history":[{"count":1,"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=\/wp\/v2\/posts\/129\/revisions"}],"predecessor-version":[{"id":133,"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=\/wp\/v2\/posts\/129\/revisions\/133"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=\/wp\/v2\/media\/132"}],"wp:attachment":[{"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ruedt.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}