def test_basic(self): g = Graph() g.add_vertex("A") g.add_vertex("B") g.add_edge("A", "B", Link()) g.add_edge("A", "B", Street("foo", 20.0)) gdb_file = os.path.dirname(__file__) + "unit_test.db" if os.path.exists(gdb_file): os.remove(gdb_file) gdb = GraphDatabase(gdb_file) gdb.populate(g) list(gdb.execute("select * from resources")) assert "A" in list(gdb.all_vertex_labels()) assert "B" in list(gdb.all_vertex_labels()) assert glen(gdb.all_edges()) == 2 assert glen(gdb.all_outgoing("A")) == 2 assert glen(gdb.all_outgoing("B")) == 0 assert glen(gdb.all_incoming("A")) == 0 assert glen(gdb.all_incoming("B")) == 2 assert glen(gdb.resources()) == 0 assert gdb.num_vertices() == 2 assert gdb.num_edges() == 2 g.destroy() g = gdb.incarnate() list(gdb.execute("select * from resources")) assert "A" in list(gdb.all_vertex_labels()) assert "B" in list(gdb.all_vertex_labels()) assert glen(gdb.all_edges()) == 2 assert glen(gdb.all_outgoing("A")) == 2 assert glen(gdb.all_outgoing("B")) == 0 assert glen(gdb.all_incoming("A")) == 0 assert glen(gdb.all_incoming("B")) == 2 assert glen(gdb.resources()) == 0 assert gdb.num_vertices() == 2 assert gdb.num_edges() == 2 os.remove( gdb_file )
def test_basic(self): g = Graph() g.add_vertex("A") g.add_vertex("B") g.add_edge("A", "B", Link()) g.add_edge("A", "B", Street("foo", 20.0)) gdb_file = os.path.dirname(__file__) + "unit_test.db" if os.path.exists(gdb_file): os.remove(gdb_file) gdb = GraphDatabase(gdb_file) gdb.populate(g) list(gdb.execute("select * from resources")) assert "A" in list(gdb.all_vertex_labels()) assert "B" in list(gdb.all_vertex_labels()) assert glen(gdb.all_edges()) == 2 assert glen(gdb.all_outgoing("A")) == 2 assert glen(gdb.all_outgoing("B")) == 0 assert glen(gdb.all_incoming("A")) == 0 assert glen(gdb.all_incoming("B")) == 2 assert glen(gdb.resources()) == 0 assert gdb.num_vertices() == 2 assert gdb.num_edges() == 2 g.destroy() g = gdb.incarnate() list(gdb.execute("select * from resources")) assert "A" in list(gdb.all_vertex_labels()) assert "B" in list(gdb.all_vertex_labels()) assert glen(gdb.all_edges()) == 2 assert glen(gdb.all_outgoing("A")) == 2 assert glen(gdb.all_outgoing("B")) == 0 assert glen(gdb.all_incoming("A")) == 0 assert glen(gdb.all_incoming("B")) == 2 assert glen(gdb.resources()) == 0 assert gdb.num_vertices() == 2 assert gdb.num_edges() == 2 os.remove(gdb_file)
class GraphCrawler(Servable): def __init__(self, graphdb_filename): self.graphdb = GraphDatabase( graphdb_filename ) def vertices(self, like=None): if like: return "\n".join( ["<a href=\"/vertex?label="%s"\">%s</a><br>"%(vl[0], vl[0]) for vl in self.graphdb.execute("SELECT label from vertices where label like ? order by label", (like,)) ]) else: return "\n".join( ["<a href=\"/vertex?label="%s"\">%s</a><br>"%(vl[0], vl[0]) for vl in self.graphdb.execute("SELECT label from vertices order by label") ]) vertices.mime = "text/html" def vertex(self, label, currtime=None, hill_reluctance=1.5, walking_speed=0.85): currtime = currtime or int(time.time()) ret = [] ret.append( "<h1>%s</h1>"%label ) wo = WalkOptions() ret.append( "<h3>walk options</h3>" ) ret.append( "<li>transfer_penalty: %s</li>"%wo.transfer_penalty ) ret.append( "<li>turn_penalty: %s</li>"%wo.turn_penalty ) ret.append( "<li>walking_speed: %s</li>"%wo.walking_speed ) ret.append( "<li>walking_reluctance: %s</li>"%wo.walking_reluctance ) ret.append( "<li>uphill_slowness: %s</li>"%wo.uphill_slowness ) ret.append( "<li>downhill_fastness: %s</li>"%wo.downhill_fastness ) ret.append( "<li>hill_reluctance: %s</li>"%wo.hill_reluctance ) ret.append( "<li>max_walk: %s</li>"%wo.max_walk ) ret.append( "<li>walking_overage: %s</li>"%wo.walking_overage ) ret.append( "<h3>incoming from:</h3>" ) for i, (vertex1, vertex2, edgetype) in enumerate( self.graphdb.all_incoming( label ) ): s1 = State(1,int(currtime)) wo = WalkOptions() wo.hill_reluctance=hill_reluctance wo.walking_speed=walking_speed s0 = edgetype.walk_back( s1, wo ) if s0: toterm = "<a href=\"/vertex?label="%s"&currtime=%d\">%s@%d</a>"%(vertex1, s0.time, vertex1, s1.time) else: toterm = "<a href=\"/vertex?label="%s"\">%s</a>"%(vertex1, vertex1) ret.append( "%s<br><pre> via %s (<a href=\"/incoming?label="%s"&edgenum=%d\">details</a>)</pre>"%(toterm, cgi.escape(repr(edgetype)), vertex2, i) ) if s0: ret.append( "<pre> %s</pre>"%cgi.escape(str(s0)) ) ret.append( "<h3>outgoing to:</h3>" ) for i, (vertex1, vertex2, edgetype) in enumerate( self.graphdb.all_outgoing( label ) ): s0 = State(1,int(currtime)) wo = WalkOptions() wo.hill_reluctance=hill_reluctance wo.walking_speed=walking_speed s1 = edgetype.walk( s0, wo ) if s1: toterm = "<a href=\"/vertex?label="%s"&currtime=%d\">%s@%d</a>"%(vertex2, s1.time, vertex2, s1.time) else: toterm = "<a href=\"/vertex?label="%s"\">%s</a>"%(vertex2, vertex2) ret.append( "%s<br><pre> via %s (<a href=\"/outgoing?label="%s"&edgenum=%d\">details</a>)</pre>"%(toterm, cgi.escape(repr(edgetype)), vertex1, i) ) if s1: ret.append( "<pre> %s</pre>"%cgi.escape(str(s1)) ) wo.destroy() return "".join(ret) vertex.mime = "text/html" def outgoing(self, label, edgenum): all_outgoing = list( self.graphdb.all_outgoing( label ) ) fromv, tov, edge = all_outgoing[edgenum] return edge.expound() def incoming(self, label, edgenum): all_incoming = list( self.graphdb.all_incoming( label ) ) fromv, tov, edge = all_incoming[edgenum] return edge.expound() def str(self): return str(self.graphdb)
class GraphCrawler(Servable): def __init__(self, graphdb_filename): self.graphdb = GraphDatabase(graphdb_filename) def vertices(self, like=None): if like: return "\n".join([ "<a href=\"/vertex?label="%s"\">%s</a><br>" % (vl[0], vl[0]) for vl in self.graphdb.execute( "SELECT label from vertices where label like ? order by label", (like, )) ]) else: return "\n".join([ "<a href=\"/vertex?label="%s"\">%s</a><br>" % (vl[0], vl[0]) for vl in self.graphdb.execute( "SELECT label from vertices order by label") ]) vertices.mime = "text/html" def vertex(self, label, currtime=None, hill_reluctance=1.5, walking_speed=0.85): currtime = currtime or int(time.time()) ret = [] ret.append("<h1>%s</h1>" % label) wo = WalkOptions() ret.append("<h3>walk options</h3>") ret.append("<li>transfer_penalty: %s</li>" % wo.transfer_penalty) ret.append("<li>turn_penalty: %s</li>" % wo.turn_penalty) ret.append("<li>walking_speed: %s</li>" % wo.walking_speed) ret.append("<li>walking_reluctance: %s</li>" % wo.walking_reluctance) ret.append("<li>uphill_slowness: %s</li>" % wo.uphill_slowness) ret.append("<li>downhill_fastness: %s</li>" % wo.downhill_fastness) ret.append("<li>hill_reluctance: %s</li>" % wo.hill_reluctance) ret.append("<li>max_walk: %s</li>" % wo.max_walk) ret.append("<li>walking_overage: %s</li>" % wo.walking_overage) ret.append("<h3>incoming from:</h3>") for i, (vertex1, vertex2, edgetype) in enumerate(self.graphdb.all_incoming(label)): s1 = State(1, int(currtime)) wo = WalkOptions() wo.hill_reluctance = hill_reluctance wo.walking_speed = walking_speed s0 = edgetype.walk_back(s1, wo) if s0: toterm = "<a href=\"/vertex?label="%s"&currtime=%d\">%s@%d</a>" % ( vertex1, s0.time, vertex1, s1.time) else: toterm = "<a href=\"/vertex?label="%s"\">%s</a>" % ( vertex1, vertex1) ret.append( "%s<br><pre> via %s (<a href=\"/incoming?label="%s"&edgenum=%d\">details</a>)</pre>" % (toterm, cgi.escape(repr(edgetype)), vertex2, i)) if s0: ret.append("<pre> %s</pre>" % cgi.escape(str(s0))) ret.append("<h3>outgoing to:</h3>") for i, (vertex1, vertex2, edgetype) in enumerate(self.graphdb.all_outgoing(label)): s0 = State(1, int(currtime)) wo = WalkOptions() wo.hill_reluctance = hill_reluctance wo.walking_speed = walking_speed s1 = edgetype.walk(s0, wo) if s1: toterm = "<a href=\"/vertex?label="%s"&currtime=%d\">%s@%d</a>" % ( vertex2, s1.time, vertex2, s1.time) else: toterm = "<a href=\"/vertex?label="%s"\">%s</a>" % ( vertex2, vertex2) ret.append( "%s<br><pre> via %s (<a href=\"/outgoing?label="%s"&edgenum=%d\">details</a>)</pre>" % (toterm, cgi.escape(repr(edgetype)), vertex1, i)) if s1: ret.append("<pre> %s</pre>" % cgi.escape(str(s1))) wo.destroy() return "".join(ret) vertex.mime = "text/html" def outgoing(self, label, edgenum): all_outgoing = list(self.graphdb.all_outgoing(label)) fromv, tov, edge = all_outgoing[edgenum] return edge.expound() def incoming(self, label, edgenum): all_incoming = list(self.graphdb.all_incoming(label)) fromv, tov, edge = all_incoming[edgenum] return edge.expound() def str(self): return str(self.graphdb)
def main(): usage = """usage: python wktize_gdb.py <graphdb_filename> <osmdb_filename> <gtfsdb_filename>""" parser = OptionParser(usage=usage) (options, args) = parser.parse_args() if len(args) != 3: parser.print_help() exit(-1) graphdb_filename = args[0] osmdb_filename = args[1] gtfsdb_filename = args[2] gtfsdb = GTFSDatabase( gtfsdb_filename ) osmdb = OSMDB( osmdb_filename ) gdb = GraphDatabase( graphdb_filename ) def vertex_interesting(vlabel) : return vlabel[0:4] == 'sta-' or vlabel[0:4] == 'osm-' def vertex_lookup(vlabel) : if vlabel[0:4] == 'sta-' : id, name, lat, lon = gtfsdb.stop(vlabel[4:]) vclass = 'GTFS Stop' elif vlabel[0:4] == 'osm-' : id, tags, lat, lon, endnode_refs = osmdb.node(vlabel[4:]) vclass = 'OSM Node' else : lat = None lon = None vclass = None return vclass, lat, lon c = gdb.get_cursor() c.execute( "CREATE TABLE IF NOT EXISTS geom_vertices (label TEXT UNIQUE ON CONFLICT IGNORE, class TEXT, WKT_GEOMETRY TEXT)" ) c.execute( "CREATE TABLE IF NOT EXISTS geom_edges (class TEXT, WKT_GEOMETRY TEXT)" ) gdb.commit() num_vertices = gdb.num_vertices() curr_vertex = 0 for vlabel in gdb.all_vertex_labels() : curr_vertex += 1 if curr_vertex % 1000 == 0 : sys.stdout.write( '\rVertex %i/%i' % (curr_vertex, num_vertices) ) sys.stdout.flush() if not vertex_interesting(vlabel) : continue vclass, lat, lon = vertex_lookup(vlabel) c.execute("INSERT INTO geom_vertices VALUES (?, ?, ?)", (vlabel, vclass, "POINT(%s %s)" % (lon, lat))) gdb.commit() print ' ' num_edges = gdb.num_edges() curr_edge = 0 edges = gdb.execute( "SELECT vertex1, vertex2, edgetype, edgestate FROM edges" ) for vertex1, vertex2, edgetype, edgestate in edges : curr_edge += 1 if curr_edge % 1000 == 0 : sys.stdout.write( '\rEdge %i/%i' % (curr_edge, num_edges) ) sys.stdout.flush() if not (vertex_interesting(vertex1) and vertex_interesting(vertex2)) : continue vclass1, lat1, lon1 = vertex_lookup(vertex1) vclass2, lat2, lon2 = vertex_lookup(vertex2) c.execute("INSERT INTO geom_edges VALUES (?, ?)", (edgetype, "LINESTRING(%s %s, %s %s)" % (lon1, lat1, lon2, lat2))) gdb.commit() print '\nIndexing...' gdb.execute( "CREATE INDEX IF NOT EXISTS geom_vertices_label ON geom_vertices (label)" ) gdb.execute( "CREATE INDEX IF NOT EXISTS geom_vertices_class ON geom_vertices (class)" ) gdb.execute( "CREATE INDEX IF NOT EXISTS geom_edges_class ON geom_edges (class)" )