如何让NetworkX网络边权重对应GeoDataFrame线长度并找最远节点对
解决方法
你用momepy.gdf_to_nx(my_line, approach="primal", length='mm_len')转图时,已经把GeoDataFrame里的mm_len字段值作为每条边的length属性存储了——这就是你需要的实际米数权重。之前的代码问题在于没告诉Dijkstra算法要用这个权重,默认是按路径经过的节点数量计算的。
直接用带权重参数的NetworkX方法就能解决:
1. 计算所有节点对的实际最短路径长度
# 基于边的length属性(即mm_len的米数)计算所有节点对的最短路径长度 path_lengths = dict(nx.all_pairs_dijkstra_path_length(G, weight='length')) # 遍历找出最大距离对应的节点对 max_distance = 0 start = None end = None for source, targets in path_lengths.items(): for target, distance in targets.items(): if distance > max_distance: max_distance = distance start = source end = target print(f"最远节点对:{start} 到 {end},实际距离:{max_distance}米")
2. 如果需要获取具体路径
如果还想拿到这条最长路径的节点序列,再用指定权重的路径获取方法:
# 获取带权重的所有最短路径 all_paths = dict(nx.all_pairs_dijkstra_path(G, weight='length')) # 提取最远节点对的路径 longest_path_nodes = all_paths[start][end]
这样得到的max_distance就是实际的米数长度,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Lord_Verulam
相关产品推荐
相关产品推荐

