Python实现真实地图两点间路线规划及各点到达时间计算
OSMnx路线规划问题解决方案
1. 节点ID转经纬度
OSMnx路网图的每个节点字典中直接存储了经纬度信息:graph.nodes[node_id]['y']对应纬度,graph.nodes[node_id]['x']对应经度。遍历路径节点列表,即可批量转换为经纬度坐标。
2. 计算各点到达时间
- 自定义速度场景:先获取路段长度(单位:米),将长度转换为公里后除以自定义速度(单位:km/h)得到小时数,再转换为秒/分钟等单位,累加每段时间得到各节点的累计到达时间。
- 默认时间权重场景:OSMnx已为路网边添加
travel_time属性(基于默认速度计算),直接累加相邻节点间的travel_time即可。
3. 优化代码运行速度
- 缩小路网范围:用
graph_from_point替代graph_from_place,以起点终点的中点为中心,下载指定半径内的路网,避免加载整个城市的超大图。 - 简化路网:开启
simplify=True(OSMnx默认开启),合并冗余节点和边,减少计算量。 - 批量调用API:一次性获取起点和终点的最近节点,减少函数调用次数。
完整解决方案代码
import osmnx as ox import networkx as nx # OSMnx基础配置 ox.settings.log_console = True ox.settings.use_cache = True ox.settings.simplify = True # 输入参数 start_latlng = (35.73509, 51.4171) end_latlng = (35.73674, 51.40611) mode = 'walk' custom_speed = 4.5 # 自定义步行速度,单位:km/h optimizer = 'time' # 加载指定范围的路网(半径1500米,覆盖起点终点) center_point = ((start_latlng[0] + end_latlng[0])/2, (start_latlng[1] + end_latlng[1])/2) graph = ox.graph_from_point(center_point, dist=1500, network_type=mode) # 批量获取起点、终点的最近节点 orig_node, dest_node = ox.distance.nearest_nodes(graph, [start_latlng[1], end_latlng[1]], [start_latlng[0], end_latlng[0]]) # 计算最短路径 shortest_route = nx.shortest_path(graph, orig_node, dest_node, weight=optimizer) # 转换节点为经纬度坐标 route_coords = [(graph.nodes[node]['y'], graph.nodes[node]['x']) for node in shortest_route] # 计算各节点到达时间(单位:秒) arrival_times = [0.0] # 起点时间设为0 for i in range(len(shortest_route)-1): u, v = shortest_route[i], shortest_route[i+1] # 获取路段长度,用自定义速度计算时间 segment_length = graph.edges[u, v, 0]['length'] segment_time = (segment_length / 1000) / custom_speed * 3600 # 若使用默认travel_time,替换为:segment_time = graph.edges[u, v, 0]['travel_time'] arrival_times.append(arrival_times[-1] + segment_time) # 生成期望格式的结果 result = list(zip(route_coords, arrival_times)) # 输出结果 for item in result: print(item)
内容的提问来源于stack exchange,提问作者mohsen
相关产品推荐
相关产品推荐

