如何用OSMnx构建街道与河流网络?自定义过滤器报错求解
OSMnx构建含街道与河流网络的解决方案
首先说明报错原因:你写的自定义过滤器["waterway"~"river"]["highway"~"primary|trunk"]是逻辑与关系,OSMnx会去查找同时属于河流(waterway=river)和主干道/干线公路(highway=primary|trunk)的元素,这种元素根本不存在,所以返回空响应报错。
两种可行解决方式
方式一:修改自定义过滤器为逻辑或
把过滤器改成Overpass QL支持的逻辑或语法,就能同时获取河流和街道元素:
country_graph = ox.graph_from_polygon( polygon=drc_boundary.geometry.iloc[0], simplify=True, retain_all=True, custom_filter='["waterway"~"river"] or ["highway"~"primary|trunk"]' )
注意:OSMnx的graph_from_polygon原本是为道路网络设计的,河流作为非道路元素被加入后,图的节点、边属性可能和纯道路图有差异,后续处理(比如路径规划)需要额外调整属性逻辑。
方式二:分别获取后合并(更推荐)
这种方式能分别处理街道和河流的属性,灵活性更高:
- 获取街道网络:
street_graph = ox.graph_from_polygon( drc_boundary.geometry.iloc[0], simplify=True, retain_all=True, custom_filter='["highway"~"primary|trunk"]' )
- 获取河流的几何要素(用
geometries_from_polygon更适合非道路的地理要素):
rivers = ox.geometries_from_polygon( drc_boundary.geometry.iloc[0], tags={"waterway": "river"} )
- 手动合并到同一图结构中:可以将河流的几何数据作为边添加到街道图里,或者创建新的混合图,根据你的需求调整节点和边的属性映射(比如给河流边标记特殊属性区分道路)。
总结
- 若只是快速获取两种元素的集合,修改过滤器为逻辑或即可;
- 若需要构建能正常使用的混合网络,分别获取再合并的方式更可靠,能避免不同要素属性冲突带来的问题。
内容的提问来源于stack exchange,提问作者Michelle Li
相关产品推荐
相关产品推荐

