class StreetEndEvent: def __init__(self, osmdb_filename, timezone_name="America/Los_Angeles"): self.osmdb = OSMDB(osmdb_filename) self.timezone_name = timezone_name @staticmethod def applies_to(edge1, vertex, edge2): # if edge1 is not a street and edge2 is return (edge2 is None or not isinstance(edge2.payload, graphserver.core.Street)) and \ (edge1 and isinstance(edge1.payload, graphserver.core.Street)) 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)
class StreetTurnEvent: def __init__(self, osmdb_filename, timezone_name = "America/Los_Angeles"): self.osmdb = OSMDB( osmdb_filename ) self.timezone_name = timezone_name @staticmethod def applies_to(edge1, vertex, edge2): return edge1 and edge2 and isinstance(edge1.payload, graphserver.core.Street) and isinstance(edge2.payload, graphserver.core.Street) \ and edge1.payload.way != edge2.payload.way 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)
class StreetStartEvent: def __init__(self, osmdb_filename, timezone_name="America/Los_Angeles"): self.osmdb = OSMDB(osmdb_filename) self.timezone_name = timezone_name @staticmethod def applies_to(edge1, vertex, edge2): # if edge1 is not a street and edge2 is return (edge1 is None or not isinstance(edge1.payload, graphserver.core.Street)) and \ (edge2 and isinstance(edge2.payload, graphserver.core.Street)) 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)
class StreetStartEvent: def __init__(self, osmdb_filename, timezone_name = "America/Los_Angeles"): self.osmdb = OSMDB( osmdb_filename ) self.timezone_name = timezone_name @staticmethod def applies_to(edge1, vertex, edge2): # if edge1 is not a street and edge2 is return (edge1 is None or not isinstance(edge1.payload, graphserver.core.Street)) and \ (edge2 and isinstance(edge2.payload, graphserver.core.Street)) 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)
class StreetEndEvent: def __init__(self, osmdb_filename, timezone_name = "America/Los_Angeles"): self.osmdb = OSMDB( osmdb_filename ) self.timezone_name = timezone_name @staticmethod def applies_to(edge1, vertex, edge2): # if edge1 is not a street and edge2 is return (edge2 is None or not isinstance(edge2.payload, graphserver.core.Street)) and \ (edge1 and isinstance(edge1.payload, graphserver.core.Street)) 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)