Skip to content

Custom Types

Jan Jakobus edited this page Sep 28, 2023 · 14 revisions

Custom Types

The project introduces custom types regarding locations and journeys, that are used in communication between Backend and Frontend.

Need for custom types

The Backend uses some 3rd party APIs (as of today VRR's API) to query for locations and to plan journeys. In consequence types of the results are determined by the external API. Why not using these? Firstly these types are not available to add to a typescript project to assure type safety. Secondly it is not possible (and not desirable too, see third) to use these types with Frontend client generation tools like Swagger OpenAPI. Finally the most relevant reason: Using custom types ensure that our Frontend is decoupled from any 3rd party API that's used by the Backend.

Design of types

All types are designed based on example structures that were received from VRR's API. See attechements for some examples. The analysis below shows which use cases are differentiated and which fields are always given and which not (only fields that are interesting are being listed).

Locations

Use Case Results count Id Name Type Coordinates Parent Assigned Stops Fields for Rating
Searching by name multiple yes yes yes yes** yes no matchQuality
Searching by coordinates one yes yes yes yes** yes yes none
Parents of locations one no* yes yes no yes*** no none
Assigned stops multiple yes yes yes yes** yes no Distance, Duration

* There are some cases where there actually is an id.

** Always typed as Number.

*** While there could be a chain of parents, such structures never appeared in location examples (but needed for Journeys).

Example: Searching for name
[
{
  "coord": [
    51.50493,
    7.10221
  ],
  "disassembledName": "Hbf",
  "id": "de:05513:5613",
  "isBest": true,
  "isGlobalId": true,
  "matchQuality": 805,
  "name": "Gelsenkirchen, Hbf",
  "parent": {
    "id": "placeID:5513000:9",
    "name": "Gelsenkirchen",
    "type": "locality"
  },
  "productClasses": [
    0,
    1,
    4,
    5,
    7,
    10
  ],
  "properties": {
    "stopId": "20005613"
  },
  "type": "stop"
},
{
  "coord": [
    51.53899,
    7.0263
  ],
  "disassembledName": "Buerer Str.",
  "id": "de:05513:5579",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 773,
  "name": "Gelsenkirchen, Buerer Str.",
  "parent": {
    "id": "placeID:5513000:9",
    "name": "Gelsenkirchen",
    "type": "locality"
  },
  "productClasses": [
    2,
    4,
    5,
    7,
    10
  ],
  "properties": {
    "stopId": "20005579"
  },
  "type": "stop"
},
{
  "coord": [
    51.57824,
    7.05752
  ],
  "disassembledName": "Buer Rathaus",
  "id": "de:05513:4662",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 770,
  "name": "Gelsenkirchen, Buer Rathaus",
  "parent": {
    "id": "placeID:5513000:9",
    "name": "Gelsenkirchen",
    "type": "locality"
  },
  "productClasses": [
    4,
    5,
    7,
    10
  ],
  "properties": {
    "stopId": "20004662"
  },
  "type": "stop"
},
{
  "coord": [
    51.55516,
    7.06225
  ],
  "disassembledName": "VELTINS-Arena",
  "id": "de:05513:5524",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 770,
  "name": "Gelsenkirchen, VELTINS-Arena",
  "parent": {
    "id": "placeID:5513000:9",
    "name": "Gelsenkirchen",
    "type": "locality"
  },
  "productClasses": [
    4,
    5
  ],
  "properties": {
    "stopId": "20005524"
  },
  "type": "stop"
},
{
  "coord": [
    51.48126,
    7.11195
  ],
  "disassembledName": "Leithe Gelsenkirchener Str.",
  "id": "de:05911:5112",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 709,
  "name": "Bochum, Leithe Gelsenkirchener Str.",
  "parent": {
    "id": "placeID:5911000:3",
    "name": "Bochum",
    "type": "locality"
  },
  "productClasses": [
    5
  ],
  "properties": {
    "stopId": "20005112"
  },
  "type": "stop"
},
{
  "coord": [
    51.49626,
    7.10162
  ],
  "disassembledName": "Marienhospital Gelsenkirchen",
  "id": "de:05513:5034",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 709,
  "name": "Gelsenkirchen, Marienhospital Gelsenkirchen",
  "parent": {
    "id": "placeID:5513000:9",
    "name": "Gelsenkirchen",
    "type": "locality"
  },
  "productClasses": [
    5
  ],
  "properties": {
    "stopId": "20005034"
  },
  "type": "stop"
},
{
  "coord": [
    51.15622,
    6.38889
  ],
  "disassembledName": "Genhülsen Trafo",
  "id": "de:05116:23084",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 639,
  "name": "Mönchengladbach, Genhülsen Trafo",
  "parent": {
    "id": "placeID:5116000:60",
    "name": "Mönchengladbach",
    "type": "locality"
  },
  "productClasses": [
    5
  ],
  "properties": {
    "stopId": "20023084"
  },
  "type": "stop"
},
{
  "coord": [
    51.15231,
    6.4018
  ],
  "disassembledName": "Abzw. Genhülsen",
  "id": "de:05116:23087",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 637,
  "name": "Mönchengladbach, Abzw. Genhülsen",
  "parent": {
    "id": "placeID:5116000:60",
    "name": "Mönchengladbach",
    "type": "locality"
  },
  "productClasses": [
    5
  ],
  "properties": {
    "stopId": "20023087"
  },
  "type": "stop"
},
{
  "coord": [
    51.15474,
    6.39439
  ],
  "disassembledName": "Genhülsen Kapelle",
  "id": "de:05116:23085",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 637,
  "name": "Mönchengladbach, Genhülsen Kapelle",
  "parent": {
    "id": "placeID:5116000:60",
    "name": "Mönchengladbach",
    "type": "locality"
  },
  "productClasses": [
    5
  ],
  "properties": {
    "stopId": "20023085"
  },
  "type": "stop"
},
{
  "coord": [
    51.58827,
    7.07751
  ],
  "disassembledName": "Baut",
  "id": "de:05513:4591",
  "isBest": false,
  "isGlobalId": true,
  "matchQuality": 570,
  "name": "Gelsenkirchen, Baut",
  "parent": {
    "id": "placeID:5513000:9",
    "name": "Gelsenkirchen",
    "type": "locality"
  },
  "productClasses": [
    5
  ],
  "properties": {
    "stopId": "20004591"
  },
  "type": "stop"
}
]
Example: Searching for coordinates
[
{
  "assignedStops": [
    {
      "coord": [
        5288779,
        790526
      ],
      "disassembledName": "Hbf",
      "id": "de:05513:5613",
      "isGlobalId": true,
      "name": "Gelsenkirchen Hbf",
      "parent": {
        "name": "Gelsenkirchen",
        "type": "locality"
      },
      "productClasses": [
        1,
        0,
        4,
        5,
        7,
        10
      ],
      "properties": {
        "stopId": "20005613"
      },
      "type": "stop",
      "connectingMode": 100,
      "distance": 53,
      "duration": 0
    },
    {
      "coord": [
        5288581,
        790845
      ],
      "disassembledName": "Wildenbruchstr.",
      "id": "de:05513:5731",
      "isGlobalId": true,
      "name": "Gelsenkirchen Wildenbruchstr.",
      "parent": {
        "name": "Gelsenkirchen",
        "type": "locality"
      },
      "productClasses": [
        5
      ],
      "properties": {
        "stopId": "20005731"
      },
      "type": "stop",
      "connectingMode": 100,
      "distance": 328,
      "duration": 5
    },
    {
      "coord": [
        5289219,
        790870
      ],
      "disassembledName": "Neustadtplatz",
      "id": "de:05513:6687",
      "isGlobalId": true,
      "name": "Gelsenkirchen Neustadtplatz",
      "parent": {
        "name": "Gelsenkirchen",
        "type": "locality"
      },
      "productClasses": [
        5
      ],
      "properties": {
        "stopId": "20006687"
      },
      "type": "stop",
      "connectingMode": 100,
      "distance": 417,
      "duration": 6
    },
    {
      "coord": [
        5288450,
        789905
      ],
      "disassembledName": "Machensplatz",
      "id": "de:05513:5344",
      "isGlobalId": true,
      "name": "Gelsenkirchen Machensplatz",
      "parent": {
        "name": "Gelsenkirchen",
        "type": "locality"
      },
      "productClasses": [
        5
      ],
      "properties": {
        "stopId": "20005344"
      },
      "type": "stop",
      "connectingMode": 100,
      "distance": 421,
      "duration": 6
    },
    {
      "coord": [
        5288442,
        789888
      ],
      "disassembledName": "Heinrich-König-Platz",
      "id": "de:05513:6686",
      "isGlobalId": true,
      "name": "GE Heinrich-König-Platz",
      "parent": {
        "name": "Gelsenkirchen",
        "type": "locality"
      },
      "productClasses": [
        4
      ],
      "properties": {
        "stopId": "20006686"
      },
      "type": "stop",
      "connectingMode": 100,
      "distance": 433,
      "duration": 6
    },
    {
      "coord": [
        5289510,
        791014
      ],
      "disassembledName": "Rheinelbestr.",
      "id": "de:05513:5145",
      "isGlobalId": true,
      "name": "Gelsenkirchen Rheinelbestr.",
      "parent": {
        "name": "Gelsenkirchen",
        "type": "locality"
      },
      "productClasses": [
        4,
        5
      ],
      "properties": {
        "stopId": "20005145"
      },
      "type": "stop",
      "connectingMode": 100,
      "distance": 623,
      "duration": 9
    },
    {
      "coord": [
        5289265,
        790251
      ],
      "disassembledName": "Wiehagen",
      "id": "de:05513:6694",
      "isGlobalId": true,
      "name": "Gelsenkirchen Wiehagen",
      "parent": {
        "name": "Gelsenkirchen",
        "type": "locality"
      },
      "productClasses": [
        5,
        10
      ],
      "properties": {
        "stopId": "20006694"
      },
      "type": "stop",
      "connectingMode": 100,
      "distance": 657,
      "duration": 9
    }
  ],
  "coord": [
    5288715,
    790483
  ],
  "disassembledName": "Bahnhofcenter",
  "id": "coord:790483:5288715:MRCV:Altstadt (Gelsenkirchen), Bahnhofcenter:0",
  "name": "Altstadt (Gelsenkirchen), Bahnhofcenter",
  "parent": {
    "id": "placeID:5513000:1500000000",
    "name": "Altstadt (Gelsenkirchen)",
    "type": "locality"
  },
  "type": "address"
}
]

Journeys

Types Overview

Journey (multiple)
  |
  |--- interchanges <number>
  |--- legs <Leg>

Leg (at least one)
  |
  |--- origin <JourneyLocationElement>
  |--- destination <JourneyLocationElement>
  |--- transportation <Transportation>
  |
  |--- duration <number> [in secs]
  |--- distance <number> [never used in examples]
  |--- hints <Info[]> [general information about transportation on this leg, sometimes missing]
  |--- infos <Info[]> [information like restrictions regarding specific journey/leg]
  |--- footpath <Footpath> [optional]
  |--- interchange <Interchange> [optional]
  |--- coords* <Array<number>>
  |--- stopSequence <JourneyLocationElement[]>

JourneyLocationElement
  |
  |--- ...Location**
  |--- arrivalTimePlanned <string>
  |--- arrivalTimeEstimated <string>
  |--- departureTimePlanned <string>
  |--- departureTimeEstimated <string>

Transportation
  |
  |--- id <string>
  |--- name <string>
  |--- disassembledName <string>
  |--- number <string> [identical to disassembledName, but always present]
  |--- destination <Location>
  |--- product <Product> [only relevant to determine if footpath]
  |--- operator <OperatorObject>

Info
  |
  |--- content <string> [can contain html formatting]
  |--- priority <string> ["veryHigh", "normal"]
  |--- urlText <string>
  |--- url <string> [links to text identical to content]
  |--- title <string>
  |--- subtitle <string> [can be identical to title]
  |--- additionalText <string>
  |--- properties <InfoProperties> [includes Date from-to, sometimes additional links]

Interchange
  |
  |--- desc <string> [no example other than "Fussweg"]
  |--- coords <Array<Array<number>>>

* Always typed as Number.

** Mostly includes multiple parents.

JourneyLocationElement use cases

Use Case arrivalTimePlanned arrivalTimeEstimated departureTimePlanned departureTimeEstimated
Leg Origin no no yes yes
Leg Destination yes yes no no
Stop Sequence Origin no no yes no
Stop Sequence Intermediate yes no yes no
Stop Sequence Destination yes no no no

Transportation use cases / products

Use Case / "product" id name disassembledName number destination operator
Typical vehicle (Bus, RE, ...) yes yes yes* yes yes** yes*
"footpath" no no no no no no
"gesicherter Anschluss" no no no no no no

* There are some cases this field is missing without any particular reason.

** Id of destination location is not global (not matching with typical location ids from location search).

Info use cases

Use Case content priority url urlText title subtitle additionalText properties
hint yes no no no no no no no
info yes* yes yes yes** yes yes yes yes

* Can contain html formatting.

** Can be empty string.

Example: Simple Journey
{
"rating": 0,
"isAdditional": false,
"interchanges": 1,
"legs": [
  {
    "duration": 480,
    "origin": {
      "isGlobalId": true,
      "id": "de:05513:5613:91:7",
      "name": "Gelsenkirchen Hbf",
      "disassembledName": "7",
      "type": "platform",
      "pointType": "TRACK",
      "coord": [
        5288910,
        790718
      ],
      "niveau": 2,
      "parent": {
        "isGlobalId": true,
        "id": "de:05513:5613",
        "name": "Gelsenkirchen Hbf",
        "type": "stop",
        "parent": {
          "id": "placeID:5513000:9",
          "name": "Gelsenkirchen",
          "type": "locality"
        },
        "properties": {
          "stopId": "20005613"
        },
        "coord": [
          5288900,
          790614
        ],
        "niveau": 0
      },
      "productClasses": [
        0,
        1,
        4,
        5,
        7,
        10
      ],
      "departureTimePlanned": "2023-12-01T11:26:00Z",
      "departureTimeEstimated": "2023-12-01T11:26:00Z",
      "properties": {
        "downloads": [
          {
            "type": "RM",
            "url": "FILELOAD?Filename=nrw_6511BBF70.pdf"
          },
          {
            "type": "SM",
            "url": "vrr/05613_ge_hbf_1.htm"
          }
        ],
        "AREA_NIVEAU_DIVA": "2",
        "stoppingPointPlanned": "7",
        "areaGid": "de:05513:5613:91",
        "area": "91",
        "platform": "7",
        "platformName": "7"
      }
    },
    "destination": {
      "isGlobalId": true,
      "id": "de:05562:3644:90:2",
      "name": "RE Süd Bf",
      "disassembledName": "2",
      "type": "platform",
      "pointType": "TRACK",
      "coord": [
        5278475,
        801016
      ],
      "niveau": 0,
      "parent": {
        "isGlobalId": true,
        "id": "de:05562:3644",
        "name": "RE Süd Bf",
        "type": "stop",
        "parent": {
          "id": "placeID:5562032:12",
          "name": "Recklinghausen",
          "type": "locality"
        },
        "properties": {
          "stopId": "20003644"
        },
        "coord": [
          5278703,
          800957
        ],
        "niveau": 0
      },
      "productClasses": [
        0,
        1,
        5
      ],
      "arrivalTimePlanned": "2023-12-01T11:34:00Z",
      "arrivalTimeEstimated": "2023-12-01T11:34:00Z",
      "properties": {
        "downloads": [
          {
            "type": "RM",
            "url": "FILELOAD?Filename=nrw_6511BBF71.pdf"
          }
        ],
        "AREA_NIVEAU_DIVA": "0",
        "stoppingPointPlanned": "2",
        "areaGid": "de:05562:3644:90",
        "area": "91",
        "platform": "2",
        "platformName": "2"
      }
    },
    "transportation": {
      "id": "ddb:90E42: :H:j23",
      "name": "Regionalzug RE42",
      "disassembledName": "RE42",
      "number": "RE42",
      "product": {
        "id": 8,
        "class": 13,
        "name": "Regionalzug",
        "iconId": 6
      },
      "operator": {
        "code": "DBNW",
        "id": "8003",
        "name": "DB Regio AG NRW"
      },
      "destination": {
        "id": "24041000",
        "name": "Münster (Westf) Hbf",
        "type": "stop"
      },
      "properties": {
        "trainName": "Niers-Haard-Express",
        "trainType": "RE",
        "trainNumber": "10131",
        "tripCode": 77,
        "timetablePeriod": "Jahresfahrplan 2023",
        "lineDisplay": "LINE",
        "globalId": "de:nrw.de:re42:"
      }
    },
    "hints": [
      {
        "content": "Linie RE42: Fahrradmitnahme begrenzt möglich",
        "providerCode": "FK",
        "type": "Timetable",
        "properties": {
          "subnet": "ddb"
        }
      },
      {
        "content": "Linie RE42: Fahrzeuggebundene Einstiegshilfe vorhanden",
        "providerCode": "EH",
        "type": "Timetable",
        "properties": {
          "subnet": "ddb"
        }
      },
      {
        "content": "Linie RE42: rollstuhltaugliches WC",
        "providerCode": "OC",
        "type": "Timetable",
        "properties": {
          "subnet": "ddb"
        }
      }
    ],
    "stopSequence": [
      {
        "isGlobalId": true,
        "id": "de:05513:5613:91:7",
        "name": "Gelsenkirchen Hbf",
        "disassembledName": "7",
        "type": "platform",
        "pointType": "TRACK",
        "coord": [
          5288910,
          790718
        ],
        "niveau": 2,
        "parent": {
          "isGlobalId": true,
          "id": "de:05513:5613",
          "name": "Gelsenkirchen Hbf",
          "type": "stop",
          "parent": {
            "id": "placeID:5513000:9",
            "name": "Gelsenkirchen",
            "type": "locality"
          },
          "properties": {
            "stopId": "20005613"
          },
          "coord": [
            5288900,
            790614
          ],
          "niveau": 0
        },
        "productClasses": [
          0,
          1,
          4,
          5,
          7,
          10
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "2",
          "stoppingPointPlanned": "7",
          "areaGid": "de:05513:5613:91",
          "area": "91",
          "platform": "7",
          "platformName": "7",
          "zone": "vrr:260"
        },
        "departureTimePlanned": "2023-12-01T11:26:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05916:7590:91:5",
        "name": "Wanne-Eickel Hbf",
        "disassembledName": "5",
        "type": "platform",
        "pointType": "TRACK",
        "coord": [
          5284181,
          797752
        ],
        "niveau": 1,
        "parent": {
          "isGlobalId": true,
          "id": "de:05916:7590",
          "name": "Wanne-Eickel Hbf",
          "type": "stop",
          "parent": {
            "id": "placeID:5916000:5",
            "name": "Herne",
            "type": "locality"
          },
          "properties": {
            "stopId": "20007590"
          },
          "coord": [
            5284190,
            797691
          ],
          "niveau": 0
        },
        "productClasses": [
          0,
          1,
          4,
          5,
          7
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "1",
          "stoppingPointPlanned": "5",
          "areaGid": "de:05916:7590:91",
          "area": "91",
          "platform": "5",
          "platformName": "5",
          "zone": "vrr:272"
        },
        "arrivalTimePlanned": "2023-12-01T11:30:00Z",
        "departureTimePlanned": "2023-12-01T11:31:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:3644:90:2",
        "name": "RE Süd Bf",
        "disassembledName": "2",
        "type": "platform",
        "pointType": "TRACK",
        "coord": [
          5278475,
          801016
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3644",
          "name": "RE Süd Bf",
          "type": "stop",
          "parent": {
            "id": "placeID:5562032:12",
            "name": "Recklinghausen",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003644"
          },
          "coord": [
            5278703,
            800957
          ],
          "niveau": 0
        },
        "productClasses": [
          0,
          1,
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "2",
          "areaGid": "de:05562:3644:90",
          "area": "91",
          "platform": "2",
          "platformName": "2",
          "zone": "vrr:174"
        },
        "arrivalTimePlanned": "2023-12-01T11:34:00Z"
      }
    ],
    "footPathInfo": [
      {
        "position": "AFTER",
        "duration": 300
      }
    ],
    "infos": [],
    "coords": [...],
    "pathDescriptions": [
      {
        "turnDirection": "UNKNOWN",
        "manoeuvre": "LEAVE",
        "name": "Ausstieg Zug rechts",
        "coord": [
          5278475,
          801016
        ],
        "skyDirection": 0,
        "duration": 0,
        "cumDuration": 27,
        "distance": 0,
        "cumDistance": 30,
        "fromCoordsIndex": 0,
        "toCoordsIndex": 0,
        "properties": {
          "INDOOR_TYPE": "PLATFORM_WAY"
        }
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "KEEP",
        "name": "Bahnsteig",
        "coord": [
          5278475,
          801016
        ],
        "skyDirection": 184,
        "duration": 27,
        "cumDuration": 27,
        "distance": 30,
        "cumDistance": 30,
        "fromCoordsIndex": 0,
        "toCoordsIndex": 5,
        "properties": {
          "INDOOR_TYPE": "PLATFORM_WAY",
          "TRACK_ILLUMINATED": "true"
        }
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "CONTINUE",
        "name": "Außenrampe abwärts zur Ebene -1",
        "coord": [
          5278519,
          801021
        ],
        "skyDirection": 183,
        "duration": 55,
        "cumDuration": 82,
        "distance": 61,
        "cumDistance": 92,
        "fromCoordsIndex": 5,
        "toCoordsIndex": 6,
        "properties": {
          "FLOOR_LEVEL_CHANGE_DIRECTION": "DOWN",
          "OUTDOOR_TYPE": "OUTDOOR_RAMP"
        }
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "CONTINUE",
        "name": "Fußweg im Gebäude",
        "coord": [
          5278617,
          801015
        ],
        "skyDirection": 183,
        "duration": 37,
        "cumDuration": 120,
        "distance": 42,
        "cumDistance": 134,
        "fromCoordsIndex": 6,
        "toCoordsIndex": 12,
        "properties": {
          "INDOOR_TYPE": "BUILDING_WAY",
          "TRACK_ILLUMINATED": "true"
        }
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "CONTINUE",
        "name": "",
        "coord": [
          5278663,
          800990
        ],
        "skyDirection": 272,
        "duration": 7,
        "cumDuration": 127,
        "distance": 8,
        "cumDistance": 142,
        "fromCoordsIndex": 12,
        "toCoordsIndex": 13,
        "properties": {
          "OUTDOOR_TYPE": "HIKING_TRAIL",
          "TRACK_ILLUMINATED": "true"
        }
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "CONTINUE",
        "name": "Treppe aufwärts zur Ebene 0",
        "coord": [
          5278662,
          800977
        ],
        "skyDirection": 272,
        "duration": 37,
        "cumDuration": 164,
        "distance": 8,
        "cumDistance": 150,
        "fromCoordsIndex": 13,
        "toCoordsIndex": 14,
        "properties": {
          "FLOOR_LEVEL_CHANGE_DIRECTION": "UP",
          "FLOOR_LEVEL_DIFFERENCE": "1",
          "INDOOR_TYPE": "STAIRS"
        }
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "CONTINUE",
        "name": "",
        "coord": [
          5278662,
          800964
        ],
        "skyDirection": 272,
        "duration": 5,
        "cumDuration": 170,
        "distance": 6,
        "cumDistance": 156,
        "fromCoordsIndex": 14,
        "toCoordsIndex": 15,
        "properties": {
          "OUTDOOR_TYPE": "HIKING_TRAIL"
        }
      },
      {
        "turnDirection": "LEFT",
        "manoeuvre": "TURN",
        "name": "Am Südbahnhof",
        "coord": [
          5278658,
          800954
        ],
        "skyDirection": 290,
        "duration": 28,
        "cumDuration": 199,
        "distance": 32,
        "cumDistance": 188,
        "fromCoordsIndex": 15,
        "toCoordsIndex": 18,
        "properties": {
          "TRACK_ILLUMINATED": "true"
        }
      },
      {
        "turnDirection": "RIGHT",
        "manoeuvre": "TURN",
        "name": "Hochlarmarkstraße",
        "coord": [
          5278709,
          800953
        ],
        "skyDirection": 177,
        "duration": 66,
        "cumDuration": 266,
        "distance": 74,
        "cumDistance": 263,
        "fromCoordsIndex": 18,
        "toCoordsIndex": 24,
        "properties": {
          "TRACK_ILLUMINATED": "true"
        }
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "CONTINUE",
        "name": "Hochlarmarkstraße",
        "coord": [
          5278727,
          800834
        ],
        "skyDirection": 262,
        "duration": 0,
        "cumDuration": 266,
        "distance": 1,
        "cumDistance": 264,
        "fromCoordsIndex": 24,
        "toCoordsIndex": 26,
        "properties": {
          "TRACK_ILLUMINATED": "true"
        }
      },
      {
        "turnDirection": "UNKNOWN",
        "manoeuvre": "ENTER",
        "name": "Einstieg Niederflurbus",
        "coord": [
          5278716,
          800830
        ],
        "skyDirection": 0,
        "duration": 0,
        "cumDuration": 266,
        "distance": 0,
        "cumDistance": 264,
        "fromCoordsIndex": 26,
        "toCoordsIndex": 26
      }
    ],
    "interchange": {
      "desc": "Fussweg",
      "type": 100,
      "coords": [...]
    },
    "fare": {
      "zones": [
        {
          "net": "",
          "toLeg": 0,
          "fromLeg": 0,
          "neutralZone": "",
          "zones": [],
          "zonesUnited": [
            [
              "26"
            ],
            [
              "27"
            ],
            [
              "17"
            ]
          ]
        }
      ]
    }
  },
  {
    "duration": 840,
    "origin": {
      "isGlobalId": true,
      "id": "de:05562:3644:2:02",
      "name": "RE Süd Bf",
      "disassembledName": "02",
      "type": "platform",
      "coord": [
        5278716,
        800830
      ],
      "niveau": 0,
      "parent": {
        "isGlobalId": true,
        "id": "de:05562:3644",
        "name": "RE Süd Bf",
        "type": "stop",
        "parent": {
          "id": "placeID:5562032:12",
          "name": "Recklinghausen",
          "type": "locality"
        },
        "properties": {
          "stopId": "20003644"
        },
        "coord": [
          5278703,
          800957
        ],
        "niveau": 0
      },
      "productClasses": [
        0,
        1,
        5
      ],
      "departureTimePlanned": "2023-12-01T11:43:00Z",
      "departureTimeEstimated": "2023-12-01T11:43:00Z",
      "properties": {
        "downloads": [
          {
            "type": "RM",
            "url": "FILELOAD?Filename=nrw_6511BBF71.pdf"
          }
        ],
        "AREA_NIVEAU_DIVA": "0",
        "stoppingPointPlanned": "02",
        "areaGid": "de:05562:3644:2",
        "area": "2",
        "platform": "02",
        "platformName": "02"
      }
    },
    "destination": {
      "isGlobalId": true,
      "id": "de:05562:4982:0:01",
      "name": "Gelsenkirchener Str",
      "disassembledName": "01",
      "type": "platform",
      "coord": [
        5275881,
        795341
      ],
      "niveau": 0,
      "parent": {
        "isGlobalId": true,
        "id": "de:05562:4982",
        "name": "Gelsenkirchener Str",
        "type": "stop",
        "parent": {
          "id": "placeID:5562020:6",
          "name": "Herten",
          "type": "locality"
        },
        "properties": {
          "stopId": "20004982"
        },
        "coord": [
          5275911,
          795331
        ],
        "niveau": 0
      },
      "productClasses": [
        5,
        7
      ],
      "arrivalTimePlanned": "2023-12-01T11:57:00Z",
      "arrivalTimeEstimated": "2023-12-01T11:57:00Z",
      "properties": {
        "downloads": [
          {
            "type": "RM",
            "url": "FILELOAD?Filename=nrw_6511BBF72.pdf"
          }
        ],
        "AREA_NIVEAU_DIVA": "0",
        "stoppingPointPlanned": "01",
        "areaGid": "de:05562:4982",
        "area": "0",
        "platform": "01",
        "platformName": "01"
      }
    },
    "transportation": {
      "id": "ves:40210: :H:j23",
      "name": "Niederflurbus 210",
      "disassembledName": "210",
      "number": "210",
      "description": "RE-Röllinghausen Marderweg - RE-Süd Neue Horizonte - Herten Mitte",
      "product": {
        "id": 13,
        "class": 5,
        "name": "Niederflurbus",
        "iconId": 5
      },
      "operator": {
        "code": "VEST",
        "id": "40",
        "name": "Vestische"
      },
      "destination": {
        "id": "20003626",
        "name": "Herten Mitte",
        "type": "stop"
      },
      "properties": {
        "tripCode": 17,
        "timetablePeriod": "Jahresfahrplan 2023 (09.01.2023 - 07.01.2024)",
        "lineDisplay": "LINE"
      }
    },
    "hints": [
      {
        "content": "Linie 210: Anschlussgarantie gilt auf allen Linien der Vestischen mo-so/feiertags zwischen 20.00 Uhr und Betriebsende. Infos unter www.vestische.de/anschlussgarantie.",
        "providerCode": "A",
        "type": "Timetable",
        "properties": {
          "subnet": "ves"
        }
      }
    ],
    "stopSequence": [
      {
        "isGlobalId": true,
        "id": "de:05562:3644:2:02",
        "name": "RE Süd Bf",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5278716,
          800830
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3644",
          "name": "RE Süd Bf",
          "type": "stop",
          "parent": {
            "id": "placeID:5562032:12",
            "name": "Recklinghausen",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003644"
          },
          "coord": [
            5278703,
            800957
          ],
          "niveau": 0
        },
        "productClasses": [
          0,
          1,
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:3644:2",
          "area": "2",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:174"
        },
        "departureTimePlanned": "2023-12-01T11:43:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:3643:0:02",
        "name": "Recklinghausen Karlstr.",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5279063,
          800287
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3643",
          "name": "Recklinghausen Karlstr.",
          "disassembledName": "Karlstr",
          "type": "stop",
          "parent": {
            "id": "placeID:5562032:12",
            "name": "Recklinghausen",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003643"
          },
          "coord": [
            5279055,
            800264
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:3643",
          "area": "0",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:174"
        },
        "arrivalTimePlanned": "2023-12-01T11:45:00Z",
        "departureTimePlanned": "2023-12-01T11:45:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:3642:2:02",
        "name": "Recklinghausen Michaelstr.",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5278758,
          799889
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3642",
          "name": "Recklinghausen Michaelstr.",
          "disassembledName": "Michaelstr",
          "type": "stop",
          "parent": {
            "id": "placeID:5562032:12",
            "name": "Recklinghausen",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003642"
          },
          "coord": [
            5278772,
            799893
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:3642:2",
          "area": "2",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:174"
        },
        "arrivalTimePlanned": "2023-12-01T11:46:00Z",
        "departureTimePlanned": "2023-12-01T11:46:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:3641:0:02",
        "name": "RE Zeche Recklinghausen II",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5278209,
          799388
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3641",
          "name": "RE Zeche Recklinghausen II",
          "type": "stop",
          "parent": {
            "id": "placeID:5562032:12",
            "name": "Recklinghausen",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003641"
          },
          "coord": [
            5278227,
            799385
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:3641",
          "area": "0",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:174"
        },
        "arrivalTimePlanned": "2023-12-01T11:47:00Z",
        "departureTimePlanned": "2023-12-01T11:47:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:3640:0:01",
        "name": "Recklinghausen Konradstr.",
        "disassembledName": "01",
        "type": "platform",
        "coord": [
          5277673,
          799170
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3640",
          "name": "Recklinghausen Konradstr.",
          "disassembledName": "Konradstr",
          "type": "stop",
          "parent": {
            "id": "placeID:5562032:12",
            "name": "Recklinghausen",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003640"
          },
          "coord": [
            5277699,
            799175
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "01",
          "areaGid": "de:05562:3640",
          "area": "0",
          "platform": "01",
          "platformName": "01",
          "zone": "vrr:174"
        },
        "arrivalTimePlanned": "2023-12-01T11:48:00Z",
        "departureTimePlanned": "2023-12-01T11:48:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:3639:0:02",
        "name": "Herten Neue Horizonte",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5276590,
          798223
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3639",
          "name": "Herten Neue Horizonte",
          "disassembledName": "Neue Horizonte",
          "type": "stop",
          "parent": {
            "id": "placeID:5562020:6",
            "name": "Herten",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003639"
          },
          "coord": [
            5276622,
            798223
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:3639",
          "area": "0",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:174|176"
        },
        "arrivalTimePlanned": "2023-12-01T11:50:00Z",
        "departureTimePlanned": "2023-12-01T11:50:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:4012:0:02",
        "name": "Herten Industriegebiet",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5276094,
          797892
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:4012",
          "name": "Herten Industriegebiet",
          "disassembledName": "Industriegebiet",
          "type": "stop",
          "parent": {
            "id": "placeID:5562020:6",
            "name": "Herten",
            "type": "locality"
          },
          "properties": {
            "stopId": "20004012"
          },
          "coord": [
            5276181,
            797928
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:4012",
          "area": "0",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:176"
        },
        "arrivalTimePlanned": "2023-12-01T11:51:00Z",
        "departureTimePlanned": "2023-12-01T11:51:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:4011:0:02",
        "name": "Herten Autobahn",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5275594,
          797491
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:4011",
          "name": "Herten Autobahn",
          "disassembledName": "Autobahn",
          "type": "stop",
          "parent": {
            "id": "placeID:5562020:6",
            "name": "Herten",
            "type": "locality"
          },
          "properties": {
            "stopId": "20004011"
          },
          "coord": [
            5275617,
            797494
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:4011",
          "area": "0",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:176"
        },
        "arrivalTimePlanned": "2023-12-01T11:52:00Z",
        "departureTimePlanned": "2023-12-01T11:52:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:3634:1:01",
        "name": "Herten Heiliger Dimitrios",
        "disassembledName": "01",
        "type": "platform",
        "coord": [
          5275426,
          796766
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:3634",
          "name": "Herten Heiliger Dimitrios",
          "disassembledName": "Heiliger Dimitrios",
          "type": "stop",
          "parent": {
            "id": "placeID:5562020:6",
            "name": "Herten",
            "type": "locality"
          },
          "properties": {
            "stopId": "20003634"
          },
          "coord": [
            5275366,
            796858
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "01",
          "areaGid": "de:05562:3634:1",
          "area": "1",
          "platform": "01",
          "platformName": "01",
          "zone": "vrr:176"
        },
        "arrivalTimePlanned": "2023-12-01T11:53:00Z",
        "departureTimePlanned": "2023-12-01T11:53:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:4181:0:02",
        "name": "Waldenburger Str",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5275684,
          796507
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:4181",
          "name": "Waldenburger Str",
          "type": "stop",
          "parent": {
            "id": "placeID:5562020:6",
            "name": "Herten",
            "type": "locality"
          },
          "properties": {
            "stopId": "20004181"
          },
          "coord": [
            5275680,
            796525
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:4181",
          "area": "0",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:176"
        },
        "arrivalTimePlanned": "2023-12-01T11:54:00Z",
        "departureTimePlanned": "2023-12-01T11:54:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:4173:0:02",
        "name": "Herten Adalbertstr.",
        "disassembledName": "02",
        "type": "platform",
        "coord": [
          5275880,
          796142
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:4173",
          "name": "Herten Adalbertstr.",
          "disassembledName": "Adalbertstr",
          "type": "stop",
          "parent": {
            "id": "placeID:5562020:6",
            "name": "Herten",
            "type": "locality"
          },
          "properties": {
            "stopId": "20004173"
          },
          "coord": [
            5275893,
            796135
          ],
          "niveau": 0
        },
        "productClasses": [
          5
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "02",
          "areaGid": "de:05562:4173",
          "area": "0",
          "platform": "02",
          "platformName": "02",
          "zone": "vrr:176"
        },
        "arrivalTimePlanned": "2023-12-01T11:55:00Z",
        "departureTimePlanned": "2023-12-01T11:55:00Z"
      },
      {
        "isGlobalId": true,
        "id": "de:05562:4982:0:01",
        "name": "Gelsenkirchener Str",
        "disassembledName": "01",
        "type": "platform",
        "coord": [
          5275881,
          795341
        ],
        "niveau": 0,
        "parent": {
          "isGlobalId": true,
          "id": "de:05562:4982",
          "name": "Gelsenkirchener Str",
          "type": "stop",
          "parent": {
            "id": "placeID:5562020:6",
            "name": "Herten",
            "type": "locality"
          },
          "properties": {
            "stopId": "20004982"
          },
          "coord": [
            5275911,
            795331
          ],
          "niveau": 0
        },
        "productClasses": [
          5,
          7
        ],
        "properties": {
          "AREA_NIVEAU_DIVA": "0",
          "stoppingPointPlanned": "01",
          "areaGid": "de:05562:4982",
          "area": "0",
          "platform": "01",
          "platformName": "01",
          "zone": "vrr:176"
        },
        "arrivalTimePlanned": "2023-12-01T11:57:00Z"
      }
    ],
    "infos": [],
    "coords": [...],
    "fare": {
      "zones": [
        {
          "net": "",
          "toLeg": 1,
          "fromLeg": 1,
          "neutralZone": "",
          "zones": [],
          "zonesUnited": [
            [
              "17"
            ]
          ]
        }
      ]
    },
    "properties": {
      "vehicleAccess": [
        "999|0|0|0|0"
      ],
      "PlanWheelChairAccess": "1"
    }
  }
],
"fare": {
  "zones": [
    {
      "net": "vrr",
      "toLeg": 1,
      "fromLeg": 0,
      "neutralZone": "",
      "zones": [
        [
          "260"
        ],
        [
          "272"
        ],
        [
          "270"
        ],
        [
          "174"
        ],
        [
          "176"
        ]
      ],
      "zonesUnited": [
        [
          "26"
        ],
        [
          "27"
        ],
        [
          "17"
        ]
      ]
    }
  ]
},
"daysOfService": {
  "rvb": "000000003EF800005FBF7EFD0003E7CF1E0EFD006FDFA0003DFBF7EE000001FB00000000"
}
}

FootPath information

Footpath (loose collection)
  |
  |--- footPathInfo* <Array<FootPathInfoClass>> [optional -> sometimes without interchange or transportation type === footpath]
  |--- pathDescriptions** <PathDescriptionClass[]> [optional -> only if transportation type === footpath or interchange included]

FootPathInfoClass
  |
  |--- duration <number> [in secs]
  |--- position <Position> [time-wise]
  |--- footPathElem <FootPathElemObject[]> [not always present]

FootPathElemObject
  |
  |--- type <FootPathElemType>
  |--- levelFrom <number>
  |--- levelTo <number>
  |--- origin <FluffyJourneyLocation> [id, type, coords]
  |--- destination <PurpleJourneyLocation> [id, type, coords]

PathDescriptionClass
  |
  |--- manoeuvre <Manoeuvre>
  |--- turnDirection <TurnDirection>
  |--- name <string> [sometimes empty]
  |--- duration <number> [in secs, can be 0]
  |--- distance <number> [in meters, can be 0]
  |--- coord <Array<number>> [position of specific manoeuvre]
  |--- fromCoordsIndex <number> [related to interchange coords or general coords if transportation === footpath]
  |--- toCoordsIndex <number> [related to interchange coords or general coords if transportation === footpath]

* Always typed as FootPathInfoClass.

** Always typed as PathDescriptionClass.

Example: Simplified Leg with footpath interchange
{
  "duration": 480,
  "origin": {
    "isGlobalId": true,
    "id": "de:05513:5613:91:7",
    "name": "Gelsenkirchen Hbf",
    "disassembledName": "7",
    "type": "platform",
    "pointType": "TRACK",
    "departureTimePlanned": "2023-12-01T11:26:00Z",
    "departureTimeEstimated": "2023-12-01T11:26:00Z",
    ...      
  },
  "destination": {
    "isGlobalId": true,
    "id": "de:05562:3644:90:2",
    "name": "RE Süd Bf",
    "disassembledName": "2",
    "type": "platform",
    "pointType": "TRACK",
    "arrivalTimePlanned": "2023-12-01T11:34:00Z",
    "arrivalTimeEstimated": "2023-12-01T11:34:00Z",
  ...
  },
  "transportation": {
    "id": "ddb:90E42: :H:j23",
    "name": "Regionalzug RE42",
    "disassembledName": "RE42",
    "number": "RE42",
    "destination": {
      "id": "24041000",
      "name": "Münster (Westf) Hbf",
      "type": "stop"
    },      
    ...
  },
  "footPathInfo": [
    {
      "position": "AFTER",
      "duration": 300
    }
  ],
  "pathDescriptions": [
    {
      "turnDirection": "UNKNOWN",
      "manoeuvre": "LEAVE",
      "name": "Ausstieg Zug rechts",
      "coord": [
        5278475,
        801016
      ],
      "skyDirection": 0,
      "duration": 0,
      "cumDuration": 27,
      "distance": 0,
      "cumDistance": 30,
      "fromCoordsIndex": 0,
      "toCoordsIndex": 0,
      "properties": {
        "INDOOR_TYPE": "PLATFORM_WAY"
      }
    },
    {
      "turnDirection": "STRAIGHT",
      "manoeuvre": "KEEP",
      "name": "Bahnsteig",
      "coord": [
        5278475,
        801016
      ],
      "skyDirection": 184,
      "duration": 27,
      "cumDuration": 27,
      "distance": 30,
      "cumDistance": 30,
      "fromCoordsIndex": 0,
      "toCoordsIndex": 5,
      "properties": {
        "INDOOR_TYPE": "PLATFORM_WAY",
        "TRACK_ILLUMINATED": "true"
      }
    },
    {
      "turnDirection": "STRAIGHT",
      "manoeuvre": "CONTINUE",
      "name": "Außenrampe abwärts zur Ebene -1",
      "coord": [
        5278519,
        801021
      ],
      "skyDirection": 183,
      "duration": 55,
      "cumDuration": 82,
      "distance": 61,
      "cumDistance": 92,
      "fromCoordsIndex": 5,
      "toCoordsIndex": 6,
      "properties": {
        "FLOOR_LEVEL_CHANGE_DIRECTION": "DOWN",
        "OUTDOOR_TYPE": "OUTDOOR_RAMP"
      }
    },
    {
      "turnDirection": "STRAIGHT",
      "manoeuvre": "CONTINUE",
      "name": "Fußweg im Gebäude",
      "coord": [
        5278617,
        801015
      ],
      "skyDirection": 183,
      "duration": 37,
      "cumDuration": 120,
      "distance": 42,
      "cumDistance": 134,
      "fromCoordsIndex": 6,
      "toCoordsIndex": 12,
      "properties": {
        "INDOOR_TYPE": "BUILDING_WAY",
        "TRACK_ILLUMINATED": "true"
      }
    },
    {
      "turnDirection": "STRAIGHT",
      "manoeuvre": "CONTINUE",
      "name": "",
      "coord": [
        5278663,
        800990
      ],
      "skyDirection": 272,
      "duration": 7,
      "cumDuration": 127,
      "distance": 8,
      "cumDistance": 142,
      "fromCoordsIndex": 12,
      "toCoordsIndex": 13,
      "properties": {
        "OUTDOOR_TYPE": "HIKING_TRAIL",
        "TRACK_ILLUMINATED": "true"
      }
    },
    {
      "turnDirection": "STRAIGHT",
      "manoeuvre": "CONTINUE",
      "name": "Treppe aufwärts zur Ebene 0",
      "coord": [
        5278662,
        800977
      ],
      "skyDirection": 272,
      "duration": 37,
      "cumDuration": 164,
      "distance": 8,
      "cumDistance": 150,
      "fromCoordsIndex": 13,
      "toCoordsIndex": 14,
      "properties": {
        "FLOOR_LEVEL_CHANGE_DIRECTION": "UP",
        "FLOOR_LEVEL_DIFFERENCE": "1",
        "INDOOR_TYPE": "STAIRS"
      }
    },
    {
      "turnDirection": "STRAIGHT",
      "manoeuvre": "CONTINUE",
      "name": "",
      "coord": [
        5278662,
        800964
      ],
      "skyDirection": 272,
      "duration": 5,
      "cumDuration": 170,
      "distance": 6,
      "cumDistance": 156,
      "fromCoordsIndex": 14,
      "toCoordsIndex": 15,
      "properties": {
        "OUTDOOR_TYPE": "HIKING_TRAIL"
      }
    },
    {
      "turnDirection": "LEFT",
      "manoeuvre": "TURN",
      "name": "Am Südbahnhof",
      "coord": [
        5278658,
        800954
      ],
      "skyDirection": 290,
      "duration": 28,
      "cumDuration": 199,
      "distance": 32,
      "cumDistance": 188,
      "fromCoordsIndex": 15,
      "toCoordsIndex": 18,
      "properties": {
        "TRACK_ILLUMINATED": "true"
      }
    },
    {
      "turnDirection": "RIGHT",
      "manoeuvre": "TURN",
      "name": "Hochlarmarkstraße",
      "coord": [
        5278709,
        800953
      ],
      "skyDirection": 177,
      "duration": 66,
      "cumDuration": 266,
      "distance": 74,
      "cumDistance": 263,
      "fromCoordsIndex": 18,
      "toCoordsIndex": 24,
      "properties": {
        "TRACK_ILLUMINATED": "true"
      }
    },
    {
      "turnDirection": "STRAIGHT",
      "manoeuvre": "CONTINUE",
      "name": "Hochlarmarkstraße",
      "coord": [
        5278727,
        800834
      ],
      "skyDirection": 262,
      "duration": 0,
      "cumDuration": 266,
      "distance": 1,
      "cumDistance": 264,
      "fromCoordsIndex": 24,
      "toCoordsIndex": 26,
      "properties": {
       "TRACK_ILLUMINATED": "true"
      }
    },
    {
      "turnDirection": "UNKNOWN",
      "manoeuvre": "ENTER",
      "name": "Einstieg Niederflurbus",
      "coord": [
        5278716,
        800830
      ],
      "skyDirection": 0,
      "duration": 0,
      "cumDuration": 266,
      "distance": 0,
      "cumDistance": 264,
      "fromCoordsIndex": 26,
      "toCoordsIndex": 26
    }
  ],
  "interchange": {
    "desc": "Fussweg",
    "type": 100,
    "coords": [...]
  },
  ...
}
Example: Simplified footpath Leg
{
    "duration": 240,
    "origin": {
      "isGlobalId": true,
      "id": "de:05562:4252:1:01",
      "name": "GLA Zweckel Mitte/Bf",
      "disassembledName": "01",
      "type": "platform",
      "departureTimePlanned": "2023-12-01T11:33:00Z",
      "departureTimeEstimated": "2023-12-01T11:33:00Z",
      ...
    },
    "destination": {
      "isGlobalId": true,
      "id": "de:05562:4196:90:1",
      "name": "Gladbeck-Zweckel Bf",
      "disassembledName": "1",
      "type": "platform",
      "pointType": "TRACK",
      "arrivalTimePlanned": "2023-12-01T11:37:00Z",
      "arrivalTimeEstimated": "2023-12-01T11:37:00Z",
      ...
    },
    "transportation": {
      "product": {
        "class": 99,
        "name": "footpath",
        "iconId": 99
      },
      "properties": {
        "tripCode": 0,
        "lineDisplay": "LINE"
      }
    },
    "stopSequence": [
      {
        "isGlobalId": true,
        "id": "de:05562:4252:1:01",
        "name": "GLA Zweckel Mitte/Bf",
        "disassembledName": "Zweckel Mitte/Bf",
        "type": "platform",
        "departureTimePlanned": "2023-12-01T11:33:00Z",
        ...
      },
      {
        "isGlobalId": true,
        "id": "de:05562:4196:90:1",
        "name": "Gladbeck-Zweckel Bf",
        "disassembledName": "Zweckel Bf",
        "type": "platform",
        "arrivalTimePlanned": "2023-12-01T11:37:00Z",
        ...
      }
    ],
    "footPathInfo": [
      {
        "position": "IDEST",
        "duration": 240,
        "footPathElem": [
          {
            "description": "",
            "type": "LEVEL",
            "levelFrom": 0,
            "levelTo": 0,
            "level": "LEVEL",
            "origin": {
              "id": "de:05562:4252",
              "isGlobalId": true,
              "type": "stop",
              "coord": [
                5273357,
                777769
              ],
              "properties": {
                "area": 1,
                "platform": 0,
                "georef": "1000551939:33:MRCV:100"
              }
            },
            "destination": {
              "id": "de:05562:4196",
              "isGlobalId": true,
              "type": "stop",
              "coord": [
                5273523,
                777512
              ],
              "properties": {
                "area": 60,
                "platform": 0,
                "georef": "320836055:2:MRCV:100"
              }
            }
          },
          {
            "description": "",
            "type": "STAIRS",
            "levelFrom": 0,
            "levelTo": -1,
            "level": "DOWN",
            "origin": {
              "id": "de:05562:4196",
              "isGlobalId": true,
              "type": "stop",
              "coord": [
                5273523,
                777512
              ],
              "properties": {
                "area": 60,
                "platform": 0,
                "georef": "320836055:2:MRCV:100"
              }
            },
            "destination": {
              "id": "de:05562:4196",
              "isGlobalId": true,
              "type": "stop",
              "coord": [
                5273645,
                777515
              ],
              "properties": {
                "area": 90,
                "platform": 0,
                "georef": "1002272441:85:MRCV:100"
              }
            }
          }
        ]
      }
    ],
    "pathDescriptions": [
      {
        "turnDirection": "UNKNOWN",
        "manoeuvre": "LEAVE",
        "name": "Ausstieg Niederflurbus rechts",
        "coord": [
          5273346,
          777759
        ],
        "skyDirection": 0,
        "duration": 0,
        "cumDuration": 129,
        "distance": 0,
        "cumDistance": 143,
        "fromCoordsIndex": 0,
        "toCoordsIndex": 0
      },
      {
        "turnDirection": "STRAIGHT",
        "manoeuvre": "KEEP",
        "name": "Dorstener Straße",
        "coord": [
          5273346,
          777759
        ],
        "skyDirection": 229,
        "duration": 129,
        "cumDuration": 129,
        "distance": 143,
        "cumDistance": 143,
        "fromCoordsIndex": 0,
        "toCoordsIndex": 9,
        "properties": {
          "TRACK_ILLUMINATED": "true"
        }
      },
      {
        "turnDirection": "RIGHT",
        "manoeuvre": "TURN",
        "name": "Feldhauser Straße/Beethovenstraße",
        "coord": [
          5273496,
          777584
        ],
        "skyDirection": 212,
        "duration": 48,
        "cumDuration": 177,
        "distance": 53,
        "cumDistance": 197,
        "fromCoordsIndex": 9,
        "toCoordsIndex": 16
      },
      {
        "turnDirection": "LEFT",
        "manoeuvre": "TURN",
        "name": "",
        "coord": [
          5273522,
          777515
        ],
        "skyDirection": 255,
        "duration": 13,
        "cumDuration": 190,
        "distance": 14,
        "cumDistance": 212,
        "fromCoordsIndex": 16,
        "toCoordsIndex": 17,
        "properties": {
          "FLOOR_LEVEL_CHANGE_DIRECTION": "UP",
          "OUTDOOR_TYPE": "HIKING_TRAIL"
        }
      },
      {
        "turnDirection": "RIGHT",
        "manoeuvre": "TURN",
        "name": "Außentreppe abwärts zur Ebene 0",
        "coord": [
          5273546,
          777513
        ],
        "skyDirection": 185,
        "duration": 9,
        "cumDuration": 200,
        "distance": 10,
        "cumDistance": 223,
        "fromCoordsIndex": 17,
        "toCoordsIndex": 19,
        "properties": {
          "FLOOR_LEVEL_CHANGE_DIRECTION": "DOWN",
          "FLOOR_LEVEL_DIFFERENCE": "-1",
          "OUTDOOR_TYPE": "OUTDOOR_STAIRS"
        }
      },
      {
        "turnDirection": "LEFT",
        "manoeuvre": "TURN",
        "name": "Bahnsteig",
        "coord": [
          5273549,
          777496
        ],
        "skyDirection": 164,
        "duration": 59,
        "cumDuration": 260,
        "distance": 66,
        "cumDistance": 289,
        "fromCoordsIndex": 19,
        "toCoordsIndex": 23,
        "properties": {
          "INDOOR_TYPE": "PLATFORM_WAY",
          "OUTDOOR_TYPE": "PLATFORM_WAY"
        }
      },
      {
        "turnDirection": "UNKNOWN",
        "manoeuvre": "ENTER",
        "name": "Einstieg Zug",
        "coord": [
          5273608,
          777507
        ],
        "skyDirection": 0,
        "duration": 0,
        "cumDuration": 260,
        "distance": 0,
        "cumDistance": 289,
        "fromCoordsIndex": 23,
        "toCoordsIndex": 24,
        "properties": {
          "INDOOR_TYPE": "PLATFORM_WAY",
          "OUTDOOR_TYPE": "PLATFORM_WAY"
        }
      }
    ]
  }
Clone this wiki locally