def service_calendar_from_timezone(gtfsdb, timezone_name): timezone = pytz.timezone(timezone_name) # grab date, day service bounds start_date, end_date = gtfsdb.date_range() # init empty calendar cal = ServiceCalendar() # for each day in service range, inclusive for currdate in iter_dates(start_date, end_date): # get and encode in utf-8 the service_ids of all service periods running thos date service_ids = [ x.encode('utf8') for x in gtfsdb.service_periods(currdate) ] # figure datetime.datetime bounds of this service day currdate_start = datetime.combine(currdate, time(0)) currdate_local_start = timezone.localize(currdate_start) service_period_begins = timezone.normalize(currdate_local_start) service_period_ends = timezone.normalize(currdate_local_start + timedelta(hours=24)) # enter as entry in service calendar cal.add_period(TimeHelpers.datetime_to_unix(service_period_begins), TimeHelpers.datetime_to_unix(service_period_ends), service_ids) return cal
def service_calendar_from_timezone(gtfsdb, timezone_name): MAX_CALENDAR_SIZE = 1024 sc_count = list(gtfsdb.execute( "SELECT DISTINCT count(num) FROM (SELECT service_id FROM gtfs_calendar_dates UNION SELECT service_id FROM gtfs_calendar ) AS num" ))[0][0] if sc_count > MAX_CALENDAR_SIZE: raise Exception( "Service period count %d is greater than the maximum of %d"%(sc_count, MAX_CALENDAR_SIZE) ) timezone = pytz.timezone( timezone_name ) # grab date, day service bounds start_date, end_date = gtfsdb.date_range() # init empty calendar cal = ServiceCalendar() # for each day in service range, inclusive for currdate in iter_dates(start_date, end_date): # get and encode in utf-8 the service_ids of all service periods running thos date service_ids = [x.encode('utf8') for x in gtfsdb.service_periods( currdate )] # figure datetime.datetime bounds of this service day currdate_start = datetime.combine(currdate, time(0)) currdate_local_start = timezone.localize(currdate_start) service_period_begins = timezone.normalize( currdate_local_start ) service_period_ends = timezone.normalize( currdate_local_start + timedelta(hours=24) ) # enter as entry in service calendar cal.add_period( TimeHelpers.datetime_to_unix(service_period_begins), TimeHelpers.datetime_to_unix(service_period_ends), service_ids ) return cal
def gtfsdb_to_service_calendar(gtfsdb, agency_id=None): """Given gtfsdb and agency_id, returns graphserver.core.ServiceCalendar""" # grab pytz timezone by agency_id, via gtfsdb timezone_name = gtfsdb.agency_timezone_name( agency_id ) timezone = pytz.timezone( timezone_name ) # grab date, day service bounds start_date, end_date = gtfsdb.date_range() # init empty calendar cal = ServiceCalendar() # for each day in service range, inclusive for currdate in iter_dates(start_date, end_date): # get and encode in utf-8 the service_ids of all service periods running thos date service_ids = [x.encode('utf8') for x in gtfsdb.service_periods( currdate )] # figure datetime.datetime bounds of this service day currdate_start = datetime.combine(currdate, time(0)) currdate_local_start = timezone.localize(currdate_start) service_period_begins = timezone.normalize( currdate_local_start ) service_period_ends = timezone.normalize( currdate_local_start + timedelta(hours=24) ) # enter as entry in service calendar cal.add_period( TimeHelpers.datetime_to_unix(service_period_begins), TimeHelpers.datetime_to_unix(service_period_ends), service_ids ) return cal
def service_calendar_from_timezone(gtfsdb, timezone_name): MAX_CALENDAR_SIZE = 1024 sc_count = list(gtfsdb.execute( "SELECT DISTINCT count(*) FROM (SELECT service_id FROM calendar_dates UNION SELECT service_id FROM calendar )" ))[0][0] if sc_count > MAX_CALENDAR_SIZE: raise Exception( "Service period count %d is greater than the maximum of %d"%(sc_count, MAX_CALENDAR_SIZE) ) timezone = pytz.timezone( timezone_name ) # grab date, day service bounds start_date, end_date = gtfsdb.date_range() # init empty calendar cal = ServiceCalendar() # for each day in service range, inclusive for currdate in iter_dates(start_date, end_date): # get and encode in utf-8 the service_ids of all service periods running thos date service_ids = [x.encode('utf8') for x in gtfsdb.service_periods( currdate )] # figure datetime.datetime bounds of this service day currdate_start = datetime.combine(currdate, time(0)) currdate_local_start = timezone.localize(currdate_start) service_period_begins = timezone.normalize( currdate_local_start ) service_period_ends = timezone.normalize( currdate_local_start + timedelta(hours=24) ) # enter as entry in service calendar cal.add_period( TimeHelpers.datetime_to_unix(service_period_begins), TimeHelpers.datetime_to_unix(service_period_ends), service_ids ) return cal
def __call__(self, vertex1, edge, vertex2, context): event_time = vertex2.state.time trip_id = vertex2.state.trip_id stop_id = vertex1.label.split("-")[-1] route_desc = "-".join([ str(x) for x in list( self.gtfsdb.execute( "SELECT routes.route_short_name, routes.route_long_name FROM routes, trips WHERE routes.route_id=trips.route_id AND trip_id=?", (trip_id, )))[0] ]) stop_desc = list( self.gtfsdb.execute( "SELECT stop_name FROM stops WHERE stop_id = ?", (stop_id, )))[0][0] lat, lon = list( self.gtfsdb.execute( "SELECT stop_lat, stop_lon FROM stops WHERE stop_id = ?", (stop_id, )))[0] what = "Board the %s" % route_desc where = stop_desc when = str( TimeHelpers.unix_to_localtime(event_time, self.timezone_name)) geom = (lon, lat) return NarrativeEvent(what, where, when, geom)
def __call__(self, edge1, vertex, edge2, context): context['streetgeom'] = [] context['sumlength'] = 0 context['sumrise'] = 0 context['sumfall'] = 0 context['lastturntime'] = vertex.state.time osm_way2 = edge2.payload.name.split("-")[0] street_name2 = self.osmdb.way(osm_way2).tags.get('name', "unnamed") osm_id = vertex.label.split("-")[1] osm_node_id, osm_node_tags, osm_node_lat, osm_node_lon, osm_node_refcount = self.osmdb.node( osm_id) osm_edge2 = self.osmdb.edge(edge2.payload.name) osm_edge2_startnode = osm_edge2[2] osm_edge2_geom = osm_edge2[5] if osm_id != osm_edge2_startnode: osm_edge2_geom.reverse() startseg = osm_edge2_geom[:2] direction = description_from_north(startseg[0], startseg[1]) what = "start walking" where = "on %s facing %s" % (street_name2, direction) when = "about %s" % str( TimeHelpers.unix_to_localtime(vertex.state.time, self.timezone_name)) geom = [osm_node_lon, osm_node_lat] return NarrativeEvent(what, where, when, geom)
def __call__(self, edge1, vertex, edge2, context): context['streetgeom'] = [] context['sumlength'] = 0 context['sumrise'] = 0 context['sumfall'] = 0 context['lastturntime'] = vertex.state.time osm_way2 = edge2.payload.name.split("-")[0] street_name2 = self.osmdb.way( osm_way2 ).tags.get('name', "unnamed") osm_id = vertex.label.split("-")[1] osm_node_id, osm_node_tags, osm_node_lat, osm_node_lon, osm_node_refcount = self.osmdb.node( osm_id ) osm_edge2 = self.osmdb.edge( edge2.payload.name ) osm_edge2_startnode = osm_edge2[2] osm_edge2_geom = osm_edge2[5] if osm_id != osm_edge2_startnode: osm_edge2_geom.reverse() startseg = osm_edge2_geom[:2] direction = description_from_north( startseg[0], startseg[1] ) what = "start walking" where = "on %s facing %s"%(street_name2, direction) when = "about %s"%str(TimeHelpers.unix_to_localtime( vertex.state.time, self.timezone_name )) geom = [osm_node_lon, osm_node_lat] return NarrativeEvent(what,where,when,geom)
def test_basic(self): assert TimeHelpers.localtime_to_unix(2008,10,12,6,0,0,"Europe/Paris") == 1223784000 assert str(TimeHelpers.unix_to_localtime(1199181360, "America/New_York")) == "2008-01-01 04:56:00-05:00" assert TimeHelpers.unixtime_to_daytimes(1219834260, "America/Los_Angeles") == (13860, 100260, 186660) assert str(TimeHelpers.unix_to_localtime(1221459000, "America/Chicago")) == "2008-09-15 01:10:00-05:00" assert TimeHelpers.unixtime_to_daytimes(1230354000, "America/Chicago") == (82800, 169200, 255600) assert TimeHelpers.unix_time(2008,8,27,12,0,0,-7*3600) == 1219863600 assert TimeHelpers.localtime_to_unix(2008,8,27,12,0,0,"America/Los_Angeles") == 1219863600 assert str(TimeHelpers.unix_to_localtime(1219863600, "America/Los_Angeles")) == "2008-08-27 12:00:00-07:00"
def schedule_to_service_calendar(sched, agency_id): timezone = timezone_from_agency(sched, agency_id) day_start, day_end = day_bounds_from_sched(sched) startdate, enddate = [ datetime.datetime( *parse_date(x) ) for x in sched.GetDateRange() ] cal = ServiceCalendar() for currdate in iter_dates(startdate, enddate): local_dt = timezone.localize(currdate) service_ids = [x.encode("ascii") for x in get_service_ids( sched, currdate )] this_day_begins = timezone.normalize( local_dt + timedelta(seconds=day_start) ) this_day_ends = timezone.normalize( local_dt + timedelta(seconds=day_end) ) cal.add_period( TimeHelpers.datetime_to_unix(this_day_begins), TimeHelpers.datetime_to_unix(this_day_ends), service_ids ) return cal
def headwayalight_event(vertex1, edge, vertex2): event_time = vertex1.payload.time stop_id = vertex2.label.split("-")[-1] stop_desc = list( gtfsdb.execute( "SELECT stop_name FROM stops WHERE stop_id = ?", (stop_id,) ) )[0][0] lat, lon = list( gtfsdb.execute( "SELECT stop_lat, stop_lon FROM stops WHERE stop_id = ?", (stop_id,) ) )[0] what = "Alight" where = stop_desc when = "about %s"%str(TimeHelpers.unix_to_localtime( event_time, "America/Los_Angeles" )) loc = (lat,lon) return (what, where, when, loc)
def __call__(self, vertex1, edge, vertex2, context): event_time = vertex1.state.time stop_id = vertex2.label.split("-")[-1] stop_desc = list( self.gtfsdb.execute( "SELECT stop_name FROM stops WHERE stop_id = ?", (stop_id,) ) )[0][0] lat, lon = list( self.gtfsdb.execute( "SELECT stop_lat, stop_lon FROM stops WHERE stop_id = ?", (stop_id,) ) )[0] what = "Alight" where = stop_desc when = str(TimeHelpers.unix_to_localtime( event_time, self.timezone_name )) geom = (lon,lat) return NarrativeEvent(what, where, when, geom)
def __call__(self, edge1, vertex, edge2, context): osm_id = vertex.label.split("-")[1] # figure out which direction to turn osm_way_id1 = edge1.payload.name.split("-")[0] osm_way_id2 = edge2.payload.name.split("-")[0] osm_edge1 = self.osmdb.edge(edge1.payload.name) osm_edge2 = self.osmdb.edge(edge2.payload.name) osm_edge1_endnode = osm_edge1[3] osm_edge2_startnode = osm_edge2[2] osm_edge1_geom = osm_edge1[5] osm_edge2_geom = osm_edge2[5] if osm_id != osm_edge1_endnode: osm_edge1_geom.reverse() if osm_id != osm_edge2_startnode: osm_edge2_geom.reverse() endseg = osm_edge1_geom[-2:] startseg = osm_edge2_geom[:2] direction = turn_narrative(endseg[0], endseg[1], startseg[0], startseg[1]) street_name1 = self.osmdb.way(osm_way_id1).tags.get("name", "unnamed") street_name2 = self.osmdb.way(osm_way_id2).tags.get("name", "unnamed") osm_node_id, osm_node_tags, osm_node_lat, osm_node_lon, osm_node_refcount = self.osmdb.node( osm_id) average_speed = context['sumlength'] / ( vertex.state.time - context['lastturntime'] ) if vertex.state.time - context['lastturntime'] > 0 else 100000000 what = "%s onto %s after %dm, %0.1fm rise, %0.1fm fall (%0.1fm/s)" % ( direction, street_name2, context['sumlength'], context['sumrise'], context['sumfall'], average_speed) where = "%s & %s" % (street_name1, street_name2) when = "about %s" % str( TimeHelpers.unix_to_localtime(vertex.state.time, self.timezone_name)) geom = (osm_node_lon, osm_node_lat) context['sumlength'] = 0 context['sumrise'] = 0 context['sumfall'] = 0 context['lastturntime'] = vertex.state.time return NarrativeEvent(what, where, when, geom)
def __call__(self, edge1, vertex, edge2, context): osm_way1 = edge1.payload.name.split("-")[0] street_name1 = self.osmdb.way( osm_way1 ).tags.get('name', "unnamed") osm_id = vertex.label.split("-")[1] osm_node_id, osm_node_tags, osm_node_lat, osm_node_lon, osm_node_refcount = self.osmdb.node( osm_id ) average_speed = context['sumlength']/(vertex.state.time-context['lastturntime']) if vertex.state.time-context['lastturntime']>0 else 100000000 what = "arrive walking after %dm, %0.1f rise, %0.1f fall (%0.1fm/s)"%(context['sumlength'], context['sumrise'], context['sumfall'], average_speed) where = "on %s"%(street_name1) when = "about %s"%str(TimeHelpers.unix_to_localtime( vertex.state.time, self.timezone_name )) geom = [osm_node_lon, osm_node_lat] return NarrativeEvent(what,where,when,geom)
def headwayboard_event(vertex1, edge, vertex2): event_time = vertex2.payload.time trip_id = vertex2.payload.trip_id stop_id = vertex1.label.split("-")[-1] route_desc = "-".join(list( gtfsdb.execute( "SELECT routes.route_short_name, routes.route_long_name FROM routes, trips WHERE routes.route_id=trips.route_id AND trip_id=?", (trip_id,) ) )[0]) stop_desc = list( gtfsdb.execute( "SELECT stop_name FROM stops WHERE stop_id = ?", (stop_id,) ) )[0][0] lat, lon = list( gtfsdb.execute( "SELECT stop_lat, stop_lon FROM stops WHERE stop_id = ?", (stop_id,) ) )[0] what = "Board the %s"%route_desc where = stop_desc when = "about %s"%str(TimeHelpers.unix_to_localtime( event_time, "America/Los_Angeles" )) loc = (lat,lon) return (what, where, when, loc)
def __call__(self, vertex1, edge, vertex2, context): event_time = vertex2.state.time trip_id = vertex2.state.trip_id stop_id = vertex1.label.split("-")[-1] route_desc = "-".join(list( self.gtfsdb.execute( "SELECT routes.route_short_name, routes.route_long_name FROM routes, trips WHERE routes.route_id=trips.route_id AND trip_id=?", (trip_id,) ) )[0]) stop_desc = list( self.gtfsdb.execute( "SELECT stop_name FROM stops WHERE stop_id = ?", (stop_id,) ) )[0][0] lat, lon = list( self.gtfsdb.execute( "SELECT stop_lat, stop_lon FROM stops WHERE stop_id = ?", (stop_id,) ) )[0] what = "Board the %s"%route_desc where = stop_desc when = "about %s"%str(TimeHelpers.unix_to_localtime( event_time, self.timezone_name )) geom = (lon,lat) return NarrativeEvent(what, where, when, geom)
def __call__(self, edge1, vertex, edge2, context): osm_id = vertex.label.split("-")[1] # figure out which direction to turn osm_way_id1 = edge1.payload.name.split("-")[0] osm_way_id2 = edge2.payload.name.split("-")[0] osm_edge1 = self.osmdb.edge( edge1.payload.name ) osm_edge2 = self.osmdb.edge( edge2.payload.name ) osm_edge1_endnode = osm_edge1[3] osm_edge2_startnode = osm_edge2[2] osm_edge1_geom = osm_edge1[5] osm_edge2_geom = osm_edge2[5] if osm_id != osm_edge1_endnode: osm_edge1_geom.reverse() if osm_id != osm_edge2_startnode: osm_edge2_geom.reverse() endseg = osm_edge1_geom[-2:] startseg = osm_edge2_geom[:2] direction = turn_narrative( endseg[0], endseg[1], startseg[0], startseg[1] ) street_name1 = self.osmdb.way( osm_way_id1 ).tags.get("name", "unnamed") street_name2 = self.osmdb.way( osm_way_id2 ).tags.get("name", "unnamed") osm_node_id, osm_node_tags, osm_node_lat, osm_node_lon, osm_node_refcount = self.osmdb.node( osm_id ) average_speed = context['sumlength']/(vertex.state.time-context['lastturntime']) if vertex.state.time-context['lastturntime']>0 else 100000000 what = "%s onto %s after %dm, %0.1fm rise, %0.1fm fall (%0.1fm/s)"%(direction, street_name2, context['sumlength'], context['sumrise'], context['sumfall'], average_speed) where = "%s & %s"%(street_name1, street_name2) when = "about %s"%str(TimeHelpers.unix_to_localtime( vertex.state.time, self.timezone_name )) geom = (osm_node_lon, osm_node_lat) context['sumlength'] = 0 context['sumrise'] = 0 context['sumfall'] = 0 context['lastturntime'] = vertex.state.time return NarrativeEvent(what,where,when,geom)
def contour(self, lat, lon, year, month, day, hour, minute, second, cutoff, step=60*15, encoded=False, speed=0.85): if step is not None and step < 600: raise Exception( "Step cannot be less than 600 seconds" ) starttime = TimeHelpers.localtime_to_unix( year, month, day, hour, minute, second, "America/Los_Angeles" ) #=== get osm vertex == print( "getting nearest vertex" ) #find osmid of origin intersection t0 = time.time() range = 0.001 bbox = (lon-range, lat-range, lon+range, lat+range) candidates = self.index.intersection( bbox ) vlabel, vlat, vlon, vdist = self.osmdb.nearest_of( lat, lon, candidates ) t1 = time.time() print( "done, took %s seconds"%(t1-t0) ) #vlabel, vlat, vlon, vdist = self.osmdb.nearest_node( lat, lon ) if vlabel is None: return json.dumps( "NO NEARBY INTERSECTION" ) print( "found - %s"%vlabel ) contours = self._contour( "osm"+vlabel, starttime, cutoff, step, speed ) if encoded: encoded_contours = [] for contour in contours: encoded_contour = [] for ring in contour: encoded_contour.append( encode_pairs( [(lat,lon) for lon,lat in ring] ) ) encoded_contours.append( encoded_contour ) contours = encoded_contours return json.dumps( contours )
def _surface(self, lat, lon, year, month, day, hour, minute, second, cutoff, speed, cellsize=0.004): starttime = TimeHelpers.localtime_to_unix( year, month, day, hour, minute, second, "America/Los_Angeles" ) #=== get osm vertex == print( "getting nearest vertex" ) #find osmid of origin intersection t0 = time.time() range = 0.001 bbox = (lon-range, lat-range, lon+range, lat+range) candidates = self.index.intersection( bbox ) vlabel, vlat, vlon, vdist = self.osmdb.nearest_of( lat, lon, candidates ) t1 = time.time() print( "done, took %s seconds"%(t1-t0) ) #vlabel, vlat, vlon, vdist = self.osmdb.nearest_node( lat, lon ) if vlabel is None: return json.dumps( "NO NEARBY INTERSECTION" ) print( "found - %s"%vlabel ) #=== get points which comprise ETA surface === points = self._points( "osm"+vlabel, starttime, cutoff, speed ) #=== create regular grid from ETA surface === print "creating surface...", t0 = time.time() ret = points_to_surface_grid( points, cutoff=cutoff, fudge=1.1, margin=2, closure_tolerance=0.05, cellsize=cellsize ) #ret = travel_time_surface( points, cutoff=cutoff, cellsize=0.004, fudge=1.7 ) print "%s sec"%(time.time()-t0) print "done. here you go..." return ret