使用graph_from_bbox自定义过滤器后节点数增多的问题咨询
问题原因与解决方案
为什么带过滤器的节点数更多?
- simplify参数是核心差异:你带过滤器的代码用了
simplify=False,这会保留OpenStreetMap里的所有原始节点——包括每条街道中间的所有非交汇点节点;而不带过滤器的代码用了simplify=True,OSMnx会自动合并那些只连接同一条道路的连续节点,只保留街道交汇处的节点,这直接导致节点数量大幅减少。 - 过滤器逻辑冗余且可能引入额外道路:你的
custom_filter里写了["highway"~"."],这会匹配所有带highway标签的元素,包括一些默认drive网络类型会过滤掉的道路类型。虽然你排除了人行道和服务道路,但可能引入了更多原本被drive类型过滤的道路,进一步增加了节点总量。
你的代码是否符合需求?
当前代码不符合需求:
- 没有开启
simplify=True,无法删除非街道交汇处的节点; - 过滤器逻辑有冗余,还可能引入不必要的道路。
修正后的代码
import osmnx as ox import networkx as nx ox.settings.bidirectional_network_types = ["drive"] # bounds 是你定义的边界字典 # 优化过滤器:只保留适合驾车的道路,同时排除人行道和服务道路 cf = ('["area"!~"yes"]["highway"!~"footway|service"]["highway"~"motorway|trunk|primary|secondary|tertiary|unclassified|residential"]') G4 = ox.graph_from_bbox( bounds["max_lat"], bounds["min_lat"], bounds["max_lon"], bounds["min_lon"], simplify = True, # 关键:开启节点精简 retain_all = False, network_type = 'none', # 使用custom_filter时设为none避免冲突 custom_filter=cf ) print(len(G4.nodes))
额外说明
simplify=True是实现“删除非两条及以上街道交汇处节点”的核心参数,必须开启;- 自定义过滤器里明确列出允许的道路类型,比
["highway"~"."]更精准,避免引入无关道路; - 使用
custom_filter时,把network_type设为'none',这样OSMnx不会再用默认的drive类型过滤规则,完全遵循你的自定义过滤器。
内容的提问来源于stack exchange,提问作者earendil_the_mariner
相关产品推荐
相关产品推荐

