我正在使用OSMnx返回路线图,这些路线图在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)
这将返回由六个边线(灰色)连接的五个节点(蓝点)的图形。
您会注意到,两个节点有两个连接它们的边(右下角)。因此,如果您查看
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。无论如何,有没有简单地添加新的“反向”边缘而不是重新定义它?
最佳答案
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。