将MultiDiGraph转换为MultiGraph而不会丢失现有边

时间:2017-06-06 15:48:14

标签: python graph networkx edges

我正在使用OSMnx返回路线图,在networkx中表示为MultiDiGraph。

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 个答案:

答案 0 :(得分: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是MultiGraph。如您所见,它在这些节点和每个节点的所有属性之间保留了两条(即平行的)无向边。

另外,是的,OSMnx图形边长默认为in meters