def graph_filter(g, threshold=0.3, min_len=None):
    road_segments, _ = graph.get_graph_road_segments(g)
    bad_edges = set()
    for rs in road_segments:
        if min_len is not None and len(rs.edges) < min_len:
            bad_edges.update(rs.edges)
            continue
        probs = []
        if len(rs.edges) < 5 or True:
            for edge in rs.edges:
                if hasattr(edge, 'prob'):
                    probs.append(edge.prob)
        else:
            for edge in rs.edges[2:-2]:
                if hasattr(edge, 'prob'):
                    probs.append(edge.prob)
        if not probs:
            continue
        avg_prob = numpy.mean(probs)
        if avg_prob < threshold:
            bad_edges.update(rs.edges)
    print('filtering {} edges'.format(len(bad_edges)))
    ng = graph.Graph()
    vertex_map = {}
    for vertex in g.vertices:
        vertex_map[vertex] = ng.add_vertex(vertex.point)
    for edge in g.edges:
        if edge not in bad_edges:
            ng.add_edge(vertex_map[edge.src], vertex_map[edge.dst])
    return ng
Beispiel #2
0
def graph_filter_edges(g, bad_edges):
    print 'filtering {} edges'.format(len(bad_edges))
    ng = graph.Graph()
    vertex_map = {}
    for vertex in g.vertices:
        vertex_map[vertex] = ng.add_vertex(vertex.point)
    for edge in g.edges:
        if edge not in bad_edges:
            nedge = ng.add_edge(vertex_map[edge.src], vertex_map[edge.dst])
            if hasattr(edge, 'prob'):
                nedge.prob = edge.prob
    return ng
Beispiel #3
0
    def __init__(self, gc, tile_data, start_loc=None, g=None):
        self.gc = gc
        self.tile_data = tile_data
        if g is None:
            self.graph = graph.Graph()
        else:
            self.graph = g
        self.explored_pairs = {}
        self.unmatched_vertices = 0

        if start_loc:
            #v1 = self.graph.add_vertex(start_loc[0]['point'])
            v2 = self.graph.add_vertex(start_loc[1]['point'])
            #self.graph.add_bidirectional_edge(v1, v2)

            #v1.edge_pos = start_loc[0]['edge_pos']
            v2.edge_pos = start_loc[1]['edge_pos']

            self.search_vertices = [v2]
        else:
            self.search_vertices = []

        self._load_edge_rtree()
        m6_mask = numpy.concatenate([m6_mask[:, 64:96], m6_mask[:, 32:64]],
                                    axis=1).reshape(
                                        (1024, 1024, 64)).astype('float32')
        m6_mask = 1 - m6_mask
        cache_m6 = m6_new * m6_mask

        result = eval([path],
                      m,
                      session,
                      save=False,
                      compute_targets=False,
                      cache_m6=cache_m6,
                      cache_m6_old=m6_old,
                      cache_m6_new=m6_new)

        ng = graph.Graph()
        vertex_map = {}
        for edge in path.graph.edges:
            if not hasattr(edge, 'prob'):
                continue
            for vertex in [edge.src, edge.dst]:
                if vertex not in vertex_map:
                    vertex_map[vertex] = ng.add_vertex(vertex.point)
            new_edge = ng.add_edge(vertex_map[edge.src], vertex_map[edge.dst])
            new_edge.prob = edge.prob
        ng.save(cur_graph_out_fname)
        edge_probs = []
        for edge in ng.edges:
            edge_probs.append(int(edge.prob * 100))
        with open(os.path.join(out_path, '{}_{}.json'.format(x, y)), 'w') as f:
            json.dump(edge_probs, f)
Beispiel #5
0
def func(in_fname, out_fname):

	g = graph.read_graph(in_fname)

	bad_edges = set()
	merge_vertices = {}
	merge_groups = []

	road_segments, _ = graph.get_graph_road_segments(g)
	edge_index = g.edgeIndex()

	# prune short branches
	for rs in road_segments:
		if (len(rs.dst().out_edges) < 2 or len(rs.src().out_edges) < 2) and rs.length() < BRANCH_THRESHOLD:
			for edge in rs.edges:
				bad_edges.add(edge)

	# merge short loops
	for rs in road_segments:
		if rs.length() < LOOP_THRESHOLD:
			if rs.src() in merge_vertices and rs.dst() in merge_vertices:
				group = merge_vertices[rs.src()]
				dst_group = merge_vertices[rs.dst()]
				if group != dst_group:
					group.update(dst_group)
					for vertex in dst_group:
						merge_vertices[vertex] = group
			elif rs.src() in merge_vertices:
				group = merge_vertices[rs.src()]
				group.add(rs.dst())
				merge_vertices[rs.dst()] = group
			elif rs.dst() in merge_vertices:
				group = merge_vertices[rs.dst()]
				group.add(rs.src())
				merge_vertices[rs.src()] = group
			else:
				group = Group()
				group.add(rs.src())
				group.add(rs.dst())
				merge_vertices[rs.src()] = group
				merge_vertices[rs.dst()] = group
				merge_groups.append(group)
			for edge in rs.edges:
				merge_vertices[edge.src] = group
				merge_vertices[edge.dst] = group
				group.add(edge.src)
				group.add(edge.dst)

	def get_avg(group):
		point_sum = geom.Point(0, 0)
		for vertex in group:
			point_sum = point_sum.add(vertex.point)
		return point_sum.scale(1.0 / len(group))

	ng = graph.Graph()
	vertex_map = {}

	def get_vertex(vertex):
		if vertex in merge_vertices:
			group = merge_vertices[vertex]
			group_head = group.head()
			if group_head not in vertex_map:
				vertex_map[group_head] = ng.add_vertex(get_avg(group))
			return vertex_map[group_head]
		else:
			if vertex not in vertex_map:
				vertex_map[vertex] = ng.add_vertex(vertex.point)
			return vertex_map[vertex]

	for edge in g.edges:
		if edge in bad_edges:
			continue
		src = get_vertex(edge.src)
		dst = get_vertex(edge.dst)
		if src == dst:
			continue
		ng.add_edge(src, dst)

	ng.save(out_fname)
Beispiel #6
0
print('reading inferred graph')
g = graph.read_graph(TEST_PATH)
print('creating edge index')
idx = g.edgeIndex()

# determine which tiles the graph spans
print('identifying spanned tiles')
tiles = set()
for vertex in g.vertices:
    x, y = vertex.point.x / 4096, vertex.point.y / 4096
    tiles.add(geom.Point(x, y))

counter = 0

out_graph = graph.Graph()
out_vertex_map = {}


def get_out_vertex(p):
    if (p.x, p.y) not in out_vertex_map:
        out_vertex_map[(p.x, p.y)] = out_graph.add_vertex(p)
    return out_vertex_map[(p.x, p.y)]


for tile in tiles:
    print('...', tile)
    tile_rect = geom.Rectangle(tile.scale(4096),
                               tile.add(geom.Point(1, 1)).scale(4096))
    tile_graph = idx.subgraph(tile_rect)
    for vertex in tile_graph.vertices: