首页 > 解决方案 > 如何在 OSMnx 图中包含汽车轮渡

问题描述

构建图表时是否可以让 OSMnx(BTW 很棒的工具)包括汽车渡轮?如果做不到这一点,那么构建这样一个图表的最直接方法是什么?问题不仅在于轮渡路线本身不存在,而且在没有轮渡的情况下,实际上可以通过汽车到达的岛屿不包括在道路网络中。

我尝试使用 osmnx.settings.useful_tags_way 无济于事。在 overpass-api 中使用 'route'='ferry' 会返回我想要包含在图中的内容,因此我一直在编辑 OSMnx downloads.py 文件,试图直接更改 overpass-api 调用。

谢谢!

标签: overpass-apiosmnx

解决方案


第一次通过(hacky)

通过编辑 osmnx 的 downloads.py 文件并替换该行(最初在第 350 行附近),我提出了相当 hacky 的部分解决方案:

query_str = f"{overpass_settings};(way{osm_filter}(poly:'{polygon_coord_str}');>;);out;"

和:

osm_filter2 = f'["route"="ferry"]'
query_str = f"{overpass_settings};(way{osm_filter}(poly:'{polygon_coord_str}');>;way{osm_filter2}(poly:'{polygon_coord_str}');>;);out;"

查询字符串格式经过反复试验。如果这或类似的方法被证明是最好的方法,我将尝试使其更广泛地适用(将“轮渡”添加到预定义的过滤器列表而不是硬编码,传递过滤器列表等)。

好多了

我发现使用 networkx.union 或 networkx.disjoint_union 构建单独的图表并合并它们并没有给出可用的结果。因此,我在我的 osmnx downloads.py 文件版本中添加了多重过滤功能。我还添加了一些额外的网络类型选项。因此,现在可以将“ferry”作为 osmnx.graph_from_* 函数的 network_type 传递:

network_type = "ferry"

我现在还可以使用管道分隔符传递多种网络类型:

network_type = "drive|ferry"

得到一个图,它是两者的并集。执行此操作时,我发现创建第二个仅轮渡图并将其用作更新组合网络图中的标签的参考非常有用。最好先加载非简化图,然后在此步骤之后自己简化它/它们。

仍在尝试

仍然存在一些非连通性问题 - 现在在仅限渡轮的网络中。与直通渡轮不共享港口的孤立交叉口的汽车渡轮不包含在仅渡轮图表中,因此组合网络中其对应方的标签不会根据需要更新。组合网络 (network_type = "drive|ferry") 中的渡轮都存在并正确连接,因此它们各自的岛屿现在位于道路网络上 - 这很棒。但是,因为他们的标签没有更新,这些孤立的渡轮正在获得默认的高速公路速度(我正在做旅行时间分析)。我可以使用以下方法解决此问题:

if not 'highway' in edge[3]:

但是,对于一个强大的解决方案,我认为我们希望能够明确地标记它们。

我仍然很想听听其他人的想法。


推荐阅读