Trafikverket exponerar API

I eftermiddags lanserade Trafikverket en ny del av sin webbplats, Läget i trafiken. Via fliken Tågtrafiken kan du, precis som i tidigare vyer, söka tidtabeller för stationer och tåg. Denna information skickades tidigare i sin helhet från servern som HTML, nu hämtas den istället via en så kallad web service (API) med JavaScript på klienten (webbläsaren). Jag har tittat närmare på vilken information som är tillgänglig via detta API.

Genom att skriva en egen klient som efterliknar anropen som görs på Trafikverkets webbplats har jag funnit att följande data exponeras.

Stationer

Alla tågstationer (och trafikplatser?).

Exempelfrågan:

<ORIONML version='1.0'>
    <REQUEST plugin='KartDB'>
        <PLUGINML table='Stations'></PLUGINML>
    </REQUEST>
</ORIONML>

ger svaret:

{
    "Stations":
    {
        "Station":
        [
            {
                "CountyNo": "23",
                "EPSG": "3006",
                "EW": "472351",
                "Id": "002ce1da-199e-437c-b9ed-b5a2180869cf",
                "IkonNiva": "trafikplats_hpl",
                "Namn": "Krokom",
                "NS": "7022027",
                "Prognostisering": "true",
                "Signatur": "Krm",
                "Timestamp": "2011-06-14T10:35:49+02:00"
            },
            …
            {
                "CountyNo": "19",
                "EPSG": "3006",
                "EW": "587627",
                "Id": "ffd446fc-94b8-4537-8a9c-9c4aa807c087",
                "IkonNiva": "trafikplats_dp",
                "Namn": "Västerås C",
                "NS": "6608750",
                "Prognostisering": "true",
                "Signatur": "Vå",
                "Timestamp": "2011-06-14T10:35:49+02:00"
            }
        ]
    }
}

Meddelanden

Alla meddelanden som berör tågtrafiken vid olika stationer.

Exempelfrågan:

<ORIONML version="1.0">
    <REQUEST plugin="KartDB" locale="SE_sv">
        <PLUGINML table="Messages" />
    </REQUEST>
</ORIONML>

ger svaret:

{
    "Messages":
    {
        "Message":
        [
            {
                "CountyNo": "23",
                "EPSG": "3006",
                "EW": "418246.5",
                "Header": "banarbete",
                "IconId": "1005",
                "Id": "740326",
                "Message": "5\/10-6\/10 är tåg 10087 tidigarelagd pga av banarbete. Storlien 19.00, Enafors 19.10, Ånn 19.19, Duved 19.37, Åre 19.46, Undersåker 20.00, Järpen 20.11, Krokom 20.45, Östersund 21.00, Bräcke, 21.45 samt Ånge 22.05. En buss kommer att avgå i den gamla tidtabellen och ansluta med tåg 91 i Ånge. För mer information www.sj.se eller 0771-75 75 75.",
                "NS": "7014354",
                "PaverkadePlatser": "Ånn,Du,Åre,Ens,Jpn,Krm,Un,Ös,Gö,Bä,Bf,Stv,Pl,Åg",
                "StartTidpunkt": "2011-10-05T12:39:00+02:00",
                "UppdateradTidpunkt": "2011-09-20T12:42:39+02:00"
            },
            …
            {
                "CountyNo": "2",
                "EPSG": "3006",
                "EW": "670572",
                "Header": "banarbete",
                "IconId": "1005",
                "Id": "687756",
                "Message": "SL Pendeltåg Västerhaninge-Bålsta samt fjärrtåg Stockholm C-Västerås:\u000d\u000a\u000d\u000aEtt banarbete mellan Karlberg och Sundbyberg medför att endast ett av två spår kan trafikeras en kortare sträcka. Då tågen går enligt tidtabell ska inga förseningar uppstå på grund av detta men vid avvikelser så drabbas tåg i båda riktningar.",
                "NS": "6582927.5",
                "PaverkadePlatser": "Sub",
                "StartTidpunkt": "2011-07-18T07:00:00+02:00",
                "UppdateradTidpunkt": "2011-07-15T11:44:19+02:00"
            }
        ] 
    }
}

Tidtabeller

Aktuella tidtabeller vid alla stationer. Det är den här datan som enligt mig är den mest intressanta. Genom att filtrera och sortera går det enkelt att få ut precis den informationen man som resenär söker.

Exempelfrågan:

<ORIONML version="1.0">
    <REQUEST plugin="WOW" locale="SE_sv">
        <PLUGINML table="LpvTrafiklagen" />
    </REQUEST>
</ORIONML>

ger svaret:

{
    "LpvTrafiklagen":
    {
        "Trafiklage":
        [
            {
                "AnnonseradAnkomstTid": "07:27",
                "AnnonseradAvgangTid": "07:27",
                "AnnonseradTidpunktAnkomst": "2011-09-28T07:27:00+02:00",
                "AnnonseradTidpunktAvgang": "2011-09-28T07:27:00+02:00",
                "ArAnkomstTag": "true",
                "ArAvgangTag": "true",
                "InstalldAnkomst": "false",
                "InstalldAvgang": "false",
                "SenasteTidrapportAktivitet": "Ankomst",
                "StatiskInformationTagVisning": "För den här stationen är det inte säkert att information om beräknade förseningar eller inställda tåg visas",
                "StatiskInformationTrafikplatsVisning": "För den här stationen är det inte säkert att information om beräknade förseningar eller inställda tåg visas",
                "TagGrupp": "c8b11e29-86e5-419b-a7d9-00250f9df6cc",
                "TagGruppOrdning": "9",
                "TeknisktTagId": "2710",
                "TrafikInfoAgareMobilUrl": "http:\/\/www.sl.se",
                "TrafikInfoAgareNamn": "Stockholmståg\/SL",
                "TrafikInfoAgareUrl": "http:\/\/www.sl.se",
                "TrafikplatsNamn": "Solna",
                "TrafikplatsPrognos": "false",
                "TrafikplatsSignatur": "So",
                "Utgangsdatum": "2011-09-28T00:00:00+02:00",
                "VisaAnkomst": "true",
                "VisaAvgang": "true"
            },
            …
            {
                "AnmarkningarAnkomst": "SJ Regional",
                "AnmarkningarAvgang": "SJ Regional",
                "AnnonseradAnkomstTid": "07:09",
                "AnnonseradAvgangTid": "07:16",
                "AnnonseradTidpunktAnkomst": "2011-09-28T07:09:00+02:00",
                "AnnonseradTidpunktAvgang": "2011-09-28T07:16:00+02:00",
                "AnnonseratTagId": "218",
                "ArAnkomstTag": "true",
                "ArAvgangTag": "true",
                "Fran": "Linköping,Norrköping,Nyköping",
                "InstalldAnkomst": "false",
                "InstalldAvgang": "false",
                "SenasteTidrapportAktivitet": "Ankomst",
                "SparangivelseAnkomst": "18b",
                "SparangivelseAvgang": "18b",
                "StatiskInformationTrafikplatsVisning": "SL-tåg och Arlanda Express omfattas ej. 

Spåruppgifterna är preliminära och kan snabbt ändras. När du kommer till stationen måste du alltid kontrollera igen vilket spår tåget avgår från, eller ankommer till.", "TagGrupp": "c048bf5b-6c99-4a01-ac46-931c2b822023", "TagGruppOrdning": "7", "TeknisktTagId": "218", "Till": "Uppsala,Gävle", "TrafikInfoAgareMobilUrl": "http:\/\/www.sj.se\/sj\/jsp\/polopoly.jsp?d=288", "TrafikInfoAgareNamn": "SJ", "TrafikInfoAgareUrl": "http:\/\/www.sj.se\/sj\/jsp\/polopoly.jsp?d=288", "TrafikplatsNamn": "Stockholm C", "TrafikplatsPrognos": "true", "TrafikplatsSignatur": "Cst", "Utgangsdatum": "2011-09-28T00:00:00+02:00", "VisaAnkomst": "true", "VisaAvgang": "true" } ] } }

Avvikelser

Information om planerade och pågående vägarbeten samt avvikelser i färjetrafiken.

Exempelfrågan:

<ORIONML version="1.0">
    <REQUEST plugin="TrissData2">
        <PLUGINML table="Deviations" />
    </REQUEST>
</ORIONML>

ger svaret:

{
    "Deviations":
    {
        "Deviation":
        [
            {
                "Active": "true",
                "CountryCode": "se",
                "CountyNo": "2",
                "CreationTime": "2000-03-01T15:44:21+01:00",
                "EW": "721792.22",
                "Geometry": "POINT(721792,22 6619018,33)",
                "Header": "Blidö",
                "IconId": "140",
                "Id": "SE_SRA_TRISSID_1_1030564",
                "ListElements": "Väg 1025",
                "MainNews": "false",
                "MapObject": "false",
                "Message": "Färja.\u000d\u000aVäg 1025 vid Blidöleden, i båda riktningar.",
                "MessageCode": "färja",
                "MessageCodeValue": "ferry",
                "MessageType": "Färjor",
                "MessageTypeValue": "TransitInformation",
                "NS": "6619018.33",
                "Provider": "Trafikverket",
                "RoadCategory": "S",
                "RoadNumberNumeric": "1025",
                "SituationsId": "GUIDf7e0b46d-7376-4c45-8440-b7d7e51a39f5",
                "StartTime": "2011-05-18T18:26:28+02:00",
                "Teaser": "Väg 1025 vid Blidöleden, i båda riktningar.",
                "ValidUntilFurtherNotice": "true",
                "Version": "24",
                "VersionTime": "2011-05-18T18:26:13+02:00",
                "Zone": "Nord"
            },
            …
            {
                "Active": "true",
                "CountryCode": "se",
                "CountyNo": "12",
                "CreationTime": "2011-09-19T11:01:12+02:00",
                "EndTime": "2011-10-21T16:00:00+02:00",
                "EW": "445076.72",
                "Geometry": "POINT(445076,72 6208429,78)",
                "Header": "Härlöv Trafikplats, Kristianstad",
                "IconId": "120",
                "Id": "SE_SRA_TRISSID_2_8079856",
                "ListElements": "E 22",
                "LPV_Message": "På E22 mellan Trafikplats Vilan (38) och Trafikplats Härlöv (37), i riktning mot Hörby görs fräsning och beläggning av ytterfilen vid Trafikplats Härlöv, fram till påfartsramp mot Hässleholm.\u000d\u000aHastighetsbegränsat till 50 km\/h under pågående arbete, övrig tid 70 km\/h.\u000d\u000aRekommenderad hastighet 30 km\/h.",
                "MainNews": "true",
                "MapObject": "true",
                "Message": "Beläggningsarbete.\u000d\u000aE 22 mellan Trafikplats Vilan (38) och Trafikplats Härlöv (37), i riktning mot Hörby.\u000d\u000aPå E22 mellan Trafikplats Vilan (38) och Trafikplats Härlöv (37), i riktning mot Hörby görs fräsning och beläggning av ytterfilen vid Trafikplats Härlöv, fram till påfartsramp mot Hässleholm.\u000d\u000aHastighetsbegränsat till 50 km\/h under pågående arbete, övrig tid 70 km\/h.\u000d\u000aRekommenderad hastighet 30 km\/h.",
                "MessageCode": "beläggningsarbete",
                "MessageCodeValue": "resurfacingWork",
                "MessageType": "Vägarbete",
                "MessageTypeValue": "MaintenanceWorks",
                "NS": "6208429.78",
                "ParentId": "SE_SRA_TRISSID_1_8079856",
                "Provider": "Trafikverket",
                "RoadCategory": "E",
                "RoadNumberNumeric": "22",
                "Severity": "4",
                "SeverityText": "Stor påverkan",
                "SituationsId": "GUID70657dac-a857-4bc2-b1ca-5b5a8ea6be9a",
                "StartTime": "2011-09-26T12:45:00+02:00",
                "Teaser": "E 22 mellan Trafikplats Vilan (38) och Trafikplats Härlöv (37), i riktning mot Hörby.",
                "ValidUntilFurtherNotice": "false",
                "Version": "2",
                "VersionTime": "2011-09-26T12:48:31+02:00",
                "Zone": "NO"
            }
        ]
    }
}

Filtrering & sortering

Då Trafikverket har exponerat ett SQL-gränssnitt är det, som jag nämnder ovan, möjligt att ställa mer komplexa frågor för att filtrera och sortera informationen. Detta är också det stora problemet. I mina exempelfrågor har jag inte valt att göra någon filtrering, vilket resulterar i stora(!) mängder svarsdata. Tillgängliga attribut för PLUGINML:

Om du snabbt vill komma igång med Trafikverkets exponerade API finns:

Andra som bloggat om Trafikverkets API

Tweet

Svara på inlägget


Hittills 6 kommentarer

Rickard Pettersson (@RickardP)

Bra jobbat att hitta det, jag visste inte ens att dem startat ny sida/tjänst, jag har suttit och kollat lite på detta och har skrivit ett blogg inlägg om det på min hemsida som litet svar, dessutom med länk till C# kod att hämta data med: http://rickardp.se/blogg/trafikverket-exponerar-api

Rickard Pettersson (@RickardP)

Glömde nämna i förra kommentaren att i mitt blogg inlägg så skriver jag om att jag hittat en annan url för webservicen som fungerade bättre att anropa från C# men vet inte om det är exakt samma men verkar fungera med dem grejer jag testat med än så länge.

Erik Pettersson

Rickard: Snyggt jobbat, och grävt! Jag måste kika närmare på den endpoint du hittat också. Detta förenklar ju avsevärt för oss utvecklare, tyvärr känns det lite för bra för att vara sant.

Vill inte vara pesimistiskt i en lyckostund som denna, men exponeringen känns inte helt genomtänkt då den med enkelhet kan sätta hög last på deras maskiner. Hoppas dock att de väljer att inte fega och skala upp istället för att stänga in datan.

Rickard Pettersson (@RickardP)

Japp, jo, jag tänkte man får ju vara medveten om att dem med ganska stor säkerhet inte räknade med att någon skulle kolla på deras ajax anrop och börja anropa deras webservice.

Det intressanta vore ju att kontakta Trafikverket själva och se vad dem säger.

Johan

Vet någon något om ORIONML? Det verkar vara nåt slags XML-baserat frågespråk.

Leo

Att ha med filter samt orderby som attribut gör ju, som någon annan också nämner, att det går att sätta väldigt hög last på deras servrar – vilket gör dem sårbara för DoS-attacker….

Inte så bra, med tanke på att Trafikverket är ett statligt verk och det talas mer och mer om ”cyberkrigsföring”.

Ping- & trackbacks

API Måndag – Trafikverket, SJ, Bredbandskollen och E-delegationen « API – Mashup.se

[...] webbsajt och några timmar sedan så dokumenterade Erik Pettersson (som ligger bakom tågtider.net det API som används för att söka tidtabeller för tåg och stationer. Detta API användes av [...]