The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Getting started with GTFSwizard

GTFSwizard creates, reads, validates, explores, edits, and exports General Transit Feed Specification (GTFS) Schedule feeds. Its functions work with a wizardgtfs object: a named list of GTFS tables plus a dates_services table that connects calendar dates, services, and service patterns.

Use an included feed

The package includes two real, reduced examples from Fortaleza, Brazil. for_rail_gtfs is small enough for learning and examples; for_bus_gtfs is useful for checking workflows on a larger bus network.

library(GTFSwizard)

gtfs <- for_rail_gtfs
summary(gtfs)
#> <summary.wizardgtfs>
#>   Agency: METROFOR
#>   Service: 2020-01-02 to 2021-12-31 (614 active dates)
#>   3 routes; 215 trips; 39 stops; 6 shapes
#>   Median consecutive-stop spacing: 1144.6 m
#> 
#> Tables:
#>         agency       calendar calendar_dates         routes          stops 
#>              1              1             26              3             39 
#>     stop_times          trips         shapes 
#>           3420            215             80

Access an individual GTFS table with the usual list syntax.

head(gtfs$routes)
#> # A tibble: 3 × 9
#>   route_id route_short_name route_long_name      route_desc route_type route_url
#>   <chr>    <chr>            <chr>                <chr>           <int> <chr>    
#> 1 8        ""               VLT Parangaba Papicu ""                  1 ""       
#> 2 6        ""               Linha Sul            ""                  1 ""       
#> 3 7        ""               Linha Oeste          ""                  1 ""       
#> # ℹ 3 more variables: route_color <chr>, route_text_color <chr>,
#> #   agency_id <chr>
head(gtfs$stops)
#> # A tibble: 6 × 10
#>   stop_id stop_code stop_name       stop_desc stop_lat stop_lon zone_id stop_url
#>   <chr>   <chr>     <chr>           <chr>        <dbl>    <dbl> <chr>   <chr>   
#> 1 66      ""        Papicu          ""           -3.74    -38.5 ""      ""      
#> 2 65      ""        Antônio Sales   ""           -3.75    -38.5 ""      ""      
#> 3 64      ""        Pontes Vieira   ""           -3.75    -38.5 ""      ""      
#> 4 63      ""        São João do Ta… ""           -3.76    -38.5 ""      ""      
#> 5 41      ""        Borges de Melo  ""           -3.76    -38.5 ""      ""      
#> 6 40      ""        Vila União      ""           -3.77    -38.5 ""      ""      
#> # ℹ 2 more variables: location_type <int>, stop_timezone <chr>

Read an existing feed

read_gtfs() reads a GTFS zip archive and validates its required tables, fields, identifiers, sequences, dates, and times. Supply the archive path explicitly. To choose a file interactively, call explore_gtfs() without a feed in an interactive R session.

gtfs <- read_gtfs("path/to/feed.zip")
explore_gtfs() # choose a zip file and open the dashboard

Use as_wizardgtfs() when the GTFS tables are already available as a named list. If shapes.txt is absent, the default behavior infers straight lines from ordered stop coordinates for analysis and visualization.

converted <- as_wizardgtfs(unclass(for_rail_gtfs))
inherits(converted, "wizardgtfs")
#> [1] TRUE

Create a feed from tables

create_gtfs() validates the supplied tables using the same package rules. A feed must define service using calendar, calendar_dates, or both.

created <- create_gtfs(
  agency = data.frame(
    agency_id = "A",
    agency_name = "Demo Transit",
    agency_url = "https://example.com",
    agency_timezone = "America/Fortaleza"
  ),
  routes = data.frame(
    route_id = "R1", agency_id = "A", route_short_name = "1",
    route_long_name = "Central", route_type = 3
  ),
  trips = data.frame(
    route_id = "R1", service_id = "WK", trip_id = "T1"
  ),
  stop_times = data.frame(
    trip_id = "T1",
    arrival_time = c("08:00:00", "08:10:00"),
    departure_time = c("08:00:00", "08:10:00"),
    stop_id = c("S1", "S2"),
    stop_sequence = 1:2
  ),
  stops = data.frame(
    stop_id = c("S1", "S2"),
    stop_name = c("First", "Second"),
    stop_lat = c(-3.73, -3.74),
    stop_lon = c(-38.52, -38.53)
  ),
  calendar = data.frame(
    service_id = "WK",
    monday = 1, tuesday = 1, wednesday = 1, thursday = 1,
    friday = 1, saturday = 0, sunday = 0,
    start_date = "20260101", end_date = "20261231"
  )
)
#> GTFSwizard: building straight-line shapes from ordered stop coordinates.

created
#> <wizardgtfs>
#>   Agency: Demo Transit
#>   1 routes; 1 trips; 2 stops
#> 
#> $agency [1 rows]
#> # A tibble: 1 × 4
#>   agency_id agency_name  agency_url          agency_timezone  
#>   <chr>     <chr>        <chr>               <chr>            
#> 1 A         Demo Transit https://example.com America/Fortaleza
#> 
#> $routes [1 rows]
#> # A tibble: 1 × 5
#>   route_id agency_id route_short_name route_long_name route_type
#>   <chr>    <chr>     <chr>            <chr>                <dbl>
#> 1 R1       A         1                Central                  3
#> 
#> $trips [1 rows]
#> # A tibble: 1 × 4
#>   route_id service_id trip_id shape_id
#>   <chr>    <chr>      <chr>   <chr>   
#> 1 R1       WK         T1      shape-1 
#> 
#> $stop_times [2 rows]
#> # A tibble: 2 × 5
#>   trip_id arrival_time departure_time stop_id stop_sequence
#>   <chr>   <chr>        <chr>          <chr>           <int>
#> 1 T1      08:00:00     08:00:00       S1                  1
#> 2 T1      08:10:00     08:10:00       S2                  2
#> 
#> $stops [2 rows]
#> # A tibble: 2 × 4
#>   stop_id stop_name stop_lat stop_lon
#>   <chr>   <chr>        <dbl>    <dbl>
#> 1 S1      First        -3.73    -38.5
#> 2 S2      Second       -3.74    -38.5
#> 
#> $calendar [1 rows]
#> # A tibble: 1 × 10
#>   service_id monday tuesday wednesday thursday friday saturday sunday start_date
#>   <chr>       <dbl>   <dbl>     <dbl>    <dbl>  <dbl>    <dbl>  <dbl> <date>    
#> 1 WK              1       1         1        1      1        0      0 2026-01-01
#> # ℹ 1 more variable: end_date <date>
#> 
#> $shapes [2 rows]
#> # A tibble: 2 × 5
#>   shape_id shape_pt_lat shape_pt_lon shape_pt_sequence shape_dist_traveled
#>   <chr>           <dbl>        <dbl>             <int>               <dbl>
#> 1 shape-1         -3.73        -38.5                 1                  0 
#> 2 shape-1         -3.74        -38.5                 2               1571.

Inspect and plot

The print method previews tables, summary() reports system-level properties, and plot() draws the network. Analytical functions return ordinary tibbles or sf objects so they remain compatible with standard R workflows.

plot(gtfs)

Export a feed

write_gtfs() removes the internal dates_services table, restores standard GTFS date and spatial columns, and writes a zip archive.

output <- tempfile(fileext = ".zip")
write_gtfs(created, output)
file.exists(output)
#> [1] TRUE
unlink(output)

Continue with service analysis, or learn how to filter and edit feeds.

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.