Als je de evaluatie uitvoert op de volgorde die ik hier uitleg, dan hoef je dat ook niet te doen. Je moet alleen nog wel de oneway-tags meenemen in die drie onderste functies, en voor elk segment dus beide richtingen evalueren. oneway:vehicle kun je wel negeren, maar als je één functie maakt waarin je access-tag en oneway-tag meegeeft dan los je dat generiek op, en maakt het niet uit.
access_whitelist {
yes,
permissive,
designated,
dismount
}
access_blacklist {
no,
private,
use_sidepath
}
default_access {
NL: {
primary,
primary_link,
secondary,
secondary_link,
tertiary,
tertiary_link,
unclassified,
residential,
living_street,
road,
track,
service,
cycleway,
path
},
// Aanvullen met andere landen die relevant zijn.
default: {
trunk,
trunk_link,
primary,
primary_link,
secondary,
secondary_link,
tertiary,
tertiary_link,
unclassified,
residential,
living_street,
road,
service,
cycleway,
path
}
}
function highway_access_for_bicycle_by_default(country, highway_value) {
if default_access.has_key(country):
return default_access[country].contains(highway_value)
else
return default_access['default'].contains(highway_value)
}
function eval_access_at_level(access_value, oneway_value, direction) {
if access_value in access_blacklist return False
if oneway_value == yes && direction == Backward return False
if oneway_value == -1 && direction == Forward return False
if access_value in access_whitelist return True
return None
}
function eval_access_direction(country, direction, tags) {
Boolean has_access = highway_access_for_bicycle_by_default(country, tags['highway'])
Boolean access_access = eval_access_at_level(tags['access'], tags['oneway'], direction)
if access_access != None has_access = access_access
Boolean access_vehicle = eval_access_at_level(tags['vehicle'], tags['oneway:vehicle'], direction)
if access_vehicle != None has_access = access_vehicle
Boolean access_bicycle = eval_access_at_level(tags['bicycle'], tags['oneway:bicycle'], direction)
if access_bicycle != None has_access = access_bicycle
}
// Voorbeeldaanroep voor één OSM way:
Boolean access_forward = eval_access_direction(NL, Forward, tags)
Boolean access_backward = eval_access_direction(NL, Backward, tags)
Deze pseudocode is wat er in routers ook grofweg gedaan wordt.