← trainmap.co.uk English · Magyar

Fejlesztési napló

Az Egyesült Királyság teljes vasúthálózata, a már nem létező állomásokkal együtt

Vanilla JavaScript térkép az Egyesült Királyság minden vasútvonaláról és állomásáról, teljes egészében nyílt adatokból. Íme, hogyan állt össze, milyen adatproblémák voltak mögötte, és milyen kommunikáció hajtotta.

Szerző: optional.org.uk · 2026. május 31. · trainmap.co.uk ☕ Hívj meg egy kávéra

Egyetlen olyan térképet szerettem volna, amely a teljes brit vasúthálózatot mutatja: nem csak azt, ami egy útvonaltervezőt érdekel, hanem a nosztalgiavasutakat, a kizárólag teherforgalmú összekötő íveket, a névvel ellátott alagutakat és viaduktokat, és azt a több ezer állomást is, amelyek egykor léteztek, de ma már nem. Ilyen nem nagyon volt, ezért megépítettem: trainmap.co.uk. Nincs app, nincs regisztráció, nincs fiók. Gyorsan betölt, és kereshetsz benne irányítószám, állomásnév, hárombetűs állomáskód vagy vonalnév alapján.

Egy ilyen projekt megépítése többről szól, mint a kódról. Az érdekes részek az adatok vizualizálhatóságából fakadó előnyök, az emberek, akik használják, és az a számtalan mód, ahogyan a valós vasúti adatok csendben ellentmondanak önmaguknak. De ami igazán jóvá tette a térképet, az az ezekkel az emberekkel való visszacsatolási kör volt: korán megosztottam, és hagytam, hogy azok, akik a legjobban ismerik a vasutat, megmondják, mi a hibás. Erről a végén bővebben.

Őszinte áttekintés

Úgy döntöttem, színkóddal jelölöm ezt a cikket, hogy lásd a valóságot: mely döntéseket befolyásolt inkább én, az AI ágens segítsége, vagy a közösség.

A színkódolás végig a következő:

Az adatprobléma

Minden vonal és állomás az OpenStreetMapről származik, az Overpass API-n keresztül lekérve. Az OSM vasúti lefedettsége az Egyesült Királyságban kiváló, sokkal jobb, mint a legtöbben gondolnák, mert olyan emberek gondozzák szeretettel, akiknek tényleg fontosak a mellékvágányok.

De már az is csapda, hogy egy lekérdezést „az Egyesült Királyságra” szűkítsünk. Egy Nagy-Britannia köré húzott befoglaló téglalap behúzza Dublint, a Man-szigetet és Észak-Franciaország aggasztóan nagy részét. Észrevettem ezeket a kósza külföldi vonalakat; az ágens megoldása az volt, hogy közvetlenül a GB közigazgatási területet kérte le az Overpasstől (ISO3166-1=GB), és arra vágott. Így megkapod Észak-Írországot (ez egy egyesült királyságbeli térkép) az Ír Köztársaság, a Man-sziget vagy Calais nélkül, és minden kézzel hangolt szélességifok-trükközés nélkül, ami abban a pillanatban elromlana, amint valaki egy új vonalat rögzít egy határ közelében.

A vonalakat csempénként kérem le az Overpassról: egy durva, nagyjából harminc cellából álló rács fedi Nagy-Britanniát, és mindegyik csak a GB-határon belüli vasúti elemeket („way”-eket) kéri, mert egyetlen, az egész országra vonatkozó lekérdezés egyszerűen időtúllépést okozna. A letöltés folytatható: minden már elmentett és érvényes cellát kihagy, így egy félúton elhaló futtatás csak a hiányzó részeket pótolja. Egy feldolgozó lépés ezután OSM-azonosító alapján kiszűri a duplikált way-eket (a cellák átfednek a széleiknél), mindegyiket a railway címkéje alapján három csoport egyikébe sorolja (fő nagyvasút, könnyűvasút vagy felhagyott), minden koordinátát öt tizedesjegyre kerekít (nagyjából egy méter, jelentős méretcsökkenés látható veszteség nélkül), majd kiírja azt a GeoJSON-t, amelyet a térkép betölt, plusz egy kis név–befoglalókeret indexet, hogy vonalnév alapján is kereshess. Mindezt néhány száz sornyi Python intézi.

Az állomások, amelyek hazudtak

A NaPTAN-nal kezdtem, az Egyesült Királyság hivatalos tömegközlekedési megálló-adatbázisával. A nagyvasúti hálózatra remek, de van egy furcsasága: sok nosztalgiavasúti állomást villamos vagy metró kategóriába sorol. Így amikor „vasútállomásokra” szűrtem, egész nosztalgiavonalak lettek félig üresek, és pontosan erre gondolt egy fórumtag is, amikor szóvá tette, hogy a Swanage Railwaynek mindössze egyetlen állomása maradt.

Az állomások is átkerültek az OSM-re, ami viszont más problémát szült: az OSM állomáscímkéi következetlenek, így nekem kellett eldöntenem, mi számít nagyvasúti vagy nosztalgiaállomásnak, az ágens pedig kidolgozta a szabályokat:

Jellemző módon a kézenfekvő szűrő, a hárombetűs ref:crs kód, itt használhatatlan volt, mert a londoni metróállomások pontosan ugyanabban a mezőben TfL „Z” előtagú kódokat viselnek.

Nosztalgiavonalak és a Swanage-probléma

A megőrzött (nosztalgia-) vonalak saját színt kapnak a térképen. Az OSM a railway:preserved vagy usage=tourism címkével jelöli őket, de megint csak nem következetesen. A Swanage Railway üzemi vágánya például egyes szakaszokon közönséges szárnyvonalként van címkézve, így először normál National Rail vonalként jelent meg, amíg valaki a fórumon finoman szóvá nem tette, hogy „a Swanage-i szárnyvonalat nosztalgiából National Railre minősítettem fel”.

A javítás egy kis heurisztika, amely azt tükrözi, ahogyan egy ember olvassa a térképet: terjeszd ki a nosztalgia-jelölést minden olyan szakaszra, amely ugyanazt a vonalnevet viseli. Ha a „Swanage Railway” bármely része megőrzöttként van jelölve, az egész névvel ellátott vonal lila lesz. Durva megoldás, de sokkal gyakrabban helyes, mint ha az egyes szakaszok címkéiben külön-külön bíznánk.

Visszatérő motívum: a nyílt adat ritkán hibás, de gyakran következetlen. A munka nagy része apró, jól olvasható szabályok írása, amelyek úgy oldják fel a következetlenséget, ahogyan egy ember tenné.

Vonalak, amelyek kiegyenesedtek kicsinyítéskor

Egy apró hiba, és jó példa a felhasználókkal folytatott oda-vissza párbeszédre. Egy tag jelezte, hogy a Northallerton környéki pálya „töröttnek” látszik: a finom ívek bizonyos nagyítási szinteken egyenes húrokká váltak, és a saját beállításait már kizárta azzal, hogy hat különböző böngészőben kipróbálta. A leírása (északi végen ránagyítva helyreáll, kicsinyítve újra eltörik, a déli csomópont pedig egyáltalán nem áll helyre) elég volt a behatároláshoz.

Az ok az, hogy a MapLibre alapértelmezésben nagyítási szintenként egyszerűsíti a GeoJSON-geometriát (Douglas–Peucker), hogy a nagy vektoros rétegek olcsók maradjanak. A legtöbb adatnál ez ésszerű alapbeállítás. Egy vasúti térképnél viszont pont fordítva: a pálya pontos alakja maga a lényeg. Az egész javítás egyetlen tulajdonság a forráson: tolerance: 0. Az ívek minden nagításnál hűek maradnak. A felhasználó megerősítette, hogy megoldotta az ő esetét és egy másikat is, amelyet Low Fell közelében vett észre. A javítás egyetlen sor volt; a megtalálása egy beszélgetés.

Egy hiba kijavítása újat szül

Ez a tolerance: 0 szép példa arra, hogyan készíti elő csendben az egyik javítás a következőt. Az egyszerűsítés kikapcsolása minden csúcspontot megtart minden nagyításon, ami a pontosság szempontjából pont az, amit szeretnél, a memória szempontjából viszont pont az, amit nem. Az egész hálózat nagyjából 28 MB GeoJSON, durván 720 000 csúcspont, és mindez egyszerre volt a memóriában. Laptopon rendben. Egy középkategóriás telefonon a böngészőfül egyszerűen feladta, a rettegett „Aw, Snap” üzenettel, főleg miután bekapcsoltál még egy nehéz réteget.

Az őszinte megoldás nem az, hogy eldobjuk a részleteket, hanem hogy ne töltsünk be olyan adatot, amit úgysem látsz. Azzal, hogy a geometriában gazdag fő vasúthálózatot vektoros csempés megjelenítésre (PMTiles) állítottam át, a geometria build-időben, nagyítási szintenként előre csempékre van vágva, és a böngésző csak az épp a képernyőn lévő néhány csempét tölti le, HTTP range kérésekkel. A memória mostantól a látómezőt követi, nem az egész országot. Egyetlen statikus fájl ugyanazon a tárhelyen (nincs csempeszerver), és a csempézési lépés (tippecanoe) rendesen elvégzi a nagyításonkénti egyszerűsítést, így a vonalak minden nagításon hűek maradnak, és a húrra ugró hiba nem tér vissza.

A GeoJSON továbbra is megvan tartalékként, de mostantól a csempék az alapértelmezettek. Ez az a fajta változtatás, amit észre sem veszel, ha működik: a térkép egyszerűen, csendben nem hal meg többé a telefonodon.

Az állomások, amelyek már nem léteznek

Ez a kedvenc részem. Egy barátom szólt, hogy a wiltshire-i Box állomás hiányzik. Igaza volt: Box 1965-ben bezárt, és egyszerűen egyáltalán nincs benne az OpenStreetMapben, sem jelenlegi, sem felhagyott állomásként.

Akkor honnan szerzel be évtizedekkel ezelőtt megszűnt állomásokat? A Wikidatából (CC0). A bökkenő az, hogy a bezárási adatai hiányosak. Box Wikidata-bejegyzésében egyáltalán nincs bezárási dátum: az erre szolgáló mező egyszerűen üres, ahogy sok más bezárt állomásnál is, pedig a Wikipédia-oldala készségesen elárulja, hogy 1965. január 4-én zárt be. (A Wikidata egy homályos „decommissioned” [üzemen kívül helyezett] státusszal azért megjelöli, csak dátum nélkül.) Tehát ha a „van bezárási dátuma” szűrőt használnánk, pont azokat az állomásokat hagynánk ki, amelyeket keresünk.

A bevált megközelítés egy kivonás volt. Kérd le az összes egyesült királyságbeli vasútállomást, amiről a Wikidata tud (nagyjából 9600-at), majd vedd ki azokat, amelyek még léteznek, vagyis amelyek egy jelenlegi OpenStreetMap-állomás 250 méteres körzetében vannak. Ami marad, épp valamivel több mint 6100 állomás, az a halmaz, amely egykor létezett, de ma már nem. Box is köztük. Ez most egy opcionális réteg, amelyet bekapcsolhatsz, üreges jelölőkként rajzolva, és bármelyikre kattintva eljuthatsz a Wikipédia-szócikkéhez.

(Lábjegyzet az érdeklődőknek: a Wikidata-lekérdezések a QLever tükörszerveren futottak, mert a hivatalos lekérdezési végpont túl szigorúan van sebességkorlátozva.)

Az összekapcsolások az érdekesek

Kicsit hátrébb lépve a feldolgozási lánc valójában néhány adathalmaz összefűzése, és a bökkenő az, hogy egyik sem osztozik közös azonosítón. Az OpenStreetMap adja a geometriát és a működő állomásokat, de következetlenül címkézi őket, és semmit sem tud a bezárt állomásokról. A bezártak a Wikidatából jönnek, gyakran (ahogy láttuk) bezárási dátum nélkül. Az irányítószám-keresések kereséskor a postcodes.io-ból jönnek (a háttérben ONS-adatokkal). A NaPTAN, a hivatalos megállónyilvántartás volt az állomások kiindulópontja, amíg ki nem derült, hogy túl sok nosztalgiaállomást sorol villamos és metró alá, és pontosan ezért álltak át OSM-re. Mindegyik forrás valamiben mérvadó, a többiben pedig használhatatlan.

Mivel nincs közös kulcs az összekapcsoláshoz, a szkriptben szinte minden érdemi döntés földrajz vagy név alapján születik:

Ezek közül néhány őszintén szólva inkább következtetés, mint tény: a nosztalgia-szín és a „korábbi állomás” címke származtatott, egyik forrás sem állítja közvetlenül. Semmi sincs kitalálva (minden pozíció és név továbbra is az OpenStreetMapre, a Wikidatára vagy az ONS-re vezethető vissza), de ezek heurisztikák, egy heurisztika pedig csak annyira jó, amennyire teszteled.

És valójában ezért számított a fórum. A szabályokat meg tudtam írni; de nem volt megbízható módom eldönteni, hogy helyesek-e: hogy a Swanage-terjesztés minden szakaszt elkapott-e, hogy a keskeny nyomtáv-teszt nem volt-e túl szigorú, hogy egy ardwicki „covered” címke valóban alagútnak számítson-e. Az ott lévő emberek viszont tudták. Minden javítás gyakorlatilag egy bukott tesztesetet jelentett a feldolgozási láncra nézve, olyasvalakitől, aki nálam sokkal jobban ismerte a terepet. Csak azért sikerült jól összehangolnom az adatokat, mert a rajongók elé tettem, és megmondták, mi a hibás, vagy min lehetne javítani.

Utolsó simítások

Mitől lett igazán jó

Korán és nyersen megosztottam a térképet egy brit vasútrajongó fórumon, mindenféle hátsó szándék nélkül, csak hogy lássam, tetszik-e bárkinek, majd a következő pár napot azzal töltöttem, hogy javításokat adtam ki, amíg a téma még élt. Nem volt terv és nem volt ütemterv; az ütemterv az volt, amit utoljára észrevett valaki, és a legtöbb a felvetése után órákon belül élesbe is került.

Ebben semmi újdonság nincs; ez a szoftverfejlesztés legrégebbi gondolata, ugyanaz, amit az Agilis kiáltvány lefektetett, mielőtt az „agilis” értekezletekkel teli naptárt jelentett volna: egy rövid, őszinte visszacsatolási kör a dolgot használó emberek és a változtatni képes ember között, és hajlandóság arra, hogy a visszajelzésre most cselekedjünk, ne később. A folyamatok könnyen elveszik ezt. Egy fórumtéma, tele igazán törődő emberekkel, ezt egyenesen visszaadta nekem, és ez az a része ennek a projektnek, amelyet a leginkább ajánlanék másolásra, bármit is építs éppen.


Nyisd meg a térképet →

A trainmap.co.uk ingyenes és reklámmentes.
Ha hasznosnak találod, fontold meg:

☕ Hívj meg egy kávéra