2017-07-26 65 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

我的評論對你有幫助嗎?你不必這樣做,但對於花時間幫忙的人來說,這是一種很好的方式,或者如果答案是你正在尋找的東西,那麼接受答案/提高投票。 –