Самый быстрый способ спроецировать график на espg: 4326 в OSmnx - PullRequest
0 голосов
/ 19 июня 2020

Я использовал osmnx.graph_project OSmnx, чтобы сначала спроецировать свой график в систему координат UTM, чтобы использовать функцию consolidate_intersections, а затем ox.project_graph(G_proj_ConsolidateIntersection, to_crs='epsg:4326'), чтобы спроецировать его в систему координат широты-долготы, чтобы использовать ox.get_nearest_nodes . Эта последняя проекция занимает много времени (5 минут), тогда как первая проекция выполняется за секунды. Есть ли лучший и более быстрый способ проецирования на epsg: 4326? Я посмотрел на этот ответ , но когда я выполняю эту строку gdf = gpd.GeoDataFrame(geometry=intersections), я получаю следующую ошибку:

ValueError: Unknown column

Вот пример с крайней стороны (график я работая он меньше, но я надеюсь, что это иллюстрирует мою точку зрения):

import osmnx as ox
G = ox.graph_from_place('Edmonton, Canada', network_type='drive', simplify=False)
# 39.1 s

G_proj = ox.project_graph(G)
# 15.9 s

G_proj_ConsolidateIntersection = ox.consolidate_intersections(G_proj)
# 14 min 45 s

G_proj_ConsolidateIntersection_LatLon = ox.project_graph(G_proj_ConsolidateIntersection, to_crs='epsg:4326')
# 44 min 35 s

Также gpd.GeoDataFrame(geometry=G_proj_ConsolidateIntersection) вызывает ошибку Unknown column.

1 Ответ

1 голос
/ 20 июня 2020

Две вещи. Во-первых, убедитесь, что вы используете последнюю версию OSMnx, поскольку в предыдущем выпуске были значительные улучшения производительности. Во-вторых, все это будет намного, намного быстрее, если вы сначала упростите свой график.

Но, что более важно, на самом деле нет смысла объединять пересечения , если вы уже не упростили свой график , потому что концепция «пересечений» реального мира бессмысленна в неупрощенном (расширенном) графе. Только когда граф упрощен, узлы модели соответствуют реальным концепциям пересечений и тупиков. Подробности см. В документации и соответствующей литературе.

Вот фрагмент кода, сравнивающий ваши исходные тайминги (слева) и мои упрощенные тайминги (справа):

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

G = ox.graph_from_place('Edmonton, Canada', network_type='drive', simplify=True)
# 39.1 s vs 18.2 s

G_proj = ox.project_graph(G)
# 15.9 s vs 8.9 s

G_proj_con = ox.consolidate_intersections(G_proj)
# 14 m 45 s vs 24.2 s

G_con = ox.project_graph(G_proj_con, to_crs='epsg:4326')
# 44 m 35 s vs 6.4 s

РЕДАКТИРОВАТЬ: Я только что повторно запустил фрагмент кода, который я поделился выше, но изменил simplify=False, и мои тайминги с использованием последней версии все еще намного быстрее, чем то, что вы видели. Например, последние 2 строки кода выше закончились за 6 мин. 20 сек. И 12 сек. Соответственно (по сравнению с вашими временными интервалами 14 мин. 45 сек. И 44 мин. 35 сек.).

...