如何使用OSMNx / Networkx在边缘之间的中心度中增加边缘长度作为权重?

时间:2019-05-07 18:39:32

标签: python openstreetmap networkx

我正在使用Python库OSMNx来获取给定街道网络G的中间性。从我所看到的,模块osmnx.stats.extended_stats(G, bc=True)使用NetworkX模块networkx.betweenness_centrality(G, normalized=True, weight=None)计算中间性,将所有边缘权重设置为相等。由于边缘长度已嵌入G中,因此直接将其用作权重即可。我仍然找不到解决方法。

如何使用这两个库将权重设置为1 /长度?

请考虑以下示例给出的图形

import osmnx as ox
import networkx as nx

#Using OSMNx
G = ox.graph_from_bbox(37.79, 37.78, -122.41, -122.43, network_type='drive')
stats = ox.extended_stats(G,bc=True)
bet1 = stats["betweenness_centrality"]

#Using NetworkX
bet2 = nx.betweenness_centrality(G, weight=None)

这是我到目前为止尝试过的:

import pandas as pd

l = nx.get_edge_attributes(G, 'length')
l = pd.Series(l).to_frame()
w=1/l
w = w.to_dict(orient="index")
nx.set_edge_attributes(G, w, 'w')
bet3 = nx.betweenness_centrality(G, weight='w')

但是我得到的结果与不使用砝码完全一样。

2 个答案:

答案 0 :(得分:0)

  

模块osmnx.stats.extended_stats(G,bc = True)使用NetworkX模块networkx.betweenness_centrality(G,normalized = True,weight = None)将所有边缘权重设置为相等来计算中间度。由于边缘长度已经嵌入到G中,因此直接将其用作权重即可。

OSMnx automatically uses edge lengths作为计算中介中心度时的权重。对于任何进一步的自定义,您可以直接在OSMnx图形对象上调用nx.betweenness_centrality(G),并根据需要对其进行参数化。

答案 1 :(得分:0)

您已在最短路径算法中检测到networkx的{​​{1}}处理中的错误。请参见以下示例:

MultiDiGraph

错误在于 import networkx as nx graph = nx.Graph() graph.add_weighted_edges_from([(1,2,1), (2,3,2), (1,3,1)]) print(nx.betweenness_centrality(graph)) # {1: 0.0, 2: 0.0, 3: 0.0} print(nx.betweenness_centrality(graph, weight="weight")) # {1: 0.5, 2: 0.0, 3: 0.0} multi_di_graph = nx.MultiDiGraph() multi_di_graph.add_weighted_edges_from([(1,2,1), (2,3,2), (1,3,1)]) print(nx.betweenness_centrality(multi_di_graph)) # {1: 0.0, 2: 0.0, 3: 0.0} print(nx.betweenness_centrality(multi_di_graph, weight="weight")) # {1: 0.0, 2: 0.0, 3: 0.0} 尤其是以下cloudwatch agent configuration-EC2

_single_source_dijkstra_path_basic

我不确定for w, edgedata in G[v].items(): vw_dist = dist + edgedata.get(weight, 1) 中的最短路径算法是否适用于多图,但是由于我没有发现任何注释,因此我认为这是一个错误。 我建议您在code lines上打开一个问题。 如果可能的话,您也可以考虑将其转换为通常的networkx