Python code for simulating transit lines based on General Transit Feed Specification (GTFS) data.
This project is inspired by @QuadMet on Twitter/X who created an animation of Portland, OR transit vehicles based off of GTFS data. They used the 'GTFS Map Generator' from Dan Snow (checkout some simulations of their the Chicago L Trains). However, that code was in R, and I don't know R, so I decided to redo it all in Python.
Here is an example of how to generate a transit simulation for Sound Transit's 1 Line at 8am on Dec 25, 2024.
python3 main.py -u https://www.soundtransit.org/GTFS-rail/40_gtfs.zip -d 2024-12-25 -s 08:00:00 -r 100479 2LINE -t Foobar
The following flags can be passed when using the command line:
--file
- Specify a GTFS ZIP file to use. File should be in the /data/gtfs-data
folder
--url
- Specify a URL to get a GTFS ZIP file.
--date
- Specify the start date of the simulation in YYYY-MM-DD format.
--start-time
- Specify the start time of the simulation in hh:mm:ss format. The timezone used is that of the transit agency specified in the GTFS feed.
--end-time
- Specify the end time of the simulation in hh:mm:ss format. The timezone used is that of the transit agency specified in the GTFS feed.
--routes
- Declare which Route IDs should be displayed in the simulation.
--title
- The name to be used on the output GIF file.
python3 main.py -u https://gitlab.com/LACMTA/gtfs_rail/raw/master/gtfs_rail.zip -d 2024-12-25 -s 08:00:00 -r 807 803 801 -t LA Metro
Most of the heavy lifting is being done by gtfs_kit, which take in GTFS feed data and allows you to query it in a number of ways. The most important part of this is feed.locate_trips()
, which is able to figure out where transit vehicles are at a given point in time.
Matplotlib's FuncAnimation
is then used to animate the vehicles over an array of times
Most transit agencies will make their GTFS data availble for public download, so just try searching for " GTFS data". As an example, Sound Transit provides GTFS data for most transit agencies in the Seattle area on their website