如何使用传单在R中创建GTFS数据的交互式绘图?

如何使用传单在R中创建GTFS数据的交互式绘图?,r,dictionary,gis,leaflet,gtfs,R,Dictionary,Gis,Leaflet,Gtfs,我想创建一个显示城市公共交通线路的交互式地图。我正试图通过R中的传单来做到这一点(但我愿意接受其他选择、建议?) 数据:传输系统的数据采用GTFS格式,以文本文件(.txt)的形式组织,我将其作为数据帧读入R。* 问题是:我找不到如何指示每条多边形线的id(可变形状_id),因此绘图将实际遵循每条运输线的路线。相反,它是在一个随机序列中连接点 以下是我迄今为止所做的尝试,但没有成功: # Download GTFS data of the Victoria Regional Transit Sy

我想创建一个显示城市公共交通线路的交互式地图。我正试图通过R中的传单来做到这一点(但我愿意接受其他选择、建议?)

数据:传输系统的数据采用GTFS格式,以文本文件(.txt)的形式组织,我将其作为数据帧读入R。*

问题是:我找不到如何指示每条多边形线的id(可变形状_id),因此绘图将实际遵循每条运输线的路线。相反,它是在一个随机序列中连接点

以下是我迄今为止所做的尝试,但没有成功:

# Download GTFS data of the Victoria Regional Transit System
  tf <- tempfile() 
  td <- tempdir()
  ftp.path <- "http://www.gtfs-data-exchange.com/agency/bc-transit-victoria-regional-transit-system/latest.zip"
  download.file(ftp.path, tf) 

# Read text file to a data frame
  zipfile <- unzip( tf , exdir = td )
  shape <- read.csv(zipfile[9])

# Create base map
  basemap <- leaflet() %>% addTiles()


# Add transit layer
  basemap  %>% addPolylines(lng=shape$shape_pt_lon, lat=shape$shape_pt_lat, 
                            fill = FALSE,
                            layerId =shape$shape_id) 
#下载维多利亚地区公交系统的GTFS数据

tf您的问题不在于方法,而在于数据:请注意,您下载的是8MB,而您试图通过Shining加载到传单中的行文件是5MB。作为一项一般原则,您应该始终首先尝试使用小数据集的新方法,然后再扩展它们。以下是我诊断问题并解决问题的步骤

第1阶段:探索并细分数据 是的,它是类似的,因此我们可以使用
map2Spatial*
来转换它:

shape_map <- list(x = shape$shape_pt_lon, y = shape$shape_pt_lat)
shape_lines <- map2SpatialLines(shape_map, IDs = ids[1])
plot(shape_lines) # success - this plots a single line!
第四阶段:情节 使用
SpatialLines
对象使代码稍微短一些-在这种情况下,这将绘制前10行:

leaflet() %>% 
  addTiles() %>%
  addPolylines(data = shape_lines)

结论
在使用正确的ID将数据转换为用于打印的空间*数据类型之前,需要处理数据并对其进行操作
maptools::map2Spatial*
unique()
和一个巧妙的
for
循环可以解决这个问题。

它工作得很好。非常感谢。不过,我在想你提到的“数据问题”。因为,最后,当我应用你的解决方案绘制所有运输路线时,你的代码也会加载到传单中一个5 MB的对象(shape_lines)。确实如此,但出于测试和再现性的目的,问题应该减少到最小/最简单的形式你可以试着为每条路线挑选最长的形状,这样你就不会在每条路线上有重复的形状-这将使你需要绘制的数据小得多见我的演讲(第27页)(也在YouTube上)
shape_map <- list(x = shape$shape_pt_lon, y = shape$shape_pt_lat)
shape_lines <- map2SpatialLines(shape_map, IDs = ids[1])
plot(shape_lines) # success - this plots a single line!
for(i in 2:10){
  shape <- shape_orig[shape_orig$shape_id == ids[i],]
  shape_map <- list(x = shape$shape_pt_lon, y = shape$shape_pt_lat)
  shape_temp <- map2SpatialLines(shape_map, IDs = ids[i])
  shape_lines <- spRbind(shape_lines, shape_temp)
}
leaflet() %>% 
  addTiles() %>%
  addPolylines(data = shape_lines)