Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
    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"
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
 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)
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
0
 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)
Ejemplo n.º 15
0
 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)
Ejemplo n.º 16
0
 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)
Ejemplo n.º 17
0
 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 )
Ejemplo n.º 18
0
 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