如何移除OSMnx自行车路网中居民区等无用路段以降低复杂度?
移除OSMnx自行车路网中无用路段的可行方法
- 利用OSM自定义过滤器提前筛选
直接在调用ox.graph_from_bbox时使用custom_filter参数,根据OSM的highway标签指定只保留需要的路段类型,从源头减少无用数据。比如你要排除居民区道路,可以只保留自行车道、主次干道这类:
# 注意你原代码里lng1重复了,应该是lng2 G = ox.graph_from_bbox(lat1, lat2, lng1, lng2, custom_filter='["highway"~"cycleway|primary|secondary|tertiary|trunk"]', simplify=True)
常用的highway标签对应类型:
cycleway:专用自行车道
primary/secondary/tertiary:主/次/三级公路
trunk:干线道路
这样就能直接跳过residential(居民区)、service(服务道路)这类你不需要的路段。获取路网后基于边属性过滤
如果已经拿到了原始路网,也可以事后遍历边的属性来删除无用路段。比如根据highway标签排除居民区和服务道路:
# 遍历所有边,筛选出需要保留的边 edges_to_keep = [] for u, v, k, data in G.edges(data=True, keys=True): # 排除居民区和服务道路,可根据需求调整标签列表 if data.get('highway') not in ['residential', 'service', 'unclassified']: edges_to_keep.append((u, v, k)) # 生成过滤后的子图 G_filtered = G.edge_subgraph(edges_to_keep).copy()
还可以结合access标签进一步过滤,比如只保留允许自行车通行的路段:data.get('access') != 'no'。
- 基于连通性保留核心路网
有些居民区路段是孤立的小分支,或者和主路网连通性差,可以保留最大的连通分量来简化路网:
from networkx.algorithms.components import strongly_connected_components # 针对有向图,提取最大强连通分量 largest_component = max(strongly_connected_components(G), key=len) G_filtered = G.subgraph(largest_component).copy() # 如果是无向图,用connected_components # from networkx.algorithms.components import connected_components # largest_component = max(connected_components(G.to_undirected()), key=len) # G_filtered = G.subgraph(largest_component).copy()
这种方法能自动去掉那些游离在主路网之外的小支路,适合快速简化。
- 结合道路等级和使用场景细化过滤
如果你的需求更具体,比如只保留适合长距离骑行的道路,还可以结合maxspeed(限速)、bicycle(自行车通行权限)等标签进一步筛选:
edges_to_keep = [] for u, v, k, data in G.edges(data=True, keys=True): # 保留自行车允许通行、且道路等级不是居民区的路段 if data.get('bicycle') != 'no' and data.get('highway') not in ['residential', 'service']: # 可选:过滤掉限速过低的小路(比如低于20km/h) maxspeed = data.get('maxspeed') if maxspeed is None or int(maxspeed) >= 20: edges_to_keep.append((u, v, k)) G_filtered = G.edge_subgraph(edges_to_keep).copy()
内容的提问来源于stack exchange,提问作者Junez
相关产品推荐
相关产品推荐

