Невозможно получить правильный график из OSM при использовании Osmnx только в определенном месте (Модена) - PullRequest
0 голосов
/ 07 марта 2019

Моя цель - генерировать маршруты из точки А в точку Б, используя Osmnx и Networkx. Маршруты представляют собой пешеходные и велосипедные перемещения, поэтому я хочу игнорировать улицы с односторонним движением.

Для этого я использую аргумент: G = ox.graph_from_place(place, network_type='walk') и до сих пор все работало идеально для Барселоны (ES) и Чезены (IT).

Теперь я пытаюсь сделать то же самое с Моденой (ИТ), но я получаю неполный график при использовании обоих network_type='walk' network_type='cycle' (см. Png прилагается).

Единственный способ получить полный граф Модены - не указывать аргумент network_type, но при этом ребра в G по-прежнему приводят к значению oneway = True. Таким образом, маршрутизация является неправильной, поскольку она учитывает односторонние улицы. Я попытался изменить это значение, используя:

for u, v, key, data in G.edges(keys=True, data=True):
    data['oneway']=False 

Я не получаю никакой ошибки, но маршрутизация все еще неверна. Что мне здесь не хватает?

График Модены без дорог в центре города ожидаемая маршрутизация против неправильной маршрутизации

РЕДАКТИРОВАТЬ: Прикрепленный фрагмент кода, который:

  • получить график без указания типа сети и графика это с односторонних улиц в красном
  • получить график с типом сети = ходить и построить его
  • Перечислите отсутствующие OSMids и нанесите их на пурпурный

    place = {'city' : 'Modena', 'country' : 'Italia'}
    
    #--------SOME BASIC SETTINGS FOR PLOTTING------
    
    one_way = (0.863, 0.039, 0.173,1)
    two_way = (0.243, 0.243, 0.243,1)
    background = (0.973, 0.973, 0.973,1)
    
    
    #--------PLOT GRAPH WITHOUT SPECIFYING THE NETWORK TYPE AND GET THE OSMIDs---------
    
    G = ox.graph_from_place(place)
    
    osmid_no_network = list([data['osmid'] for u, v, key, data in G.edges(keys=True, data=True)])
    
    ec = [one_way if data['oneway'] else two_way for u, v, key, data in G.edges(keys=True, data=True)]
    
    fig, ax = ox.plot_graph(G, bgcolor=background,
    show=False, close=True, fig_height=11, fig_width=11, node_size = 0, edge_linewidth = 0.1, edge_color = ec, dpi=300)
    fig.suptitle("Modena_no_network_type")
    plt.show()
    ox.plot.save_and_show(fig, ax, save=True, show=False, close=True, filename = "Modena_no_network_type",
    file_format="png", dpi=300, axis_off=True)
    
    
    #--------PLOT GRAPH SPECIFYING THE NETWORK TYPE = WALK AND GET THE OSMIDs-------
    
    H = ox.graph_from_place(place, network_type = 'walk')
    
    osmid_network_walk = list([data['osmid'] for u, v, key, data in H.edges(keys=True, data=True)])
    
    ec = [one_way if data['oneway'] else two_way for u, v, key, data in H.edges(keys=True, data=True)]
    
    fig, ax = ox.plot_graph(H, bgcolor=background,
    show=False, close=True, fig_height=11, fig_width=11, node_size = 0, edge_linewidth = 0.1, edge_color = ec, dpi=300)
    fig.suptitle("Modena_network_walk")
    plt.show()
    ox.plot.save_and_show(fig, ax, save=True, show=False, close=True, filename = "Modena_network_walk",
    file_format="png", dpi=300, axis_off=True)
    
    #--------GET THE OSMIDs LIST OF MISSING EDGES AND PLOT MISSING EDGES IN MAGENTA---------
    
    missing_edges = [i for i in osmid_no_network + osmid_network_walk if i not in osmid_no_network or i not in osmid_network_walk]
    print(missing_edges)
    
    m_edges = (0.859, 0.180, 0.938, 1)
    ec2 = [m_edges if data['osmid'] in missing_edges else two_way for u, v, key, data in G.edges(keys=True, data=True)]
    
    fig, ax = ox.plot_graph(G, bgcolor=background,
    show=False, close=True, fig_height=11, fig_width=11, node_size = 0, edge_linewidth = 0.1, edge_color = ec2, dpi=300)
    fig.suptitle("Modena_missing_edges")
    plt.show()
    ox.plot.save_and_show(fig, ax, save=True, show=False, close=True, filename = "Modena_missing_edges", file_format="png", dpi=300, axis_off=True)
    

РЕДАКТИРОВАТЬ: добавлено Retain_all png Модена сохраняет все истинное

РЕДАКТИРОВАТЬ: уменьшил область bbox до центра города и создал список отсутствующих ребер

1 Ответ

0 голосов
/ 14 марта 2019

Вы загружаете два разных типа сети: walk и all_private (по умолчанию), поэтому вы получаете разные сети. Похоже, что ребра отсутствуют, они представляют собой 1) неприступные ребра или 2) часть отключенного компонента графа (поскольку для retain_all установлено значение по умолчанию False.

...