利用OSMnx计算路网介数中心度(Betweenness Centrality)

讲之前先介绍一下,介数中心度(Betweenness Centrality)

介数中心度(Betweenness Centrality)是网络分析中的一个重要概念,用于衡量网络中各个节点在信息流或资源流动中的中介作用程度。具体而言,一个节点的介数中心度越高,表示通过该节点的最短路径数量越多,意味着该节点在网络中更具有控制力或影响力,简单来说,就是从每块中的任一节点到其他某块中的任一节点的最短路径必然要经过的节点。 这种以经过某个节点的最短路径的数目来刻画节点重要性的指标就称为介数中心性(Betweeness centrality),简称介数(BC)。 也就是说,计算网络中任意两个节点的所有最短路径,如果这些最短路径中很多条都经过了某个节点,那么就认为这个节点的介中心性高。

计算介数中心度时,对于每一对节点之间的最短路径,我们统计经过某个特定节点的最短路径的数量,然后将这些数量累加起来。通常,介数中心度还会除以所有最短路径的总数,以标准化结果,使得值域在0到1之间,便于比较不同规模网络中的节点。

接下来我们针对一种特殊情况,解释中介中心性的计算过程。如下图所示,由A,B,C,D,E四个顶点。那么我们可以得到如下的最短路径序列(暂不考虑方向):

A-C: A,B,C
A-D:A,B,C,D
A-E:A,B,C,D,E
B-D:B,C,D
B-E:B,C,D,E
C-E:C,D,E

因此,A出现在最短路径中间的次数为0,B出现在最短路径中间的次数为3,C出现在最短路径中间的次数为4,D出现最短路径中间的次数为3, E出现在最短路径中间的次数为0。所以我们可以得出图中顶点对应的中介中心度。

完整代码#运行环境 Python 3.11

import networkx as nx
import osmnx as ox
import pandas as pd

# 定义研究区域,选择了厦门的思明区
place = "Siming Qu, Xiamen,Fujian,China"

# 使用osmnx的geocode_to_gdf函数将地点名称转化为GeoDataFrame
gdf = ox.geocode_to_gdf(place)

# 计算GeoDataFrame投影后的总面积
area = ox.projection.project_gdf(gdf).unary_union.area

# 根据地点和道路类型(本例中为drive)创建街道网络图
G = ox.graph_from_place(place, network_type="drive")

# 计算网络的基本统计信息,包括节点数、边数等,并提供区域面积作为参数
stats = ox.basic_stats(G, area=area)

# 显示基本统计信息的Series
pd.Series(stats)

# 解压内嵌字典到stats变量中,以便后续转换为DataFrame
for k, count in stats["streets_per_node_counts"].items():
    stats[f"{k}way_int_count"] = count
for k, proportion in stats["streets_per_node_proportions"].items():
    stats[f"{k}way_int_prop"] = proportion

# 删除不再需要的内嵌字典
del stats["streets_per_node_counts"]
del stats["streets_per_node_proportions"]

# 将处理后的stats转换为DataFrame并四舍五入到小数点后三位
df_stats = pd.DataFrame(pd.Series(stats, name="value")).round(3)

# 计算介数中心性,考虑到边的长度作为权重,且先将图转换为有向图以排除平行边的影响
bc = nx.betweenness_centrality(ox.convert.to_digraph(G), weight="length")

# 找出介数中心性最高的节点
max_node, max_bc = max(bc.items(), key=lambda x: x[1])

# 将介数中心性值添加为网络图G中各节点的属性
nx.set_node_attributes(G, bc, "bc")

# 根据节点的介数中心性属性获取节点颜色,使用"plasma"色彩映射
nc = ox.plot.get_node_colors_by_attr(G, "bc", cmap="plasma")

# 绘制网络图,节点颜色依据介数中心性变化,边缘为白色,节点尺寸和排序也进行了设定
fig, ax = ox.plot_graph(
    G,
    node_color=nc,
    node_size=30,
    node_zorder=2,
    edge_linewidth=0.2,
    edge_color="w",
)

# 将创建的街道网络图保存为GeoPackage文件
ox.save_graph_geopackage(G, filepath="D:/data/XiamenSimingQu.gpkg")

可以看出中间一条主干道整体的介数中心度较高,介数中心度高的节点或路段往往是路网中的交通瓶颈,因为这些地方承载了大量的最短路径,交通流量大,一旦发生拥堵或故障,将对整个路网的运行效率产生显著影响。通过计算介数中心度,可以定量评估路网中各个节点或路段的重要性,为路网的规划、设计提供依据;

以厦门市为例,放大到整个城市可以看出数中心度较高的道路基本分布在几个跨海大桥上,并隐约形成二个环路,以跨海大桥为媒介,连通整个厦门市;

通过对比百度地图的路况预测,选取时间段:星期一 9:00,可以一窥端倪。

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值