Let's say we have a tertiary road with the following tags:
- maxspeed=60
- surface=gravel
- smoothness=horrible
The maxspeed tag tells us the legal speed limit, but the surface and
smoothness tags have much more effect on the real-world speed of a car.
In the default car profile, the gravel surface sets a driving speed of
40kph, and the horrible smoothness sets a driving speed of 10kph. It
seems to me that the tags should be processed in this order:
1. maxspeed
2. surface
3. smoothness
That is, maxspeed can be overridden by the surface tag, which can in
turn be overridden by the smoothness tag. In the case of our secondary
road, it would start with a driving speed of 60kph (from maxspeed),
which would be reduced to 40kph (from surface), and end at 10kph (from
smoothness).
However, before this change, the maxspeed tag is processed *after*
surface and smoothness: our road starts with a driving speed of 40kph
(from surface), it's reduced to 10kph (from smoothness), and then
*increased* to 60kph (from maxspeed).
This change alters the processing order so that maxspeed is processed
first, giving it the lowest priority of these three tags.
OSM data contains many mistakes that tag kerbs as highway barriers
when instead they are only describing highway crossings.
This PR updates the default car profile to handle these mistakes
and unblock routing on the affected highways.
* In Belgium the maximum speed in rural areas is 70 in the region Flanders
* parse maxspeed using source:maxspeed and maxspeed:type tags
* add changelog
* make maxspeed:advisory more important than maxspeed
* add test for source:maxspeed
* set and store highway and access classification for the turn function
* expose highway turn classification and access turn classification and speed to the lua profile turn function
* expose whether connection road at turn is incoming or outgoing
* add lua tests for exposed information to turn function
* update docs about attributes in process_turn
* add turn_classification info to docs
* adding warning if uturn and intersection dont match
* handle u turns that do not turn into intersection[0]
* split OSM link generation in an accessible coordinate function