如何用R的tmap包生成含带标签点位与连线的交互式地图
解决tmap同时展示带标签点位与轨迹连线的问题
我来帮你搞定这个需求!其实核心很简单——把点图层和线图层叠加起来就可以实现单张图同时显示带标签的点位和连接它们的轨迹线,而且完全支持导出交互式地图。下面是完整的实现步骤和代码:
关键思路
tmap的图层是可以通过+号自由组合的,你之前分开绘制的track.point和track.line,只要把它们用+拼接,就能得到同时包含两者的地图。另外要确保你的points_to_line函数是可用的,我把这个函数的代码也附在下面,避免你因为缺失函数报错。
完整代码
# 加载所需包 library(ggmap) library(plyr) library(dplyr) library(sp) library(tmap) library(maps) # 创建示例数据 eg <- data.frame( longitude = c(-38.04434, -38.07048, -38.38147, -38.98167, -39.51479, -39.68861, -40.10173, -40.69829, -41.06727, -41.45114), latitude = c(-54.00679, -53.98419, -53.82259, -53.73171, -53.77248, -53.78981, -53.71934, -53.64412, -53.53544, -53.51021), PointNum=1:10, track=1 ) # 定义points_to_line函数(用于将点转换为线) points_to_line <- function(data, long, lat, sort_field = NULL) { if (!is.null(sort_field)) { data <- data[order(data[[sort_field]]), ] } coords <- data.frame(data[[long]], data[[lat]]) sp_line <- Line(coords) sp_lines <- Lines(list(sp_line), ID = "1") sp_lines_obj <- SpatialLines(list(sp_lines)) return(sp_lines_obj) } # 创建空间点数据框 sp.point <- SpatialPointsDataFrame( eg[,c("longitude","latitude")], eg[,3:4], proj4string = CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") ) # 创建空间线对象 sp.lines <- points_to_line( data = eg, long = "longitude", lat = "latitude", sort_field = "PointNum" ) proj4string(sp.lines) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") # 组合点图层和线图层 track_combined <- tm_shape(sp.lines) + tm_lines(col = "blue", lwd = 2) + # 先画轨迹线,避免被点覆盖 tm_shape(sp.point) + tm_dots(col = "red", size = 0.5) + tm_text("PointNum", size = 0.7, col = "black") # 预览组合后的地图 track_combined # 保存为交互式地图 save_tmap(tm = track_combined, filename = "track_combined.html")
细节说明
- 图层顺序:我把线图层放在前面,点图层放在后面,这样点不会被线遮挡,保证标签和点位清晰可见;
- 样式调整:我给线加了颜色和粗细,点也调整了大小,你可以根据自己的需求修改
tm_lines和tm_dots里的参数; - 交互式导出:直接把组合后的
track_combined传给save_tmap,就能得到包含所有元素的交互式HTML地图了。
内容的提问来源于stack exchange,提问作者Jono
相关产品推荐
相关产品推荐

