2017-07-26 22 views
1

我有一张伦敦步行路径图(由OSMNX转换而来),包含667.588条边,具有不同的highway属性(openstreetmap中的街道类型)。运行最短路径算法非常慢(4秒)。为了提高速度,我想在很大程度上减少边缘的数量而不会丢失主要连接/城市结构,但不知道如何去做。有什么建议么?有没有办法将一些关闭节点分组到一个更重要的节点,从而减小大小?减少网络中的openstreetmap图形大小

+0

欢迎StackOverflow上。你的问题有些宽泛。 SO用户可以在您遇到特定类型的代码或问题时提供帮助,而不是提供一般方法。你有什么不同的公路属性。过滤那些可能不那么重要的想法会是一个想法吗? –

+0

主要是住宅小径等。我正在寻找一种方法来分组一些节点,并只用一条边切出节点。 –

+1

你可以使用1-2个高速公路类别吗?我怀疑你只想要“小径”是对的吗?对于只有一条边的节点,可以删除一级节点 –

回答

0

这取决于您正在使用的网络类型(例如,散步,自行车,驱动器,drive_service,全部等)。网络类型将是最小的并且优先考虑主要路线,但是以行人路径和通道为代价。

OSMnx还提供了simplify the graph's topology内置函数的功能。如果您还没有做到这一点,那么这样做值得,因为它有时可以将图形大小减少90%,同时正确保留所有相交和死角节点以及边缘几何形状。

+0

我直接创建了“伦敦,英国”图形。所以看起来网络已经简化了,不能再做了。 –

1

您可以从主图G提取与期望的公路类型的边:

highways_to_keep = ['motorway', 'trunk', 'primary'] 
H = nx.MultiDiGraph() 
for u,v,attr in G.edges(data=True): 
    if attr['highway'] in highways_to_keep: 
     H.add_edge(u,v,attr_dict=attr) 
     H.node[u] = G.node[u] 
     H.node[v] = G.node[v] 

在这里,我们首先初始化一个空MultiDiGraph,这是OSMnx使用的类型的图形,然后用从数据填充主图G,如果'highway'属性在我们的列表highways_to_keep。您可以在this OpenStreetMap页面找到更多关于公路类型的信息。

我们的图形是一个有效的NetworkX图形,但在利用OSMnx功能之前还需要做一件事。如果执行G.graph,则会看到包含crs(坐标参考系统)和其他一些内容的图形属性。你应该添加此信息到您的新创建的图表:

H.graph = G.graph 

这里是H情节,osmnx.plot_graph(H)

enter image description here

+0

谢谢。我想使用步行地图,这意味着其中大部分是住宅道路(没有高速公路)。我应该只保留住宅街道吗?他们仍然很多。 –

+1

在这种情况下,最好完全依靠OSMnx提供的'walk'网络类型。我的猜测是,你提到的4秒内不是用于计算从一个节点到另一个节点的最短路径,它可能是一个节点到所有其他节点,或者甚至每个节点到每个其他节点。为此,4秒完全没问题。如果您不提供任何参数(例如nx.shortest_path(G)),它将计算每对节点之间的最短路径。 NX。shortest_path(G,node1)计算节点1和所有其他节点之间的最短路径,以及nx.shortest_path(G,node1,node2),仅在节点1和节点2之间计算最短路径。 –

+0

我的评论对你有帮助吗?你不必这样做,但对于花时间帮忙的人来说,这是一种很好的方式,或者如果答案是你正在寻找的东西,那么接受答案/提高投票。 –