r5r生成的Travel Time Matrix未纳入公共交通耗时问题排查
问题描述
尝试使用r5r R包开展克利夫兰市超市的等时线可达性研究,步骤为:获取城市边界并生成网格质心;通过OSM获取道路网络与超市位置;导入本地GTFS公交数据后,使用travel_time_matrix生成出行时间矩阵。但输出仅得到532条结果,最大出行耗时仅29分钟,推测未纳入公共交通耗时,仅计算了步行时间。
使用代码如下:
# load required packages library(tidycensus) library(tidytransit) library(tmap) library(osmdata) library(tidyverse) library(osmextract) library(tigris) library(r5r) library(sf) cleveland_boundary = places("Ohio") %>% filter(NAME == "Cleveland") %>% st_transform(4326) cleveland_grid = st_make_grid(cleveland_boundary, square = FALSE, n=c(100,100), what = "polygons") %>% st_as_sf() %>% st_filter(cleveland_boundary) %>% mutate(id = seq(1, length(cleveland_grid$geometry), by=1)) %>% st_transform(4326) cleveland_centroids = st_centroid(cleveland_grid) cle_file = oe_match("Cleveland, Ohio") cle_grocery = oe_read(cle_file$url, layer = "points", quiet = TRUE) %>% st_transform(crs = st_crs(cleveland_boundary)) %>% st_filter(cleveland_boundary) %>% rename(id = osm_id) %>% st_transform(4326) dir.create("cle_network") cleveland_streets = oe_read(cle_file$url, layer = "lines", quiet = TRUE, download_directory = "cle_network") %>% filter(!is.na(highway)) %>% st_transform(crs = st_crs(cleveland_boundary)) %>% st_filter(cleveland_boundary) options(java.parameters = "-Xmx2G") # set up r5r core r5r_core <- setup_r5("cle_network", verbose = FALSE, overwrite = TRUE) ttm_wkday = travel_time_matrix(r5r_core = r5r_core, origins = cle_grocery, destinations = cleveland_centroids, mode = c("WALK", "TRANSIT"), departure_datetime = as.POSIXct("08-12-2022 14:00:00", format = "%d-%m-%Y %H:%M:%S"), max_walk_dist = 1000, max_trip_duration = 480, verbose = FALSE)
注:已将GTFS数据保存为CLEgtfs.zip,但存放目录为cle_networks(与代码中cle_network目录不一致)。
原因分析与解决方法
核心原因
- GTFS文件未被r5r加载:代码中
setup_r5指向的目录是cle_network,但GTFS文件存放在cle_networks,路径不匹配,导致r5r未读取到公交数据,仅基于步行网络计算时间。 - OSM数据格式错误:r5r需要完整的OSM PBF文件,而非手动提取的
lines层数据,当前代码仅提取了道路线要素,无法被r5r用于构建完整的交通网络。 - 内存分配不足:处理公交网络需要更大的Java内存,当前
-Xmx2G可能不足以加载完整的GTFS和OSM数据。
解决步骤
- 统一文件存放路径:将
CLEgtfs.zip移动到cle_network目录下,确保setup_r5指向的目录同时包含OSM PBF文件和GTFS压缩包。 - 重新获取完整OSM PBF文件:删除手动提取道路的代码,直接下载完整的OSM PBF文件到
cle_network目录:# 下载完整OSM PBF文件到cle_network目录 oe_download(cle_file$url, download_directory = "cle_network", quiet = TRUE) - 调整Java内存分配:增大内存配额,建议设置为
-Xmx4G或更高:options(java.parameters = "-Xmx4G") - 开启调试模式验证加载状态:将
setup_r5和travel_time_matrix的verbose参数设为TRUE,查看日志确认GTFS和OSM是否被成功加载:r5r_core <- setup_r5("cle_network", verbose = TRUE, overwrite = TRUE) ttm_wkday = travel_time_matrix(r5r_core = r5r_core, origins = cle_grocery, destinations = cleveland_centroids, mode = c("WALK", "TRANSIT"), departure_datetime = as.POSIXct("08-12-2022 14:00:00", format = "%d-%m-%Y %H:%M:%S"), max_walk_dist = 1000, max_trip_duration = 480, verbose = TRUE) - 验证GTFS文件有效性:使用
tidytransit检查GTFS文件是否可正常读取,确认时刻表数据完整:gtfs <- read_gtfs("cle_network/CLEgtfs.zip") # 查看线路数量 nrow(gtfs$routes) # 查看指定时间的公交班次 gtfs_sched <- tidytransit::filter_feed_by_date(gtfs, as.Date("2022-12-08"))
内容的提问来源于stack exchange,提问作者z_11122
相关产品推荐
相关产品推荐

