减少网络中的openstreetmap图形大小
我有一张伦敦步行路径图(由OSMNX转换而来),包含667.588条边,具有不同的highway
属性(openstreetmap中的街道类型)。运行最短路径算法非常慢(4秒)。为了提高速度,我想在很大程度上减少边缘的数量而不会丢失主要连接/城市结构,但不知道如何去做。有什么建议么?有没有办法将一些关闭节点分组到一个更重要的节点,从而减小大小?减少网络中的openstreetmap图形大小
这取决于您正在使用的网络类型(例如,散步,自行车,驱动器,drive_service,全部等)。网络类型将是最小的并且优先考虑主要路线,但是以行人路径和通道为代价。
OSMnx还提供了simplify the graph's topology内置函数的功能。如果您还没有做到这一点,那么这样做值得,因为它有时可以将图形大小减少90%,同时正确保留所有相交和死角节点以及边缘几何形状。
我直接创建了“伦敦,英国”图形。所以看起来网络已经简化了,不能再做了。 –
您可以从主图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)
:
谢谢。我想使用步行地图,这意味着其中大部分是住宅道路(没有高速公路)。我应该只保留住宅街道吗?他们仍然很多。 –
在这种情况下,最好完全依靠OSMnx提供的'walk'网络类型。我的猜测是,你提到的4秒内不是用于计算从一个节点到另一个节点的最短路径,它可能是一个节点到所有其他节点,或者甚至每个节点到每个其他节点。为此,4秒完全没问题。如果您不提供任何参数(例如nx.shortest_path(G)),它将计算每对节点之间的最短路径。 NX。shortest_path(G,node1)计算节点1和所有其他节点之间的最短路径,以及nx.shortest_path(G,node1,node2),仅在节点1和节点2之间计算最短路径。 –
我的评论对你有帮助吗?你不必这样做,但对于花时间帮忙的人来说,这是一种很好的方式,或者如果答案是你正在寻找的东西,那么接受答案/提高投票。 –
欢迎*上。你的问题有些宽泛。 SO用户可以在您遇到特定类型的代码或问题时提供帮助,而不是提供一般方法。你有什么不同的公路属性。过滤那些可能不那么重要的想法会是一个想法吗? –
主要是住宅小径等。我正在寻找一种方法来分组一些节点,并只用一条边切出节点。 –
你可以使用1-2个高速公路类别吗?我怀疑你只想要“小径”是对的吗?对于只有一条边的节点,可以删除一级节点 –