OSMnx应用指南:对路网节点进行简化

利用OSMnx对路网节点进行简化是一个重要的步骤,特别是在处理大型或复杂的道路网络时,节点简化可以显著减少计算量并提高分析效率,在路网分析中,原始的道路网络数据可能包含大量的节点,尤其是在交叉口和复杂路口处。这些节点在增加数据复杂性的同时,也可能对分析结果产生不必要的干扰。因此,通过节点简化,可以合并相邻的节点,减少节点数量,同时保持道路网络的拓扑结构和关键特征。

本文以坐标标点出发构建网络的搜索半径,这里是500米,不写通行方式的话,默认方式是"drive",并绘制原始路网图,节点用红色表示,结果和代码如下图所示;

区域路网节点优化

完整代码#运行环境 Python 3.11

import osmnx as ox
import networkx as nx

# 定义一个点坐标,这里以上海市中心为例 (经度, 纬度)
location_point = (31.233975, 121.477949)

# 使用osmnx.graph_from_point函数从给定的经纬度点创建图,
# dist参数设置了从该点出发构建网络的搜索半径,这里是500米。
# simplify=False表示不对得到的图进行拓扑简化,保持最原始的道路结构信息。
G = ox.graph_from_point(location_point, dist=500, simplify=False)

# 首先绘制原始图,所有节点颜色设为红色,以便初步观察图形结构
fig, ax = ox.plot_graph(G, node_color="r")

# 接下来,我们想区分终端节点(道路的尽头)和其他非终端节点的颜色。
# 使用列表推导式遍历所有节点,利用osmnx内部的_simplification._is_endpoint函数判断每个节点是否为路网的端点。
# 如果是端点,节点颜色设为红色("r"),否则设为黄色("y")。
nc = ["r" if ox.simplification._is_endpoint(G, node, None) else "y" for node in G.nodes()]

# 使用更新的节点颜色列表nc,重新绘制图形。现在,端点将以红色显示,非端点节点将以黄色显示,
fig, ax = ox.plot_graph(G, node_color=nc)

可以看到路网并不是连续的道路,而是通过一个个节点连起来的,我们要做是把这些黄色的节点给它接起来了,减少我们处理路网拓扑关系的时间;

于是,引用了osmnx内部的simplification._is_endpoint函数判断每个节点是否为路网的端点。 如果是端点,节点颜色设为红色("r"),否则设为黄色("y");

为了直观的展现,我把两个节点叠加进行展示,可以看到红色的节点大部分是路口节点,这是我们正需要的,在OSMnx中,节点简化主要通过consolidate_intersections函数实现。该函数可以合并路网中的交叉口节点,减少节点数量,并可以根据需要重建拓扑关系,但是从图上看出还是有部分道路应该是一个整体的,但是仍然出现了多个节点,在这里,引入了tolerance参数定义了合并节点的最大距离。如果两个节点之间的距离小于或等于tolerance,则它们将被合并为一个节点。我这里设置的是15m,如果有需要可以进行微调,也就是“ tolerance=15”这个部分;

城市路网节点优化

那一块区域可以做,那对于整个城市路网呢,答案也是可以优化全网的路网节点的,代码如下,有需要的可以通过调整tolerance参数来对路网节点数量进行优化;

完整代码#运行环境 Python 3.11

import osmnx as ox
import networkx as nx

# 设置要查询的地点名称,例如广州市
place_name = "Guangzhou, Guangdong, China"

# 使用osmnx的graph_from_place函数,通过地点名称下载广州市的街道网络数据
G = ox.graph_from_place(place_name)

# 将下载的原始图形投影到适合本地测量的坐标系(通常是wgs84坐标系)
G_proj = ox.project_graph(G)

# 合并街道网络中的邻近交叉点,此步骤可选地重建图的拓扑结构,如果两个交叉点在指定的tolerance(本例中为15米)内,则它们会被视为同一交叉点并合并,通过设置dead_ends=False,我们确保死胡同节点不会被合并进交叉点中
G2 = ox.consolidate_intersections(G_proj, rebuild_graph=True, tolerance=15, dead_ends=False)

# 输出合并交叉点后的新图的节点数量,简化操作对网络结构的影响
print(f"Number of nodes after consolidation: {len(G2)}")

# 绘制简化后的街道网络图,节点被标记为红色,便于视觉上观察合并交叉点的效果
fig, ax = ox.plot_graph(G2, node_color="r")

# 将处理后的街道网络保存为GeoPackage文件格式,filepath参数指定了保存文件的路径和名称
ox.save_graph_geopackage(G2, filepath="D:/data/Guangzhou_network.gpkg")

还是以广州市为例,这里我把路网区域局部放大了,这样看起来更直观一些,整体效果还是okay的,路网节点也少了1个万左右的节点,还有优化的空间。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图说交通

买猫粮,楼下的流浪猫在等我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值