in libs/apls/skeletonize.py [0:0]
def G_to_wkt(G, add_small=True,
debug=False, verbose=False, super_verbose=False):
"""Transform G to wkt"""
if G == [linestring.format("EMPTY")] or type(G) == str:
return [linestring.format("EMPTY")]
node_lines = graph2lines(G)
if not node_lines:
return [linestring.format("EMPTY")]
try: # later version of networkx
node = G.nodes
except: # legacy networkx
node = G.node
deg = dict(G.degree())
wkt = []
terminal_points = [i for i, d in deg.items() if d == 1]
# refine wkt
terminal_lines = {}
vertices = []
for i, w in enumerate(node_lines):
if ((i % 10000) == 0) and (i > 0) and verbose:
print(" ", i, "/", len(node_lines))
coord_list = []
additional_paths = []
for s, e in pairwise(w):
vals = flatten([[v] for v in G[s][e].values()])
for ix, val in enumerate(vals):
s_coord, e_coord = node[s]['o'], node[e]['o']
pts = val.get('pts', [])
if s in terminal_points:
terminal_lines[s] = (s_coord, e_coord)
if e in terminal_points:
terminal_lines[e] = (e_coord, s_coord)
ps = add_direction_change_nodes(pts, s, e, s_coord, e_coord)
if len(ps.shape) < 2 or len(ps) < 2:
continue
if len(ps) == 2 and np.all(ps[0] == ps[1]):
continue
line_strings = ["{1:.1f} {0:.1f}".format(*c.tolist()) for c in ps]
if ix == 0:
coord_list.extend(line_strings)
else:
additional_paths.append(line_strings)
vertices.append(ps)
if not len(coord_list):
continue
segments = remove_duplicate_segments(coord_list)
for coord_list in segments:
if len(coord_list) > 1:
line = '(' + ", ".join(coord_list) + ')'
wkt.append(linestring.format(line))
for line_strings in additional_paths:
line = ", ".join(line_strings)
line_rev = ", ".join(reversed(line_strings))
for s in wkt:
if line in s or line_rev in s:
break
else:
wkt.append(linestring.format('(' + line + ')'))
if add_small and len(terminal_points) > 1:
small_segs, good_pairs, good_coords = add_small_segments(
G, terminal_points, terminal_lines, verbose=verbose)
if verbose: print("small_segs", small_segs)
wkt.extend(small_segs)
if debug:
vertices = flatten(vertices)
if not wkt:
return [linestring.format("EMPTY")]
return wkt