首页 > 解决方案 > 如何简单地计算从一个点到另一个点的旅行时间?(没有情节)

问题描述

我花了很多时间阅读和测试OSMnx 的示例笔记本,但我想不出一种方法来简单地计算从给定点(GPS 坐标)到另一个点的旅行时间。我想估计,对于我列表中的每个点,到达特定点(有时 100 公里)需要多长时间。我不需要生成图形/地图/绘图,因为我只需要每次旅行的持续时间(而且我认为 OSMnx 地图在城市规模上的渲染效果更好)。

我非常绝望,因为我无法找到一种简单的方法来跨不同的 Python 库执行此操作...如果在国家比例尺地图中对 +-10k 点进行此计算对 OSMnx 的要求太多,本地存储的 pbf 文件是否可以对另一种解决方案有帮助吗?

标签: pythonosmnxosrm

解决方案


当您想要对大型研究区域(例如整个地区或整个国家/地区)进行建模时,存在固有的权衡: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

为了加快建模速度,您可以从 .osm XML文件加载网络数据,而不必多次调用 Overpass API。默认情况下,OSMnx 将您的查询区域划分为 50 公里 x 50 公里的块,然后每次为每个块查询 Overpass,以不超过服务器的每次查询内存限制。如果您更喜欢使用 OSMnx 的 API 查询功能而不是其源文件功能,则可以配置max_query_area_size参数以及服务器内存分配。


推荐阅读