如何在OSMnx中从.osm文件仅读取drive类型路网?
解决OSMnx从XML导入路网后匹配drive类型路网的问题
要让从本地OSM XML文件生成的路网和ox.graph_from_bbox(..., network_type='drive')的结果一致,核心是手动模拟OSMnx对drive类型路网的筛选规则,步骤如下:
1. 明确drive类型的道路筛选规则
OSMnx的network_type='drive'会保留所有允许机动车通行的道路,对应的OSMhighway标签包括:
motorway,motorway_link,trunk,trunk_linkprimary,primary_link,secondary,secondary_linktertiary,tertiary_link,unclassified,residential
同时会排除人行道、自行车道等非驾驶道路(比如pedestrian、cycleway)。
2. 代码实现步骤
导入依赖
import osmnx as ox import networkx as nx
读取XML文件生成完整路网
# 替换为你的OSM文件路径 G_full = ox.graph_from_xml("your_exported.osm")
筛选符合drive类型的边
# 定义drive类型允许的highway标签集合 allowed_highways = { 'motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary', 'secondary_link', 'tertiary', 'tertiary_link', 'unclassified', 'residential' } # 筛选出符合条件的边(保留所有key维度的边) valid_edges = [(u, v, k) for u, v, k, attrs in G_full.edges(data=True, keys=True) if attrs.get('highway') in allowed_highways] # 基于有效边创建子图 G_drive = G_full.edge_subgraph(valid_edges).copy()
移除孤立节点
筛选后可能存在没有关联边的孤立节点,需要清理:
isolated_nodes = [node for node in G_drive.nodes if G_drive.degree(node) == 0] G_drive.remove_nodes_from(isolated_nodes)
裁剪到原边界框
OSM网站导出的文件可能包含边界框外的道路,需要和原bbox范围对齐:
# 原边界框参数:north, south, east, west G_drive = ox.truncate.truncate_graph_bbox( G_drive, north=43.54645, south=43.54235, east=-96.72649, west=-96.73444 )
3. 验证结果
可以对比原bbox方法生成的路网和处理后的XML路网的节点/边数量:
# 原bbox生成的路网 G_bbox = ox.graph_from_bbox(43.54645, 43.54235, -96.73444, -96.72649, network_type='drive') print(f"原bbox路网:节点数={len(G_bbox.nodes)}, 边数={len(G_bbox.edges)}") print(f"处理后XML路网:节点数={len(G_drive.nodes)}, 边数={len(G_drive.edges)}")
这样处理后的路网就会和graph_from_bbox指定drive类型的结果一致。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

