You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Python OSMNX可视化车辆GPS路线的参数结构咨询

刚好我对OSMNX的路径可视化这块比较熟,来给你掰扯清楚这两个函数的route参数到底要传啥,以及怎么从你的GPS数据生成符合要求的路径~

一、先搞懂:OSMNX里的route到底是什么?

不管是plot_graph_route还是plot_graph_folium,它们要的route本质都是一串按行驶顺序排列的OSM节点ID(整数类型),而且这些节点必须属于你传入的路网图对象G(就是你用ox.graph_from_place或者ox.graph_from_bbox生成的那个NetworkX图)。简单说,就是你要告诉OSMNX:“我要画从节点A→B→C→…的路径”。

1. plot_graph_routeroute参数

这个函数是用来生成静态Matplotlib地图的,直接传纯整数列表就行。举个简单例子:

import osmnx as ox
import matplotlib.pyplot as plt

# 先获取目标区域的路网(比如曼哈顿的驾车路网)
G = ox.graph_from_place("Manhattan, New York, USA", network_type="drive")

# 假设我们已经有了起点和终点的节点ID,生成最短路径的节点列表
orig_node = ox.nearest_nodes(G, -74.0060, 40.7128)  # 纽约坐标示例
dest_node = ox.nearest_nodes(G, -73.9857, 40.7484)
route = ox.shortest_path(G, orig_node, dest_node, weight="length")

# 画静态路线图
fig, ax = ox.plot_graph_route(G, route, route_color="#ff0000", route_linewidth=3)
plt.show()

2. plot_graph_foliumroute参数

这个函数是生成交互式Folium网页地图的,route参数要求和上面完全一样——还是按顺序排列的OSM节点ID列表。示例代码:

import osmnx as ox
import folium

G = ox.graph_from_place("Manhattan, New York, USA", network_type="drive")
orig_node = ox.nearest_nodes(G, -74.0060, 40.7128)
dest_node = ox.nearest_nodes(G, -73.9857, 40.7484)
route = ox.shortest_path(G, orig_node, dest_node, weight="length")

# 生成交互式地图并保存
folium_map = ox.plot_graph_folium(G, route=route, route_color="#0000ff", route_weight=5)
folium_map.save("vehicle_route.html")
二、从你的GPS DataFrame生成符合要求的route

你的数据是带时间戳的经纬度,得先把这些GPS点“贴”到OSMNX的路网上,再拼成连续的路径。步骤如下:

1. 先整理GPS数据

首先按时间戳排序,确保是车辆行驶的先后顺序:

# 假设你的DataFrame叫gps_df,包含timestamp(时间戳)、lon(经度)、lat(纬度)列
gps_df = gps_df.sort_values("timestamp").reset_index(drop=True)

2. 把GPS点匹配到路网节点

ox.nearest_nodes函数,把每个经纬度点对应到路网G里最近的OSM节点ID:

# 根据GPS数据的范围生成路网(避免获取过大的区域)
bbox = [gps_df.lat.min(), gps_df.lat.max(), gps_df.lon.min(), gps_df.lon.max()]
G = ox.graph_from_bbox(*bbox, network_type="drive")

# 给每个GPS点匹配对应的OSM节点ID
gps_df["osm_node_id"] = ox.nearest_nodes(G, gps_df.lon, gps_df.lat)

3. 生成连续的路径节点列表

如果直接用gps_df["osm_node_id"].tolist()当route,可能会因为相邻GPS点间隔大,导致路径跳变。更靠谱的方式是对每一对相邻的匹配节点,用最短路径补全中间的路网节点:

route = []
for i in range(len(gps_df) - 1):
    start_node = gps_df.loc[i, "osm_node_id"]
    end_node = gps_df.loc[i+1, "osm_node_id"]
    # 获取两个节点之间的最短路径(按道路长度计算)
    segment = ox.shortest_path(G, start_node, end_node, weight="length")
    if segment:  # 确保路径存在(避免路网覆盖不到的情况)
        route.extend(segment[:-1])  # 去掉最后一个节点,避免和下一段的起点重复
# 别忘了添加最后一个节点
route.append(gps_df.loc[len(gps_df)-1, "osm_node_id"])

4. 最后可视化

现在这个route列表就可以直接传入plot_graph_routeplot_graph_folium了,完美适配两个函数的要求!

小提醒
  • 一定要确保你的路网G覆盖了所有GPS点的范围,不然节点匹配会出错
  • 如果GPS点间隔太大,建议先对GPS数据做插值,或者用上面的路径补全方式,这样生成的路线更贴合实际行驶轨迹

内容的提问来源于stack exchange,提问作者Tugberk Ayar

火山引擎 最新活动