{"id":2311,"date":"2018-06-17T18:37:58","date_gmt":"2018-06-17T16:37:58","guid":{"rendered":"http:\/\/uwe.s2000.at\/?p=2311"},"modified":"2020-02-17T17:50:57","modified_gmt":"2020-02-17T16:50:57","slug":"ferrophile-breitensuche","status":"publish","type":"post","link":"https:\/\/www.domaratius.de\/blog\/2018\/06\/17\/ferrophile-breitensuche\/","title":{"rendered":"Ferrophile Breitensuche"},"content":{"rendered":"<p>Im letzten halben Jahr war ich (mit Pausen nat\u00fcrlich) damit besch\u00e4ftigt, eine Frage eines Bekannten zu beantworten. Der hatte mich n\u00e4mlich sinngem\u00e4\u00df folgendes gefragt: Welche Ziele kann ich erreichen, wenn ich morgens in einen Zug einsteige und maximal x Stunden unterwegs sein will? Die Onlinesuche der Bahn hilft in dem Fall nicht weiter, denn die will ja wissen von wo nach wo ich fahren will, damit sie mir f\u00fcnf verschiedene Verbindungen mit 12 verschiedenen Preisen ausspucken kann. Also musste man sich da selbst was stricken.<\/p>\n<p><strong>Fahrplandaten sammeln<\/strong><\/p>\n<p>Schritt eins zur L\u00f6sung war das Einsammeln der Fahrplandaten. Das geht zum Beispiel, indem man die Webseiten der verschiedenen Bahnverwaltungen Europas hernimmt, sich dort die Abfahrtspl\u00e4ne der Bahnh\u00f6fe anzeigen l\u00e4sst und diese Daten dann erfasst. Nat\u00fcrlich schreibt man die sich nicht von Hand ab, da baute ich mir ein kleines Programm, was das Abschreiben f\u00fcr mich erledigt. Einzelne Bahnverwaltungen (wie die Schweizer) bieten auch komplette Datenpakete im gtfs-Format an (General Transit Feed Specification, eigentlich gedacht f\u00fcr Busse und Stra\u00dfenbahnen, weniger f\u00fcr das Eisenbahnnetz eines ganzen Landes).<\/p>\n<p>Technisch gesehen steht dahinter eine einfache Breitensuche: Man pflegt eine Liste von Bahnh\u00f6fen und eine Liste von Z\u00fcgen, erstere enth\u00e4lt anfangs einen beliebigen Startbahnhof, die andere ist leer. Dazu h\u00e4lt man zwei Listen, in denen man sich merkt, welche Bahnh\u00f6fe bzw. Z\u00fcge man schon gepr\u00fcft hat. Solange nun die Bahnhofsliste nicht leer ist, macht man folgendes: Man sucht die Daten aller Z\u00fcge, die an diesem Bahnhof halten und die man noch nicht bearbeitet hatte und speichert diese in der Zugliste. Nun arbeitet man die Zugliste ab und pr\u00fcft, an welchen Bahnh\u00f6fen die Z\u00fcge so halten. Bahnh\u00f6fe, die man noch nicht bearbeitet hat, tr\u00e4gt man in die Bahnhofsliste ein. Nachdem man nun alle aktuell in der Zugliste befindlichen Z\u00fcge verarbeitet hat, hat man neue Eintr\u00e4ge in der Bahnhofsliste, und kann nun wieder beim ersten Eintrag der Bahnhofsliste fortfahren. Dieses Wechseln zwischen Bahnhofsliste und Zugliste wiederholt sich solange, bis man alle irgendwie erreichbaren Bahnh\u00f6fe abgeklappert hat.<\/p>\n<p>Da das Eisenbahnnetz in Europa recht dicht ist und es viele internationale Verbindungen gibt, findet man so nicht nur die Bummelz\u00fcge nach Kleinkleckersdorf, sondern eben auch Verbindungen bis nach Peking und Wladiwostok (angebunden via Transsibirischer Eisenbahn von Moskau aus). Das ist zwar in keinem Fall mehr an einem Tag erreichbar, aber ich wollte in der Lage sein, mit beliebigen Startbahnh\u00f6fen, Umsteigeparametern und Reisezeiten zu arbeiten, ergo wurde erstmal alles eingesammelt was irgendwie erreichbar ist. Deswegen brauchte das Skript auch ein paar Monate zum Durchlaufen und hatte am Ende \u00fcber 34000 Bahnstationen und etwa die zehnfache Zahl an Z\u00fcgen erfasst.<\/p>\n<p><strong>Datenauswertung<\/strong><\/p>\n<p>Nachdem nun s\u00e4mtliche Zugfahrten mehr oder minder genau erfasst waren (ich bin der Einfachheit halber davon ausgegangen, dass alle Z\u00fcge t\u00e4glich fahren), konnte es ans Beantworten der eigentlichen Frage gehen: Auch hier kommt wieder eine Breitensuche zum Einsatz, die vom gew\u00e4hlten Startbahnhof aus alle in Frage kommenden Z\u00fcge benutzt, um einfach ziellos irgendwohin zu fahren. Von allen potentiellen Reisezielen wird dann wieder weitergesucht, ob man von dort via Umsteigen in andere Z\u00fcge noch weiterfahren kann. Die Suche wird beendet, wenn man entweder die einstellbare Zeitgrenze oder die ebenfalls einstellbare maximale Anzahl von Umsteigevorg\u00e4ngen erreicht hat. D.h. man kann nun z.B. suchen, von wo aus man innerhalb von zwei Stunden mit h\u00f6chstens einmal Umsteigen von einem beliebigen Bahnhof Europas aus fahren kann. Das Ergebnis wird dann als Textdatei gespeichert und enth\u00e4lt alle erreichbaren Zielbahnh\u00f6fe inkl. der dahin f\u00fchrenden Zugverbindung.<\/p>\n<p><strong>Visualisierung<\/strong><\/p>\n<p>Weil ein Bild mehr sagt als eine lange Liste von Ortsnamen, von denen man die wenigsten schon mal geh\u00f6rt hat, soll das ganze auch auf einer Karte angezeigt werden. Dazu musste ich zun\u00e4chst mal die geographischen Positionen der Bahnh\u00f6fe herausfinden, was zum Gl\u00fcck anhand von Eintragungen in OpenStreetMap noch vergleichsweise einfach war (bis auf die L\u00fcckenhaftigkeit der Daten&#8230;). Das Programm spuckt nun eine kml-Datei aus, die man sich mittels Google Earth anzeigen lassen kann. F\u00fcr den Blogeintrag ist das aber wieder doof, weil ich hier nun gerne Screenshots zeigen wollen w\u00fcrde, was aber wiederum rechtliche Probleme mit einer Firma nach sich zieht, die sich bessere Anw\u00e4lte leisten kann als ich. Also hab ich das ganze nochmal umgebaut und gebe nun die Daten in einer Form aus, die ich mit OpenStreetMap-Tools verarbeiten kann. Und damit lassen sich nun auch sch\u00f6ne Screenshots zusammenpuzzeln.<\/p>\n<p><strong>Probleme<\/strong><\/p>\n<p>Der Ansatz ist nat\u00fcrlich lange nicht perfekt. Das beginnt schon bei der Tatsache, dass nicht jeder Zug t\u00e4glich f\u00e4hrt, das Programm als auch Verbindungen errechnen kann, die es in der Realit\u00e4t gar nicht gibt. Au\u00dferdem gabs sicherlich Fehler in der Datenerfassung, es kann gut sein, dass diverse Z\u00fcge (gerade im Ausland) einfach in meinem Datenbestand fehlen. Dann gibt es noch lustige logistische Schwierigkeiten: So ist zum Beispiel der Bahnhof Leipzig (der Startbahnhof meines Bekannten) betrieblich in zwei Bahnh\u00f6fe aufgeteilt, einen Tunnelbahnhof und den eigentlichen Hauptbahnhof. F\u00fcr mein Programm sind das zwei v\u00f6llig getrennte Einheiten, so dass man nun Verbindungen von Leipzig Hbf \u00fcber Leipzig Messe nach Leipzig Hbf (tief) erh\u00e4lt, was nat\u00fcrlich wenig sinnvoll ist, da man statt 20 min Bahnfahrt auch 2 Min zu Fu\u00df gehen kann. \u00c4hnlich ist es mit dem Berliner Hauptbahnhof, der auch aus mehreren Ebenen besteht, und in der Form gibt es noch zahllose weitere Bahnh\u00f6fe.<\/p>\n<p>Besonders auff\u00e4llig ist es bei den gro\u00dfen Bahnh\u00f6fen in Paris. Weil die Franzm\u00e4nner ja ein bissl chaotisch sind, gibts da sechs gro\u00dfe Kopfbahnh\u00f6fe, und an jedem fahren nur Z\u00fcge in bestimmte Regionen Frankreichs ab. Wer also am Gare de l&#8217;Est ankommt und zum Gare Montparnasse muss, darf erstmal mit der Metro durchs Pariser Stadtzentrum. Leider fehlen aber die Metroverbindungen in meinem Datensatz. Mein Programm w\u00fcrde also Bummelz\u00fcge aus dem Pariser Vorortverkehr nutzen, um von einem Pariser Bahnhof zum anderen zu gelangen, was deutlich l\u00e4nger dauert als mit der Metro. Besonders krass ist das beim Umsteigen zwischen Gare de l&#8217;Est und Gare du Nord, denn da spuckt mein Programm eine Bummelzugroute mit zweimal Umsteigen und \u00fcber einer Stunde Fahrzeit aus, in der Realit\u00e4t kann man die Strecke in 10 Minuten laufen, da beide Bahnh\u00f6fe nur durch zwei Querstra\u00dfen getrennt sind. Die Preu\u00dfen waren da vern\u00fcnftiger, die haben die \u00f6chzig Berliner Kopfbahnh\u00f6fe irgendwann durch eine durchgehende Bahnstrecke ersetzt.<\/p>\n<p><strong>Beispiel (Bilder statt Worte und so)<\/strong><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\" alignnone\" title=\"Erlangen 2h ohne Umsteigen\" src=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/erlangen_0_2.png\" alt=\"Erlangen 2h ohne Umsteigen\" width=\"600\" height=\"540\" \/><\/p>\n<p>In diesem Bild sieht man die Ziele, die man von Erlangen aus innerhalb von einer Stunde (rot) bzw. zwei Stunden (orange) umsteigefrei erreichen kann. Man erkennt folgende Verbindungen:<\/p>\n<ul>\n<li>S-Bahn Bamberg-Erlangen-N\u00fcrnberg-Hartmannshof<\/li>\n<li>Regionalz\u00fcge N\u00fcrnberg-Erlangen-Bamberg-Coburg und N\u00fcrnberg-Erlangen-Bamberg-Lichtenfels (und weiter nach Jena)<\/li>\n<li>Regionalz\u00fcge N\u00fcrnberg-Erlangen-Bamberg-Schweinfurt-W\u00fcrzburg<\/li>\n<li>ICE-Verbindungen nach M\u00fcnchen \u00fcber Ingolstadt bzw. Treuchtlingen und Augsburg<\/li>\n<li>ICE-Verbindungen nach Halle und Leipzig \u00fcber Erfurt<\/li>\n<\/ul>\n<p>Die Fahrzeit von 2:45h oder so nach Jena ist nat\u00fcrlich alles andere als witzig, vor allem wenn man bedenkt dass man mit einem Schlenker \u00fcber Erfurt inzwischen mal eben eine Stunde einsparen kann. Die Strecke \u00fcber die Rampen des Th\u00fcringer Waldes stammt ja aus der Zeit als Deutschland noch nen Kaiser hatte (der nicht Beckenbauer hie\u00df). Und da zuckelt man eben heute noch mit Tempo 70 herum.<\/p>\n<p><a href=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/erlangen_1_2_full.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" title=\"Erlangen 2h mit einmal Umsteigen\" src=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/erlangen_1_2.png\" alt=\"Erlangen 2h mit einmal Umsteigen\" width=\"600\" height=\"540\" \/><\/a><\/p>\n<p>Das ist der gleiche Kartenausschnitt (mit Link zur vollen Karte), nur dass man nun (fast) alle Ziele sieht, die man mit einmaligem Umsteigen in zwei Stunden erreichen kann. Deutlich zu erkennen sind die sternf\u00f6rmig von N\u00fcrnberg ausgehenden Bahnstrecken Richtung W\u00fcrzburg, Regensburg, Ansbach und Treuchtlingen. Zahlreiche weitere neue Verbindungen kommen in den ICE-Knoten Erfurt und Ingolstadt zustande. Weniger sichtbar ist die Tatsache, dass man nun auch einige Ziele, die man umsteigefrei erreichen kann, durch einmaliges Umsteigen schneller erreichen kann (z.B. mit dem ICE von Erlangen nach N\u00fcrnberg und von dort weiter mit der S-Bahn Richtung Hartmannshof).<\/p>\n<p><a href=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/erlangen_0_10_full.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" title=\"Erlangen &gt;6h ohne Umsteigen\" src=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/erlangen_0_10.jpg\" alt=\"Erlangen &gt;6h ohne Umsteigen\" width=\"600\" height=\"540\" \/><\/a><\/p>\n<p>Wenn man nun die Reisezeit verl\u00e4ngert und nicht umsteigen mag, kommt am Ende dies hier heraus: In Richtung S\u00fcden ist nach etwas \u00fcber einer Stunde Schluss in M\u00fcnchen. Nach Norden geht es \u00fcber Leipzig und Halle hinaus \u00fcber Bitterfeld und Wittenberg nach Berlin und von dort aus landet man nach ungef\u00e4hr f\u00fcnf Stunden Hamburg bzw. nach etwa 5h 30min Rostock.<\/p>\n<p>Und nun kann man mit den Parametern Reisezeit und Umsteigezahl herumspielen&#8230; Die allermeisten Verbindungen sind ab 3x Umsteigen optimal &#8211; zumindest innerhalb Deutschlands. Man erreicht auch so ziemlich jede Ecke Deutschlands in weniger als acht Stunden von Erlangen aus.<\/p>\n<p>Im Gesamtbild sieht das bei einer maximalen Reisezeit von zehn Stunden dann so aus:<\/p>\n<p><a href=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/erlangen_10_10_full.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" src=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/erlangen_10_10.jpg\" alt=\"Von Erlangen aus in 10h bei unlimitierter Umsteigezahl\" width=\"600\" height=\"519\" \/><\/a><\/p>\n<p>Die ersten Stationen im Ausland sind hier in \u00d6sterreich, etwa Salzburg und Innsbruck, aber auch Strasbourg, sp\u00e4ter gefolgt von den Benelux-Staaten. Noch etwas sp\u00e4ter folgt die Schweiz, hier macht sich der Umweg um den Bodensee zeitlich bemerkbar. In Frankreich fallen die isoliert liegenden Punkte im Westen und S\u00fcden auf &#8211; das sind TGV-Bahnh\u00f6fe, von denen aus man wiederum mit Regionalz\u00fcgen weiterfahren k\u00f6nnte &#8211; so entsteht die sternf\u00f6rmige Struktur um Dijon herum. Ebenso f\u00e4llt auf, dass man Paris deutlich schneller erreicht als viele Orte im Nordosten Frankreichs, etwa Rouen. Im Osten hingegen f\u00e4llt auf, dass man hier nur vergleichsweise langsam vorankommt, in Polen erreicht man Wroclaw und Poznan noch relativ schnell, aber viel weiter geht es nicht. Weiter s\u00fcdlich macht sich hingegen die schnelle Durchquerung \u00d6sterreichs in Richtung Ungarn bemerkbar.<\/p>\n<p><strong>Von Leipzig aus in alle Welt<\/strong><\/p>\n<p>Mein Kumpel wollte nun aber nicht von Erlangen aus losfahren, sondern von Leipzig. Also hat mein Programm das alles auch nochmal lustig f\u00fcr den Startbahnhof Leipzig Hbf ausgerechnet. Und das sieht dann ungef\u00e4hr so aus:<\/p>\n<p><a href=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/leipzig_0_10_full.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" src=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/leipzig_0_10.jpg\" alt=\"Von Leipzig aus ohne Umsteigen mit max. 10h Reisezeit\" width=\"600\" height=\"545\" \/><\/a><\/p>\n<p>Sieht ja soweit ganz nett aus, hat aber einen gro\u00dfen Haken &#8211; es ist nicht die ganze Wahrheit. Wie weiter oben beschrieben gibts am Leipziger Hauptbahnhof ja noch die Tiefbahnsteige. Und die sind betrieblich ein anderer Bahnhof. Das hei\u00dft es fehlen hier die ganzen S-Bahnen des mitteldeutschen S-Bahn-Netzes, die von Leipzig aus in Richtung Halle, Dessau, Wittenberg, Hoyerswerda oder Zwickau fahren. Sobald man aber Umsteigevorg\u00e4nge mit in Betracht zieht passt das wieder halbwegs, da man nat\u00fcrlich auch anderswo (z.B. Leipzig-Messe in die S-Bahn einsteigen kann, die dann zu den Tiefbahnsteigen f\u00e4hrt). Allerdings braucht man so halt rein rechnerisch 22 min, um vom Hauptbahnhof zum Marktplatz zu kommen. Da w\u00e4re man zu Fu\u00df ungef\u00e4hr doppelt so schnell&#8230; Ich gehe trotzdem mal aus, dass das meinem Kumpel egal ist &#8211; er wohnt in Leipzig, da will er kaum zum Marktplatz fahren, sondern eher Fernverkehrsreiseziele der Gr\u00f6\u00dfenordnung Amsterdam, Prag oder Paris aufgelistet haben. Wobei&#8230; Leipzig ist ja ein klein Paris (sagte Goethe, und Goethe muss es wissen, der wusste schlie\u00dflich vieles und das meiste besser).<\/p>\n<p>Also weiter im Text, das eigentliche Endergebnis ist ja die Karte mit maximalen Umsteigeverbindungen und zehn Stunden Reisezeit. Und die sieht so aus:<\/p>\n<p><a href=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/leipzig_10_10_full.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone\" src=\"http:\/\/www.domaratius.de\/blog\/img\/20180606\/leipzig_10_10.jpg\" alt=\"Von Leipzig aus in 10h mit max. 9mal Umsteigen\" width=\"600\" height=\"545\" \/><\/a><\/p>\n<p>Wenn man das nun mit der weiter oben gezeigten Karte von den Erlanger Verbindungen vergleicht, stellt man im Wesentlichen folgendes fest: Richtung Westen \u00e4ndert sich nicht viel, man schafft es entlang der TGV-Strecken in Frankreich nicht ganz so weit Richtung Marseille und Bordeaux, aber Paris wird bequem im gesetzten Zeitraum erreicht. Richtung Norden kommt man ein gutes St\u00fcck weiter, n\u00e4mlich bis zu den n\u00f6rdlichen Spitzen D\u00e4nemarks sowie nach Schweden. Richtung S\u00fcden kommt man erwartungsgem\u00e4\u00df nicht so weit, Erlangen liegt halt schon mal 1.5h Fahrzeit weiter s\u00fcdlich. Venedig muss man damit von der Liste streichen, ebenso den Gro\u00dfteil Sloweniens und Ungarns. Im Osten hingegen kommt man von Leipzig aus wieder weiter, so erreicht man in Polen eine ganze Reihe weiterer Ziele wie Krakau, Warschau oder Danzig.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im letzten halben Jahr war ich (mit Pausen nat\u00fcrlich) damit besch\u00e4ftigt, eine Frage eines Bekannten zu beantworten. Der hatte mich n\u00e4mlich sinngem\u00e4\u00df folgendes gefragt: Welche Ziele kann ich erreichen, wenn ich morgens in einen Zug einsteige und maximal x Stunden unterwegs sein will? Die Onlinesuche der Bahn hilft in dem Fall nicht weiter, denn die [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/posts\/2311"}],"collection":[{"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/comments?post=2311"}],"version-history":[{"count":2,"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/posts\/2311\/revisions"}],"predecessor-version":[{"id":2728,"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/posts\/2311\/revisions\/2728"}],"wp:attachment":[{"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/media?parent=2311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/categories?post=2311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.domaratius.de\/blog\/wp-json\/wp\/v2\/tags?post=2311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}