如何创建多线串sf对象以实现Leaflet地图时间滑块功能
问题根源
你之前的代码出错是因为在data.table分组计算时,调用了全局的包含所有月份坐标的mat_list,导致每个月份分组都生成了包含全量数据的多线对象,没有实现按月份拆分的效果。
正确处理逻辑
- 先对每条行程记录,单独生成对应的线段坐标矩阵(注意sf要求坐标顺序是经度在前,纬度在后)
- 按
arrival_month分组,将当月所有线段的坐标矩阵汇总为列表,转换为st_multilinestring对象 - 生成的sf对象每行对应一个月份的所有路径,可直接传入
addTimeslider使用
完整可运行代码
# 加载依赖包 library(dplyr) library(leaflet) library(leaflet.extras2) library(sf) library(data.table) # 示例数据集 data <- structure(list(arrival_month = structure(c(3L, 3L, 4L, 4L, 4L, 5L, 5L, 6L, 6L, 6L), .Label = c("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"), class = c("ordered", "factor")), start_lat = c(33.40693, 33.64672, 33.57127, 33.42848, 33.54936, 33.53418, 33.60399, 33.49554, 33.5056, 33.61696), start_long = c(-112.0298, -111.9255, -112.049, -112.0998, -112.0912, -112.0911, -111.9273, -111.9687, -112.0563, -111.9866), finish_lat...4 = c(33.40687, 33.64776, 33.57125, 33.42853, 33.54893, 33.53488, 33.60401, 33.49647, 33.5056, 33.61654 ), finish_lat...5 = c(-112.0343, -111.9303, -112.0481, -112.0993, -112.0912, -112.0911, -111.931, -111.9711, -112.0541, -111.986 )), row.names = c(NA, -10L), class = c("data.table", "data.frame")) # 按月份生成多线sf对象 sf_month <- data[, # 逐行生成单条行程的线段坐标矩阵 .(line = list(matrix( c(start_long, finish_lat...5, start_lat, finish_lat...4), nrow = 2, dimnames = list(c("start", "end"), c("lon", "lat")) ))), by = .(arrival_month, seq_len(nrow(data))) ][, # 按月份分组,将当月所有线段转为多线对象 .(geometry = st_sfc(st_multilinestring(line))), by = arrival_month ] |> st_as_sf(crs = 4326) # 设定WGS84坐标系 # 测试时间滑块功能 leaflet() |> addTiles() |> addTimeslider( data = sf_month, options = timesliderOptions( timeAttribute = "arrival_month", showControls = TRUE ) )
处理后的sf_month对象每行仅包含对应月份的所有行程路径,完全符合addTimeslider的调用要求,滑动时间滑块即可切换不同月份的路径展示。
内容的提问来源于stack exchange,提问作者Biased_Observer
相关产品推荐
相关产品推荐

