Создать взвешенный график из OSMnx для NetworKX - PullRequest
0 голосов
/ 11 января 2020

Я хочу сгенерировать график NetworKX со взвешенными краями, чтобы вес каждого ребра составлял его distance * driving speed on this road(if it exists) или, если скорость движения неизвестна, 100*distance для автомагистралей и 60*distance для городских дорог.

Я не смог найти пост, похожий на мои, за исключением этого , но должен быть способ сделать это автоматически.

Моя цель - найти путь с кратчайшим временем (с Дейкстрой) проезда между точкой A и B, и это то, что я делал до сих пор:

l1 = (A_lat,A_lon)
G = ox.graph_from_point(l1,distance= 100)
l1_node_id = ox.get_nearest_node(G,l1)   # Find closest node ID    

l2 = (B_lat,B_lon)
G = ox.graph_from_point(l2,distance = 100)
l2_node_id = ox.get_nearest_node(G,l2)   # Find closest node ID

dist = vincenty(l1, l2).meters    # The distance between l1 and l2


p1 = ((l1[0] + l2[0])/2,(l1[1]+l2[1])/2)    #The mid point between l1 and l2
dist = vincenty(l1, l2).meters              #The distance between l1 and l2
G = ox.graph_from_point(p1,distance = dist)
path = nx.shortest_path(G, l1_node_id, l2_node_id)   #Find the shortest path for cutoff

for path in nx.all_simple_paths(G, source=l1_node_id, target=l2_node_id,cutoff = len(path)):
    #Here I want to checke if "path" is the shortest path but right now it is without weight

В документации 1014 * они написали, что вес должен быть строкой но как я могу это сделать?

TIA

1 Ответ

0 голосов
/ 13 января 2020
fast=['motorway','trunk','primary','secondary','motorway_link','trunk_link','primary_link','secondary_link','escape','track']
slow = ['tertiary', 'residential','tertiary_link','living_street']
other = ['unclassified','road','service']

def find_speed(row):
    if row['highway'] in fast:
        return 100/3.6
    elif row['highway'] in slow:
        return 50/3.6
    elif row['highway'] in other:
        return 70/3.6
    else:
        return 5/3.6


nodes, edges = ox.graph_to_gdfs(G)
edges = edges.assign(speed=edges.apply(find_speed, axis=1))
edges['wgt'] = edges['length']/edges['speed']

UG = ox.gdfs_to_graph(nodes, edges)


for path in nx.all_shortest_paths(UG, source=l1_node_id, target=l2_node_id,weight = 'wgt'):
...