HAFAS Fahrplanauskunft API - Sammlung
Hier sammle ich unsortiert ein paar Dinge zum Zugriff auf Fahrplandaten per API
Allgemein sieht die Situation beim Zugriff auf Fahrplanauskunftsdaten eher recht traurig aus. Die einzelnen Verkehrsverbände, die für ihre Pläne verantwortlich sind betrachten die Pläne als ihr Eigentum und geben die Daten auch auf Anfrage eher selten frei.
Das Programm HAFAS wird von der Firma HaCon hergestellt und kommt bei einem Großteil der Verkehrsverbände in Deutschland und teilweise auch in anderen Ländern zum Einsatz. HAFAS bietet zwar Schnittstellen, aber HaCon verweigert die Herausgabe der Spezifikation, da dies die Entscheidung des Kunden sei.
HAFAS lässt sich recht leicht durch die URL identifzieren. Diese enthält meistens
Das andere beliebte System ist EFA der Firma Mentz Datenverarbeitung, dass sich über
Daneben gibt es vereinzelt noch andere Systeme.
Für die Kommunikation der Fahrplansysteme untereinander gibt es das DELFI-Projekt.
Die Spezifikation dafür ist offen zugänglich.
Die Interoperabilität der Systeme ist dabei abweichend gut.
Das HAFAS-System der Bahn zeigt z.B. problemlos auch regionale Routen aus anderen HAFAS- und EFA-Systemen an.
Bei den regionalen Verbänden konnte ich noch keinen Fall finden bei dem EFA und HAFAS zusammenarbeiten.
HAFAS-Systeme untereinander zeigen in manchen Fällen die genauen Haltestellen andere Verbände an, manchmal auch nur Gemeinden.
Wer also deutschlandweit nach Informationen sucht, sollte das System der DB benutzen.
HAFAS bietet eine JSON-API an - allerdings scheinbar nur in Ländern, die mit ihren Daten liberaler umgehen, wie Schweden oder Dänemark.
http://travelhack.se/dijamwisaam/downloads/HAFAS_ReST_Interface_VT_104. ...
http://labs.rejseplanen.dk/files/api/rest_documentation_latest.pdf
Da diese API einen API-Key benötigt wird sie hier mal ignoriert.
Schwerer aufzutreiben ist die XML-API. HaCon bietet hierfür keine offene Dokumentation an und unter die referenzierte XSD-Datei http://hafassrv.hacon.de/xml/hafasXMLInterface.xsd ist auch nicht vorhanden.
Wenn man etwas sucht findet man allerdings eine Kopie:
http://demo.hafas.de/hafas-res/sbb/xml/47r/hafasXMLInterface.xsd
Die XML-Daten werden in diesem Fall per
Allgemein scheint HAFAS dabei
Diese Funktion ist nicht dokumentiert.
Um eine Auflistung von Haltestellen zu finden sieht der Request so aus:
Die Antwort sieht z.B. so aus:
Die erhaltenen Koordinatenwerte kann man z.B. auf Google Maps als
Die in der xsd-Datei dokumentierte Methode sieht beispielsweise so aus:
Bei weiteren Requests sollte das Attribut
Der Aushangfahrplan ("STationBoard") lässt sich über diese Methode erhalten.
Soweit die Theorie.
In der Praxis verweigert
Die Alternative
Und die dritte Schnittstelle
Damit bleiben zwei Möglichkeiten:
Der iOS-Gateway der Bahn (
Der
Wenn man
Die Paramter, die per POST oder GET übergeben werden könnten sind u.A.:
Die Methode über
HAFAS verwendet am Ende der URL noch eine Endung, damit werden verschiedene Versionen angesprochen:
Dabei kann der erste Buchstabe ersetzt werden:
Die Situation bei Fahrplanauskünften
Allgemein sieht die Situation beim Zugriff auf Fahrplanauskunftsdaten eher recht traurig aus. Die einzelnen Verkehrsverbände, die für ihre Pläne verantwortlich sind betrachten die Pläne als ihr Eigentum und geben die Daten auch auf Anfrage eher selten frei.
HAFAS
Das Programm HAFAS wird von der Firma HaCon hergestellt und kommt bei einem Großteil der Verkehrsverbände in Deutschland und teilweise auch in anderen Ländern zum Einsatz. HAFAS bietet zwar Schnittstellen, aber HaCon verweigert die Herausgabe der Spezifikation, da dies die Entscheidung des Kunden sei.
HAFAS lässt sich recht leicht durch die URL identifzieren. Diese enthält meistens
query.exe
oder stboard.exe
Das andere beliebte System ist EFA der Firma Mentz Datenverarbeitung, dass sich über
XSLT_TRIP_REQUEST
in der URL identifizieren lässt.Daneben gibt es vereinzelt noch andere Systeme.
Interoperabilität
Für die Kommunikation der Fahrplansysteme untereinander gibt es das DELFI-Projekt.
Die Spezifikation dafür ist offen zugänglich.
Die Interoperabilität der Systeme ist dabei abweichend gut.
Das HAFAS-System der Bahn zeigt z.B. problemlos auch regionale Routen aus anderen HAFAS- und EFA-Systemen an.
Bei den regionalen Verbänden konnte ich noch keinen Fall finden bei dem EFA und HAFAS zusammenarbeiten.
HAFAS-Systeme untereinander zeigen in manchen Fällen die genauen Haltestellen andere Verbände an, manchmal auch nur Gemeinden.
Wer also deutschlandweit nach Informationen sucht, sollte das System der DB benutzen.
JSON-API
HAFAS bietet eine JSON-API an - allerdings scheinbar nur in Ländern, die mit ihren Daten liberaler umgehen, wie Schweden oder Dänemark.
http://travelhack.se/dijamwisaam/downloads/HAFAS_ReST_Interface_VT_104. ...
http://labs.rejseplanen.dk/files/api/rest_documentation_latest.pdf
Da diese API einen API-Key benötigt wird sie hier mal ignoriert.
XML-API
Schwerer aufzutreiben ist die XML-API. HaCon bietet hierfür keine offene Dokumentation an und unter die referenzierte XSD-Datei http://hafassrv.hacon.de/xml/hafasXMLInterface.xsd ist auch nicht vorhanden.
Wenn man etwas sucht findet man allerdings eine Kopie:
http://demo.hafas.de/hafas-res/sbb/xml/47r/hafasXMLInterface.xsd
Die XML-Daten werden in diesem Fall per
POST
an die Basis-URL von HAFAS query.exe/dn
gesendet.Allgemein scheint HAFAS dabei
ISO-8859-1
lieber zu sehen als UTF-8
.Beispiele
Haltestelle finden (undokumentiert)
Diese Funktion ist nicht dokumentiert.
Um eine Auflistung von Haltestellen zu finden sieht der Request so aus:
POST /query.exe/dn HTTP/1.1
Host: ???
Content-Type: application/xml; charset=utf-8
Content-Length: ??
Connection: close
<?xml version="1.0" encoding="UTF-8" ?>
<ReqC ver="1.1" prod="String" lang="DE">
<MLcReq>
<MLc n="Haltestellename" t="ST" />
</MLcReq>
</ReqC>
Die Antwort sieht z.B. so aus:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ResC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://hafassrv.hacon.de/xml/hafasXMLInterface.xsd" ver="1.1" prod="String" lang="EN">
<MLcRes flag="FINAL">
<MLc t="ST" n="Hauptbahnhof Nord, Dresden" i="A=1@O=Hauptbahnhof Nord, Dresden@X=13734996@Y=51041407@U=80@L=000972032@B=1@p=1321988872@" x="13734996" y="51041407" />
[...]
</MLcRes>
</ResC>
51.041407, 13.734996
eingeben, um den Standort zu sehen.Haltestelle finden (dokumentiert)
Die in der xsd-Datei dokumentierte Methode sieht beispielsweise so aus:
<?xml version="1.0" encoding="utf-8" ?>
<ReqC ver="1.1" prod="String" lang="DE">
<LocValReq id="001" maxNr="20" sMode="1">
<ReqLoc type="ST" match="Hauptbahnhof, Berlin" />
</LocValReq>
</ReqC>
<?xml version="1.0" encoding="ISO-8859-1"?>
<ResC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://hafassrv.hacon.de/xml/hafasXMLInterface.xsd" ver="1.1" prod="String" lang="EN">
<LocValRes flag="FINAL" id="001">
<Station name="Berlin Hbf" externalId="008011160#81" externalStationNr="008011160" type="WGS84" x="13369548" y="52525589"/>
[...]
</LocValRes>
</ResC>
Bei weiteren Requests sollte das Attribut
externalId
für die Haltestelle benutzt werden.Abfahrten anzeigen
Der Aushangfahrplan ("STationBoard") lässt sich über diese Methode erhalten.
Soweit die Theorie.
In der Praxis verweigert
query.exe
den Dienst und gibt einfach eine normale Seite zurück.Die Alternative
stboard.exe
gibt zwar ein Ergebnis zurück, aber das ist immer leer.Und die dritte Schnittstelle
extxml.exe
ist nicht überall verfügbar und wenn, dann braucht man einen API-Key (Attribut accessId
in ReqC
).<?xml version='1.0' encoding='iso-8859-1'?>
<ReqC ver='1.1' prod='String' lang='de' accessId='???'>
<STBReq boardType='DEP'>
<Time>11:20:11</Time>
<Today />
<TableStation externalId='009100003#86'/>
<ProductFilter>1111111111111111</ProductFilter>
</STBReq>
</ReqC>
<?xml version="1.0" encoding="iso-8859-1"?>
<ResC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://demo.hafas.de/xml/vbb/dai/hafasXMLInterface.xsd" ver="1.1" prod="HAFAS 5.28.VBB.4.7g" lang="DE">
<STBRes>
<JourneyList>
<STBJourney>
<MainStop>
<BasicStop index="6">
<Station name="S+U Alexanderplatz Bhf (Berlin)" x="13412831" y="52521148" type="WGS84" externalId="9100003#86" externalStationNr="9100003"/>
<Dep>
<Time>11:20</Time>
</Dep>
</BasicStop>
</MainStop>
<JourneyAttributeList>
<JourneyAttribute from="6" to="15">
<Attribute type="NAME">
<AttributeVariant type="NORMAL">
<Text>U2</Text>
</AttributeVariant>
</Attribute>
</JourneyAttribute>
<JourneyAttribute from="6" to="15">
<Attribute type="CATEGORY" code="1">
<AttributeVariant type="NORMAL">
<Text>U</Text>
</AttributeVariant>
</Attribute>
</JourneyAttribute>
<JourneyAttribute from="6" to="15">
<Attribute type="OPERATOR">
<AttributeVariant type="NORMAL">
<Text>BVG</Text>
</AttributeVariant>
</Attribute>
</JourneyAttribute>
<JourneyAttribute from="6" to="15">
<Attribute type="NUMBER">
<AttributeVariant type="NORMAL">
<Text>U2</Text>
</AttributeVariant>
</Attribute>
</JourneyAttribute>
<JourneyAttribute from="6" to="15">
<Attribute type="DIRECTION">
<AttributeVariant type="NORMAL">
<Text>U Gleisdreieck (Berlin)</Text>
</AttributeVariant>
</Attribute>
</JourneyAttribute>
<JourneyAttribute from="0" to="15">
<Attribute priority="350" type="NORMAL" code="RA">
<AttributeVariant type="NORMAL">
<Text>Fahrradmitnahme möglich</Text>
</AttributeVariant>
</Attribute>
</JourneyAttribute>
<JourneyAttribute from="0" to="15">
<Attribute priority="1" type="NORMAL" code="bf">
<AttributeVariant type="NORMAL">
<Text>barrierefrei</Text>
</AttributeVariant>
</Attribute>
</JourneyAttribute>
</JourneyAttributeList>
<ServiceDaysList>
<ServiceDays>
<RegularServiceText>
<Text>nicht täglich</Text>
</RegularServiceText>
<IrregularServiceText>
<Text>2., 3. Dez 2011</Text>
</IrregularServiceText>
</ServiceDays>
</ServiceDaysList>
</STBJourney>
[...]
</JourneyList>
</STBRes>
</ResC>
Damit bleiben zwei Möglichkeiten:
Der iOS-Gateway der Bahn (
mgate.exe
) lies sich zu einer Antwort überreden, die aber wieder ein anderes Format besitzt.<?xml version='1.0' encoding='iso-8859-1'?>
<ReqC ver='1.1' prod='String' lang='de'>
<STBReq boardType='DEP'>
<Time>11:20:11</Time>
<Period>
<DateBegin>20111202</DateBegin>
<DateEnd>20111202</DateEnd>
</Period>
<TableStation externalId='008011160#81'/>
<ProductFilter>1111111111111111</ProductFilter>
</STBReq>
</ReqC>
ProductFilter
gibt an, welche "Produkte" (Straßenbahn, Bus, ...) benutzt werden dürften. Ohne diese Angabe gibt das System keine Auskunft.<?xml version="1.0" encoding="iso-8859-1"?>
<ResC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://hafassrv.hacon.de/xml/hafasXMLInterface.xsd" ver="1.1" prod="HAFAS 5.29.DB.R8.40.h" lang="DE" ld="9649">
<STBResIPhone boardType="dep">
<Entries>
<StationBoardEntry name="Bus TXL" category="Bus" product="5" direction="Flughafen Tegel Airport" scheduledTime="11:20" scheduledPlatform="">
<JHandle tNr="515505" puic="80" cycle="12"/>
<Station name="Berlin Hauptbahnhof (S+U), Berlin" x="13368901" y="52526290" type="WGS84" externalId="730749#80" externalStationNr="730749"/>
<Messages></Messages>
<MessageContainerElement>
<MessageCluster></MessageCluster>
</MessageContainerElement>
</StationBoardEntry>
[...]
</Entries>
<MessageContainerHeader>
<MessageCluster></MessageCluster>
</MessageContainerHeader>
</STBResIPhone>
</ResC>
Wenn man
stboard.exe/dn
mit den richtigen Parametern füttert bekommt man die Abfahrten in verschiedenen Formaten ausgegeben.Die Paramter, die per POST oder GET übergeben werden könnten sind u.A.:
Paramter | Bedeutung |
---|---|
productsFilter | Verwendete Verkehrsmittel (s.O.). Für "Alle" weglassen oder "11111111111111". Achtung: Die konkreten Filterwerte unterscheiden sich zwischen den HAFAS-Systemen |
maxJourneys | Maximale Anzahl an Einträgen in Anzeige |
time | Abfahrtszeit als HH:MM oder actual für Jetzt |
inputTripelId (sic!) | Die Haltestellen-ID im Format wie sie die undokumentierte Funktion zur Haltestellensuche ausgibt |
input | (Alternativ) Die Haltestellen-ID aus dem externalStationNr -Feld der dokumentierten Methode. |
inputRef | (Wird beim Formular benutzt) <Name der Haltestelle>#<externalStationNr> |
boardType | dep = Abfahrten, arr Ankunften |
L | Ausgabeformat. Variiert bei verschiedenen Systemen. Textbasiert z.B.: vs_java , vs_java2 , vs_java3 |
start | yes um die Abfrage zu starten (sonst Formular) |
Die Methode über
input
war zwischen HAFAS-Systemen nicht zuverlässig, inputTripleId
sollte aber auch dann funktionieren.Sprachcodes in den URLs
HAFAS verwendet am Ende der URL noch eine Endung, damit werden verschiedene Versionen angesprochen:
Erweiterung | Funktion |
---|---|
dn | Deutsch, normal |
dl | Deutsch, nur Text |
dox | Deutsch, Handyversion |
Dabei kann der erste Buchstabe ersetzt werden:
Buchstabe | Sprache |
---|---|
d | Deutsch |
n | Niederländisch |
p | Polnisch |
e | Englisch |
i | Italienisch |
f | Französisch |
m | Dänisch |
h | Spanisch |
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 177145
Url: https://administrator.de/contentid/177145
Ausgedruckt am: 22.11.2024 um 06:11 Uhr