【问题标题】:Truncating osmnx by bbox (or polygon): How to create dummy nodes at boundaries?通过 bbox(或多边形)截断 osmnx:如何在边界处创建虚拟节点?
【发布时间】:2023-01-14 00:12:42
【问题描述】:

我正在尝试通过 bbox 截断 osmnx 图。它按照文档工作。可重现的自解释代码如下:

import numpy as np
import osmnx as ox
import geopandas as gpd
import networkx as nx
import matplotlib.pyplot as plt

N, S, E, W = 1.3235381983186159, 1.319982801681384, \
                           103.85361309942331 , 103.84833190057668,
graph = ox.graph_from_bbox(N, S, E, W, \
                           network_type='drive')
nodes= ox.graph_to_gdfs(graph, nodes=True, edges=False)
edges= ox.graph_to_gdfs(graph, edges=True, nodes=False)
fig, ax = ox.plot.plot_graph(
                graph,
                ax=None,
                figsize=(10, 10),
                bgcolor="white",
                node_color="red",
                node_size=5,
                node_alpha=None,
                node_edgecolor="none",
                node_zorder=1,
                edge_color="black",
                edge_linewidth=0.1,
                edge_alpha=None,
                show=False,
                close=False,
                save=False,
                bbox=None,
            )
W_ = W + (E-W) * 0.8
S_ = S + (N-S)*0.7
width = (E - W)*0.07 
height = (N - S)*0.1 

rect = plt.Rectangle((W_, S_), width, height, facecolor="green", alpha=0.3, edgecolor=None)
ax.add_patch(rect)
plt.show()

g_truncated = ox.truncate.truncate_graph_bbox(graph, S_ + height, S_, W_+width, W_, truncate_by_edge=False)
ox.plot_graph(g_truncated)

bbox和提取的图如下所示:

如果我想提取子图以便在边界处引入虚拟节点,我该怎么做?具体来说,我正在尝试获取图片中可见的子图。 (即具有 6 个黑色节点的子图,如下所示:

鉴于 osmnx 的广泛流行,是否存在一种简单/直接的方法来实现这一目标?

【问题讨论】:

    标签: python graph truncate osmnx


    【解决方案1】:
    - LOOP over edges in graph
      - LOOP over sides in box
         - IF box side intersects edge
            - remove edge
            - Add vertex at intersection point
            - Add edges between intersection vertex and original edge end points
    

    您将需要在谷歌上搜索“计算两条线段的交点”

    【讨论】:

    • 感谢你的回答。两个问题: 1. 如何找到交点对于 shapely 或任何其他库来说是微不足道的。此外,如果涉及 bboxes,这是一个 O(log n) 时间操作。 2.您的蛮力方法对于多个查询非常低效。我在问题中提到的算法速度快了几个数量级,因为它利用了已经优化的函数 osm.truncategraph,显着减少了搜索空间。
    • 您的问题是“如何在边界处创建虚拟节点?”这就是我的回答。如果你有不同的问题,你应该改变你的问题标题。
    • 感谢你付出的努力。但我正在寻找比我已经提出的更好的方法。也许我应该在标题中添加如何更快地完成它。
    猜你喜欢
    • 2013-04-25
    • 2021-12-03
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多