Awesome
GTFS shape mapfit
Fits GTFS shape files to a given OSM map file. Uses pymapmatch for the matching. Quite accurate, but very slow.
License
Copyright 2013 Jami Pekkanen (with dots at helsinki.fi), released under AGPLv3 license.
Dependencies
What pymapmatch needs and argh for argument parsing. Matplotlib for visualization of the results. Pymapmatch is included as a submodule.
Linux. May work on other unix-like systems. Does not work on Windows due to some library dependencies not supporting the platform.
Install
git clone --recursive https://github.com/tru-hy/pymapmatch
Usage
NOTE: The current implementation is mostly done with a specific fit to city of Tampere's data in mind. In practice if you want to use this program, it's best to contact the author.
You'll need a OSM export in XML or PBF format for the area covering the
wanted shapes, referred in examples as map.osm
.
Due to some naive choices in current implementation, the map
size affects fitting times very strongly. Expect many minutes per one
shape. The initial loading also takes quite a while as it generates
a graph from the map and R-tree from the edges.
At the moment the map projection used is also hardcoded in gtfs_shape_mapfit.py
,
so you'll need to change it if you are doing the matching anywhere but in Finland.
The fitting is usually done in two stages, first the fits are made with some included statistics and stored in a pickle.
./gtfs_shape_mapfit.py process map.osm < shapes_orig.txt > fits.pickle
The results can be visualized with some statistics:
./gtfs_shape_mapfit.py view map.osm < fits.pickle
And exported to a new shapes.txt:
./gtfs_shape_mapfit.py export map.osm < fits.pickle > shapes_fitted.txt
With -n flag to the export command the file will also include the OSM
node ids for the shape points under column node_id
.
Caveats
Many. If any of the measurements aren't in the search radius (default 50m)
away from the right road, the results can be very bad. The radius can be
increased with the -s
parameter, but note that this dramatically increases
the runtime. You can select only a subset of shapes to fit with the -w
parameter, which is especially useful if only some shapes need a larger search
radius.