Author: Adam Evyčędo <git@apiote.xyz>
generate transitous motis2 api
app/build.gradle.kts | 29 + build.gradle.kts | 1 specs/motis2.yml | 1288 ++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fa1aa641706e77412d05ae850be974e2a8165252..cd24af98846d5c2cb16d055caca4fb969ec72141 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,7 @@ +import com.android.build.gradle.tasks.ExtractDeepLinksTask +import com.android.build.gradle.tasks.MergeResources +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + // SPDX-FileCopyrightText: Adam Evyčędo // // SPDX-License-Identifier: GPL-3.0-or-later @@ -7,6 +11,7 @@ id("com.android.application") kotlin("android") kotlin("plugin.parcelize") kotlin("plugin.serialization") + id("org.openapi.generator") } android { @@ -49,6 +54,27 @@ viewBinding = true } } +openApiGenerate { + generatorName.set("kotlin") + inputSpec.set("$rootDir/specs/motis2.yml") + outputDir.set("${layout.buildDirectory.get()}/generated") + apiPackage.set("xyz.apiote.bimba.czwek.api.transitous.api") + invokerPackage.set("xyz.apiote.bimba.czwek.api.transitous.invoker") + modelPackage.set("xyz.apiote.bimba.czwek.api.transitous.model") +} + +kotlin.sourceSets["main"].kotlin.srcDir("${layout.buildDirectory.get()}/generated/src/main/kotlin") + +tasks.withType<KotlinCompile> { + dependsOn("openApiGenerate") +} +tasks.withType<MergeResources> { + dependsOn("openApiGenerate") +} +tasks.withType<ExtractDeepLinksTask> { + dependsOn("openApiGenerate") +} + dependencies { implementation("androidx.core:core-ktx:1.15.0") implementation("androidx.appcompat:appcompat:1.7.0") @@ -76,10 +102,11 @@ implementation("com.google.guava:guava:33.3.1-android") implementation(project(":fruchtfleisch")) implementation("ch.acra:acra-http:5.11.4") implementation("ch.acra:acra-notification:5.11.4") + implementation("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.moshi:moshi-kotlin:1.15.1") coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.3") - testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.2.1") androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") } diff --git a/build.gradle.kts b/build.gradle.kts index 86f0ddbf3403895e1c7ff8b91dd0849b8edda743..ca6f53eea291845d61db0b769543e70f2afa1ee1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,6 +6,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id("com.android.application") version "8.7.2" apply false id("com.android.library") version "8.7.2" apply false + id("org.openapi.generator") version "7.9.0" apply false kotlin("android") version "2.0.10" apply false kotlin("jvm") version "1.7.20" apply false kotlin("plugin.parcelize") version "1.8.20" apply false diff --git a/specs/motis2.yml b/specs/motis2.yml new file mode 100644 index 0000000000000000000000000000000000000000..9720bdca1cf9cdc62d35d7214e484f9e70dd1523 --- /dev/null +++ b/specs/motis2.yml @@ -0,0 +1,1288 @@ +openapi: 3.1.0 +info: + title: MOTIS API + description: This is the MOTIS routing API. + contact: + email: felix@triptix.tech + license: + name: MIT + url: https://opensource.org/license/mit + version: v1 +externalDocs: + description: Find out more about MOTIS + url: https://github.com/motis-project/motis + # https://raw.githubusercontent.com/motis-project/motis/refs/heads/master/openapi.yaml +servers: + - url: https://europe.motis-project.de +paths: + /api/v1/one-to-many: + get: + tags: + - geocode + summary: | + Street routing from one to many places or many to one. + The order in the response array corresponds to the order of coordinates of the \`many\` parameter in the query. + operationId: oneToMany + parameters: + - name: one + in: query + required: true + description: geo location as latitude,longitude + schema: + type: string + - name: many + in: query + required: true + description: geo locations as latitude;longitude,latitude;longitude,... + schema: + type: array + items: + type: string + - name: mode + in: query + required: true + description: | + routing profile to use (currently supported: \`WALK\`, \`BIKE\`, \`CAR\`) + schema: + $ref: '#/components/schemas/Mode' + - name: max + in: query + required: true + description: maximum travel time in seconds + schema: + type: number + - name: maxMatchingDistance + in: query + required: true + description: maximum matching distance in meters to match geo coordinates to the street network + schema: + type: number + - name: arriveBy + in: query + required: true + description: | + true = many to one + false = one to many + schema: + type: boolean + responses: + 200: + description: | + A list of distance + duration pairs. + If no path was found, the object doesn't contain distance and duration. + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Duration' + + /api/v1/reverse-geocode: + get: + tags: + - geocode + summary: Translate coordinates to the closest address(es)/places/stops. + operationId: reverseGeocode + parameters: + - name: place + in: query + required: true + description: latitude, longitude in degrees + schema: + type: string + responses: + 200: + description: A list of guesses to resolve the coordinates to a location + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Match' + + /api/v1/geocode: + get: + tags: + - geocode + summary: Autocompletion & geocoding that resolves user input addresses including coordinates + operationId: geocode + parameters: + - name: text + in: query + required: true + description: the (potentially partially typed) address to resolve + schema: + type: string + + - name: language + in: query + required: false + description: | + language tags as used in OpenStreetMap + (usually ISO 639-1, or ISO 639-2 if there's no ISO 639-1) + schema: + type: string + + responses: + 200: + description: A list of guesses to resolve the text to a location + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Match' + + /api/v1/trip: + get: + tags: + - timetable + summary: Get a trip as itinerary + operationId: trip + parameters: + - name: tripId + in: query + schema: + type: string + required: true + description: trip identifier (e.g. from an itinerary leg or stop event) + responses: + 200: + description: the requested trip as itinerary + content: + application/json: + schema: + $ref: '#/components/schemas/Itinerary' + + /api/v1/stoptimes: + get: + tags: + - timetable + summary: Get the next N departures or arrivals of a stop sorted by time + operationId: stoptimes + parameters: + - name: stopId + in: query + schema: + type: string + required: true + description: stop id of the stop to retrieve departures/arrivals for + + - name: time + in: query + required: false + description: | + Optional. Defaults to the current time. + schema: + type: string + format: date-time + + - name: arriveBy + in: query + required: false + schema: + type: boolean + default: false + description: | + Optional. Default is `false`. + + - `arriveBy=true`: the parameters `date` and `time` refer to the arrival time + - `arriveBy=false`: the parameters `date` and `time` refer to the departure time + + - name: n + in: query + schema: + type: integer + required: true + description: the number of events + + - name: radius + in: query + schema: + type: integer + required: false + description: | + Optional. Radius in meters. + + Default is that only stop times of the parent of the stop itself + and all stops with the same name (+ their child stops) are returned. + + If set, all stops at parent stations and their child stops in the specified radius + are returned. + + - name: pageCursor + in: query + required: false + description: | + Use the cursor to go to the next "page" of stop times. + Copy the cursor from the last response and keep the original request as is. + This will enable you to search for stop times in the next or previous time-window. + schema: + type: string + + responses: + 200: + description: A list of guesses to resolve the text to a location + content: + application/json: + schema: + type: object + required: + - stopTimes + - previousPageCursor + - nextPageCursor + properties: + stopTimes: + description: list of stop times + type: array + items: + $ref: '#/components/schemas/StopTime' + previousPageCursor: + description: | + Use the cursor to get the previous page of results. Insert the cursor into the request and post it to get the previous page. + The previous page is a set of stop times BEFORE the first stop time in the result. + type: string + nextPageCursor: + description: | + Use the cursor to get the next page of results. Insert the cursor into the request and post it to get the next page. + The next page is a set of stop times AFTER the last stop time in this result. + type: string + + /api/v1/plan: + get: + tags: + - routing + summary: Computes optimal connections from one place to another. + operationId: plan + parameters: + - name: fromPlace + in: query + required: true + description: \`latitude,longitude,level\` tuple in degrees OR stop id + schema: + type: string + + - name: toPlace + in: query + required: true + description: \`latitude,longitude,level\` tuple in degrees OR stop id + schema: + type: string + + - name: time + in: query + required: false + description: | + Optional. Defaults to the current time. + + Departure time ($arriveBy=false) / arrival date ($arriveBy=true), + schema: + type: string + format: date-time + + - name: maxTransfers + in: query + required: false + description: | + The maximum number of allowed transfers. + If not provided, the routing uses the server-side default value + which is hardcoded and very high to cover all use cases. + + *Warning*: Use with care. Setting this too low can lead to + optimal (e.g. the fastest) journeys not being found. + If this value is too low to reach the destination at all, + it can lead to slow routing performance. + schema: + type: integer + + - name: maxHours + in: query + required: false + description: | + The maximum travel time in hours. + If not provided, the routing to uses the value + hardcoded in the server which is usually quite high. + + *Warning*: Use with care. Setting this too low can lead to + optimal (e.g. the least transfers) journeys not being found. + If this value is too low to reach the destination at all, + it can lead to slow routing performance. + schema: + type: number + + - name: minTransferTime + in: query + required: false + description: Minimum transfer time for each transfer. + schema: + type: integer + + - name: transferTimeFactor + in: query + required: false + description: Factor to multiply transfer times with. + schema: + type: integer + default: 1 + + - name: wheelchair + in: query + description: Whether the trip must be wheelchair accessible. + required: false + schema: + type: boolean + default: false + + - name: mode + in: query + required: false + description: | + A comma separated list of allowed modes. + + Default if not provided: `WALK,TRANSIT` + schema: + default: + - WALK + - TRANSIT + type: array + minItems: 1 + items: + $ref: '#/components/schemas/Mode' + explode: false + + - name: numItineraries + in: query + required: false + description: | + The minimum number of itineraries to compute. + This is only relevant if `timetableView=true`. + The default value is 5. + schema: + type: integer + default: 5 + + - name: pageCursor + in: query + required: false + description: | + Use the cursor to go to the next "page" of itineraries. + Copy the cursor from the last response and keep the original request as is. + This will enable you to search for itineraries in the next or previous time-window. + schema: + type: string + + - name: timetableView + in: query + required: false + description: | + Optional. Default is `true`. + + Search for the best trip options within a time window. + If true two itineraries are considered optimal + if one is better on arrival time (earliest wins) + and the other is better on departure time (latest wins). + In combination with arriveBy this parameter cover the following use cases: + + `timetable=false` = waiting for the first transit departure/arrival is considered travel time: + - `arriveBy=true`: event (e.g. a meeting) starts at 10:00 am, + compute the best journeys that arrive by that time (maximizes departure time) + - `arriveBy=false`: event (e.g. a meeting) ends at 11:00 am, + compute the best journeys that depart after that time + + `timetable=true` = optimize "later departure" + "earlier arrival" and give all options over a time window: + - `arriveBy=true`: the time window around `date` and `time` refers to the arrival time window + - `arriveBy=false`: the time window around `date` and `time` refers to the departure time window + schema: + type: boolean + default: false + + - name: arriveBy + in: query + required: false + schema: + type: boolean + default: false + description: | + Optional. Default is `false`. + + - `arriveBy=true`: the parameters `date` and `time` refer to the arrival time + - `arriveBy=false`: the parameters `date` and `time` refer to the departure time + + - name: searchWindow + in: query + required: false + description: | + Optional. Default is 2 hours which is `7200`. + + The length of the search-window in seconds. Default value two hours. + + - `arriveBy=true`: number of seconds between the earliest departure time and latest departure time + - `arriveBy=false`: number of seconds between the earliest arrival time and the latest arrival time + schema: + type: integer + default: 7200 + minimum: 0 + + - name: maxPreTransitTime + in: query + required: false + description: | + Optional. Default is 15min which is `900`. + Maximum time in seconds for the first street leg. + schema: + type: integer + default: 900 + minimum: 0 + + - name: maxPostTransitTime + in: query + required: false + description: | + Optional. Default is 15min which is `900`. + Maximum time in seconds for the last street leg. + schema: + type: integer + default: 900 + minimum: 0 + responses: + '200': + description: routing result + content: + application/json: + schema: + type: object + required: + - requestParameters + - debugOutput + - date + - from + - to + - itineraries + - previousPageCursor + - nextPageCursor + properties: + requestParameters: + description: "the routing query" + type: object + additionalProperties: + type: string + debugOutput: + description: "debug statistics" + type: object + additionalProperties: + type: string + from: + $ref: '#/components/schemas/Place' + to: + $ref: '#/components/schemas/Place' + itineraries: + description: list of itineraries + type: array + items: + $ref: '#/components/schemas/Itinerary' + previousPageCursor: + description: | + Use the cursor to get the previous page of results. Insert the cursor into the request and post it to get the previous page. + The previous page is a set of itineraries departing BEFORE the first itinerary in the result for a depart after search. When using the default sort order the previous set of itineraries is inserted before the current result. + type: string + nextPageCursor: + description: | + Use the cursor to get the next page of results. Insert the cursor into the request and post it to get the next page. + The next page is a set of itineraries departing AFTER the last itinerary in this result. + type: string + + /api/v1/map/trips: + get: + tags: + - map + operationId: trips + summary: | + Given a area frame (box defined by top right and bottom left corner) and a time frame, + it returns all trips and their respective shapes that operate in this area + time frame. + Trips are filtered by zoom level. On low zoom levels, only long distance trains will be shown + while on high zoom levels, also metros, buses and trams will be returned. + parameters: + - name: zoom + in: query + required: true + description: current zoom level + schema: + type: number + - name: min + in: query + required: true + description: latitude,longitude pair of the lower right coordinate + schema: + type: string + - name: max + in: query + required: true + description: latitude,longitude pair of the upper left coordinate + schema: + type: string + - name: startTime + in: query + required: true + description: start of the time window + schema: + type: string + format: date-time + - name: endTime + in: query + required: true + description: end if the time window + schema: + type: string + format: date-time + responses: + '200': + description: a list of trips + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TripSegment' + + /api/v1/map/initial: + get: + tags: + - map + operationId: initial + summary: initial location to view the map at after loading based on where public transport should be visible + responses: + '200': + description: latitude, longitude and zoom level to set the map to + content: + application/json: + schema: + type: object + required: + - lat + - lon + - zoom + properties: + lat: + description: latitude + type: number + lon: + description: longitude + type: number + zoom: + description: zoom level + type: number + + /api/v1/map/stops: + get: + tags: + - map + summary: Get all stops for a map section + operationId: stops + parameters: + - name: min + in: query + required: true + description: latitude,longitude pair of the lower right coordinate + schema: + type: string + - name: max + in: query + required: true + description: latitude,longitude pair of the upper left coordinate + schema: + type: string + responses: + '200': + description: array of stop places in the selected map section + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Place' + + /api/v1/map/levels: + get: + tags: + - map + summary: Get all available levels for a map section + operationId: levels + parameters: + - name: min + in: query + required: true + description: latitude,longitude pair of the lower right coordinate + schema: + type: string + - name: max + in: query + required: true + description: latitude,longitude pair of the upper left coordinate + schema: + type: string + responses: + '200': + description: array of available levels + content: + application/json: + schema: + type: array + items: + type: number + + /api/debug/footpaths: + get: + tags: + - debug + summary: Prints all footpaths of a timetable location (track, bus stop, etc.) + operationId: footpaths + parameters: + - name: id + in: query + required: true + description: location id + schema: + type: string + responses: + '200': + description: list of outgoing footpaths of this location + content: + application/json: + schema: + type: object + required: + - place + - footpaths + properties: + place: + $ref: '#/components/schemas/Place' + footpaths: + description: all outgoing footpaths of this location + type: array + items: + $ref: '#/components/schemas/Footpath' + +components: + schemas: + Duration: + description: Object containing duration if a path was found or none if no path was found + type: object + required: [ ] + properties: + duration: + type: number + description: duration in seconds if a path was found, otherwise missing + + Area: + description: Administrative area + type: object + required: + - name + - adminLevel + - matched + properties: + name: + type: string + description: Name of the area + adminLevel: + type: number + description: | + [OpenStreetMap `admin_level`](https://wiki.openstreetmap.org/wiki/Key:admin_level) + of the area + matched: + type: boolean + description: Whether this area was matched by the input text + default: + type: boolean + description: Whether this area should be displayed as default area (area with admin level closest 7) + + Token: + description: Matched token range (from index, length) + type: array + minItems: 2 + maxItems: 2 + items: + type: number + + Match: + description: GeoCoding match + type: object + required: + - type + - name + - id + - lat + - lon + - tokens + - areas + - score + properties: + type: + description: location type + type: string + enum: + - ADDRESS + - PLACE + - STOP + tokens: + description: list of non-overlapping tokens that were matched + type: array + items: + $ref: '#/components/schemas/Token' + name: + description: name of the location (transit stop / PoI / address) + type: string + id: + description: unique ID of the location + type: string + lat: + description: latitude + type: number + lon: + description: longitude + type: number + level: + description: | + level according to OpenStreetMap + (at the moment only for public transport) + type: number + street: + description: street name + type: string + houseNumber: + description: house number + type: string + zip: + description: zip code + type: string + areas: + description: list of areas + type: array + items: + $ref: '#/components/schemas/Area' + score: + description: score according to the internal scoring system (the scoring algorithm might change in the future) + type: number + + Mode: + description: | + # Street modes + + - `WALK`: Walking some or all of the way of the route. + - `BIKE`: Cycling for the entirety of the route or taking a bicycle onto the public transport (if enabled) and cycling from the arrival station to the destination. + - `BIKE_RENTAL`: Taking a rented, shared-mobility bike for part or the entirety of the route. + - `BIKE_TO_PARK`: Leaving the bicycle at the departure station and walking from the arrival station to the destination. This mode needs to be combined with at least one transit mode otherwise it behaves like an ordinary bicycle journey. + - `CAR`: Driving your own car the entirety of the route. This can be combined with transit, where will return routes with a Kiss & Ride component. This means that the car is not parked in a permanent parking area but rather the passenger is dropped off (for example, at an airport) and the driver continues driving the car away from the drop off location. + - `CAR_PARK` | `CAR_TO_PARK`: Driving a car to the park-and-ride facilities near a station and taking publictransport. This mode needs to be combined with at least one transit mode otherwise, it behaves like an ordinary car journey. + - `CAR_HAILING`: Using a car hailing app like Uber or Lyft to get to a train station or all the way to the destination. + - `CAR_PICKUP`: Walking to a pickup point along the road, driving to a drop-off point along the road, and walking the rest of the way. This can include various taxi-services or kiss & ride. + - `CAR_RENTAL`: Walk to a car rental point, drive to a car rental drop-off point and walk the rest of the way. This can include car rental at fixed locations or free-floating services. + - `FLEXIBLE`: Encompasses all types of on-demand and flexible transportation for example GTFS Flex or NeTEx Flexible Stop Places. + - `SCOOTER_RENTAL`: Walking to a scooter rental point, riding a scooter to a scooter rental drop-off point, and walking the rest of the way. This can include scooter rental at fixed locations or free-floating services. + + # Transit modes + + - `TRANSIT`: translates to `RAIL,SUBWAY,TRAM,BUS,FERRY,AIRPLANE,COACH` + - `TRAM`: trams + - `SUBWAY`: subway trains + - `FERRY`: ferries + - `AIRPLANE`: airline flights + - `BUS`: short distance buses (does not include `COACH`) + - `COACH`: long distance buses (does not include `BUS`) + - `RAIL`: translates to `HIGHSPEED_RAIL,LONG_DISTANCE_RAIL,NIGHT_RAIL,REGIONAL_RAIL,REGIONAL_FAST_RAIL` + - `METRO`: metro trains + - `HIGHSPEED_RAIL`: long distance high speed trains (e.g. TGV) + - `LONG_DISTANCE`: long distance inter city trains + - `NIGHT_RAIL`: long distance night trains + - `REGIONAL_FAST_RAIL`: regional express routes that skip low traffic stops to be faster + - `REGIONAL_RAIL`: regional train + type: string + enum: + # === Street === + - WALK + - BIKE + - CAR + - BIKE_RENTAL + - BIKE_TO_PARK + - CAR_TO_PARK + - CAR_HAILING + - CAR_SHARING + - CAR_PICKUP + - CAR_RENTAL + - FLEXIBLE + - SCOOTER_RENTAL + # === Transit === + - TRANSIT + - TRAM + - SUBWAY + - FERRY + - AIRPLANE + - METRO + - BUS + - COACH + - RAIL + - HIGHSPEED_RAIL + - LONG_DISTANCE + - NIGHT_RAIL + - REGIONAL_FAST_RAIL + - REGIONAL_RAIL + - OTHER + + VertexType: + type: string + description: | + - `NORMAL` - latitude / longitude coordinate or address + - `BIKESHARE` - bike sharing station + - `BIKEPARK` - bike parking + - `TRANSIT` - transit stop + enum: + - NORMAL + - BIKESHARE + - BIKEPARK + - TRANSIT + + Place: + type: object + required: + - name + - lat + - lon + - level + properties: + name: + description: name of the transit stop / PoI / address + type: string + stopId: + description: The ID of the stop. This is often something that users don't care about. + type: string + lat: + description: latitude + type: number + lon: + description: longitude + type: number + level: + description: level according to OpenStreetMap + type: number + arrivalDelay: + type: integer + description: | + The offset from the scheduled arrival time of the boarding stop in this leg (in milliseconds). + Scheduled time of arrival at boarding stop = endTime - arrivalDelay + departureDelay: + type: integer + description: | + The offset from the scheduled departure time of the boarding stop in this leg (in milliseconds). + Scheduled time of departure at boarding stop = startTime - departureDelay + arrival: + description: arrival time + type: string + format: date-time + departure: + description: departure time + type: string + format: date-time + scheduledTrack: + description: scheduled track from the static schedule timetable dataset + type: string + track: + description: | + The current track/platform information, updated with real-time updates if available. + Can be missing if neither real-time updates nor the schedule timetable contains track information. + type: string + vertexType: + $ref: '#/components/schemas/VertexType' + + StopTime: + description: departure or arrival event at a stop + type: object + required: + - place + - mode + - realTime + - route + - headsign + - agencyId + - agencyName + - agencyUrl + - tripId + - routeShortName + - source + properties: + place: + $ref: '#/components/schemas/Place' + description: information about the stop place and time + mode: + $ref: '#/components/schemas/Mode' + description: Transport mode for this leg + realTime: + description: Whether there is real-time data about this leg + type: boolean + route: + description: | + For transit legs, the route of the bus or train being used. + For non-transit legs, the name of the street being traversed. + type: string + headsign: + description: | + For transit legs, the headsign of the bus or train being used. + For non-transit legs, null + type: string + agencyId: + type: string + agencyName: + type: string + agencyUrl: + type: string + routeColor: + type: string + routeTextColor: + type: string + tripId: + type: string + routeShortName: + type: string + source: + description: Filename and line number where this trip is from + type: string + + TripInfo: + description: trip id and name + type: object + required: + - tripId + - routeShortName + properties: + tripId: + description: trip ID (dataset trip id prefixed with the dataset tag) + type: string + routeShortName: + description: trip display name + type: string + + TripSegment: + description: trip segment between two stops to show a trip on a map + type: object + required: + - trips + - mode + - distance + - from + - to + - departure + - arrival + - departureDelay + - arrivalDelay + - realTime + - polyline + properties: + trips: + type: array + items: + $ref: '#/components/schemas/TripInfo' + routeColor: + type: string + mode: + $ref: '#/components/schemas/Mode' + description: Transport mode for this leg + distance: + type: number + description: distance in meters + from: + $ref: '#/components/schemas/Place' + to: + $ref: '#/components/schemas/Place' + departure: + description: departure time + type: string + format: date-time + arrival: + description: arrival time + type: string + format: date-time + departureDelay: + type: integer + description: | + The offset from the scheduled departure time of the boarding stop in this leg (in milliseconds). + Scheduled time of departure at boarding stop = startTime - departureDelay + arrivalDelay: + type: integer + description: | + The offset from the scheduled arrival time of the boarding stop in this leg (in milliseconds). + Scheduled time of arrival at boarding stop = endTime - arrivalDelay + realTime: + description: Whether there is real-time data about this leg + type: boolean + polyline: + description: Google polyline encoded coordinate sequence (with precision 7) where the trip travels on this segment. + type: string + + RelativeDirection: + type: string + enum: + - DEPART + - HARD_LEFT + - LEFT + - SLIGHTLY_LEFT + - CONTINUE + - SLIGHTLY_RIGHT + - RIGHT + - HARD_RIGHT + - CIRCLE_CLOCKWISE + - CIRCLE_COUNTERCLOCKWISE + - ELEVATOR + - UTURN_LEFT + - UTURN_RIGHT + + AbsoluteDirection: + type: string + enum: + - NORTH + - NORTHEAST + - EAST + - SOUTHEAST + - SOUTH + - SOUTHWEST + - WEST + - NORTHWEST + + EncodedPolyline: + type: object + required: + - points + - length + properties: + points: + description: The encoded points of the polyline using the Google polyline encoding with precision 7. + type: string + length: + description: The number of points in the string + type: integer + + StepInstruction: + type: object + required: + - fromLevel + - toLevel + - polyline + - relativeDirection + - absoluteDirection + - distance + - streetName + - exit + - stayOn + - area + - lon + - lat + properties: + relativeDirection: + $ref: '#/components/schemas/RelativeDirection' + absoluteDirection: + $ref: '#/components/schemas/AbsoluteDirection' + distance: + description: The distance in meters that this step takes. + type: number + fromLevel: + description: level where this segment starts, based on OpenStreetMap data + type: number + toLevel: + description: level where this segment starts, based on OpenStreetMap data + type: number + osmWay: + description: OpenStreetMap way index + type: integer + polyline: + $ref: '#/components/schemas/EncodedPolyline' + streetName: + description: The name of the street. + type: string + exit: + description: | + Not implemented! + When exiting a highway or traffic circle, the exit name/number. + type: string + stayOn: + description: | + Not implemented! + Indicates whether or not a street changes direction at an intersection. + type: boolean + area: + description: | + Not implemented! + This step is on an open area, such as a plaza or train platform, + and thus the directions should say something like "cross" + type: boolean + + Leg: + type: object + required: + - mode + - startTime + - endTime + - departureDelay + - arrivalDelay + - realTime + - distance + - duration + - from + - to + - legGeometry + properties: + mode: + $ref: '#/components/schemas/Mode' + description: Transport mode for this leg + from: + $ref: '#/components/schemas/Place' + to: + $ref: '#/components/schemas/Place' + duration: + description: Leg duration in seconds + type: integer + startTime: + type: string + format: date-time + description: leg departure time + endTime: + type: string + format: date-time + description: leg arrival time + departureDelay: + type: integer + description: | + The offset from the scheduled departure time of the boarding stop in this leg (in milliseconds). + Scheduled time of departure at boarding stop = startTime - departureDelay + arrivalDelay: + type: integer + description: | + The offset from the scheduled arrival time of the boarding stop in this leg (in milliseconds). + Scheduled time of arrival at boarding stop = endTime - arrivalDelay + realTime: + description: Whether there is real-time data about this leg + type: boolean + distance: + description: The distance traveled while traversing this leg in meters. + type: number + interlineWithPreviousLeg: + description: For transit legs, if the rider should stay on the vehicle as it changes route names. + type: boolean + route: + description: | + For transit legs, the route of the bus or train being used. + For non-transit legs, the name of the street being traversed. + type: string + headsign: + description: | + For transit legs, the headsign of the bus or train being used. + For non-transit legs, null + type: string + agencyName: + type: string + agencyUrl: + type: string + routeColor: + type: string + routeTextColor: + type: string + routeType: + type: string + routeId: + type: string + agencyId: + type: string + tripId: + type: string + routeShortName: + type: string + source: + description: Filename and line number where this trip is from + type: string + intermediateStops: + description: | + For transit legs, intermediate stops between the Place where the leg originates + and the Place where the leg ends. For non-transit legs, null. + type: array + items: + $ref: "#/components/schemas/Place" + legGeometry: + $ref: '#/components/schemas/EncodedPolyline' + steps: + description: | + A series of turn by turn instructions + used for walking, biking and driving. + type: array + items: + $ref: '#/components/schemas/StepInstruction' + + Itinerary: + type: object + required: + - duration + - startTime + - endTime + - walkTime + - transitTime + - waitingTime + - walkDistance + - transfers + - legs + properties: + duration: + description: journey duration in seconds + type: integer + startTime: + type: string + format: date-time + description: journey departure time + endTime: + type: string + format: date-time + description: journey arrival time + walkTime: + type: integer + description: How much time is spent walking, in seconds. + transitTime: + type: integer + description: How much time is spent on transit, in seconds. + waitingTime: + type: integer + description: How much time is spent waiting for transit to arrive, in seconds. + walkDistance: + type: integer + description: How far the user has to walk, in meters. + transfers: + type: integer + description: The number of transfers this trip has. + legs: + description: Journey legs + type: array + items: + $ref: '#/components/schemas/Leg' + + Footpath: + description: footpath from one location to another + type: object + required: + - to + properties: + to: + $ref: '#/components/schemas/Place' + default: + type: number + description: | + optional; missing if the GTFS did not contain a footpath + footpath duration in minutes according to GTFS (+heuristics) + foot: + type: number + description: | + optional; missing if no path was found with the foot profile + footpath duration in minutes for the foot profile + wheelchair: + type: number + description: | + optional; missing if no path was found with the wheelchair profile + footpath duration in minutes for the wheelchair profile + wheelchairUsesElevator: + type: boolean + description: | + optional; missing if no path was found with the wheelchair profile + true if the wheelchair path uses an elevator