如何使用R制作车辆沿OSRM规划路线移动的可视化动画
R语言实现车辆沿规划路线行驶的动画制作方法
需求背景
我们已经通过osrm包完成了纽约世贸中心一号楼到麦迪逊广场公园的路径查询,得到总行驶时间为10.37分钟,现在需要制作可视化动画,以标记点代表车辆,沿规划路径匀速行驶,可使用tmap工具实现。
原路径查询的静态效果如下:
完整实现代码
1. 基础路径查询(原有逻辑保留)
library(sf) library(dplyr) library(tidygeocoder) library(osrm) library(tmap) # 起点:纽约世贸中心一号楼,终点:纽约麦迪逊广场公园 addresses <- c("285 Fulton St, New York, NY 10007", "11 Madison Ave, New York, NY 10010") # 地址转坐标,转为sf空间对象 data <- tidygeocoder::geo(addresses, method = "osm") %>% st_as_sf(coords = c("long", "lat"), crs = 4326) # 调用OSRM接口查询路径 osroute <- osrm::osrmRoute(loc = data, returnclass = "sf")
2. 采样车辆行驶点位(适配匀速假设)
因为我们假设车辆匀速行驶,所以对路径线做等距离采样,每个采样点对应动画一帧的车辆位置:
# 总行驶时长(单位:分钟) total_time <- osroute$duration # 设置动画总帧数,数值越大动画越流畅,生成速度越慢 n_frames <- 60 # 沿路径等距采样点位 sample_points <- st_line_sample(osroute$geometry, n = n_frames) %>% st_cast("POINT") %>% st_as_sf(crs = 4326) %>% # 给每帧加时间标记 mutate(frame = 1:n(), time_passed = total_time * frame / n_frames)
3. 生成tmap动画并导出
# 先创建tmap的动画图层 tm <- tm_shape(osroute) + # 底图用CartoDB浅色风格 tm_basemap("CartoDB.Positron") + # 绘制规划路径红线 tm_lines(col = "red", lwd = 2) + # 绘制起点终点标记 tm_shape(data) + tm_markers(size = 1, labels = ~address) + # 绘制当前帧的车辆位置 tm_shape(sample_points) + tm_symbols(col = "blue", size = 0.5, group = "frame") + # 按frame列分帧生成动画 tm_facets(along = "frame", free.coords = FALSE) # 导出为gif动图,如果要导出mp4可以把后缀改成.mp4,需要系统安装ffmpeg tmap_animation(tm, filename = "route_animation.gif", delay = 100, width = 800, height = 600)
参数说明
n_frames:控制动画的总帧数,数值越高动画越平滑,同时生成耗时越长delay:控制每帧之间的间隔,单位为1/100秒,数值越小动画播放速度越快- 如果需要导出MP4格式的视频,只需要把
tmap_animation的文件名后缀改为.mp4即可,需要提前在系统中安装ffmpeg工具。
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

