【问题标题】:How to simply compute the travel time from one point to an other? (Without a plot)如何简单地计算从一个点到另一个点的旅行时间? (没有情节)
【发布时间】:2021-11-29 07:47:43
【问题描述】:

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

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

【问题讨论】:

  • 谢谢,但我正在寻找旅行时间(步行、骑自行车或开车),这似乎只能测量距离?
  • 如果你只有 GPS 点那么你不能直接计算这些细节。您需要知道允许的速度。步行可以通过使用平均步行速度来估计。这取决于您可以获得有关位置点的其他信息。 JSON 中的信息是否包含其他详细信息,还是只是一个纯 GPS 位置?
  • 我知道您不想听到它,但您是否考虑过改用 Google Maps API?谷歌投入了大量资金来绘制世界大部分地区的所有街道细节。使用 Google Maps API 在 python 中查询数据很简单。这些地图保持最新。 medium.com/future-vision/…
  • @James 我所拥有的是我点的纯 GPS 位置。我查看了 Google Maps API,但有一个速率限制,这就是为什么我想使用 OSRM 或 Graph Hopper(Opens Street Map 使用的 API),因为它们看起来也很准确(并且是开放的!)

标签: python osmnx osrm


【解决方案1】:

当您想要为整个区域或整个国家/地区等大型研究区域建模时,存在固有的权衡取舍:1) 模型精度与 2) 区域大小与 3) 内存/速度。您需要权衡这三者之一。

首先,您可以建模一个粗粒度的网络,例如仅在该地区/国家的主要道路,而不是数百万条细粒度的住宅街道和路径。其次,您可以研究较小的区域。第三,您可以配置一台具有大量内存的机器,然后让脚本运行一段时间以完成该过程。您的权衡取决于您自己的分析需求。

在下面的示例代码中,我选择权衡 #1:我已经通过高速公路和主干道对该地区(西米德兰兹)进行了建模。给定不同的分析目标,您可能会权衡其他事情。创建模型后,我随机sample 1000个起点和终点经纬度点,将它们捕捉到图中的nearest nodes,并通过travel time(占speed限制)求解shortest paths(占speed限制) .

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 file 加载网络数据,而不必多次调用 Overpass API。默认情况下,OSMnx 将您的查询区域划分为 50 公里 x 50 公里的块,然后每次查询每个块的 Overpass 以不超过服务器的每次查询内存限制。如果您更喜欢使用 OSMnx 的 API 查询功能而不是其源文件功能,您可以 configure 这个 max_query_area_size 参数以及服务器内存分配。

【讨论】:

  • 感谢您的回答!有没有办法在像西米德兰兹一样加载的区域内,在两个精确的纬度点(而不是随机采样的点)之间获得shortest_path?万事如意
  • 是的。只需将您想要的任何坐标传递给nearest_nodes 函数即可。
猜你喜欢
  • 2013-11-10
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多