← 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.
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 irány, a hatókör és a megítélés, a technológiai döntések és a kód szerkezete.
- Milyen visszajelzést adott a közösség: hibák, javítások és kérések egy vasútrajongó fórumról.
- Amit az AI csinált: a feldolgozási lánc kódját készítette el az én irányításom alapján, AI kódoló asszisztenssel.
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.
; 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 , az ágens pedig kidolgozta a szabályokat:
- Tartsd meg a National Rail / metró átszállóállomásokat: azokat, amelyek
networkcímkéjében szerepel a „National Rail” (Amersham, Harrow-on-the-Hill). Dobd el a tisztán metró-, DLR- és villamosmegállókat. (Ez a lista szinte szó szerint egy olyan tagtól származott, aki ezeken a vonalakon vezet, és felsorolta az összes hiányzó Chiltern-állomást.) - Tarts meg mindent, ami keskeny nyomtávú nosztalgiavonalon fekszik, közelség alapján kiszűrve (így a New Romney állomás a Romney, Hythe & Dymchurch vonalon megmarad, még akkor is, ha az OSM félig kisvasútként címkézi).
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: . 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.
Azzal, hogy a geometriában gazdag fő vasúthálózatot á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 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:
- Egy OSM-„metró” állomás valójában National Rail átszállóhely? Olvasd be a
networkcímkéjét: így kerül vissza Amersham és Harrow-on-the-Hill. - Egy állomás keskeny nyomtávú nosztalgiavonalon van, hiába van kisvasútként címkézve?
Erre nincs címke, ezért azt vizsgáljuk, hogy a fő adathalmaz egy
narrow_gaugevonalának nagyjából száz méteres körzetében van-e (így marad meg New Romney). - Egy egész vonal nosztalgiavonal? Terjeszd ki a
railway:preserved/usage=tourismjelölést minden szakaszra, amely ugyanazt a vonalnevet viseli (a Swanage-javítás). - Egy Wikidata-állomás még üzemel, vagy rég megszűnt? Kivonás: ha egy jelenlegi OSM-állomás 250 méteres körzetében van, jelenleginek számít; egyébként a nagyjából 6100 bezárt egyike.
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 , és megmondták, mi a hibás, vagy min lehetne javítani.
Utolsó simítások
- ,
állomásnevet,
hárombetűs kódot (
PAD,YRK) , ez utóbbinál a térkép úgy nagyít, hogy a teljes útvonal ráférjen. - Névvel ellátott műtárgyak. A fontosabb alagutak és viaduktok
feliratozása az OSM
tunnel:name/bridge:namecímkéiből készül: Severn-alagút, Ribblehead-viadukt, és így tovább. (Ez egy konkrét kérés volt: „a hab a tortán az lenne, ha a fontosabb alagutak és viaduktok nevet kapnának.”) - Kattints egy állomásra (legyen jelenlegi vagy rég bezárt) egy
infógombért, amely a Wikipédia-szócikkére visz, és egy gombért, amely a Google
Maps-helyére. A jelenlegi állomások nagyjából 92%-ához és a korábbiak 99%-ához
tartozik Wikipédia-oldal, többségükhöz egyenesen az OSM saját
wikipediacímkéiből.
Mitől lett igazán jó
, 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: . 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.
A trainmap.co.uk ingyenes és reklámmentes.
Ha hasznosnak találod, fontold meg: