2017-06-06 125 views
1

我正在使用OSMnx返回路標,這些路線圖在networkx中表示爲MultiDiGraph。將MultiDiGraph轉換爲MultiGraph而不會丟失現有邊緣

import osmnx as ox 
%matplotlib inline 
sg = ox.graph_from_point((37.7936516, -122.4503161), distance=100, network_type='all_private') 
ox.plot_graph(sg) 

enter image description here

這將返回由六條邊(灰色)連接五個節點(藍點)的曲線圖。

你會注意到兩個節點有兩條連接它們的邊(在右下角)。所以如果你看看sg[a][b],你會得到不同於sg[b][a]的優勢。但如果你拉sg[c][d]並不總是sg[d][c](因爲單向道路)。

我想將其轉換爲MultiGraph,所以我運行sg_u = sg.to_undirected(),它創建了缺少的sg[d][c]。但不幸的是,它也覆蓋了現有的「反向」邊緣。

可以很容易地看到,如果在看 '長度' 屬性:

sg[65283442][65283457]有85.36長度(M,大概)

sg[65283457][65283442]卻只有41.62

的長度,但運行後to_undirected()的長度都是41.62。

無論如何只需添加新的「反向」邊緣而不是重新定義它?

回答

1

OSMnx具有內置函數get_undirected來處理將街道網絡的MultiDiGraph轉換爲MultiGraph的怪癖。

import osmnx as ox 
%matplotlib inline 
sg = ox.graph_from_point((37.7936516, -122.4503161), distance=100, network_type='all_private') 
sgu = ox.get_undirected(sg) 
print(sgu[65283457][65283442]) 

打印:

{0: {'from': 65283442, 
    'geometry': <shapely.geometry.linestring.LineString at 0x1a0c10b67b8>, 
    'highway': 'residential', 
    'length': 85.36240139096256, 
    'oneway': True, 
    'osmid': 8915222, 
    'to': 65283457}, 
1: {'from': 65283457, 
    'geometry': <shapely.geometry.linestring.LineString at 0x1a0c10b64a8>, 
    'highway': 'residential', 
    'length': 41.620571785809716, 
    'oneway': True, 
    'osmid': 8915224, 
    'to': 65283442}} 

sgu是多重圖。正如你所看到的,它在這些節點和每個節點的所有屬性之間保留了兩條(即平行)無向邊。

另外,是的,默認情況下OSMnx圖邊緣長度爲in meters

相關問題