在不丢失现有边的情况下将 MultiDiGraph 转换为 MultiGraph
Convert a MultiDiGraph to MultiGraph without losing existing edges
我正在使用 OSMnx 来 return 路线图,这些路线图在 networkx 中表示为 MultiDiGraphs。
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)
这 return 是一个由六个边(灰色)连接的五个节点(蓝点)组成的图。
您会注意到两个节点有两条边连接它们(在右下角)。因此,如果您查看 sg[a][b]
,您将获得与 sg[b][a]
不同的优势。但是如果你拉 sg[c][d]
并不总是 sg[d][c]
(因为单行道)。
我想将其转换为多图,因此我 运行 sg_u = sg.to_undirected()
创建了缺失的 sg[d][c]
。但不幸的是,它也会覆盖现有的 "reverse" 边。
看'length'属性就很容易看出:
sg[65283442][65283457]
长度为85.36(米,大概)
sg[65283457][65283442]
的长度只有 41.62
但是在 运行ning to_undirected()
之后两者的长度都是 41.62。
是否可以简单地添加新的 "reverse" 边而不是重新定义它?
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。
我正在使用 OSMnx 来 return 路线图,这些路线图在 networkx 中表示为 MultiDiGraphs。
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)
这 return 是一个由六个边(灰色)连接的五个节点(蓝点)组成的图。
您会注意到两个节点有两条边连接它们(在右下角)。因此,如果您查看 sg[a][b]
,您将获得与 sg[b][a]
不同的优势。但是如果你拉 sg[c][d]
并不总是 sg[d][c]
(因为单行道)。
我想将其转换为多图,因此我 运行 sg_u = sg.to_undirected()
创建了缺失的 sg[d][c]
。但不幸的是,它也会覆盖现有的 "reverse" 边。
看'length'属性就很容易看出:
sg[65283442][65283457]
长度为85.36(米,大概)
sg[65283457][65283442]
的长度只有 41.62
但是在 运行ning to_undirected()
之后两者的长度都是 41.62。
是否可以简单地添加新的 "reverse" 边而不是重新定义它?
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。