diff --git a/README.md b/README.md index 08be5e6..af740e7 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ dunkler Karte (OpenStreetMap) und Satellit (swisstopo SWISSIMAGE, ausserhalb der ``` 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) + FR SNCF, NL OVapi, BE NMBS/SNCB │ ├─ Filter: nur Bahn (route_type 2, 100–199) OpenStreetMap (Geofabrik, 5 Länder) ──────┘ ├─ osmium: nur Schienennetz, je Land zugeschnitten ├─ pfaedle: Streckenverläufe └─▶ data/feeds/// @@ -80,7 +80,7 @@ Die Hinweise erscheinen unten rechts auf der Karte. - 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 +- Belgien: NMBS/SNCB [Open Data](https://www.belgiantrain.be/en/3rd-party-services/mobility-service-providers/public-data) (HAFAS-Feeds), Fahrplan und Echtzeit - 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) @@ -96,11 +96,10 @@ Die Hinweise erscheinen unten rechts auf der Karte. 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. +- Belgien: die Feed-Adressen unter sncb-opendata.hafas.de sind nicht offiziell dokumentiert und + laufen evtl. aus (die NMBS stellt auf data.belgianmobility.io um). Dann neue Adresse als + `TRAINPULSE_BE_RT_URL` (und ggf. `TRAINPULSE_BE_RT_KEY`) in `.env` eintragen. - 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. diff --git a/tests/test_core.py b/tests/test_core.py index 3fbddb3..5b282a6 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -149,7 +149,7 @@ def test_all(): fm.header.gtfs_realtime_version = "2.0" e = fm.entity.add(id="1") e.trip_update.trip.trip_id, e.trip_update.trip.start_date = "T1", "20261021" - st = e.trip_update.stop_time_update.add(stop_id="B") + st = e.trip_update.stop_time_update.add(stop_id="B_7") # Belgien: Gleis als Suffix st.arrival.delay = st.departure.delay = 300 _, rt = realtime.parse(fm.SerializeToString(), f.trip_index) assert rt[("T1", "20261021")][1][0][0] is None diff --git a/trainpulse/config.py b/trainpulse/config.py index e17940f..74b550f 100644 --- a/trainpulse/config.py +++ b/trainpulse/config.py @@ -35,9 +35,10 @@ SOURCES = { "needs_key": False, "rt_interval": 60, # OVapi: nicht öfter als 1x pro Minute }, - "be": { # SNCB/NMBS über GTFS.be (Community-Feed); Echtzeit nur mit Registrierung -> vorerst ohne - "gtfs_url": "https://data.gtfs.be/sncb/gtfs/be-sncb-gtfs.zip", - "rt_url": os.environ.get("TRAINPULSE_BE_RT_URL", ""), + "be": { # SNCB/NMBS offizielle Open-Data-Feeds (HAFAS); Fahrplan täglich, Echtzeit passt zu dessen trip_ids + "gtfs_url": "https://sncb-opendata.hafas.de/gtfs/static/c21ac6758dd25af84cca5b707f3cb3de", + "rt_url": os.environ.get("TRAINPULSE_BE_RT_URL", + "https://sncb-opendata.hafas.de/gtfs/realtime/d22ad6759ee25bg84ddb6c818g4dc4de_TC"), "rt_key": os.environ.get("TRAINPULSE_BE_RT_KEY", ""), "needs_key": False, "rt_interval": 60, diff --git a/trainpulse/feed.py b/trainpulse/feed.py index 24eb138..68885c0 100644 --- a/trainpulse/feed.py +++ b/trainpulse/feed.py @@ -315,6 +315,8 @@ class Feed: # Frankreich, Niederlande: nur Haltestellen-ID; über den Bahnhof abgleichen, damit es # auch bei Gleiswechsel passt, und der Reihe nach (eine Fahrt kann einen Bahnhof zweimal haben) k = self.stop_index.get(u[1]) + if k is None: # Belgien meldet das Gleis ("8863008_10"), der Fahrplan nur den Bahnhof ("8863008") + k = self.stop_index.get(u[1].rsplit("_", 1)[0]) if k is None: continue for i in range(j, len(stops)): diff --git a/web/app.js b/web/app.js index f69bf21..80da27e 100644 --- a/web/app.js +++ b/web/app.js @@ -60,7 +60,7 @@ const map = new maplibregl.Map({ attribution: 'Fahrplan & Echtzeit: opentransportdata.swiss, ' + 'gtfs.de (DELFI e.V., CC BY-SA 4.0), ' + 'SNCF (ODbL), ' - + 'OVapi, GTFS.be (NMBS/SNCB)', + + 'OVapi, NMBS/SNCB', }, }, layers: [