如何用R的tidytransit基于GTFS生成单条可视化公交线路?
解决GTFS路线双向路径可视化问题
针对你遇到的同一条路线显示双向路径、视觉冗余的问题,可通过以下几种方法生成单条可视化线路,同时保留完整路径(包括环路):
方法一:生成双向路径的中线(推荐)
利用lwgeom包的st_centerline()函数,将同路线的双向路径合并后生成中线,完美解决双向车道视觉重复的问题,同时保留环路完整结构。
步骤代码:
# 加载所需包(若未安装lwgeom,先运行install.packages("lwgeom")) library(tidytransit) library(tidyverse) library(sf) library(tmap) library(lwgeom) # 加载并处理GTFS数据 gtfs <- read_gtfs("https://www.riderta.com/sites/default/files/gtfs/latest/google_transit.zip") gtfs_sf <- gtfs_as_sf(gtfs) routes <- get_route_geometry(gtfs_sf) # 按路线分组,合并双向路径并生成中线 routes_single_line <- routes %>% # 按唯一路线标识分组,保留路线名称信息 group_by(route_id, route_short_name, route_long_name) %>% # 合并同路线的所有几何路径 summarise(geometry = st_union(geometry), .groups = "drop") %>% # 生成双向路径的中线 mutate(geometry = st_centerline(geometry)) # 可视化单条线路 tmap_mode("view") qtm(routes_single_line)
方法二:投影后简化路径(适合无需精确中线的场景)
若不想依赖lwgeom,可先将地理坐标系(WGS84)转换为投影坐标系(如UTM,以米为单位),合并路径后简化,再转回原坐标系,减少视觉冗余。
步骤代码:
# 加载所需包 library(tidytransit) library(tidyverse) library(sf) library(tmap) # 加载并处理GTFS数据 gtfs <- read_gtfs("https://www.riderta.com/sites/default/files/gtfs/latest/google_transit.zip") gtfs_sf <- gtfs_as_sf(gtfs) routes <- get_route_geometry(gtfs_sf) # 转换为UTM投影(根据数据所在区域选择对应EPSG,示例为美国德州区域的EPSG:32614) routes_single_line <- routes %>% st_transform(32614) %>% group_by(route_id, route_short_name, route_long_name) %>% summarise(geometry = st_union(geometry), .groups = "drop") %>% # 简化路径,dTolerance为简化阈值(单位:米,数值越大简化程度越高) mutate(geometry = st_simplify(geometry, dTolerance = 10)) %>% # 转回WGS84坐标系 st_transform(4326) # 可视化 tmap_mode("view") qtm(routes_single_line)
注意事项:
- 选择UTM投影时,需根据数据所在地理位置匹配正确的EPSG代码(可通过
sf::st_crs()查看原数据坐标系,再查找对应区域的UTM EPSG)。 dTolerance参数可根据需求调整,平衡路径简化程度与精度。
内容的提问来源于stack exchange,提问作者z_11122
相关产品推荐
相关产品推荐

