Как просто вычислить время в пути от одной точки до другой? (Без сюжета)

Я потратил много времени на чтение и тестирование примеров ноутбуков OSMnx, но я не мог придумать способ просто рассчитать время в пути от данной точки (координаты GPS) до другой. Я хотел бы оценить для каждой точки из моего списка, сколько времени потребуется, чтобы добраться до конкретной точки (иногда на расстоянии 100 км). Мне не нужно создавать график / карту / сюжет, поскольку мне нужна только продолжительность каждой поездки (и я думаю, что карты OSMnx лучше отображаются в масштабе города).

Я в отчаянии, так как я не мог найти простой способ сделать это в разных библиотеках Python ... Если выполнение этого расчета для +-10 тыс. Точек на карте в масштабе страны требует слишком много от OSMnx, может ли локально сохраненный файл pbf страны быть полезным для другого решения?

1 ответ

Когда вы хотите смоделировать большую исследуемую область, такую ​​как весь регион или целую страну, существуют неизбежные компромиссы: 1) точность модели против 2) размер области против 3) память / скорость. Вам нужно найти компромисс между одним из этих трех.

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

В приведенном ниже примере кода я выбрал компромисс №1: я смоделировал этот регион (Уэст-Мидлендс) по его автомагистралям и магистральным дорогам. Имея другую аналитическую цель, вы можете вместо этого пойти на компромисс. После создания модели я произвольно выбираю 1000 исходных и конечных точек широты и долготы, привязываю их к ближайшим узлам на графике и решаю кратчайшие пути по времени прохождения (с учетом ограничений скорости ) с многопроцессорной обработкой.

      import osmnx as ox

# get boundaries of West Midlands region by its OSM ID
gdf = ox.geocode_to_gdf('R151283', by_osmid=True)
polygon = gdf.iloc[0]['geometry']

# get network of motorways and trunk roads, with speed and travel time
cf = '["highway"~"motorway|motorway_link|trunk|trunk_link"]'
G = ox.graph_from_polygon(polygon, network_type='drive', custom_filter=cf)
G = ox.add_edge_speeds(G)
G = ox.add_edge_travel_times(G)

# randomly sample lat-lng points across the graph
origin_points = ox.utils_geo.sample_points(ox.get_undirected(G), 1000)
origin_nodes = ox.nearest_nodes(G, origin_points.x, origin_points.y)
dest_points = ox.utils_geo.sample_points(ox.get_undirected(G), 1000)
dest_nodes = ox.nearest_nodes(G, dest_points.x, dest_points.y)

%%time
# solve 1000 shortest paths between origins and destinations
# minimizing travel time, using all available CPUs
paths = ox.shortest_path(G, origin_nodes, dest_nodes, weight='travel_time', cpus=None)
# elapsed time: 9.8 seconds

Для более быстрого моделирования вы можете загружать сетевые данные из XML- файла .osm вместо того, чтобы выполнять многочисленные вызовы API Overpass. OSMnx по умолчанию делит область запроса на части размером 50 км x 50 км, а затем запрашивает Overpass для каждой части по одному, чтобы не превышать лимиты памяти сервера для каждого запроса. Вы можете настроить это параметр, а также выделение памяти сервера, если вы предпочитаете использовать функции запросов API OSMnx, а не функции из файла.

Другие вопросы по тегам