2017-06-06 3 views
1

OSMnxを使用して、networkxのMultiDiGraphsとして表されるロードマップを返します。既存のエッジを失うことなく、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

これは、6つのエッジ(灰色)によって接続された5つのノード(青色のドット)のグラフを返します。

2つのノードに2つのエッジが(右下に)接続されていることがわかります。したがって、sg[a][b]を見ると、sg[b][a]とは異なるエッジが表示されます。しかし、sg[c][d]を引くと、(片道のために)いつもsg[d][c]であるとは限りません。

私はこれをMultiGraphに変換したいので、sg_u = sg.to_undirected()を実行すると、sg[d][c]が作成されます。しかし残念ながら、既存の "逆"エッジも上書きされます。

それは '長さ' を見ると属性かどうかを確認するのは簡単です:

sg[65283457][65283442]が唯一の41.62

しかし、実行した後の長さを持っている

sg[65283442][65283457]は(おそらく、M)85.36の長さを有しto_undirected()はいずれも長さが41.62です。

新しい「リバース」エッジを再定義するのではなく単に追加するだけですか?

答えて

1

OSMnxには、街路ネットワークのMultiDiGraphをMultiGraphに変換した奇妙なものを処理する組み込み関数get_undirectedがあります。

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多重グラフです。ご覧のように、これらのノードとそれぞれの属性の間には、2つの(つまり、パラレル)無向エッジが保持されています。

また、OSMnxグラフのエッジの長さは、デフォルトでin metersです。

関連する問題