【问题标题】:How to include car ferries in OSMnx graphs如何在 OSMnx 图中包含汽车轮渡
【发布时间】:2020-10-06 02:26:13
【问题描述】:

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

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

谢谢!

【问题讨论】:

标签: overpass-api osmnx


【解决方案1】:

第一遍(hacky)

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

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]:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多