Der Icon-Rand war breiter als das SDF-Feld und füllte bei kleinem Zoom das ganze Bild. Rand skaliert jetzt mit der Symbolgrösse. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
TrainPulse – Schweiz
Live-Karte aller Züge in der Schweiz: Position entlang der echten Strecke, Linie, Zugnummer, Ziel, Verspätung und Fahrtverlauf mit Gleis. Hintergrund umschaltbar zwischen Karte (OpenStreetMap) und Satellit (swisstopo SWISSIMAGE, ausserhalb der Schweiz Sentinel-2).
Wie es funktioniert
opentransportdata.swiss ──GTFS (Mo+Do)──▶ updater-Container (stündlich)
├─ Filter: nur Bahn (route_type 100–199)
OpenStreetMap (Geofabrik) ─────────────────▶├─ pfaedle: echte Streckenverläufe
└─▶ data/feeds/<version>/
opentransportdata.swiss ──GTFS-RT (35 s)──▶ web-Container (Port 8080)
├─ Position = Fahrplan + Verspätung, entlang Strecke
└─ /api/vehicles, /api/trip/…, /api/status, Weboberfläche
Es gibt in der Schweiz keine offenen GPS-Positionen der Züge. Die Position wird aus Fahrplan und gemeldeter Verspätung berechnet und auf den Streckenverlauf gelegt.
Wechsel des Fahrplans: Neue Fahrpläne erscheinen Montag und Donnerstag zwischen 9 und 10 Uhr,
die Echtzeitdaten stellen erst um 15 Uhr um. Der Server lädt deshalb immer den Fahrplan, auf den
sich die Echtzeitdaten gerade beziehen (feed_version), und schaltet automatisch mit um.
Installation auf Proxmox (Docker)
TrainPulse läuft als zwei Docker-Container aus demselben Image:
web (Webserver, Port 8080) und updater (holt stündlich neue Fahrpläne und beim ersten Start
die Kartenkacheln). Alle Daten liegen im Ordner data/ neben der compose.yaml.
- Container anlegen (Proxmox-Oberfläche → Create CT): Debian 12 oder 13 Template, unprivileged, 2 Kerne, 4 GB RAM (pfaedle braucht beim Aufbereiten bis ~2 GB, der Server ~0,5 GB), 20 GB Disk, Netz per DHCP. Unter Options → Features Nesting und keyctl aktivieren – ohne das läuft Docker im LXC nicht.
- Installieren (im Container als root):
Das Skript installiert Docker, falls es fehlt, baut das Image und startet beide Container.
apt install -y git git clone https://git.scarriffle.com/Scarriffle/Trainpulse.git bash Trainpulse/deploy/install.sh - Echtzeit freischalten: Auf https://api-manager.opentransportdata.swiss registrieren,
eine Applikation anlegen, das Produkt GTFS-RT abonnieren und den API-Key in
Trainpulse/.envbeiTRAINPULSE_RT_KEY=eintragen. Danndocker compose up -d.
Danach ist die Karte unter http://<ip>:8080 erreichbar. Für den Zugriff von aussen einfach
hinter deinen bestehenden Reverse Proxy hängen.
Update: git pull && bash deploy/install.sh – baut das Image neu, Daten bleiben.
Nützliche Befehle (im Ordner Trainpulse)
| Was | Befehl |
|---|---|
| Status | curl localhost:8080/api/status |
| Logs Webserver | docker compose logs -f web |
| Logs Fahrplan-Update | docker compose logs -f updater |
| Fahrplan sofort neu aufbereiten | docker compose exec updater python -m trainpulse.prepare --force |
| Selbsttest | docker compose exec web python tests/test_core.py |
| Stoppen / Starten | docker compose down / docker compose up -d |
Datenquellen und Lizenzen
Die Hinweise erscheinen unten rechts auf der Karte.
- Fahrplan & Echtzeit: opentransportdata.swiss (Quellenangabe Pflicht)
- Karte: © OpenStreetMap-Mitwirkende (ODbL), Kacheln von Protomaps
- Streckenverläufe: berechnet mit pfaedle aus OpenStreetMap-Daten (ODbL)
- Satellit Schweiz: © swisstopo (frei, Quellenangabe)
- Satellit ausserhalb: Sentinel-2 cloudless 2024 von EOX – nur nicht-kommerziell frei
Bekannte Grenzen
- Nur Bahn. Busse, Trams und Schiffe sind im Fahrplan, werden aber noch herausgefiltert.
- Der Schweizer Fahrplan enthält auch einige ausländische Züge (z. B. TGV, TER); deren Strecke ausserhalb der Schweiz ist nur Luftlinie, weil der OSM-Ausschnitt nur die Schweiz abdeckt.
- Zwischen zwei Abfragen fahren die Züge auf gerader Linie; in engen Kurven schneiden sie für ein paar Sekunden minimal ab.
- Zusätzliche Fahrten, die nur in den Echtzeitdaten vorkommen (Extrazüge), fehlen.
- In der Nacht des Fahrplanwechsels (2. Sonntag im Dezember) fehlen bis zum nächsten stündlichen Lauf die Züge.