You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用OSMnx实现OSM网络的多标签联合过滤下载?

解决OSMnx路网下载的并集过滤问题

嘿,刚好我对OSMnx的Overpass过滤语法比较熟悉,来帮你搞定这个问题!

你之前遇到的问题是因为OSMnx的custom_filter参数直接使用Overpass QL语法,而不是Python的逻辑运算符(or/|),所以直接用这些符号自然不会生效。要实现两个条件的并集,你需要用Overpass QL里的集合语法——把多个过滤条件放在括号里,用分号分隔即可。

正确的自定义过滤写法

直接把你需要的两个条件用(条件1;条件2;)的结构包裹起来,就能实现并集查询:

network = ox.core.graph_from_place(place_name, custom_filter='(["highway"~"cycleway"]["bicycle"!~"no"];["cycleway"~"lane"];)')

这个写法会告诉Overpass API:要么满足highway为cycleway且bicycle标签不为no,要么满足cycleway为lane,把这两类路段都下载回来,完美实现你要的并集效果。

为什么之前的写法不行?

Overpass QL的逻辑组合规则和Python不同:

  • 方括号[]交集(同时满足多个标签条件)
  • 括号加;并集(满足任意一个条件组)
    所以你之前的["highway"~"cycleway"]["bicycle"!~"no"]是交集,要和另一个条件取并集,就得用Overpass的集合语法来包裹。

关于先下载再删除的备选方案

如果因为某些特殊情况(比如复杂的过滤逻辑)导致直接写并集过滤有问题,那再考虑先下载更大范围的路网,再用OSMnx的remove_edges_from或者其他方法删除无关路段。但显然上面的直接过滤写法更高效,能避免下载不必要的数据。

内容的提问来源于stack exchange,提问作者Giulia R

火山引擎 最新活动