Created
July 31, 2025 14:29
-
-
Save extratone/f3e02275aaa23ea72544f941a84a23ee to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# Car-Routing based on a kinematic model | |
# | |
# Depending on the vmax-parameter (target-speed) | |
# this can be anything from least-time routing to eco-routing | |
# | |
# | |
---model:btools.router.KinematicModel | |
---context:global | |
# Car profile | |
assign validForCars = true | |
# Use the following switches to change behaviour | |
assign avoid_toll = false # %avoid_toll% | Avoid paid roads | boolean | |
assign avoid_unpaved = true # %avoid_unpaved% | Avoid unpaved roads, if possible | boolean | |
assign avoid_motorways = true # %avoid_motorways% | Avoid motorways | boolean | |
assign add_beeline = false # %add_beeline% | Enable beeline on distant start/end points | boolean | |
assign use_offroad = false # %use_offroad% | Enable additional roads | boolean | |
# Kinematic model parameters | |
assign vmax = 160 # %vmax% | Target speed (in km/h) | number | |
assign recup_efficiency = 0.7 # %recup_efficiency% | (ratio) | number | |
assign totalweight = 1383 # %totalweight% | Total weight of the car (in kg) | number | |
assign f_roll = 232 # %f_roll% | Rolling friction (in Newton) | number | |
assign f_air = 0.4 # %f_air% | Drag force (in Newton / (m/s)^2), 0.5*cw*A*rho | number | |
assign f_recup = 400 # %f_recup% | Newton | number | |
assign p_standby = 250 # %p_standby% | Watt | number | |
# Turn instructions settings | |
assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style, 7=locus-old-style] | |
# Technical parameters | |
assign pass1coefficient = 1.3 | |
---context:way # following code refers to way-tags | |
# classifier constants | |
assign classifier_none = 1 | |
assign classifier_ferry = 2 | |
assign is_avoided_toll_road and avoid_toll toll=yes | |
assign is_avoided_motorway and avoid_motorways highway=motorway|motorway_link | |
# | |
# calculate logical car access | |
# | |
assign isresidentialorliving = or highway=residential|living_street living_street=yes | |
assign caraccess | |
switch motorcar= | |
switch motor_vehicle= | |
switch vehicle= | |
switch access= | |
switch highway=motorway|motorway_link 1 | |
switch highway=trunk|trunk_link 1 | |
switch highway=primary|primary_link 1 | |
switch highway=secondary|secondary_link 1 | |
switch highway=tertiary|tertiary_link 1 | |
switch highway=unclassified 1 | |
switch and highway=track use_offroad 1 | |
switch and highway=road use_offroad 1 | |
switch route=ferry 1 | |
switch isresidentialorliving 1 | |
switch highway=service 1 | |
0 | |
access=yes|permissive|designated|destination | |
vehicle=yes|designated|destination | |
motor_vehicle=yes|permissive|designated|destination | |
motorcar=yes|permissive|designated|destination | |
assign caraccess_destination | |
switch motorcar= | |
switch motor_vehicle= | |
switch vehicle= | |
access=destination | |
vehicle=destination | |
motor_vehicle=destination | |
motorcar=destination | |
# | |
# for any change in initialclassifier, initialcost is added once | |
# | |
assign initialclassifier = | |
if route=ferry then classifier_ferry | |
else classifier_none | |
# | |
# calculate the initial cost | |
# this is added to the total cost each time the costfactor | |
# changed | |
# | |
assign initialcost = | |
if ( equal initialclassifier classifier_ferry ) then 10000 | |
else 0 | |
assign accessspeedlimit = if caraccess then 999 else 0 | |
assign isbadoneway = if reversedirection=yes then ( if oneway= then junction=roundabout else oneway=yes|true|1 ) else oneway=-1 | |
assign onewayspeedlimit = if isbadoneway then 0 else 999 | |
assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link | |
assign maxspeed_surface = | |
switch or surface= surface=paved|asphalt|concrete 999 | |
switch surface=paving_stones|cobblestone|sett 30 | |
switch surface=fine_gravel ( switch avoid_unpaved 3 10 ) | |
switch avoid_unpaved 1 2 | |
assign maxspeed_tracktype = | |
switch tracktype= 999 | |
switch tracktype=grade1 40 | |
switch tracktype=grade2 ( switch avoid_unpaved 2 5 ) | |
1 | |
assign maxspeed_implicit = | |
switch highway=motorway 999 | |
switch highway=motorway_link 130 | |
switch highway=trunk 250 | |
switch highway=trunk_link 100 | |
switch highway=primary|primary_link 100 | |
switch highway=secondary|secondary_link 90 | |
switch highway=tertiary|tertiary_link 80 | |
switch highway=unclassified 50 | |
switch route=ferry 10 | |
switch highway=bridleway 10 | |
switch isresidentialorliving 30 | |
switch highway=service 30 | |
switch highway=track|road|path switch tracktype=grade1 30 5 | |
0 | |
assign maxspeed_forward = | |
switch maxspeed:forward=50 50 | |
switch maxspeed:forward=30 30 | |
switch maxspeed:forward=10 10 | |
switch maxspeed:forward=20 20 | |
switch maxspeed:forward=40 40 | |
switch maxspeed:forward=60 60 | |
switch maxspeed:forward=70 70 | |
switch maxspeed:forward=80 80 | |
switch maxspeed:forward=90 90 | |
switch maxspeed:forward=100 100 | |
switch maxspeed:forward=110 110 | |
switch maxspeed:forward=120 120 | |
switch maxspeed:forward=130 130 | |
switch maxspeed:forward=urban 50 | |
switch maxspeed:forward=rural 100 | |
999 | |
assign maxspeed_backward = | |
switch maxspeed:backward=50 50 | |
switch maxspeed:backward=30 30 | |
switch maxspeed:backward=10 10 | |
switch maxspeed:backward=20 20 | |
switch maxspeed:backward=40 40 | |
switch maxspeed:backward=60 60 | |
switch maxspeed:backward=70 70 | |
switch maxspeed:backward=80 80 | |
switch maxspeed:backward=90 90 | |
switch maxspeed:backward=100 100 | |
switch maxspeed:backward=110 110 | |
switch maxspeed:backward=120 120 | |
switch maxspeed:backward=130 130 | |
switch maxspeed:backward=urban 50 | |
switch maxspeed:backward=rural 100 | |
999 | |
assign maxspeed_explicit = | |
switch maxspeed=50 50 | |
switch maxspeed=30 30 | |
switch maxspeed=10 10 | |
switch maxspeed=20 20 | |
switch maxspeed=40 40 | |
switch maxspeed=60 60 | |
switch maxspeed=70 70 | |
switch maxspeed=80 80 | |
switch maxspeed=90 90 | |
switch maxspeed=100 100 | |
switch maxspeed=110 110 | |
switch maxspeed=120 120 | |
switch maxspeed=130 130 | |
switch maxspeed=urban 50 | |
switch maxspeed=rural 100 | |
if reversedirection=yes then maxspeed_backward else maxspeed_forward | |
assign maxspeed = | |
min if is_avoided_toll_road then 0 else 999 | |
min if is_avoided_motorway then 0 else 999 | |
min onewayspeedlimit | |
min accessspeedlimit | |
min maxspeed_explicit | |
min maxspeed_implicit | |
min maxspeed_surface maxspeed_tracktype | |
assign costfactor = if equal maxspeed 0 then 10000 else 0 | |
assign minspeed = | |
switch highway=motorway|motorway_link|trunk 75 0 | |
# way priorities used for voice hint generation | |
assign priorityclassifier = | |
if ( highway=motorway ) then 30 | |
else if ( highway=motorway_link ) then 29 | |
else if ( highway=trunk ) then 28 | |
else if ( highway=trunk_link ) then 27 | |
else if ( highway=primary ) then 26 | |
else if ( highway=primary_link ) then 25 | |
else if ( highway=secondary ) then 24 | |
else if ( highway=secondary_link ) then 23 | |
else if ( highway=tertiary ) then 22 | |
else if ( highway=tertiary_link ) then 21 | |
else if ( highway=unclassified ) then 20 | |
else if ( isresidentialorliving ) then 6 | |
else if ( highway=service ) then 6 | |
else if ( highway=track ) then if tracktype=grade1 then 4 else 2 | |
else if ( highway=bridleway|road ) then 2 | |
else 0 | |
# some more classifying bits used for voice hint generation... | |
assign isgoodoneway = if reversedirection=yes then oneway=-1 | |
else if oneway= then junction=roundabout else oneway=yes|true|1 | |
assign isroundabout = junction=roundabout | |
assign isgoodforcars = if greater priorityclassifier 6 then true | |
else if or isresidentialorliving highway=service then true | |
else if ( and highway=track tracktype=grade1 ) then true | |
else false | |
# ... encoded into a bitmask | |
assign classifiermask add isbadoneway | |
add multiply isgoodoneway 2 | |
add multiply isroundabout 4 | |
add multiply islinktype 8 | |
add multiply isgoodforcars 16 | |
add multiply isresidentialorliving 32 | |
multiply caraccess_destination 64 | |
---context:node # following code refers to node tags | |
# | |
# calculate logical car access to nodes | |
# | |
assign caraccess | |
switch motorcar= | |
switch motor_vehicle= | |
switch vehicle= | |
switch access= | |
not barrier=gate|bollard|lift_gate|cycle_barrier | |
access=yes|permissive|designated|destination | |
vehicle=yes|permissive|designated|destination | |
motor_vehicle=yes|permissive|designated|destination | |
motorcar=yes|permissive|designated|destination | |
assign initialcost = | |
switch and avoid_toll barrier=toll_booth 1000000 | |
switch caraccess | |
0 | |
1000000 | |
assign maxspeed = | |
if or crossing=traffic_signals highway=traffic_signals | |
then | |
switch greater way:priorityclassifier 24 5 | |
switch greater way:priorityclassifier 22 3 | |
switch greater way:priorityclassifier 20 1 | |
0 | |
else if railway=level_crossing then 0 | |
else 999 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment