def load_gtfs_dag(self, sched_or_datadir, stops_timezone_name=None, prefix="gtfs"): if type(sched_or_datadir)==str: sched = transitfeed.Loader(sched_or_datadir).Load() else: sched = sched_or_datadir tzs = dict( [(agency.agency_id, Timezone.generate(agency.agency_timezone)) for agency in sched.GetAgencyList()] ) scs = dict( [(agency.agency_id, schedule_to_service_calendar(sched, agency.agency_id)) for agency in sched.GetAgencyList()] ) agints = dict( zip([x.agency_id for x in sched.GetAgencyList()], range(len(sched.GetAgencyList())) )) if stops_timezone_name is None: default_agency = sched.GetDefaultAgency() or sched.GetAgencyList()[0] stz = scs[default_agency.agency_id] else: stz = Timezone.generate( stops_timezone_name ) stop_times = dict( [(x.stop_id, set()) for x in sched.GetStopList()] ) for route in sched.GetRouteList(): print "adding all triphops for route %s"%route.route_id for trip in route.trips: agency_id = route_for_trip(trip).agency_id stops = trip.GetTimeInterpolatedStops() for (fromst_time,fromst_st,fromst_timed), (tost_time,tost_st,tost_timed) in cons(stops): fromst_name = "%s@%s"%(fromst_st.stop.stop_id,fromst_time) tost_name = "%s@%s"%(tost_st.stop.stop_id,tost_time) self.add_vertex(fromst_name) self.add_vertex(tost_name) sc = scs[agency_id] th = TripHop(fromst_time, tost_time, trip.trip_id, sc, tzs[agency_id], agints[agency_id], trip.service_id.encode("ascii")) self.add_edge(fromst_name, tost_name, th) stop_times[fromst_st.stop.stop_id].add(fromst_time) stop_times[tost_st.stop.stop_id].add(tost_time) for stop_id, times in stop_times.iteritems(): print "laying down beanstock for %s"%stop_id times = list(times) times.sort() self.add_vertex(stop_id) for time in times: self.add_edge( stop_id, "%s@%s"%(stop_id,time), Wait(time, stz) ) self.add_edge( "%s@%s"%(stop_id,time), stop_id, Wait(time, stz) ) for fromtime, totime in cons(times): self.add_edge( "%s@%s"%(stop_id,fromtime), "%s@%s"%(stop_id,totime), Wait(totime, stz) )
def _load_agency(self, sched, agency, agency_int, prefix): cal = schedule_to_service_calendar(sched, agency.agency_id) gs_tz = Timezone.generate(agency.agency_timezone) for stop in sched.GetStopList(): print "loading stop %s for agency %s"%(stop.stop_id, agency.agency_id) rawtriphopschedules = self._raw_triphopschedules_from_stop(sched, stop, agency) for rawtriphopschedule in rawtriphopschedules: #hops = [(fromv.departure_secs, tov.arrival_secs, trip.trip_id.encode("ascii")) for trip,fromv,tov in rawtriphopschedule] hops =[] service_id = rawtriphopschedule[0][0].service_id.encode("ascii") for trip,fromv,tov in rawtriphopschedule: trip_id = trip.trip_id.encode("ascii") if len(trip.GetHeadwayPeriodTuples())!=0: for start_time, end_time, headway_secs in trip.GetHeadwayPeriodTuples(): hw = Headway( start_time, end_time, headway_secs, (tov.arrival_secs - fromv.departure_secs), trip_id, cal, gs_tz, agency_int, service_id ) e = self.add_edge( prefix+fromv.stop_id, prefix+tov.stop_id, hw ) else: hops.append( (fromv.departure_secs, tov.arrival_secs, trip_id) ) if hops!=[]: ths = TripHopSchedule( hops, service_id, cal, gs_tz, agency_int ) e = self.add_edge( prefix+fromv.stop_id, prefix+tov.stop_id, ths )
def gdb_load_gtfsdb_to_boardalight(gdb, agency_namespace, gtfsdb, agency_id, cursor, agency_id_int, maxtrips=None, reporter=sys.stdout): # get graphserver.core.Timezone and graphserver.core.ServiceCalendars from gtfsdb for agency with given agency_id tz = Timezone.generate(gtfsdb.agency_timezone_name( agency_id )) sc = gtfsdb_to_service_calendar(gtfsdb, agency_id ) # enter station vertices for stop_id, stop_name, stop_lat, stop_lon in gtfsdb.stops(): station_vertex_label = "sta-%s"%stop_id reporter.write("adding station vertex '%s'\n"%station_vertex_label) gdb.add_vertex( station_vertex_label, stop_lat, stop_lon ) # compile trip bundles from gtfsdb if reporter: reporter.write( "Compiling trip bundles...\n" ) bundles = gtfsdb.compile_trip_bundles(maxtrips=maxtrips, reporter=reporter) # load bundles to graph if reporter: reporter.write( "Loading trip bundles into graph...\n" ) n_bundles = len(bundles) for i, bundle in enumerate(bundles): if reporter: reporter.write( "%d/%d loading %s\n"%(i, n_bundles, bundle) ) for service_id in [x.encode("ascii") for x in gtfsdb.service_ids()]: gdb_boardalight_load_bundle(gdb, agency_namespace, gtfsdb, bundle, service_id, sc, tz, cursor, agency_id_int) # load headways if reporter: reporter.write( "Loading headways trips to graph...\n" ) for trip_id, start_time, end_time, headway_secs in gtfsdb.execute( "SELECT * FROM frequencies" ): service_id = list(gtfsdb.execute( "SELECT service_id FROM trips WHERE trip_id=?", (trip_id,) ))[0][0] service_id = service_id.encode('utf-8') route_type = gtfsdb.route_type_for_trip_id(trip_id) stoptimes = list(gtfsdb.execute( "SELECT * FROM stop_times WHERE trip_id=? ORDER BY stop_sequence", (trip_id,)) ) #add board edges for trip_id, arrival_time, departure_time, stop_id, stop_sequence, stop_dist_traveled, stop_headsign in stoptimes[:-1]: board_stop_id, board_stop_name, board_stop_lat, board_stop_lon = gtfsdb.stop(stop_id) wheelchair_boarding = gtfsdb.wheelchair_boarding_for_stop_id(stop_id) gdb.add_vertex( "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id), board_stop_lat, board_stop_lon ) gdb.add_edge( "sta-%s"%stop_id, "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id), HeadwayBoard( service_id, sc, tz, agency_id_int, route_type, wheelchair_boarding, trip_id.encode('utf-8'), start_time, end_time, headway_secs ) ) #add alight edges for trip_id, arrival_time, departure_time, stop_id, stop_sequence, stop_dist_traveled, stop_headsign in stoptimes[1:]: alight_stop_id, alight_stop_name, alight_stop_lat, alight_stop_lon = gtfsdb.stop(stop_id) wheelchair_boarding = gtfsdb.wheelchair_boarding_for_stop_id(stop_id) gdb.add_vertex( "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id), alight_stop_lat, alight_stop_lon ) gdb.add_edge( "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id), "sta-%s"%stop_id, HeadwayAlight( service_id, sc, tz, agency_id_int, route_type, wheelchair_boarding, trip_id.encode('utf-8'), start_time, end_time, headway_secs ) ) #add crossing edges for (trip_id1, arrival_time1, departure_time1, stop_id1, stop_sequence1, stop_dist_traveled1, stop_headsign1), (trip_id2, arrival_time2, departure_time2, stop_id2, stop_sequence2, stop_dist_traveled2, stop_headsign2) in cons(stoptimes): gdb.add_edge( "hwv-%s-%s-%s"%(agency_namespace,stop_id1, trip_id1), "hwv-%s-%s-%s"%(agency_namespace,stop_id2, trip_id2), Crossing(arrival_time2-departure_time1) ) # load connections if reporter: reporter.write( "Loading connections to graph...\n" ) for stop_id1, stop_id2, conn_type, distance in gtfsdb.execute( "SELECT * FROM connections" ): gdb.add_edge( "sta-%s"%stop_id1, "sta-%s"%stop_id2, Street( conn_type, distance ) ) gdb.add_edge( "sta-%s"%stop_id2, "sta-%s"%stop_id1, Street( conn_type, distance ) )
def __init__(self, gtfsdb, agency_namespace, agency_id=None, reporter=None): self.gtfsdb = gtfsdb self.agency_namespace = agency_namespace self.reporter = reporter # get graphserver.core.Timezone and graphserver.core.ServiceCalendars from gtfsdb for agency with given agency_id timezone_name = gtfsdb.agency_timezone_name(agency_id) self.tz = Timezone.generate( timezone_name ) if reporter: reporter.write( "constructing service calendar for timezone '%s'\n"%timezone_name ) self.sc = service_calendar_from_timezone(gtfsdb, timezone_name )
def load_gtfsdb_to_boardalight_graph(g, agency_namespace, gtfsdb, agency_id, service_ids, reporter=sys.stdout): # get graphserver.core.Timezone and graphserver.core.ServiceCalendars from gtfsdb for agency with given agency_id tz = Timezone.generate(gtfsdb.agency_timezone_name( agency_id )) sc = gtfsdb_to_service_calendar(gtfsdb, agency_id ) # enter station vertices for stop_id, stop_name, stop_lat, stop_lon in gtfsdb.stops(): g.add_vertex( "sta-%s"%stop_id ) # compile trip bundles from gtfsdb if reporter: reporter.write( "Compiling trip bundles...\n" ) bundles = gtfsdb.compile_trip_bundles(reporter=reporter) # load bundles to graph if reporter: reporter.write( "Loading trip bundles into graph...\n" ) n_bundles = len(bundles) for i, bundle in enumerate(bundles): if reporter and i%((n_bundles//100)+1)==0: reporter.write( "%d/%d trip bundles loaded\n"%(i, n_bundles) ) for service_id in service_ids: load_bundle_to_boardalight_graph(g, agency_namespace, bundle, service_id, sc, tz) # load headways if reporter: reporter.write( "Loading headways trips to graph...\n" ) for trip_id, start_time, end_time, headway_secs in gtfsdb.execute( "SELECT * FROM frequencies" ): service_id = list(gtfsdb.execute( "SELECT service_id FROM trips WHERE trip_id=?", (trip_id,) ))[0][0] service_id = service_id.encode('utf-8') hb = HeadwayBoard( service_id, sc, tz, 0, trip_id.encode('utf-8'), start_time, end_time, headway_secs ) ha = HeadwayAlight( service_id, sc, tz, 0, trip_id.encode('utf-8'), start_time, end_time, headway_secs ) stoptimes = list(gtfsdb.execute( "SELECT trip_id, arrival_time, departure_time, stop_id, stop_sequence, shape_dist_traveled FROM stop_times WHERE trip_id=? ORDER BY stop_sequence", (trip_id,)) ) #add board edges for trip_id, arrival_time, departure_time, stop_id, stop_sequence, stop_dist_traveled in stoptimes[:-1]: g.add_vertex( "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id) ) g.add_edge( "sta-%s"%stop_id, "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id), hb ) #add alight edges for trip_id, arrival_time, departure_time, stop_id, stop_sequence, stop_dist_traveled in stoptimes[1:]: g.add_vertex( "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id) ) g.add_edge( "hwv-%s-%s-%s"%(agency_namespace,stop_id, trip_id), "sta-%s"%stop_id, ha ) print ha #add crossing edges for (trip_id1, arrival_time1, departure_time1, stop_id1, stop_sequence1, stop_dist_traveled1), (trip_id2, arrival_time2, departure_time2, stop_id2, stop_sequence2,stop_dist_traveled2) in cons(stoptimes): g.add_edge( "hwv-%s-%s-%s"%(agency_namespace,stop_id1, trip_id1), "hwv-%s-%s-%s"%(agency_namespace,stop_id2, trip_id2), Crossing(arrival_time2-departure_time1) ) # load connections if reporter: reporter.write( "Loading connections to graph...\n" ) for stop_id1, stop_id2, conn_type, distance in gtfsdb.execute( "SELECT * FROM connections" ): g.add_edge( "sta-%s"%stop_id1, "sta-%s"%stop_id2, Street( conn_type, distance ) ) g.add_edge( "sta-%s"%stop_id2, "sta-%s"%stop_id1, Street( conn_type, distance ) )
def test_august(self): # noon, -7 hours off UTC, as America/Los_Angeles in summer tz = Timezone.generate("America/Los_Angeles") w = Wait(43200, tz) # one calendar, noon august 27, America/Los_Angeles s = State(1, 1219863600) assert w.walk(s, WalkOptions()).time == 1219863600 # one calendar, 11:55 AM August 27 2008, America/Los_Angeles s = State(1, 1219863300) assert w.walk(s, WalkOptions()).time == 1219863600 assert w.walk(s, WalkOptions()).weight == 300
def test_getstate(self): # noon, -7 hours off UTC, as America/Los_Angeles in summer tz = Timezone.generate("America/Los_Angeles") w = Wait(43200, tz) assert w.__getstate__() == (43200, tz.soul)