Source code for aequilibrae.transit.transit_elements.trip
from sqlite3 import Connection
from shapely.geometry import LineString
from aequilibrae.transit.constants import Constants, TRIP_ID_MULTIPLIER
from aequilibrae.log import logger
from aequilibrae.transit.transit_elements.basic_element import BasicPTElement
[docs]
class Trip(BasicPTElement):
"""Transit trips read from trips.txt
* trip (:obj:`str`): Trip ID as read from the GTFS feed
* route (:obj:`str`): Route ID as read from the GTFS feed
* service_id (:obj:`str`): Service ID as read from the GTFS feed
* trip_headsign (:obj:`str`): Trip headsign as read from the GTFS feed
* trip_short_name (:obj:`str`): Trip short name as read from the GTFS feed
* direction_id (:obj:`int`): Direction ID as read from the GTFS feed
* block_id (:obj:`int`): Block ID as read from the GTFS feed
* bikes_allowed (:obj:`int`): Bikes allowed flag as read from the GTFS feed
* wheelchair_accessible (:obj:`int`): Wheelchair accessibility flag as read from the GTFS feed
* shape_id (:obj:`str`): Shape ID as read from the GTFS feed
* trip_id (:obj:`int`): Unique trip_id as it will go into the database
* route_id (:obj:`int`): Unique Route ID as will be available in the routes table
* pattern_id (:obj:`int`): Unique Pattern ID for this route/stop-pattern as it will go into the database
* pattern_hash (:obj:`str`): Pattern ID derived from stops for this route/stop-pattern
* arrivals (:obj:`List[int]`): Sequence of arrival at stops for this trip
* departures (:obj:`List[int]`): Sequence of departures from stops for this trip
* stops (:obj:`List[Stop]`): Sequence of stops for this trip
* shape (:obj:`LineString`): Shape for this trip. Directly from shapes.txt or rebuilt from sequence of stops
"""
def __init__(self):
self.route_id = ""
self.service_id = ""
self.trip = ""
self.trip_id = -1
self.trip_headsign = ""
self.trip_short_name = ""
self.block_id = ""
self.shape_id = ""
self.direction_id = 0
self.wheelchair_accessible = 0
self.bikes_allowed = 0
# Not from GTFS
self.pattern_id = 0
self.pattern_hash = ""
self.arrivals = []
self.departures = []
self.stops = []
self.shape = None # type: LineString
self._stop_based_shape = None # type: LineString
self.seated_capacity = None
self.total_capacity = None
self.source_time = []
def _populate(self, record: tuple, headers: list) -> None:
for key, value in zip(headers, record):
if key not in self.__dict__.keys():
raise KeyError(f"{key} field in Trips.txt is unknown field for that file on GTFS")
key = "trip" if key == "trip_id" else key
key = "route" if key == "route_id" else key
self.__dict__[key] = value
[docs]
def save_to_database(self, conn: Connection, commit=True) -> None:
"""Saves trips to the database"""
logger.debug(f"Saving {self.trip_id}/{self.trip} for pattern {self.pattern_id}")
sql = """insert into trips (trip_id, trip, dir, pattern_id) values (?, ?, ?, ?);"""
data = [self.trip_id, self.trip, int(self.direction_id), self.pattern_id]
conn.execute(sql, data)
sql = """insert into trips_schedule (trip_id, seq, arrival, departure)
values (?, ?, ?, ?)"""
data = []
for i, (arr, dep) in enumerate(zip(self.arrivals, self.departures)):
data.append([self.trip_id, i, arr, dep])
conn.executemany(sql, data)
if commit:
conn.commit()
[docs]
def get_trip_id(self):
c = Constants()
self.trip_id = c.trips.get(self.pattern_id, self.pattern_id) + TRIP_ID_MULTIPLIER
c.trips[self.pattern_id] = self.trip_id
def __lt__(self, other):
return self.departures[0] < other.departures[0]