Geolocation Osmnx在组合图中找不到节点之间的路径?

Geolocation Osmnx在组合图中找不到节点之间的路径?,geolocation,networkx,distance,geo,osmnx,Geolocation,Networkx,Distance,Geo,Osmnx,我正在尝试使用osmnx查找原点(lat/lon)和最近的基础设施(如铁路、水或公园)之间的距离 1) 我通过网络

我正在尝试使用osmnx查找原点(lat/lon)和最近的基础设施(如铁路、水或公园)之间的距离

1) 我通过
网络
从一个区域获取整个图形

2) 获得所需的基础设施,例如同一地区的铁路

3) 把两张图合成一张

4) 在原始图形中查找距离原点最近的节点

5) 在基础结构图中查找距离原点最近的节点

6) 查找两个节点之间的最短路由长度

如果运行下面的示例,您将看到它缺少20%的数据,因为它无法在节点之间找到路由。对于
infrastructure='way[“leisure”~“park”].
infrastructure='way[“natural”~“wood”].
情况更糟,80-90%的节点未连接


最小可复制示例:

import osmnx as ox
import networkx as nx

bbox = [55.5267243, 55.8467243, 12.4100724, 12.7300724]

g = ox.graph_from_bbox(bbox[0], bbox[1], bbox[2], bbox[3], 
                       retain_all=True, 
                       truncate_by_edge=True, 
                       simplify=False,
                       network_type='walk')


points = [(55.6790884456018, 12.568493971506154),
 (55.6790884456018, 12.568493971506154),
 (55.6867418740291, 12.58232314016353),
 (55.6867418740291, 12.58232314016353),
 (55.6867418740291, 12.58232314016353),
 (55.67119624894504, 12.587201455313153),
 (55.677406927839506, 12.57651997656002),
 (55.6856574907879, 12.590500429002823),
 (55.6856574907879, 12.590500429002823),
 (55.68465359365924, 12.585474365063224),
 (55.68153666806675, 12.582594757267945),
 (55.67796979175, 12.583111746311117),
 (55.68767346629932, 12.610040871066179),
 (55.6830855237578, 12.575431380892427),
 (55.68746749645466, 12.589488615911913),
 (55.67514254640597, 12.574308210656602),
 (55.67812748568291, 12.568454119053886),
 (55.67812748568291, 12.568454119053886),
 (55.6701733527419, 12.58989203029166),
 (55.677700136266616, 12.582800629527789)]

railway = ox.graph_from_bbox(bbox[0], bbox[1], bbox[2], bbox[3], 
                               retain_all=True, 
                               truncate_by_edge=True, 
                               simplify=False,
                               network_type='walk', 
                               infrastructure='way["railway"]')

g_rail = nx.compose(g, railway)

l_rail = []

for point in points:

    nearest_node = ox.get_nearest_node(g, point)

    rail_nn = ox.get_nearest_node(railway, point)

    if nx.has_path(g_rail, nearest_node, rail_nn):
        l_rail.append(nx.shortest_path_length(g_rail, nearest_node, rail_nn, weight='length'))
    else:
        l_rail.append(-1)


有两件事引起了我的注意

  • OSMNX文档指定ox.graph_from_bbox参数的顺序为北、南、东、西()。我之所以提到这一点,是因为当我试图运行你的代码时,我得到的是空图

  • 您可能已经知道,参数“retain_all=True”是关键。设置为true时,它将保留图形中的所有节点,即使它们未连接到图形中的任何其他节点。这主要是由于OpenStreetMap的不完整性造成的,OpenStreetMap包含自愿提供的地理信息。我建议您设置“retain_all=False”,这意味着您的图形现在只包含连接的节点。这样,您就得到了一个完整的列表,没有任何-1

  • 我希望这有帮助

    g=ox.graph_from_bbox(bbox[1],bbox[0],bbox[3],bbox[2],
    retain_all=False,
    通过_边截断_=真,
    简化=错误,
    网络_type='walk')
    railway=ox.graph_from_bbox(bbox[1],bbox[0],bbox[3],bbox[2],
    retain_all=False,
    通过_边截断_=真,
    简化=错误,
    网络_type='walk',
    基础设施(公路[“铁路”]”)
    g_轨道=nx.组成(g,轨道)
    l_轨道=[]
    对于点到点:
    最近的_节点=ox.get_最近的_节点(g,点)
    轨道nn=ox.get\u最近的节点(轨道,点)
    如果nx.具有路径(g\u轨道,最近的节点,轨道nn):
    l_rail.append(nx.最短路径长度(g_rail,最近节点,rail_nn,weight='length'))
    其他:
    l_轨道。附加(-1)
    打印(l_导轨)
    出[60]:
    [7182.002999999995,
    7182.002999999995,
    5060.562000000002,
    5060.562000000002,
    5060.562000000002,
    6380.099999999999,
    7127.429999999996,
    4707.014000000001,
    4707.014000000001,
    5324.400000000003,
    6153.250000000002,
    6821.213000000002,
    8336.863999999998,
    6471.305,
    4509.258000000001,
    5673.294999999996,
    6964.213999999994,
    6964.213999999994,
    6213.673,
    6860.350000000001]
    
    有两件事引起了我的注意

  • OSMNX文档指定ox.graph_from_bbox参数的顺序为北、南、东、西()。我之所以提到这一点,是因为当我试图运行你的代码时,我得到的是空图

  • 您可能已经知道,参数“retain_all=True”是关键。设置为true时,它将保留图形中的所有节点,即使它们未连接到图形中的任何其他节点。这主要是由于OpenStreetMap的不完整性造成的,OpenStreetMap包含自愿提供的地理信息。我建议您设置“retain_all=False”,这意味着您的图形现在只包含连接的节点。这样,您就得到了一个完整的列表,没有任何-1

  • 我希望这有帮助

    g=ox.graph_from_bbox(bbox[1],bbox[0],bbox[3],bbox[2],
    retain_all=False,
    通过_边截断_=真,
    简化=错误,
    网络_type='walk')
    railway=ox.graph_from_bbox(bbox[1],bbox[0],bbox[3],bbox[2],
    retain_all=False,
    通过_边截断_=真,
    简化=错误,
    网络_type='walk',
    基础设施(公路[“铁路”]”)
    g_轨道=nx.组成(g,轨道)
    l_轨道=[]
    对于点到点:
    最近的_节点=ox.get_最近的_节点(g,点)
    轨道nn=ox.get\u最近的节点(轨道,点)
    如果nx.具有路径(g\u轨道,最近的节点,轨道nn):
    l_rail.append(nx.最短路径长度(g_rail,最近节点,rail_nn,weight='length'))
    其他:
    l_轨道。附加(-1)
    打印(l_导轨)
    出[60]:
    [7182.002999999995,
    7182.002999999995,
    5060.562000000002,
    5060.562000000002,
    5060.562000000002,
    6380.099999999999,
    7127.429999999996,
    4707.014000000001,
    4707.014000000001,
    5324.400000000003,
    6153.250000000002,
    6821.213000000002,
    8336.863999999998,
    6471.305,
    4509.258000000001,
    5673.294999999996,
    6964.213999999994,
    6964.213999999994,
    6213.673,
    6860.350000000001]
    
    请注意,
    infrastructure
    参数在最近的版本中被弃用并替换为
    自定义\u筛选器
    。请注意,
    infrastructure
    参数在最近的版本中被弃用并替换为
    自定义\u筛选器