pfaedle erzeugt für die Schweiz eine 2.6-GB-shapes.txt; die wird jetzt in shapes.bin (670 MB, mmap) umgewandelt. Halt-Positionen kommen aus shape_dist_traveled. RAM-Empfehlung im README ergänzt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
4.1 KiB
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)──▶ trainpulse-update (stündlich)
├─ Filter: nur Bahn (route_type 100–199)
OpenStreetMap (Geofabrik) ─────────────────▶├─ pfaedle: echte Streckenverläufe
└─▶ /var/lib/trainpulse/feeds/<version>/
opentransportdata.swiss ──GTFS-RT (35 s)──▶ trainpulse (Webserver, 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
- 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.
- Projekt in den Container kopieren, z. B.
scp trainpulse.zip root@<ip>:und dortapt install -y unzip && unzip trainpulse.zip. - Installieren:
bash trainpulse/deploy/install.shBaut pfaedle, lädt die Kartenkacheln für die Schweiz, richtet die Dienste ein und startet die erste Fahrplan-Aufbereitung im Hintergrund (journalctl -fu trainpulse-update). - Echtzeit freischalten: Auf https://api-manager.opentransportdata.swiss registrieren,
eine Applikation anlegen, das Produkt GTFS-RT abonnieren und den API-Key in
/etc/trainpulse.envbeiTRAINPULSE_RT_KEY=eintragen. Dannsystemctl restart trainpulse.
Danach ist die Karte unter http://<ip>:8080 erreichbar. Für den Zugriff von aussen einfach
hinter deinen bestehenden Reverse Proxy hängen.
Ein Update des Programms: neue Version in den Container kopieren, install.sh nochmals ausführen.
Nützliche Befehle
| Was | Befehl |
|---|---|
| Status | curl localhost:8080/api/status |
| Logs Webserver | journalctl -fu trainpulse |
| Logs Fahrplan-Update | journalctl -fu trainpulse-update |
| Fahrplan sofort neu aufbereiten | sudo -u trainpulse env $(cat /etc/trainpulse.env) /opt/trainpulse/.venv/bin/python -m trainpulse.prepare --force |
| Selbsttest | /opt/trainpulse/.venv/bin/python tests/test_core.py (im Projektordner) |
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.