Public transport/Quality Assurance
JOSM
JOSM validators already contains some checks about the relations consistencies.
Jungle Bus validation ruleset provide a few more. (sourcecode)
PT Assistant also have dedicated ptv2 validation rules.
PTNA - Public Transport Network Analysis
PTNA is a nice tool which provides a daily analysis of public transport lines mapped in OSM.
Osmose
Osmose has several analysers on public transport data:
- on geometries (list, map, stats)
- on tags (list, map, stats)
- from Jungle Bus JOSM validation ruleset (list, map, stats)
OSMInspector
OSM Inspector as dedicated views for "Public Transport Routes" and "Public Transport Stops".
Subway preprocessor
Subway Preprocessor reveals errors and incompleteness of subway networks. It is used by some mobile applications for PT routing.
Triglav
Triglav public transport validator is custom tailored to check against GTFS data mostly for Croatia, but source is available for those wishing to adopt it to their use cases. See example usage video for short example of the workflow.
Other tools
Many transport visualization tools can be use for QA, such as OSMTransportViewer.
See AwesomeTransportTools for more.
Overpass Queries
While transitioning from the old Public transport tagging schema to the newer Public_Transport some inconsistencies can appear.
highway=bus_stop without a public_transport=* tag
The first stage of transitioning from highway=bus_stop to Public_Transport is to apply either public_transport=stop_position or public_transport=platform to each highway=bus_stop.
// Collect all bus stops without an public_transport tag.
node({{bbox}})[highway=bus_stop][public_transport!~'platform|stop_position'];
// Return the result including meta data (needed for JOSM exports).
out meta;
stop_position or platform not within a stop_area relation
After tagging stop_positions and platforms, each objects related to a stop should be grouped in a public_transport=stop_area relation.
// stop_position or platform not within a stop_area relation
// Collect all stops and platforms and store the result in variable .a
node({{bbox}})[public_transport~'stop_position|platform']->.a;
// Select parent relations with the tag public_transport=stop_area for all members of the input set .a
rel(bn.a)[public_transport=stop_area];
// Select all nodes from the previous relations and store the result in variable .b
node(r)->.b;
// Substract the nodes which are in a stop_area relation from the list of all nodes.
(.a; - .b;);
// Return the result including meta data (needed for JOSM exports).
out meta;
stop_position without platform
In most cases a stop_position should have a platform not far from it.
// Stop positions without platform.
// Collect all stops and store the result in variable .a
node({{bbox}})[public_transport=stop_position]->.a;
// Collect all platforms.
(
node({{bbox}})[public_transport=platform];
way({{bbox}})[public_transport=platform];
rel({{bbox}})[public_transport=platform];
);
// Then look around for stops from each platform and store the found stops in variable .b
node(around:50.0)[public_transport=stop_position]->.b;
// Substract the stops which are found near a platform from the list of all stops (this give us the stops without platform).
(.a; - .b;);
// Return the result including meta data (needed for JOSM exports).
out meta;
platform without stop_position
// Platforms without stops.
// Collect all platforms and store the result in variable .a
(
node({{bbox}})[public_transport=platform];
way({{bbox}})[public_transport=platform];
rel({{bbox}})[public_transport=platform];
)->.a;
// Collect all stops.
node({{bbox}})[public_transport=stop_position];
// Then look around for platforms from each stop and store the found platforms in variable .b
(
node(around:50.0)[public_transport=platform];
way(around:50.0)[public_transport=platform];
rel(around:50.0)[public_transport=platform];
)->.b;
// Substract the platforms which are found near a stop from the list of all platforms (this give us the platforms without stops).
(.a; - .b;);
// Return the result including meta data (needed for JOSM exports).
out meta;
Public transport objects without network=*
If there is a stop_area, you don't have to add the network to stops and platforms.
// Public transport objects without network tag.
(
// stops and platforms
node({{bbox}})[public_transport][network!~'.'];
// platforms
way({{bbox}})[public_transport][network!~'.'];
// stop_areas and some platforms
rel({{bbox}})[public_transport][network!~'.'];
// route relations
rel({{bbox}})['public_transport:version'][network!~'.'];
);
// Return the result including meta data (needed for JOSM exports).
out meta;
|