70 releases (29 breaking)

new 0.30.0 Jan 11, 2022
0.29.1 Dec 15, 2021
0.29.0 Oct 29, 2021
0.27.0 Jul 20, 2021
0.4.2 May 2, 2018

#70 in Parser implementations

Download history 76/week @ 2021-09-28 20/week @ 2021-10-05 89/week @ 2021-10-12 9/week @ 2021-10-19 28/week @ 2021-10-26 108/week @ 2021-11-02 38/week @ 2021-11-09 22/week @ 2021-11-16 50/week @ 2021-11-23 116/week @ 2021-11-30 88/week @ 2021-12-07 50/week @ 2021-12-14 11/week @ 2021-12-21 55/week @ 2021-12-28 33/week @ 2022-01-04 62/week @ 2022-01-11

164 downloads per month
Used in gtfs-geojson

MIT license

105KB
2K SLoC

GTFS Model crates.io

The General Transit Feed Specification (GTFS) is a commonly used model to represent public transit data.

This crates brings serde structures of this model and helpers to read GTFS archives.

Using

This crates has 2 main entry-points.

Gtfs

The most common one is to create a gtfs_structures::Gtfs:

// Gtfs::new will try to guess if you provide a path, a local zip file or a remote zip file.
// You can also use Gtfs::from_path or Gtfs::from_url
let gtfs = gtfs_structures::Gtfs::new("path_of_a_zip_or_directory_or_url")?;
println!("there are {} stops in the gtfs", gtfs.stops.len());

// This structure is the easiest to use as the collections are `HashMap`,
// thus you can access an object by its id.
let route_1 = gtfs.routes.get("1").expect("no route 1");
println!("{}: {:?}", route_1.short_name, route_1);

RawGtfs

If you want a lower level model, you can use gtfs_structures::RawGtfs:

let raw_gtfs = RawGtfs::new("fixtures/basic").expect("impossible to read gtfs");
for stop in raw_gtfs.stops.expect("impossible to read stops.txt") {
    println!("stop: {}", stop.name);
}

Instead of easy to use HashMap, each collection is a Result with an error if something went wrong during the reading.

This makes it possible for example for a GTFS validator to display better error messages.

Feature 'read-url'

By default the feature 'read-url' is activated. It makes it possible to read a Gtfs from an url.

let gtfs = gtfs_structures::Gtfs::new("http://www.metromobilite.fr/data/Horaires/SEM-GTFS.zip")?;

Or you can use the explicit constructor:

let gtfs = gtfs_structures::Gtfs::from_url("http://www.metromobilite.fr/data/Horaires/SEM-GTFS.zip")?;

If you don't want the dependency to reqwest, you can remove this feature.

Building

You need an up to date rust tool-chain (commonly installed with rustup).

Building is done with:

cargo build

You can also run the unit tests:

cargo test

And run the examples by giving their names:

cargo run --example gtfs_reading

Alternative

If you are interested in transit data, you can also use the really nice crate transit_model that can also handle GTFS data.

The price to pay is a steeper learning curve (and a documentation that could be improved 🙄), but this crate provides very nice ergonomics to handle transit data and lots of utilities like data format conversions, datasets merge, ...

Dependencies

~4.5–9MB
~166K SLoC