Skip to content

Instantly share code, notes, and snippets.

@scascketta
Created January 16, 2015 04:34
Show Gist options
  • Save scascketta/89ba9339496ab1ed44b7 to your computer and use it in GitHub Desktop.
Save scascketta/89ba9339496ab1ed44b7 to your computer and use it in GitHub Desktop.
Parsing GTFS-Realtime with Go

I installed the protocol buffers package from source.

Downloaded the gtfs-realtime protobuf definition.

Followed the instructions Go protobuf instructions and ran:

protoc --go_out=. gtfs-realtime.proto

which generated gtfs-realtime.pb.go.

package main
import (
"github.com/golang/protobuf/proto"
"io/ioutil"
"net/http"
)
func FetchVehicles() ([]byte, error) {
res, err := http.Get("https://data.texas.gov/api/file_data/PlHJDxPVnJinHu1jh-eQr-1YSYPLnxH6AjP1iFvz_IA?filename=VehLoc.pb")
if err != nil {
return nil, err
}
defer res.Body.Close()
return ioutil.ReadAll(res.Body)
}
type Vehicle struct {
VehicleID string
Time uint64
Speed float32
Route string
Trip string
Latitude float32
Longitude float32
}
func ParseVehiclesResponse(b []byte) ([]Vehicle, error) {
fm := new(FeedMessage)
err := proto.Unmarshal(b, fm)
var vehicles []Vehicle
for _, entity := range fm.GetEntity() {
var vehPos *VehiclePosition = entity.GetVehicle()
var trip *TripDescriptor = vehPos.GetTrip()
var pos *Position = vehPos.GetPosition()
veh := Vehicle{
VehicleID: vehPos.GetVehicle().GetId(),
Time: vehPos.GetTimestamp(),
Speed: pos.GetSpeed(),
Route: trip.GetRouteId(),
Trip: trip.GetTripId(),
Latitude: pos.GetLatitude(),
Longitude: pos.GetLongitude(),
}
vehicles = append(vehicles, veh)
}
return vehicles, err
}
// Code generated by protoc-gen-go.
// source: gtfs-realtime.proto
// DO NOT EDIT!
/*
Package main is a generated protocol buffer package.
It is generated from these files:
gtfs-realtime.proto
It has these top-level messages:
FeedMessage
FeedHeader
FeedEntity
TripUpdate
VehiclePosition
Alert
TimeRange
Position
TripDescriptor
VehicleDescriptor
EntitySelector
TranslatedString
*/
package gtfs_realtime
import proto "github.com/golang/protobuf/proto"
import math "math"
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = math.Inf
// Determines whether the current fetch is incremental. Currently,
// DIFFERENTIAL mode is unsupported and behavior is unspecified for feeds
// that use this mode. There are discussions on the GTFS-realtime mailing
// list around fully specifying the behavior of DIFFERENTIAL mode and the
// documentation will be updated when those discussions are finalized.
type FeedHeader_Incrementality int32
const (
FeedHeader_FULL_DATASET FeedHeader_Incrementality = 0
FeedHeader_DIFFERENTIAL FeedHeader_Incrementality = 1
)
var FeedHeader_Incrementality_name = map[int32]string{
0: "FULL_DATASET",
1: "DIFFERENTIAL",
}
var FeedHeader_Incrementality_value = map[string]int32{
"FULL_DATASET": 0,
"DIFFERENTIAL": 1,
}
func (x FeedHeader_Incrementality) Enum() *FeedHeader_Incrementality {
p := new(FeedHeader_Incrementality)
*p = x
return p
}
func (x FeedHeader_Incrementality) String() string {
return proto.EnumName(FeedHeader_Incrementality_name, int32(x))
}
func (x *FeedHeader_Incrementality) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(FeedHeader_Incrementality_value, data, "FeedHeader_Incrementality")
if err != nil {
return err
}
*x = FeedHeader_Incrementality(value)
return nil
}
// The relation between this StopTime and the static schedule.
type TripUpdate_StopTimeUpdate_ScheduleRelationship int32
const (
// The vehicle is proceeding in accordance with its static schedule of
// stops, although not necessarily according to the times of the schedule.
// At least one of arrival and departure must be provided. If the schedule
// for this stop contains both arrival and departure times then so must
// this update.
TripUpdate_StopTimeUpdate_SCHEDULED TripUpdate_StopTimeUpdate_ScheduleRelationship = 0
// The stop is skipped, i.e., the vehicle will not stop at this stop.
// Arrival and departure are optional.
TripUpdate_StopTimeUpdate_SKIPPED TripUpdate_StopTimeUpdate_ScheduleRelationship = 1
// No data is given for this stop. The main intention for this value is to
// give the predictions only for part of a trip, i.e., if the last update
// for a trip has a NO_DATA specifier, then StopTimes for the rest of the
// stops in the trip are considered to be unspecified as well.
// Neither arrival nor departure should be supplied.
TripUpdate_StopTimeUpdate_NO_DATA TripUpdate_StopTimeUpdate_ScheduleRelationship = 2
)
var TripUpdate_StopTimeUpdate_ScheduleRelationship_name = map[int32]string{
0: "SCHEDULED",
1: "SKIPPED",
2: "NO_DATA",
}
var TripUpdate_StopTimeUpdate_ScheduleRelationship_value = map[string]int32{
"SCHEDULED": 0,
"SKIPPED": 1,
"NO_DATA": 2,
}
func (x TripUpdate_StopTimeUpdate_ScheduleRelationship) Enum() *TripUpdate_StopTimeUpdate_ScheduleRelationship {
p := new(TripUpdate_StopTimeUpdate_ScheduleRelationship)
*p = x
return p
}
func (x TripUpdate_StopTimeUpdate_ScheduleRelationship) String() string {
return proto.EnumName(TripUpdate_StopTimeUpdate_ScheduleRelationship_name, int32(x))
}
func (x *TripUpdate_StopTimeUpdate_ScheduleRelationship) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(TripUpdate_StopTimeUpdate_ScheduleRelationship_value, data, "TripUpdate_StopTimeUpdate_ScheduleRelationship")
if err != nil {
return err
}
*x = TripUpdate_StopTimeUpdate_ScheduleRelationship(value)
return nil
}
type VehiclePosition_VehicleStopStatus int32
const (
// The vehicle is just about to arrive at the stop (on a stop
// display, the vehicle symbol typically flashes).
VehiclePosition_INCOMING_AT VehiclePosition_VehicleStopStatus = 0
// The vehicle is standing at the stop.
VehiclePosition_STOPPED_AT VehiclePosition_VehicleStopStatus = 1
// The vehicle has departed and is in transit to the next stop.
VehiclePosition_IN_TRANSIT_TO VehiclePosition_VehicleStopStatus = 2
)
var VehiclePosition_VehicleStopStatus_name = map[int32]string{
0: "INCOMING_AT",
1: "STOPPED_AT",
2: "IN_TRANSIT_TO",
}
var VehiclePosition_VehicleStopStatus_value = map[string]int32{
"INCOMING_AT": 0,
"STOPPED_AT": 1,
"IN_TRANSIT_TO": 2,
}
func (x VehiclePosition_VehicleStopStatus) Enum() *VehiclePosition_VehicleStopStatus {
p := new(VehiclePosition_VehicleStopStatus)
*p = x
return p
}
func (x VehiclePosition_VehicleStopStatus) String() string {
return proto.EnumName(VehiclePosition_VehicleStopStatus_name, int32(x))
}
func (x *VehiclePosition_VehicleStopStatus) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(VehiclePosition_VehicleStopStatus_value, data, "VehiclePosition_VehicleStopStatus")
if err != nil {
return err
}
*x = VehiclePosition_VehicleStopStatus(value)
return nil
}
// Congestion level that is affecting this vehicle.
type VehiclePosition_CongestionLevel int32
const (
VehiclePosition_UNKNOWN_CONGESTION_LEVEL VehiclePosition_CongestionLevel = 0
VehiclePosition_RUNNING_SMOOTHLY VehiclePosition_CongestionLevel = 1
VehiclePosition_STOP_AND_GO VehiclePosition_CongestionLevel = 2
VehiclePosition_CONGESTION VehiclePosition_CongestionLevel = 3
VehiclePosition_SEVERE_CONGESTION VehiclePosition_CongestionLevel = 4
)
var VehiclePosition_CongestionLevel_name = map[int32]string{
0: "UNKNOWN_CONGESTION_LEVEL",
1: "RUNNING_SMOOTHLY",
2: "STOP_AND_GO",
3: "CONGESTION",
4: "SEVERE_CONGESTION",
}
var VehiclePosition_CongestionLevel_value = map[string]int32{
"UNKNOWN_CONGESTION_LEVEL": 0,
"RUNNING_SMOOTHLY": 1,
"STOP_AND_GO": 2,
"CONGESTION": 3,
"SEVERE_CONGESTION": 4,
}
func (x VehiclePosition_CongestionLevel) Enum() *VehiclePosition_CongestionLevel {
p := new(VehiclePosition_CongestionLevel)
*p = x
return p
}
func (x VehiclePosition_CongestionLevel) String() string {
return proto.EnumName(VehiclePosition_CongestionLevel_name, int32(x))
}
func (x *VehiclePosition_CongestionLevel) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(VehiclePosition_CongestionLevel_value, data, "VehiclePosition_CongestionLevel")
if err != nil {
return err
}
*x = VehiclePosition_CongestionLevel(value)
return nil
}
// The degree of passenger occupancy of the vehicle. This field is still
// experimental, and subject to change. It may be formally adopted in the
// future.
type VehiclePosition_OccupancyStatus int32
const (
// The vehicle is considered empty by most measures, and has few or no
// passengers onboard, but is still accepting passengers.
VehiclePosition_EMPTY VehiclePosition_OccupancyStatus = 0
// The vehicle has a relatively 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.
VehiclePosition_MANY_SEATS_AVAILABLE VehiclePosition_OccupancyStatus = 1
// The vehicle has a relatively 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 feed producer.
VehiclePosition_FEW_SEATS_AVAILABLE VehiclePosition_OccupancyStatus = 2
// The vehicle can currently accommodate only standing passengers.
VehiclePosition_STANDING_ROOM_ONLY VehiclePosition_OccupancyStatus = 3
// The vehicle can currently accommodate only standing passengers
// and has limited space for them.
VehiclePosition_CRUSHED_STANDING_ROOM_ONLY VehiclePosition_OccupancyStatus = 4
// The vehicle is considered full by most measures, but may still be
// allowing passengers to board.
VehiclePosition_FULL VehiclePosition_OccupancyStatus = 5
// The vehicle is not accepting additional passengers.
VehiclePosition_NOT_ACCEPTING_PASSENGERS VehiclePosition_OccupancyStatus = 6
)
var VehiclePosition_OccupancyStatus_name = map[int32]string{
0: "EMPTY",
1: "MANY_SEATS_AVAILABLE",
2: "FEW_SEATS_AVAILABLE",
3: "STANDING_ROOM_ONLY",
4: "CRUSHED_STANDING_ROOM_ONLY",
5: "FULL",
6: "NOT_ACCEPTING_PASSENGERS",
}
var VehiclePosition_OccupancyStatus_value = map[string]int32{
"EMPTY": 0,
"MANY_SEATS_AVAILABLE": 1,
"FEW_SEATS_AVAILABLE": 2,
"STANDING_ROOM_ONLY": 3,
"CRUSHED_STANDING_ROOM_ONLY": 4,
"FULL": 5,
"NOT_ACCEPTING_PASSENGERS": 6,
}
func (x VehiclePosition_OccupancyStatus) Enum() *VehiclePosition_OccupancyStatus {
p := new(VehiclePosition_OccupancyStatus)
*p = x
return p
}
func (x VehiclePosition_OccupancyStatus) String() string {
return proto.EnumName(VehiclePosition_OccupancyStatus_name, int32(x))
}
func (x *VehiclePosition_OccupancyStatus) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(VehiclePosition_OccupancyStatus_value, data, "VehiclePosition_OccupancyStatus")
if err != nil {
return err
}
*x = VehiclePosition_OccupancyStatus(value)
return nil
}
// Cause of this alert.
type Alert_Cause int32
const (
Alert_UNKNOWN_CAUSE Alert_Cause = 1
Alert_OTHER_CAUSE Alert_Cause = 2
Alert_TECHNICAL_PROBLEM Alert_Cause = 3
Alert_STRIKE Alert_Cause = 4
Alert_DEMONSTRATION Alert_Cause = 5
Alert_ACCIDENT Alert_Cause = 6
Alert_HOLIDAY Alert_Cause = 7
Alert_WEATHER Alert_Cause = 8
Alert_MAINTENANCE Alert_Cause = 9
Alert_CONSTRUCTION Alert_Cause = 10
Alert_POLICE_ACTIVITY Alert_Cause = 11
Alert_MEDICAL_EMERGENCY Alert_Cause = 12
)
var Alert_Cause_name = map[int32]string{
1: "UNKNOWN_CAUSE",
2: "OTHER_CAUSE",
3: "TECHNICAL_PROBLEM",
4: "STRIKE",
5: "DEMONSTRATION",
6: "ACCIDENT",
7: "HOLIDAY",
8: "WEATHER",
9: "MAINTENANCE",
10: "CONSTRUCTION",
11: "POLICE_ACTIVITY",
12: "MEDICAL_EMERGENCY",
}
var Alert_Cause_value = map[string]int32{
"UNKNOWN_CAUSE": 1,
"OTHER_CAUSE": 2,
"TECHNICAL_PROBLEM": 3,
"STRIKE": 4,
"DEMONSTRATION": 5,
"ACCIDENT": 6,
"HOLIDAY": 7,
"WEATHER": 8,
"MAINTENANCE": 9,
"CONSTRUCTION": 10,
"POLICE_ACTIVITY": 11,
"MEDICAL_EMERGENCY": 12,
}
func (x Alert_Cause) Enum() *Alert_Cause {
p := new(Alert_Cause)
*p = x
return p
}
func (x Alert_Cause) String() string {
return proto.EnumName(Alert_Cause_name, int32(x))
}
func (x *Alert_Cause) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(Alert_Cause_value, data, "Alert_Cause")
if err != nil {
return err
}
*x = Alert_Cause(value)
return nil
}
// What is the effect of this problem on the affected entity.
type Alert_Effect int32
const (
Alert_NO_SERVICE Alert_Effect = 1
Alert_REDUCED_SERVICE Alert_Effect = 2
// We don't care about INsignificant delays: they are hard to detect, have
// little impact on the user, and would clutter the results as they are too
// frequent.
Alert_SIGNIFICANT_DELAYS Alert_Effect = 3
Alert_DETOUR Alert_Effect = 4
Alert_ADDITIONAL_SERVICE Alert_Effect = 5
Alert_MODIFIED_SERVICE Alert_Effect = 6
Alert_OTHER_EFFECT Alert_Effect = 7
Alert_UNKNOWN_EFFECT Alert_Effect = 8
Alert_STOP_MOVED Alert_Effect = 9
)
var Alert_Effect_name = map[int32]string{
1: "NO_SERVICE",
2: "REDUCED_SERVICE",
3: "SIGNIFICANT_DELAYS",
4: "DETOUR",
5: "ADDITIONAL_SERVICE",
6: "MODIFIED_SERVICE",
7: "OTHER_EFFECT",
8: "UNKNOWN_EFFECT",
9: "STOP_MOVED",
}
var Alert_Effect_value = map[string]int32{
"NO_SERVICE": 1,
"REDUCED_SERVICE": 2,
"SIGNIFICANT_DELAYS": 3,
"DETOUR": 4,
"ADDITIONAL_SERVICE": 5,
"MODIFIED_SERVICE": 6,
"OTHER_EFFECT": 7,
"UNKNOWN_EFFECT": 8,
"STOP_MOVED": 9,
}
func (x Alert_Effect) Enum() *Alert_Effect {
p := new(Alert_Effect)
*p = x
return p
}
func (x Alert_Effect) String() string {
return proto.EnumName(Alert_Effect_name, int32(x))
}
func (x *Alert_Effect) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(Alert_Effect_value, data, "Alert_Effect")
if err != nil {
return err
}
*x = Alert_Effect(value)
return nil
}
// The relation between this trip and the static schedule. If a trip is done
// in accordance with temporary schedule, not reflected in GTFS, then it
// shouldn't be marked as SCHEDULED, but likely as ADDED.
type TripDescriptor_ScheduleRelationship int32
const (
// Trip that is running in accordance with its GTFS schedule, or is close
// enough to the scheduled trip to be associated with it.
TripDescriptor_SCHEDULED TripDescriptor_ScheduleRelationship = 0
// An extra trip that was added in addition to a running schedule, for
// example, to replace a broken vehicle or to respond to sudden passenger
// load.
TripDescriptor_ADDED TripDescriptor_ScheduleRelationship = 1
// A trip that is running with no schedule associated to it, for example, if
// there is no schedule at all.
TripDescriptor_UNSCHEDULED TripDescriptor_ScheduleRelationship = 2
// A trip that existed in the schedule but was removed.
TripDescriptor_CANCELED TripDescriptor_ScheduleRelationship = 3
)
var TripDescriptor_ScheduleRelationship_name = map[int32]string{
0: "SCHEDULED",
1: "ADDED",
2: "UNSCHEDULED",
3: "CANCELED",
}
var TripDescriptor_ScheduleRelationship_value = map[string]int32{
"SCHEDULED": 0,
"ADDED": 1,
"UNSCHEDULED": 2,
"CANCELED": 3,
}
func (x TripDescriptor_ScheduleRelationship) Enum() *TripDescriptor_ScheduleRelationship {
p := new(TripDescriptor_ScheduleRelationship)
*p = x
return p
}
func (x TripDescriptor_ScheduleRelationship) String() string {
return proto.EnumName(TripDescriptor_ScheduleRelationship_name, int32(x))
}
func (x *TripDescriptor_ScheduleRelationship) UnmarshalJSON(data []byte) error {
value, err := proto.UnmarshalJSONEnum(TripDescriptor_ScheduleRelationship_value, data, "TripDescriptor_ScheduleRelationship")
if err != nil {
return err
}
*x = TripDescriptor_ScheduleRelationship(value)
return nil
}
// The contents of a feed message.
// A feed is a continuous stream of feed messages. Each message in the stream is
// obtained as a response to an appropriate HTTP GET request.
// A realtime feed is always defined with relation to an existing GTFS feed.
// All the entity ids are resolved with respect to the GTFS feed.
//
// A feed depends on some external configuration:
// - The corresponding GTFS feed.
// - Feed application (updates, positions or alerts). A feed should contain only
// items of one specified application; all the other entities will be ignored.
// - Polling frequency
type FeedMessage struct {
// Metadata about this feed and feed message.
Header *FeedHeader `protobuf:"bytes,1,req,name=header" json:"header,omitempty"`
// Contents of the feed.
Entity []*FeedEntity `protobuf:"bytes,2,rep,name=entity" json:"entity,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *FeedMessage) Reset() { *m = FeedMessage{} }
func (m *FeedMessage) String() string { return proto.CompactTextString(m) }
func (*FeedMessage) ProtoMessage() {}
func (m *FeedMessage) GetHeader() *FeedHeader {
if m != nil {
return m.Header
}
return nil
}
func (m *FeedMessage) GetEntity() []*FeedEntity {
if m != nil {
return m.Entity
}
return nil
}
// Metadata about a feed, included in feed messages.
type FeedHeader struct {
// Version of the feed specification.
// The current version is 1.0.
GtfsRealtimeVersion *string `protobuf:"bytes,1,req,name=gtfs_realtime_version" json:"gtfs_realtime_version,omitempty"`
Incrementality *FeedHeader_Incrementality `protobuf:"varint,2,opt,name=incrementality,enum=main.FeedHeader_Incrementality,def=0" json:"incrementality,omitempty"`
// This timestamp identifies the moment when the content of this feed has been
// created (in server time). In POSIX time (i.e., number of seconds since
// January 1st 1970 00:00:00 UTC).
Timestamp *uint64 `protobuf:"varint,3,opt,name=timestamp" json:"timestamp,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *FeedHeader) Reset() { *m = FeedHeader{} }
func (m *FeedHeader) String() string { return proto.CompactTextString(m) }
func (*FeedHeader) ProtoMessage() {}
var extRange_FeedHeader = []proto.ExtensionRange{
{1000, 1999},
}
func (*FeedHeader) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_FeedHeader
}
func (m *FeedHeader) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
const Default_FeedHeader_Incrementality FeedHeader_Incrementality = FeedHeader_FULL_DATASET
func (m *FeedHeader) GetGtfsRealtimeVersion() string {
if m != nil && m.GtfsRealtimeVersion != nil {
return *m.GtfsRealtimeVersion
}
return ""
}
func (m *FeedHeader) GetIncrementality() FeedHeader_Incrementality {
if m != nil && m.Incrementality != nil {
return *m.Incrementality
}
return Default_FeedHeader_Incrementality
}
func (m *FeedHeader) GetTimestamp() uint64 {
if m != nil && m.Timestamp != nil {
return *m.Timestamp
}
return 0
}
// A definition (or update) of an entity in the transit feed.
type FeedEntity struct {
// The ids are used only to provide incrementality support. The id should be
// unique within a FeedMessage. Consequent FeedMessages may contain
// FeedEntities with the same id. In case of a DIFFERENTIAL update the new
// FeedEntity with some id will replace the old FeedEntity with the same id
// (or delete it - see is_deleted below).
// The actual GTFS entities (e.g. stations, routes, trips) referenced by the
// feed must be specified by explicit selectors (see EntitySelector below for
// more info).
Id *string `protobuf:"bytes,1,req,name=id" json:"id,omitempty"`
// Whether this entity is to be deleted. Relevant only for incremental
// fetches.
IsDeleted *bool `protobuf:"varint,2,opt,name=is_deleted,def=0" json:"is_deleted,omitempty"`
// Data about the entity itself. Exactly one of the following fields must be
// present (unless the entity is being deleted).
TripUpdate *TripUpdate `protobuf:"bytes,3,opt,name=trip_update" json:"trip_update,omitempty"`
Vehicle *VehiclePosition `protobuf:"bytes,4,opt,name=vehicle" json:"vehicle,omitempty"`
Alert *Alert `protobuf:"bytes,5,opt,name=alert" json:"alert,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *FeedEntity) Reset() { *m = FeedEntity{} }
func (m *FeedEntity) String() string { return proto.CompactTextString(m) }
func (*FeedEntity) ProtoMessage() {}
const Default_FeedEntity_IsDeleted bool = false
func (m *FeedEntity) GetId() string {
if m != nil && m.Id != nil {
return *m.Id
}
return ""
}
func (m *FeedEntity) GetIsDeleted() bool {
if m != nil && m.IsDeleted != nil {
return *m.IsDeleted
}
return Default_FeedEntity_IsDeleted
}
func (m *FeedEntity) GetTripUpdate() *TripUpdate {
if m != nil {
return m.TripUpdate
}
return nil
}
func (m *FeedEntity) GetVehicle() *VehiclePosition {
if m != nil {
return m.Vehicle
}
return nil
}
func (m *FeedEntity) GetAlert() *Alert {
if m != nil {
return m.Alert
}
return nil
}
// Realtime update of the progress of a vehicle along a trip.
// Depending on the value of ScheduleRelationship, a TripUpdate can specify:
// - A trip that proceeds along the schedule.
// - A trip that proceeds along a route but has no fixed schedule.
// - A trip that have been added or removed with regard to schedule.
//
// The updates can be for future, predicted arrival/departure events, or for
// past events that already occurred.
// Normally, updates should get more precise and more certain (see
// uncertainty below) as the events gets closer to current time.
// Even if that is not possible, the information for past events should be
// precise and certain. In particular, if an update points to time in the past
// but its update's uncertainty is not 0, the client should conclude that the
// update is a (wrong) prediction and that the trip has not completed yet.
//
// Note that the update can describe a trip that is already completed.
// To this end, it is enough to provide an update for the last stop of the trip.
// If the time of that is in the past, the client will conclude from that that
// the whole trip is in the past (it is possible, although inconsequential, to
// also provide updates for preceding stops).
// This option is most relevant for a trip that has completed ahead of schedule,
// but according to the schedule, the trip is still proceeding at the current
// time. Removing the updates for this trip could make the client assume
// that the trip is still proceeding.
// Note that the feed provider is allowed, but not required, to purge past
// updates - this is one case where this would be practically useful.
type TripUpdate struct {
// The Trip that this message applies to. There can be at most one
// TripUpdate entity for each actual trip instance.
// If there is none, that means there is no prediction information available.
// It does *not* mean that the trip is progressing according to schedule.
Trip *TripDescriptor `protobuf:"bytes,1,req,name=trip" json:"trip,omitempty"`
// Additional information on the vehicle that is serving this trip.
Vehicle *VehicleDescriptor `protobuf:"bytes,3,opt,name=vehicle" json:"vehicle,omitempty"`
// Updates to StopTimes for the trip (both future, i.e., predictions, and in
// some cases, past ones, i.e., those that already happened).
// The updates must be sorted by stop_sequence, and apply for all the
// following stops of the trip up to the next specified one.
//
// Example 1:
// For a trip with 20 stops, a StopTimeUpdate with arrival delay and departure
// delay of 0 for stop_sequence of the current stop means that the trip is
// exactly on time.
//
// Example 2:
// For the same trip instance, 3 StopTimeUpdates are provided:
// - delay of 5 min for stop_sequence 3
// - delay of 1 min for stop_sequence 8
// - delay of unspecified duration for stop_sequence 10
// This will be interpreted as:
// - stop_sequences 3,4,5,6,7 have delay of 5 min.
// - stop_sequences 8,9 have delay of 1 min.
// - stop_sequences 10,... have unknown delay.
StopTimeUpdate []*TripUpdate_StopTimeUpdate `protobuf:"bytes,2,rep,name=stop_time_update" json:"stop_time_update,omitempty"`
// Moment at which the vehicle's real-time progress was measured. In POSIX
// time (i.e., the number of seconds since January 1st 1970 00:00:00 UTC).
Timestamp *uint64 `protobuf:"varint,4,opt,name=timestamp" json:"timestamp,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *TripUpdate) Reset() { *m = TripUpdate{} }
func (m *TripUpdate) String() string { return proto.CompactTextString(m) }
func (*TripUpdate) ProtoMessage() {}
var extRange_TripUpdate = []proto.ExtensionRange{
{1000, 1999},
}
func (*TripUpdate) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_TripUpdate
}
func (m *TripUpdate) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
func (m *TripUpdate) GetTrip() *TripDescriptor {
if m != nil {
return m.Trip
}
return nil
}
func (m *TripUpdate) GetVehicle() *VehicleDescriptor {
if m != nil {
return m.Vehicle
}
return nil
}
func (m *TripUpdate) GetStopTimeUpdate() []*TripUpdate_StopTimeUpdate {
if m != nil {
return m.StopTimeUpdate
}
return nil
}
func (m *TripUpdate) GetTimestamp() uint64 {
if m != nil && m.Timestamp != nil {
return *m.Timestamp
}
return 0
}
// Timing information for a single predicted event (either arrival or
// departure).
// Timing consists of delay and/or estimated time, and uncertainty.
// - delay should be used when the prediction is given relative to some
// existing schedule in GTFS.
// - time should be given whether there is a predicted schedule or not. If
// both time and delay are specified, time will take precedence
// (although normally, time, if given for a scheduled trip, should be
// equal to scheduled time in GTFS + delay).
//
// Uncertainty applies equally to both time and delay.
// The uncertainty roughly specifies the expected error in true delay (but
// note, we don't yet define its precise statistical meaning). It's possible
// for the uncertainty to be 0, for example for trains that are driven under
// computer timing control.
type TripUpdate_StopTimeEvent struct {
// Delay (in seconds) can be positive (meaning that the vehicle is late) or
// negative (meaning that the vehicle is ahead of schedule). Delay of 0
// means that the vehicle is exactly on time.
Delay *int32 `protobuf:"varint,1,opt,name=delay" json:"delay,omitempty"`
// Event as absolute time.
// In Unix time (i.e., number of seconds since January 1st 1970 00:00:00
// UTC).
Time *int64 `protobuf:"varint,2,opt,name=time" json:"time,omitempty"`
// If uncertainty is omitted, it is interpreted as unknown.
// If the prediction is unknown or too uncertain, the delay (or time) field
// should be empty. In such case, the uncertainty field is ignored.
// To specify a completely certain prediction, set its uncertainty to 0.
Uncertainty *int32 `protobuf:"varint,3,opt,name=uncertainty" json:"uncertainty,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *TripUpdate_StopTimeEvent) Reset() { *m = TripUpdate_StopTimeEvent{} }
func (m *TripUpdate_StopTimeEvent) String() string { return proto.CompactTextString(m) }
func (*TripUpdate_StopTimeEvent) ProtoMessage() {}
var extRange_TripUpdate_StopTimeEvent = []proto.ExtensionRange{
{1000, 1999},
}
func (*TripUpdate_StopTimeEvent) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_TripUpdate_StopTimeEvent
}
func (m *TripUpdate_StopTimeEvent) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
func (m *TripUpdate_StopTimeEvent) GetDelay() int32 {
if m != nil && m.Delay != nil {
return *m.Delay
}
return 0
}
func (m *TripUpdate_StopTimeEvent) GetTime() int64 {
if m != nil && m.Time != nil {
return *m.Time
}
return 0
}
func (m *TripUpdate_StopTimeEvent) GetUncertainty() int32 {
if m != nil && m.Uncertainty != nil {
return *m.Uncertainty
}
return 0
}
// Realtime update for arrival and/or departure events for a given stop on a
// trip. Updates can be supplied for both past and future events.
// The producer is allowed, although not required, to drop past events.
type TripUpdate_StopTimeUpdate struct {
// Must be the same as in stop_times.txt in the corresponding GTFS feed.
StopSequence *uint32 `protobuf:"varint,1,opt,name=stop_sequence" json:"stop_sequence,omitempty"`
// Must be the same as in stops.txt in the corresponding GTFS feed.
StopId *string `protobuf:"bytes,4,opt,name=stop_id" json:"stop_id,omitempty"`
Arrival *TripUpdate_StopTimeEvent `protobuf:"bytes,2,opt,name=arrival" json:"arrival,omitempty"`
Departure *TripUpdate_StopTimeEvent `protobuf:"bytes,3,opt,name=departure" json:"departure,omitempty"`
ScheduleRelationship *TripUpdate_StopTimeUpdate_ScheduleRelationship `protobuf:"varint,5,opt,name=schedule_relationship,enum=main.TripUpdate_StopTimeUpdate_ScheduleRelationship,def=0" json:"schedule_relationship,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *TripUpdate_StopTimeUpdate) Reset() { *m = TripUpdate_StopTimeUpdate{} }
func (m *TripUpdate_StopTimeUpdate) String() string { return proto.CompactTextString(m) }
func (*TripUpdate_StopTimeUpdate) ProtoMessage() {}
var extRange_TripUpdate_StopTimeUpdate = []proto.ExtensionRange{
{1000, 1999},
}
func (*TripUpdate_StopTimeUpdate) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_TripUpdate_StopTimeUpdate
}
func (m *TripUpdate_StopTimeUpdate) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
const Default_TripUpdate_StopTimeUpdate_ScheduleRelationship TripUpdate_StopTimeUpdate_ScheduleRelationship = TripUpdate_StopTimeUpdate_SCHEDULED
func (m *TripUpdate_StopTimeUpdate) GetStopSequence() uint32 {
if m != nil && m.StopSequence != nil {
return *m.StopSequence
}
return 0
}
func (m *TripUpdate_StopTimeUpdate) GetStopId() string {
if m != nil && m.StopId != nil {
return *m.StopId
}
return ""
}
func (m *TripUpdate_StopTimeUpdate) GetArrival() *TripUpdate_StopTimeEvent {
if m != nil {
return m.Arrival
}
return nil
}
func (m *TripUpdate_StopTimeUpdate) GetDeparture() *TripUpdate_StopTimeEvent {
if m != nil {
return m.Departure
}
return nil
}
func (m *TripUpdate_StopTimeUpdate) GetScheduleRelationship() TripUpdate_StopTimeUpdate_ScheduleRelationship {
if m != nil && m.ScheduleRelationship != nil {
return *m.ScheduleRelationship
}
return Default_TripUpdate_StopTimeUpdate_ScheduleRelationship
}
// Realtime positioning information for a given vehicle.
type VehiclePosition struct {
// The Trip that this vehicle is serving.
// Can be empty or partial if the vehicle can not be identified with a given
// trip instance.
Trip *TripDescriptor `protobuf:"bytes,1,opt,name=trip" json:"trip,omitempty"`
// Additional information on the vehicle that is serving this trip.
Vehicle *VehicleDescriptor `protobuf:"bytes,8,opt,name=vehicle" json:"vehicle,omitempty"`
// Current position of this vehicle.
Position *Position `protobuf:"bytes,2,opt,name=position" json:"position,omitempty"`
// The stop sequence index of the current stop. The meaning of
// current_stop_sequence (i.e., the stop that it refers to) is determined by
// current_status.
// If current_status is missing IN_TRANSIT_TO is assumed.
CurrentStopSequence *uint32 `protobuf:"varint,3,opt,name=current_stop_sequence" json:"current_stop_sequence,omitempty"`
// Identifies the current stop. The value must be the same as in stops.txt in
// the corresponding GTFS feed.
StopId *string `protobuf:"bytes,7,opt,name=stop_id" json:"stop_id,omitempty"`
// The exact status of the vehicle with respect to the current stop.
// Ignored if current_stop_sequence is missing.
CurrentStatus *VehiclePosition_VehicleStopStatus `protobuf:"varint,4,opt,name=current_status,enum=main.VehiclePosition_VehicleStopStatus,def=2" json:"current_status,omitempty"`
// Moment at which the vehicle's position was measured. In POSIX time
// (i.e., number of seconds since January 1st 1970 00:00:00 UTC).
Timestamp *uint64 `protobuf:"varint,5,opt,name=timestamp" json:"timestamp,omitempty"`
CongestionLevel *VehiclePosition_CongestionLevel `protobuf:"varint,6,opt,name=congestion_level,enum=main.VehiclePosition_CongestionLevel" json:"congestion_level,omitempty"`
OccupancyStatus *VehiclePosition_OccupancyStatus `protobuf:"varint,9,opt,name=occupancy_status,enum=main.VehiclePosition_OccupancyStatus" json:"occupancy_status,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *VehiclePosition) Reset() { *m = VehiclePosition{} }
func (m *VehiclePosition) String() string { return proto.CompactTextString(m) }
func (*VehiclePosition) ProtoMessage() {}
var extRange_VehiclePosition = []proto.ExtensionRange{
{1000, 1999},
}
func (*VehiclePosition) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_VehiclePosition
}
func (m *VehiclePosition) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
const Default_VehiclePosition_CurrentStatus VehiclePosition_VehicleStopStatus = VehiclePosition_IN_TRANSIT_TO
func (m *VehiclePosition) GetTrip() *TripDescriptor {
if m != nil {
return m.Trip
}
return nil
}
func (m *VehiclePosition) GetVehicle() *VehicleDescriptor {
if m != nil {
return m.Vehicle
}
return nil
}
func (m *VehiclePosition) GetPosition() *Position {
if m != nil {
return m.Position
}
return nil
}
func (m *VehiclePosition) GetCurrentStopSequence() uint32 {
if m != nil && m.CurrentStopSequence != nil {
return *m.CurrentStopSequence
}
return 0
}
func (m *VehiclePosition) GetStopId() string {
if m != nil && m.StopId != nil {
return *m.StopId
}
return ""
}
func (m *VehiclePosition) GetCurrentStatus() VehiclePosition_VehicleStopStatus {
if m != nil && m.CurrentStatus != nil {
return *m.CurrentStatus
}
return Default_VehiclePosition_CurrentStatus
}
func (m *VehiclePosition) GetTimestamp() uint64 {
if m != nil && m.Timestamp != nil {
return *m.Timestamp
}
return 0
}
func (m *VehiclePosition) GetCongestionLevel() VehiclePosition_CongestionLevel {
if m != nil && m.CongestionLevel != nil {
return *m.CongestionLevel
}
return VehiclePosition_UNKNOWN_CONGESTION_LEVEL
}
func (m *VehiclePosition) GetOccupancyStatus() VehiclePosition_OccupancyStatus {
if m != nil && m.OccupancyStatus != nil {
return *m.OccupancyStatus
}
return VehiclePosition_EMPTY
}
// An alert, indicating some sort of incident in the public transit network.
type Alert struct {
// Time when the alert should be shown to the user. If missing, the
// alert will be shown as long as it appears in the feed.
// If multiple ranges are given, the alert will be shown during all of them.
ActivePeriod []*TimeRange `protobuf:"bytes,1,rep,name=active_period" json:"active_period,omitempty"`
// Entities whose users we should notify of this alert.
InformedEntity []*EntitySelector `protobuf:"bytes,5,rep,name=informed_entity" json:"informed_entity,omitempty"`
Cause *Alert_Cause `protobuf:"varint,6,opt,name=cause,enum=main.Alert_Cause,def=1" json:"cause,omitempty"`
Effect *Alert_Effect `protobuf:"varint,7,opt,name=effect,enum=main.Alert_Effect,def=8" json:"effect,omitempty"`
// The URL which provides additional information about the alert.
Url *TranslatedString `protobuf:"bytes,8,opt,name=url" json:"url,omitempty"`
// Alert header. Contains a short summary of the alert text as plain-text.
HeaderText *TranslatedString `protobuf:"bytes,10,opt,name=header_text" json:"header_text,omitempty"`
// Full description for the alert as plain-text. The information in the
// description should add to the information of the header.
DescriptionText *TranslatedString `protobuf:"bytes,11,opt,name=description_text" json:"description_text,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *Alert) Reset() { *m = Alert{} }
func (m *Alert) String() string { return proto.CompactTextString(m) }
func (*Alert) ProtoMessage() {}
var extRange_Alert = []proto.ExtensionRange{
{1000, 1999},
}
func (*Alert) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_Alert
}
func (m *Alert) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
const Default_Alert_Cause Alert_Cause = Alert_UNKNOWN_CAUSE
const Default_Alert_Effect Alert_Effect = Alert_UNKNOWN_EFFECT
func (m *Alert) GetActivePeriod() []*TimeRange {
if m != nil {
return m.ActivePeriod
}
return nil
}
func (m *Alert) GetInformedEntity() []*EntitySelector {
if m != nil {
return m.InformedEntity
}
return nil
}
func (m *Alert) GetCause() Alert_Cause {
if m != nil && m.Cause != nil {
return *m.Cause
}
return Default_Alert_Cause
}
func (m *Alert) GetEffect() Alert_Effect {
if m != nil && m.Effect != nil {
return *m.Effect
}
return Default_Alert_Effect
}
func (m *Alert) GetUrl() *TranslatedString {
if m != nil {
return m.Url
}
return nil
}
func (m *Alert) GetHeaderText() *TranslatedString {
if m != nil {
return m.HeaderText
}
return nil
}
func (m *Alert) GetDescriptionText() *TranslatedString {
if m != nil {
return m.DescriptionText
}
return nil
}
// A time interval. The interval is considered active at time 't' if 't' is
// greater than or equal to the start time and less than the end time.
type TimeRange struct {
// Start time, in POSIX time (i.e., number of seconds since January 1st 1970
// 00:00:00 UTC).
// If missing, the interval starts at minus infinity.
Start *uint64 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
// End time, in POSIX time (i.e., number of seconds since January 1st 1970
// 00:00:00 UTC).
// If missing, the interval ends at plus infinity.
End *uint64 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *TimeRange) Reset() { *m = TimeRange{} }
func (m *TimeRange) String() string { return proto.CompactTextString(m) }
func (*TimeRange) ProtoMessage() {}
func (m *TimeRange) GetStart() uint64 {
if m != nil && m.Start != nil {
return *m.Start
}
return 0
}
func (m *TimeRange) GetEnd() uint64 {
if m != nil && m.End != nil {
return *m.End
}
return 0
}
// A position.
type Position struct {
// Degrees North, in the WGS-84 coordinate system.
Latitude *float32 `protobuf:"fixed32,1,req,name=latitude" json:"latitude,omitempty"`
// Degrees East, in the WGS-84 coordinate system.
Longitude *float32 `protobuf:"fixed32,2,req,name=longitude" json:"longitude,omitempty"`
// Bearing, in degrees, clockwise from North, i.e., 0 is North and 90 is East.
// This can be the compass bearing, or the direction towards the next stop
// or intermediate location.
// This should not be direction deduced from the sequence of previous
// positions, which can be computed from previous data.
Bearing *float32 `protobuf:"fixed32,3,opt,name=bearing" json:"bearing,omitempty"`
// Odometer value, in meters.
Odometer *float64 `protobuf:"fixed64,4,opt,name=odometer" json:"odometer,omitempty"`
// Momentary speed measured by the vehicle, in meters per second.
Speed *float32 `protobuf:"fixed32,5,opt,name=speed" json:"speed,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *Position) Reset() { *m = Position{} }
func (m *Position) String() string { return proto.CompactTextString(m) }
func (*Position) ProtoMessage() {}
var extRange_Position = []proto.ExtensionRange{
{1000, 1999},
}
func (*Position) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_Position
}
func (m *Position) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
func (m *Position) GetLatitude() float32 {
if m != nil && m.Latitude != nil {
return *m.Latitude
}
return 0
}
func (m *Position) GetLongitude() float32 {
if m != nil && m.Longitude != nil {
return *m.Longitude
}
return 0
}
func (m *Position) GetBearing() float32 {
if m != nil && m.Bearing != nil {
return *m.Bearing
}
return 0
}
func (m *Position) GetOdometer() float64 {
if m != nil && m.Odometer != nil {
return *m.Odometer
}
return 0
}
func (m *Position) GetSpeed() float32 {
if m != nil && m.Speed != nil {
return *m.Speed
}
return 0
}
// A descriptor that identifies an instance of a GTFS trip, or all instances of
// a trip along a route.
// - To specify a single trip instance, the trip_id (and if necessary,
// start_time) is set. If route_id is also set, then it should be same as one
// that the given trip corresponds to.
// - To specify all the trips along a given route, only the route_id should be
// set. Note that if the trip_id is not known, then stop sequence ids in
// TripUpdate are not sufficient, and stop_ids must be provided as well. In
// addition, absolute arrival/departure times must be provided.
type TripDescriptor struct {
// The trip_id from the GTFS feed that this selector refers to.
// For non frequency expanded trips, this field is enough to uniquely identify
// the trip. For frequency expanded, start_time and start_date might also be
// necessary.
TripId *string `protobuf:"bytes,1,opt,name=trip_id" json:"trip_id,omitempty"`
// The route_id from the GTFS that this selector refers to.
RouteId *string `protobuf:"bytes,5,opt,name=route_id" json:"route_id,omitempty"`
// The scheduled start time of this trip instance.
// This field should be given only if the trip is frequency-expanded in the
// GTFS feed. The value must precisely correspond to start_time specified for
// the route in the GTFS feed plus some multiple of headway_secs.
// Format of the field is same as that of GTFS/frequencies.txt/start_time,
// e.g., 11:15:35 or 25:15:35.
StartTime *string `protobuf:"bytes,2,opt,name=start_time" json:"start_time,omitempty"`
// The scheduled start date of this trip instance.
// Must be provided to disambiguate trips that are so late as to collide with
// a scheduled trip on a next day. For example, for a train that departs 8:00
// and 20:00 every day, and is 12 hours late, there would be two distinct
// trips on the same time.
// This field can be provided but is not mandatory for schedules in which such
// collisions are impossible - for example, a service running on hourly
// schedule where a vehicle that is one hour late is not considered to be
// related to schedule anymore.
// In YYYYMMDD format.
StartDate *string `protobuf:"bytes,3,opt,name=start_date" json:"start_date,omitempty"`
ScheduleRelationship *TripDescriptor_ScheduleRelationship `protobuf:"varint,4,opt,name=schedule_relationship,enum=main.TripDescriptor_ScheduleRelationship" json:"schedule_relationship,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *TripDescriptor) Reset() { *m = TripDescriptor{} }
func (m *TripDescriptor) String() string { return proto.CompactTextString(m) }
func (*TripDescriptor) ProtoMessage() {}
var extRange_TripDescriptor = []proto.ExtensionRange{
{1000, 1999},
}
func (*TripDescriptor) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_TripDescriptor
}
func (m *TripDescriptor) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
func (m *TripDescriptor) GetTripId() string {
if m != nil && m.TripId != nil {
return *m.TripId
}
return ""
}
func (m *TripDescriptor) GetRouteId() string {
if m != nil && m.RouteId != nil {
return *m.RouteId
}
return ""
}
func (m *TripDescriptor) GetStartTime() string {
if m != nil && m.StartTime != nil {
return *m.StartTime
}
return ""
}
func (m *TripDescriptor) GetStartDate() string {
if m != nil && m.StartDate != nil {
return *m.StartDate
}
return ""
}
func (m *TripDescriptor) GetScheduleRelationship() TripDescriptor_ScheduleRelationship {
if m != nil && m.ScheduleRelationship != nil {
return *m.ScheduleRelationship
}
return TripDescriptor_SCHEDULED
}
// Identification information for the vehicle performing the trip.
type VehicleDescriptor struct {
// Internal system identification of the vehicle. Should be unique per
// vehicle, and can be used for tracking the vehicle as it proceeds through
// the system.
Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
// User visible label, i.e., something that must be shown to the passenger to
// help identify the correct vehicle.
Label *string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"`
// The license plate of the vehicle.
LicensePlate *string `protobuf:"bytes,3,opt,name=license_plate" json:"license_plate,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *VehicleDescriptor) Reset() { *m = VehicleDescriptor{} }
func (m *VehicleDescriptor) String() string { return proto.CompactTextString(m) }
func (*VehicleDescriptor) ProtoMessage() {}
var extRange_VehicleDescriptor = []proto.ExtensionRange{
{1000, 1999},
}
func (*VehicleDescriptor) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_VehicleDescriptor
}
func (m *VehicleDescriptor) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
func (m *VehicleDescriptor) GetId() string {
if m != nil && m.Id != nil {
return *m.Id
}
return ""
}
func (m *VehicleDescriptor) GetLabel() string {
if m != nil && m.Label != nil {
return *m.Label
}
return ""
}
func (m *VehicleDescriptor) GetLicensePlate() string {
if m != nil && m.LicensePlate != nil {
return *m.LicensePlate
}
return ""
}
// A selector for an entity in a GTFS feed.
type EntitySelector struct {
// The values of the fields should correspond to the appropriate fields in the
// GTFS feed.
// At least one specifier must be given. If several are given, then the
// matching has to apply to all the given specifiers.
AgencyId *string `protobuf:"bytes,1,opt,name=agency_id" json:"agency_id,omitempty"`
RouteId *string `protobuf:"bytes,2,opt,name=route_id" json:"route_id,omitempty"`
// corresponds to route_type in GTFS.
RouteType *int32 `protobuf:"varint,3,opt,name=route_type" json:"route_type,omitempty"`
Trip *TripDescriptor `protobuf:"bytes,4,opt,name=trip" json:"trip,omitempty"`
StopId *string `protobuf:"bytes,5,opt,name=stop_id" json:"stop_id,omitempty"`
XXX_extensions map[int32]proto.Extension `json:"-"`
XXX_unrecognized []byte `json:"-"`
}
func (m *EntitySelector) Reset() { *m = EntitySelector{} }
func (m *EntitySelector) String() string { return proto.CompactTextString(m) }
func (*EntitySelector) ProtoMessage() {}
var extRange_EntitySelector = []proto.ExtensionRange{
{1000, 1999},
}
func (*EntitySelector) ExtensionRangeArray() []proto.ExtensionRange {
return extRange_EntitySelector
}
func (m *EntitySelector) ExtensionMap() map[int32]proto.Extension {
if m.XXX_extensions == nil {
m.XXX_extensions = make(map[int32]proto.Extension)
}
return m.XXX_extensions
}
func (m *EntitySelector) GetAgencyId() string {
if m != nil && m.AgencyId != nil {
return *m.AgencyId
}
return ""
}
func (m *EntitySelector) GetRouteId() string {
if m != nil && m.RouteId != nil {
return *m.RouteId
}
return ""
}
func (m *EntitySelector) GetRouteType() int32 {
if m != nil && m.RouteType != nil {
return *m.RouteType
}
return 0
}
func (m *EntitySelector) GetTrip() *TripDescriptor {
if m != nil {
return m.Trip
}
return nil
}
func (m *EntitySelector) GetStopId() string {
if m != nil && m.StopId != nil {
return *m.StopId
}
return ""
}
// An internationalized message containing per-language versions of a snippet of
// text or a URL.
// One of the strings from a message will be picked up. The resolution proceeds
// as follows:
// 1. If the UI language matches the language code of a translation,
// the first matching translation is picked.
// 2. If a default UI language (e.g., English) matches the language code of a
// translation, the first matching translation is picked.
// 3. If some translation has an unspecified language code, that translation is
// picked.
type TranslatedString struct {
// At least one translation must be provided.
Translation []*TranslatedString_Translation `protobuf:"bytes,1,rep,name=translation" json:"translation,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *TranslatedString) Reset() { *m = TranslatedString{} }
func (m *TranslatedString) String() string { return proto.CompactTextString(m) }
func (*TranslatedString) ProtoMessage() {}
func (m *TranslatedString) GetTranslation() []*TranslatedString_Translation {
if m != nil {
return m.Translation
}
return nil
}
type TranslatedString_Translation struct {
// A UTF-8 string containing the message.
Text *string `protobuf:"bytes,1,req,name=text" json:"text,omitempty"`
// BCP-47 language code. Can be omitted if the language is unknown or if
// no i18n is done at all for the feed. At most one translation is
// allowed to have an unspecified language tag.
Language *string `protobuf:"bytes,2,opt,name=language" json:"language,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
func (m *TranslatedString_Translation) Reset() { *m = TranslatedString_Translation{} }
func (m *TranslatedString_Translation) String() string { return proto.CompactTextString(m) }
func (*TranslatedString_Translation) ProtoMessage() {}
func (m *TranslatedString_Translation) GetText() string {
if m != nil && m.Text != nil {
return *m.Text
}
return ""
}
func (m *TranslatedString_Translation) GetLanguage() string {
if m != nil && m.Language != nil {
return *m.Language
}
return ""
}
func init() {
proto.RegisterEnum("main.FeedHeader_Incrementality", FeedHeader_Incrementality_name, FeedHeader_Incrementality_value)
proto.RegisterEnum("main.TripUpdate_StopTimeUpdate_ScheduleRelationship", TripUpdate_StopTimeUpdate_ScheduleRelationship_name, TripUpdate_StopTimeUpdate_ScheduleRelationship_value)
proto.RegisterEnum("main.VehiclePosition_VehicleStopStatus", VehiclePosition_VehicleStopStatus_name, VehiclePosition_VehicleStopStatus_value)
proto.RegisterEnum("main.VehiclePosition_CongestionLevel", VehiclePosition_CongestionLevel_name, VehiclePosition_CongestionLevel_value)
proto.RegisterEnum("main.VehiclePosition_OccupancyStatus", VehiclePosition_OccupancyStatus_name, VehiclePosition_OccupancyStatus_value)
proto.RegisterEnum("main.Alert_Cause", Alert_Cause_name, Alert_Cause_value)
proto.RegisterEnum("main.Alert_Effect", Alert_Effect_name, Alert_Effect_value)
proto.RegisterEnum("main.TripDescriptor_ScheduleRelationship", TripDescriptor_ScheduleRelationship_name, TripDescriptor_ScheduleRelationship_value)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment