New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add repeated CarriageDescriptor to VehicleDescriptor to encapsulate carriage specific information #66
Add repeated CarriageDescriptor to VehicleDescriptor to encapsulate carriage specific information #66
Changes from 7 commits
b7bb2f6
59f7c4c
141479a
b228b28
37e1f68
daa7b3c
c840c75
75829dd
e811fd4
9acd8bc
314773c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,13 +20,27 @@ Version 1.0 of the feed specification is discussed and documented on this site. | |
* [TripDescriptor](#message-tripdescriptor) | ||
* [ScheduleRelationship](#enum-schedulerelationship-1) | ||
* [VehicleDescriptor](#message-vehicledescriptor) | ||
* [CarriageDescriptor](#message-carriagedescriptor) | ||
* [OccupancyStatus](#enum-occupancystatus) | ||
* [WheelchairAccessible](#enum-wheelchairaccessible) | ||
* [ToiletFacilities](#enum-toiletfacilities) | ||
* [WifiAvailability](#enum-wifiavailability) | ||
* [AirConditioning](#enum-airconditioning) | ||
* [BicyclesAllowed](#enum-bicyclesallowed) | ||
* [StopTimeUpdate](#message-stoptimeupdate) | ||
* [StopTimeEvent](#message-stoptimeevent) | ||
* [ScheduleRelationship](#enum-schedulerelationship) | ||
* [VehiclePosition](#message-vehicleposition) | ||
* [TripDescriptor](#message-tripdescriptor) | ||
* [ScheduleRelationship](#enum-schedulerelationship-1) | ||
* [VehicleDescriptor](#message-vehicledescriptor) | ||
* [CarriageDescriptor](#message-carriagedescriptor) | ||
* [OccupancyStatus](#enum-occupancystatus) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a design decision made when originally adding This proposal breaks from that design decision by putting At the time of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the context Sean! My reasoning for putting it in VehicleDescriptor:
I didn't realise VehicleDescriptor was intended to be immutable. If people care deeply about maintaining this, then perhaps we should at least document this in the spec? Keen to hear others thoughts :-) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @RachM That was my exact same reasoning for originally proposing |
||
* [WheelchairAccessible](#enum-wheelchairaccessible) | ||
* [ToiletFacilities](#enum-toiletfacilities) | ||
* [WifiAvailability](#enum-wifiavailability) | ||
* [AirConditioning](#enum-airconditioning) | ||
* [BicyclesAllowed](#enum-bicyclesallowed) | ||
* [Position](#message-position) | ||
* [VehicleStopStatus](#enum-vehiclestopstatus) | ||
* [CongestionLevel](#enum-congestionlevel) | ||
|
@@ -208,21 +222,21 @@ Congestion level that is affecting this vehicle. | |
|
||
## _enum OccupancyStatus_ | ||
|
||
The degree of passenger occupancy for the vehicle. | ||
The degree of passenger occupancy for the vehicle or carriage. | ||
|
||
**Caution:** this field is still **experimental**, and subject to change. It may be formally adopted in the future. | ||
|
||
#### _Values_ | ||
|
||
| _**Value**_ | _**Comment**_ | | ||
|-------------|---------------| | ||
| _**EMPTY**_ | _The vehicle is considered empty by most measures, and has few or no passengers onboard, but is still accepting passengers._ | | ||
| _**MANY_SEATS_AVAILABLE**_ | _The vehicle has a large percentage of seats available. What percentage of free seats out of the total seats available is to be considered large enough to fall into this category is determined at the discretion of the producer._ | | ||
| _**FEW_SEATS_AVAILABLE**_ | _The vehicle has a small percentage of seats available. What percentage of free seats out of the total seats available is to be considered small enough to fall into this category is determined at the discretion of the producer._ | | ||
| _**STANDING_ROOM_ONLY**_ | _The vehicle can currently accomodate only standing passengers._ | | ||
| _**CRUSHED_STANDING_ROOM_ONLY**_ | _The vehicle can currently accomodate only standing passengers and has limited space for them._ | | ||
| _**FULL**_ | _The vehicle is considered full by most measures, but may still be allowing passengers to board._ | | ||
| _**NOT_ACCEPTING_PASSENGERS**_ | _The vehicle can not accept passengers._ | | ||
| _**EMPTY**_ | _The vehicle/carriage is considered empty by most measures, and has few or no passengers onboard, but is still accepting passengers._ | | ||
| _**MANY_SEATS_AVAILABLE**_ | _The vehicle/carriage has a large percentage of seats available. What percentage of free seats out of the total seats available is to be considered large enough to fall into this category is determined at the discretion of the producer._ | | ||
| _**FEW_SEATS_AVAILABLE**_ | _The vehicle/carriage has a small percentage of seats available. What percentage of free seats out of the total seats available is to be considered small enough to fall into this category is determined at the discretion of the producer._ | | ||
| _**STANDING_ROOM_ONLY**_ | _The vehicle/carriage can currently accommodate only standing passengers._ | | ||
| _**CRUSHED_STANDING_ROOM_ONLY**_ | _The vehicle/carriage can currently accommodate only standing passengers and has limited space for them._ | | ||
| _**FULL**_ | _The vehicle/carriage is considered full by most measures, but may still be allowing passengers to board._ | | ||
| _**NOT_ACCEPTING_PASSENGERS**_ | _The vehicle/carriage can not accept passengers._ | | ||
|
||
## _message_ Alert | ||
|
||
|
@@ -340,9 +354,89 @@ Identification information for the vehicle performing the trip. | |
|
||
| _**Field Name**_ | _**Type**_ | _**Cardinality**_ | _**Description**_ | | ||
|------------------|------------|-------------------|-------------------| | ||
| **id** | [string](https://developers.google.com/protocol-buffers/docs/proto#scalar) | optional | Internal system identification of the vehicle. Should be **unique** per vehicle, and is used for tracking the vehicle as it proceeds through the system. This id should not be made visible to the end-user; for that purpose use the **label** field | | ||
| **id** | [string](https://developers.google.com/protocol-buffers/docs/proto#scalar) | optional | Internal system identification of the vehicle. Should be **unique** per vehicle, and is used for tracking the vehicle as it proceeds through the system. This id should not be made visible to the end-user; for that purpose use the **label** field. | | ||
| **label** | [string](https://developers.google.com/protocol-buffers/docs/proto#scalar) | optional | User visible label, i.e., something that must be shown to the passenger to help identify the correct vehicle. | | ||
| **license_plate** | [string](https://developers.google.com/protocol-buffers/docs/proto#scalar) | optional | The license plate of the vehicle. | | ||
| **carriage_descriptor** | [CarriageDescriptor](#message-carriagedescriptor) | repeated | An ordered list of carriage information. | | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe we should define how the carriages should be ordered. The original proposal from NSW Trains was to use a well-defined central point. A more logical one for me is to start with the first carriage in the direction of travel and move back from there. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
That's a really good point, especially on the accessibility attributes. The whole point of providing this data would be to allow a rider in a wheelchair to position themselves in the proper place on the platform before the vehicle arrives, and if the order isn't well defined, they will end up in the wrong place.
This would be good. Maybe there should also be a required There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've added carriage_sequence to CarriageDescriptor. Can you take a quick look and see if it looks OK? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I definitely support adding such field, but I'm a bit unsure how it would handle a situation when a train changes direction of its travel during its journey e.g. in a dead-end station. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @qwasar Good point. It would be good to know how this scenario is typically modeled with trip_ids in GTFS and GTFS-realtime. If the trip_id changes, which I would imagine it would, then I would expect carriage_sequence to change with the trip_id, which should have a different direction_I'd. One option would be to make GTFS trips.txt direction_I'd conditionally required if CarriageDescriptor is provided to make the behavior and expectations clearer. Consumer could change display for outgoing trip a certain amount of time become outgoing departure. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think I understand your idea. My objection was that it is probably not a feasible solution for cases where such train is modeled as a single trip (which can have only a single value of Take the Copenhagen-Karlskrona route as an example: And if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the example; it's a really good one! I agree my use of direction_id is not appropriate, so let's scratch that idea. I have a new solution that I think solves our problem; have TWO fields for the sequence:
For non-dead end stations, TUs/VPs before arriving at the station:
Consumers can know from this that it's a dead-end station, and can decide on an appropriate UI/info to show to the user. Thoughts? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @RachM Sorry for being late with reaction, I've been off-grid. I'm still afraid your latest proposal wouldn't allow us to handle all the cases I'd like to see addressed. Let me expand on the example of the Copenhagen-Karlskrona train. Before boring the Citytunneln in Malmö in 2010, the Malmö Central used to be a dead-end station as well. So that train had changed its direction twice during its journey (in Malmö and Kristianstad). I can't help myself, but I think to describe such situation we really have to add
I found it very analogous to how And on top of that it would be really great to have such info in GTFS too as it is quite common that the very same trip (train number) is served by quite different carriages on weekdays and on weekend. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. More examples: LeoExpress at Košice-Prague route changes direction twice at Prešov and Přerov stations. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're right - I was thinking mainly in terms of VehiclePositions (and hence only considered the next station). However, TripUpdates can specify many stations, so we need info about the carriage directions for each of them. I still think it's important to know what both the arriving and departing sequence is at a particular station. Revising:
More concretely:
|
||
|
||
## _message_ CarriageDescriptor | ||
|
||
Information for a carriage that is part of a vehicle. | ||
|
||
#### Fields | ||
|
||
| _**Field Name**_ | _**Type**_ | _**Cardinality**_ | _**Description**_ | | ||
|------------------|------------|-------------------|-------------------| | ||
| **id** | [string](https://developers.google.com/protocol-buffers/docs/proto#scalar) | optional | Internal system identification of the carriage. Should be **unique** per vehicle, and is used for tracking the carriage as it proceeds through the system. This id should not be made visible to the end-user; for that purpose use the **label** field. | | ||
| **label** | [string](https://developers.google.com/protocol-buffers/docs/proto#scalar) | optional | User visible label, i.e., something that can be shown to the passenger to help identify the correct carriage. | | ||
| _**occupancy_status**_ | _[OccupancyStatus](#enum-occupancystatus)_ | _optional_ |The degree of passenger occupancy of the carriage.<br>**Caution:** this field is still **experimental**, and subject to change. It may be formally adopted in the future.| | ||
| **wheelchair_accessible** | [WheelchairAccessible](#enum-wheelchairaccessible) | optional | Whether the carriage is wheelchair accessible. | | ||
| **toilet_facilities** | [ToiletFacilities](#enum-toiletfacilities) | optional | Whether the carriage has toilet facilities onboard. | | ||
| **wifi_availability** | [WifiAvailability](#enum-wifiavailability) | optional | Whether the carriage has WiFi onboard. | | ||
| **air_conditioning** | [AirConditioning](#enum-airconditioning) | optional | Whether the carriage is air conditioned. | | ||
| **bicycles_allowed** | [BicyclesAllowed](#enum-bicyclesallowed) | optional | Whether bicycles are allowed in the carriage. | | ||
|
||
## _enum_ WheelchairAccessible | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wheelchair accessibility always seems to be a tricky one to tackle. I'd love to see this included, although I'd be curious to hear from producers whether or not carriage wheelchair accessibility can be appropriately modeled as a boolean (effectively, given the below enumerations). For example, does There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hi everyone, Sean asked me to comment on this thread. I lead a research center on accessible transportation which includes both IT and vehicle accessibility research. Being able to specify a vehicle is wheelchair accessible is important but there are some subtle nuances you all might want to consider. As Sean mentioned, there's a difference between accessible boarding and there being accessibility features inside the vehicle. There are also cases where the accessible boarding is only at certain stations that have the right height platforms or portable lifts. Furthermore, wheelchair access is sometimes limited to specific cars on a train. Since boarding is often tied to stations or even train platforms, you may want to split boarding out from vehicle interior. Perhaps something like AccessibleBoarding (yes, no, accessible platforms only, unknown) and WheelchairParkingArea (integer from 0). These are just brainstorms since I don't know the rest of the vehicle spec discussions. I recommend adding something to the toilet and dining car elements (if any) to indicate whether those facilities are accessible, rather than trying to fold it into a single accessibility element. As an aside, you may also want to think about in-vehicle announcements as an element too. Visual message signs, audio announcements, etc. Those have universal value beyond just deaf and blind riders. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks so much for the insightful comments! It's fantastic to have an accessibility expert weigh in; I'm keen to get this right. In regards to having the accessible boarding tied to the vehicle; I've experienced both a stop/station needing to be accessible as well as the vehicle. We already capture stop accessibility (wheelchair_boarding in stops.txt), but I thought it would be useful to capture vehicle as well (for the scenario where only some vehicles servicing the stop are wheelchair-boarding accessible). The use case I have in mind is buses in Sydney; not all are wheelchair accessible, and I think it would be great to show this information to users so they can better plan their trips. I think it's clear that my original accessibility field is too simplistic. Maybe we need a whole message to encapsulate all of the relevant accessibility information? Maybe it doesn't all belong in a message? I'll think more about this.... Summarizing the potentially important accessibility features:
Anything else that I'm missing? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Potentially hearing "T" loop for the audio announcements as well? A common complaint from wheelchair users is that there's no way to determine if the designated wheelchair spaces on-board are already occupied. It's one thing to have a wheelchair parking space, but they're only useful if they're available. It's a similar scenario for accessible seating. Perhaps availability of wheelchair parking can be expressed as:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Great point! One concern; are producers able to capture this type of information? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Note that audio announcements can vary between computer announcements and operator announcements. The latter are notoriously unintelligible in most systems since operators frequently mumble or fail to speak loudly. We've looked at wheelchair space occupancy in our crowdsourcing transit information app (Tiramisu) and intentionally opted for overall vehicle loading instead. In most cases there is a direct relationship between loading and wheelchair space availability. Our concern about about using wheelchair space in a crowdsource system was twofold. First, most non-experts might not properly classify an opening if people without disabilities are seated in those areas. Second, we were concerned about malicious reporting that spots were full so people with wheelchairs would opt for another bus, thereby discouraging long dwell times for ingress/egress. |
||
|
||
Whether the carriage is wheelchair accessible. The default is UNKNOWN. | ||
|
||
#### Values | ||
|
||
| _**Value**_ | _**Comment**_ | | ||
|-------------|---------------| | ||
| **UNKNOWN** | It is unknown if the carriage is wheelchair accessible. This is the default case. | | ||
| **WHEELCHAIR_ACCESSIBLE** | The carriage is wheelchair accessible. | | ||
| **NOT_WHEELCHAIR_ACCESSIBLE** | The carriage is not wheelchair accessible. | | ||
|
||
## _enum_ ToiletFacilities | ||
|
||
Whether the carriage has toilet facilities onboard. The default is UNKNOWN. | ||
|
||
#### Values | ||
|
||
| _**Value**_ | _**Comment**_ | | ||
|-------------|---------------| | ||
| **UNKNOWN** | It is unknown if the carriage has toilet facilities. This is the default case. | | ||
| **TOILET_ONBOARD** | The carriage has toilet facilities onboard. | | ||
| **NO_TOILET_ONBOARD** | The carriage does not have toilet facilities onboard. | | ||
|
||
## _enum_ WifiAvailability | ||
|
||
Whether the carriage has WiFi onboard. The default is UNKNOWN. | ||
|
||
#### Values | ||
|
||
| _**Value**_ | _**Comment**_ | | ||
|-------------|---------------| | ||
| **UNKNOWN** | It is unknown if the carriage has WiFi. This is the default case. | | ||
| **FREE_WIFI** | The carriage has free WiFi available for passengers to use. | | ||
| **PAID_WIFI** | The carriage has WiFi available for passengers to purchase. | | ||
| **NO_WIFI** | The carriage has no WiFi available for passengers to use. | | ||
|
||
## _enum_ AirConditioning | ||
|
||
Whether the carriage is air conditioned. The default is UNKNOWN. | ||
|
||
#### Values | ||
|
||
| _**Value**_ | _**Comment**_ | | ||
|-------------|---------------| | ||
| **UNKNOWN** | It is unknown if the carriage is air conditioned. This is the default case. | | ||
| **AIR_CONDITIONED** | The carriage has air conditioning. | | ||
| **NOT_AIR_CONDITIONED** | The carriage does not have air conditioning. | | ||
|
||
## _enum_ BicyclesAllowed | ||
|
||
Whether bicycles are allowed in the carriage. The default is UNKNOWN. | ||
|
||
#### Values | ||
|
||
| _**Value**_ | _**Comment**_ | | ||
|-------------|---------------| | ||
| **UNKNOWN** | It is unknown if the carriage allows bicycles. This is the default case. | | ||
| **ALLOWED_OUTSIDE_CARRIAGE** | Bicycles are allowed to be transported, but must be stored outside of the carriage. | | ||
| **ALLOWED_INSIDE_CARRIAGE** | Bicycles are allowed to be transported, and can be stored inside the carriage. | | ||
| **NOT_ALLOWED** | Bicycles are not allowed to be transported in this carriage. | | ||
|
||
## _message_ EntitySelector | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think
BicyclesAllowed
would be useful outside of just the carriage use case - agencies have told me they'd like to see this for buses, including real-time capacity of racks, although I'm not aware of any real-time system that currently exposes this via an API.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The idea is that a bus amenities/info can be modelled by having a single CarriageDescriptor. Hence this works for buses.
Capacity for the rack is interesting; it could certainly be added at a later stage.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, maybe 'Carriage' is the wrong word to use? I want it to be used for all vehicle types, and if that's not clear, we should change the name.
Let me know if you have other name suggestions. Car? Compartment? Section?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I couldn't come up with anything better and more general than
Carriage
. I think as long as we make it clear in the spec that this can apply to any transit vehicle this would work for buses too.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool - I've clarified the single-vehicle case in the reference as well as the proto.