Сохраните и повторно загрузите взвешенный график из OSMnx для NetworkX

#networkx #osmnx

#networkx #osmnx

Вопрос:

Я использую OSMnx для получения графика и добавления нового атрибута ребра (w3), представляющего пользовательский вес для каждого ребра. Затем я могу успешно найти 2 разных кратчайших пути между 2 точками, используя NetworkX и ‘length’, ‘w2’. Все работает нормально, это мой код:

 G = ox.graph_from_place(PLACE, network_type='all_private', retain_all = True, simplify=True,truncate_by_edge=False) ``` 
w3_dict = dict((zip(zip(lu, lv, lk),lw3)))
nx.set_edge_attributes(G, w3_dict, "w3") 
route_1 = nx.shortest_path(G, node_start, node_stop, weight = 'length')
route_2 = nx.shortest_path(G, node_start, node_stop, weight = 'w3')
  

Теперь я хотел бы сохранить G на диск и снова открыть его, чтобы позже выполнять дополнительные задачи навигации. Но после сохранения его с:

 ox.save_graph_xml(G, filepath='DATA/network.osm')
  

и снова откройте его с помощью:

 G = ox.graph_from_xml('DATA/network.osm')
  

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

Комментарии:

1. попробуйте использовать edge_attrs параметр

Ответ №1:

Используйте функции ox.save_graphml и ox.load_graphml для сохранения / загрузки полнофункциональных графиков OSMnx / NetworkX на диск / с диска для последующего использования. Функция сохранения xml существует только для того, чтобы разрешить сериализацию в .osm формате файла для приложений, которым это требуется, и имеет множество ограничений для соответствия этому.

 import networkx as nx
import osmnx as ox
ox.config(use_cache=True, log_console=True)

# get a graph, set 'w3' edge attribute
G = ox.graph_from_place('Piedmont, CA, USA', network_type='drive')
nx.set_edge_attributes(G, 100, 'w3')

# save graph to disk
ox.save_graphml(G, './data/graph.graphml')

# load graph from disk and confirm 'w3' edge attribute is there
G2 = ox.load_graphml('./data/graph.graphml')
nx.get_edge_attributes(G2, 'w3')
  

Комментарии:

1. Да, атрибут есть! Но значения моего словаря теперь рассматриваются как строки, в то время как перед сохранением они плавают. Я работал над извлечением словаря и преобразованием строк в значения с плавающей запятой, но мне было непонятно, в чем причина этого изменения.

2. OSMnx должен пойти на некоторые уступки, чтобы изящно сериализовать все в формат graphml. Упорядочивание является одним из них.