You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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_link
  • primary, primary_link, secondary, secondary_link
  • tertiary, 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:58:31