我正在使用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)


python - 在不丢失现有边的情况下将MultiDiGraph转换为MultiGraph-LMLPHP

这将返回由六个边线(灰色)连接的五个节点(蓝点)的图形。

您会注意到,两个节点有两个连接它们的边(右下角)。因此,如果您查看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

10-06 06:18