- Quellen fr (SNCF), nl (OVapi), be (GTFS.be), Kacheln für alle 5 Länder - Landesgrenzen für 5 Länder (borders.json), Gitter-Cache für die Prüfung - Echtzeit-Abgleich auch über Haltestellen-ID (FR, NL), über den Bahnhof bei Gleiswechsel - SNCF: Gattung aus der Trip-ID, Zugnummer aus dem Headsign; NL-Linien gekürzt - calendar.txt optional (SNCF hat nur calendar_dates) - OSM je Land zugeschnitten vor pfaedle; beim Zusammenführen je Objekt nur die neueste Version (time-filter) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X48pE4bzjHej8w9HyZXCjb
107 lines
6.4 KiB
Markdown
107 lines
6.4 KiB
Markdown
# TrainPulse
|
||
|
||
Live-Karte aller Züge in der Schweiz, Deutschland, Frankreich, Belgien und den Niederlanden: Position entlang der echten Strecke,
|
||
Linie, Ziel, Verspätung und Fahrtverlauf mit Gleis. Hintergrund umschaltbar zwischen Karte,
|
||
dunkler Karte (OpenStreetMap) und Satellit (swisstopo SWISSIMAGE, ausserhalb der Schweiz Sentinel-2).
|
||
|
||
## Wie es funktioniert
|
||
|
||
```
|
||
Fahrpläne (GTFS) ─────────────────────────┐
|
||
CH opentransportdata.swiss, DE gtfs.de, ├▶ updater-Container (stündlich)
|
||
FR SNCF, NL OVapi, BE GTFS.be │ ├─ Filter: nur Bahn (route_type 2, 100–199)
|
||
OpenStreetMap (Geofabrik, 5 Länder) ──────┘ ├─ osmium: nur Schienennetz, je Land zugeschnitten
|
||
├─ pfaedle: Streckenverläufe
|
||
└─▶ data/feeds/<ch|de|fr|nl|be>/<version>/
|
||
Echtzeit (GTFS-RT) ───────────────────────┐
|
||
CH (Key), DE, FR, NL └▶ web-Container (Port 8080)
|
||
├─ Position = Fahrplan + Verspätung, entlang Strecke
|
||
└─ /api/vehicles, /api/trip/…, /api/status, Weboberfläche
|
||
```
|
||
|
||
Es gibt **keine offenen GPS-Positionen** der Züge. Die Position wird aus Fahrplan und gemeldeter
|
||
Verspätung berechnet und auf den Streckenverlauf gelegt.
|
||
|
||
Die Fahrpläne enthalten grenzüberschreitende Züge. Damit sie nicht doppelt erscheinen, zeigt jeder
|
||
Fahrplan seine Züge nur im eigenen Land; im übrigen Ausland (Österreich, Italien, …) zeigen sie alle
|
||
(`trainpulse/borders.json`: Schweiz aus OpenStreetMap, sonst Natural Earth).
|
||
|
||
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`.
|
||
|
||
1. **Container anlegen** (Proxmox-Oberfläche → *Create CT*):
|
||
Debian 12 oder 13 Template, unprivileged, 2 Kerne, **6 GB RAM** (pfaedle braucht beim
|
||
Aufbereiten bis ~3 GB, der Server ~1 GB), **50 GB Disk** (Kartenkacheln ~9,4 GB, beim
|
||
monatlichen OSM-Update kurzzeitig bis ~6 GB Download für Frankreich), Netz per DHCP.
|
||
Unter *Options → Features* **Nesting** und **keyctl** aktivieren – ohne das läuft Docker
|
||
im LXC nicht.
|
||
2. **Installieren** (im Container als root):
|
||
```bash
|
||
apt install -y git
|
||
git clone https://git.scarriffle.com/Scarriffle/Trainpulse.git
|
||
bash Trainpulse/deploy/install.sh
|
||
```
|
||
Das Skript installiert Docker, falls es fehlt, baut das Image und startet beide Container.
|
||
Der erste Start dauert ca. 1–1,5 Stunden: Kartenkacheln (~9,4 GB) und OpenStreetMap für alle
|
||
fünf Länder (~13 GB) herunterladen, dann alle Fahrpläne aufbereiten.
|
||
3. **Echtzeit freischalten:** Auf <https://api-manager.opentransportdata.swiss> registrieren,
|
||
eine Applikation anlegen, das Produkt *GTFS-RT* abonnieren und den API-Key in
|
||
`Trainpulse/.env` bei `TRAINPULSE_RT_KEY=` eintragen. Dann `docker 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 --source de --force` (oder `ch`) |
|
||
| 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 Schweiz: [opentransportdata.swiss](https://opentransportdata.swiss) (Quellenangabe Pflicht)
|
||
- Fahrplan Deutschland: [gtfs.de](https://gtfs.de), Daten von DELFI e.V. (CC BY 4.0)
|
||
- Echtzeit Deutschland: [gtfs.de](https://gtfs.de/de/realtime/) (CC BY-SA 4.0, Beta, Abdeckung je nach Region)
|
||
- Frankreich: SNCF über [transport.data.gouv.fr](https://transport.data.gouv.fr/datasets/horaires-sncf) (ODbL), Fahrplan und Echtzeit
|
||
- Niederlande: [OVapi / Stichting OpenGeo](https://gtfs.ovapi.nl), Fahrplan und Echtzeit
|
||
- Belgien: [GTFS.be](https://gtfs.be) (Community-Feed aus NMBS/SNCB-Daten), nur Fahrplan
|
||
- Landesgrenzen: [Natural Earth](https://www.naturalearthdata.com) (gemeinfrei) und OpenStreetMap
|
||
- Karte: © OpenStreetMap-Mitwirkende (ODbL), Kacheln von [Protomaps](https://protomaps.com)
|
||
- Streckenverläufe: berechnet mit [pfaedle](https://github.com/ad-freiburg/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 U-Bahnen sind im Fahrplan, werden aber noch herausgefiltert.
|
||
- Züge des Schweizer Fahrplans im übrigen Ausland (z. B. Tirano, Domodossola, Frankreich)
|
||
werden nicht angezeigt, sobald sie die Schweiz verlassen.
|
||
- Der kostenlose deutsche Fahrplan enthält keine Zugnummern und kein Fahrtziel; angezeigt
|
||
wird als Ziel der letzte Halt.
|
||
- Der deutsche Echtzeit-Feed ist ~6 MB gross (komprimiert). Bei einem Abruf pro Minute sind das
|
||
rund 9 GB Datenverkehr pro Tag; die anderen Länder zusammen ~4 GB.
|
||
- Belgien hat keine offene Echtzeit (nur nach Registrierung bei data.belgianmobility.io). Wer einen
|
||
GTFS-RT-Zugang hat, trägt URL und Key als `TRAINPULSE_BE_RT_URL` / `TRAINPULSE_BE_RT_KEY` in `.env` ein.
|
||
- Paris (RER/Transilien) ist nicht enthalten – das ist ein eigener Datensatz.
|
||
- 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.
|