使用 networkx 和 osmnx 在 "structured file" 中保存最短路径
Save shortest path in a "structured file" using networkx and osmnx
我有一个多维图 G
和一个使用方法 nx.shortest_path
计算的列表 best_path
。
感谢这个 stackexchange post,我使用 json.dumps
:
在一个简单的 ascii 文件中导出我的路线的 x 和 y 坐标
parts = []
for i in best_path:
node = G.nodes[i]
parts.append([float(node["y"]), float(node["x"])])
json_route = json.dumps(parts)
with open(current_dir + "test_best_path.json", "w", encoding="utf-8") as f:
f.write(json.dumps(parts, ensure_ascii=False))
现在我正在寻找一个解决方案,我可以将这条最佳路线保存到一个更“结构化”的文件中,我还可以在其中添加更多节点属性(例如 yaml 或 graphml)。 networkx
或 osmnx
中是否已经存在某些内容?
谢谢
我的建议是创建路径的诱导子图,即
shortest_path_graph = G.subgraph(best_path) #.copy()
并且可以创建一个副本,如果你想执行更改,这不应该反映在原始图表中。
然后您可以应用任何更改并将任何更改添加到 shortest_path_graph
,例如,添加节点属性,或删除现有不需要的信息。之后,您可以使用 networkx
save methods, e.g., GraphML
or YAML
中的任何一个来保存您的结果以遵循您的建议。如果你想在不同的 PC 之间共享文件,我强烈建议避免 pickle。
编辑
由于上述过程会丢失有关路径中节点顺序的信息,换句话说,我希望上述过程 returns 一行,即在定向情况下,一个节点没有度1 度数 0,另一个节点度数 1 度数 0,所有其他节点度数 = 1 = 度数。
为了保存路径中节点的顺序,您可以创建一个新属性
for i, node in enumerate(best_path):
shortest_path_graph.nodes[node]["path counter"] = i
或使用nx.relabel_nodes
修改节点id。
编辑 2 - 来自@lhoupert
我喜欢 nx.relabel_nodes 的解决方案,它不会创建新属性。
下面是一个实现示例:
# Relabel nodes id to sort them according to the path orientation
mapping_dict = {num: x for x,num in enumerate(best_path)}
H = nx.relabel_nodes(G_shortest_path, mapping_dict)
# Sort the graph nodes and edges according to new ID
H2 = nx.Graph() # or nx.MultiDiGraph()
H2.add_nodes_from(sorted(H.nodes(data=True)))
H2.add_edges_from(H.edges(data=True))
我有一个多维图 G
和一个使用方法 nx.shortest_path
计算的列表 best_path
。
感谢这个 stackexchange post,我使用 json.dumps
:
parts = []
for i in best_path:
node = G.nodes[i]
parts.append([float(node["y"]), float(node["x"])])
json_route = json.dumps(parts)
with open(current_dir + "test_best_path.json", "w", encoding="utf-8") as f:
f.write(json.dumps(parts, ensure_ascii=False))
现在我正在寻找一个解决方案,我可以将这条最佳路线保存到一个更“结构化”的文件中,我还可以在其中添加更多节点属性(例如 yaml 或 graphml)。 networkx
或 osmnx
中是否已经存在某些内容?
谢谢
我的建议是创建路径的诱导子图,即
shortest_path_graph = G.subgraph(best_path) #.copy()
并且可以创建一个副本,如果你想执行更改,这不应该反映在原始图表中。
然后您可以应用任何更改并将任何更改添加到 shortest_path_graph
,例如,添加节点属性,或删除现有不需要的信息。之后,您可以使用 networkx
save methods, e.g., GraphML
or YAML
中的任何一个来保存您的结果以遵循您的建议。如果你想在不同的 PC 之间共享文件,我强烈建议避免 pickle。
编辑
由于上述过程会丢失有关路径中节点顺序的信息,换句话说,我希望上述过程 returns 一行,即在定向情况下,一个节点没有度1 度数 0,另一个节点度数 1 度数 0,所有其他节点度数 = 1 = 度数。
为了保存路径中节点的顺序,您可以创建一个新属性
for i, node in enumerate(best_path):
shortest_path_graph.nodes[node]["path counter"] = i
或使用nx.relabel_nodes
修改节点id。
编辑 2 - 来自@lhoupert
我喜欢 nx.relabel_nodes 的解决方案,它不会创建新属性。 下面是一个实现示例:
# Relabel nodes id to sort them according to the path orientation
mapping_dict = {num: x for x,num in enumerate(best_path)}
H = nx.relabel_nodes(G_shortest_path, mapping_dict)
# Sort the graph nodes and edges according to new ID
H2 = nx.Graph() # or nx.MultiDiGraph()
H2.add_nodes_from(sorted(H.nodes(data=True)))
H2.add_edges_from(H.edges(data=True))