#
# Profile for fast recumbent bikes, contributed by http://www.velomobilforum.de

---context:global

assign totalMass = 90 #Gesamtmasse des Fahrzeugs (Fahrzeug, Fahrer, Gepäck...) in kg
assign maxSpeed = 60 #Maximale Geschwindigkeit ab der der Fahrer bremst in km/h
assign S_C_x = 0.23 #Effektive Stirnfläche in m²
assign C_r = 0.004 #Rollwiderstand
assign bikerPower = 125 #Dauerleistung in Watt

assign ignore_bicycle_no = false # für Regionen mit falschen bicyle=no tags können sie mit "true" ignoriert werden. Auch Shuttletransporte (bicycle=dismount + foot=no) werden geroutet
assign consider_smoothness_tags = true # mit false kann die kanne die Auswertung der smoothness tags abgeschaltet werden
assign low_memory_cutoff = false # mit true werden Wege mit hohen Kosten aus der Berechnung genommen und damit wird die Berechnung schneller und benötigt weniger Arbeitspeicher.

assign turnInstructionMode 1 #Ausgabe von Abiegehinweise 0=keine, 1=automatische Wahl, 2=locus-Style, 3=osmand-Style
assign turnInstructionCatchingRange 20 # innerhalb dieser Strecke werden mehrere Abiegehinweise zu einem zusammengefasst und die Abiegewinkel werden besser an die generelle Richtung angenähert
assign turnInstructionRoundabouts true # mit "false" werden keine speziellen Abiegehinweise für den Kreisverkehr generiert

assign downhillcost 80 # Kosten für die Höhenmeter bergab
assign downhillcutoff 0.1 # Gefälle unter diesem Wert in Prozent werden nicht gewertet
assign uphillcost 80 # Kosten für die Höhenmeter bergauf
assign uphillcutoff 1 # Steigungen unter diesem Wert in Prozent werden nicht gewertet

assign validForBikes true # bei true werden die Außnahmen bei den Abbiegebeschränkungen für Fahrräder aktiviert
assign considerTurnRestrictions true # bei false werden die Abbiegebeschränkungen ignoriert

assign pass1coefficient 2.5 # Berechnugskoeffizient für erste schnelle Berechnung
assign pass2coefficient 0 # Berechnugskoeffizient für zweite exakte Berechnung
# sinnvolle Werte für den ersten Koeffizienten:
# 1 exakte Berechnung beim ersten Durchlauf
# umso größer die Werte umso schneller und ungenauer die erste Berechnung
# sinnvolle Werte für den zweiten Koeffizienten:
# 0 exakte Berechnung mit Beschränkung des Suchgebiets über die Kosten der ersten Berechnung
# -1 keine zweite Berechnung, nur sinnvoll bei 1 im ersten Durchlauf

# Um die ungenauen SRTM Höhendaten zu filtern werden für jeweils für Anstiege und Gefälle Puffer verwendet. Erst wenn diese überschritten werden die Segmente als Anstiege oder Gefälle gewertet.

assign elevationpenaltybuffer 7 # Höhenpuffer (in Meter) ab dem die Höhenstrafen beginnen und das Segment als Anstieg und Gefälle gewertet wird
assign elevationmaxbuffer 13 # Maximale Puffergröße (in Meter), alles darüberhinausgehende wird voll bestraft
assign elevationbufferreduce 1 # im Bereich zwischen elevationpenaltybuffer und elevationmaxbuffer wird eine Höhenstrafe, die einer Steigung oder Gefälle dieses Wertes (in Prozent) entspricht, verhängt und diese Höhenmeter vom Puffer abgezogen.

assign lmc switch low_memory_cutoff 10000 0
---context:way

# Parameter für die Wege
#zusätzliche Kosten in Meter für jeden Streckenabschnitt

assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes
assign nodeaccessgranted or any_cycleroute lcn=yes

assign cycleway
 or bicycle_road=yes or highway=cycleway and highway=path|footway bicycle=designated|yes

assign footway
 or highway=footway and highway=path foot=designated|yes

assign turncost
 switch junction=roundabout 0
 150 # Kosten die für eine 90 Grad Abbiegung berechnet werden. Für kleinere Winkel werden sie mit turncost*cos(Winkel) berechnet, bei Kreisverkehr keine weitere Kosten

assign initialclassifier # hier wird bestimmten Wegen ein Wert zugeordnet und wenn er sich vom vorherigen unterscheidet die initalcost hinzugerechnet
 switch route=ferry 2
 switch highway=steps 3
 switch cycleway 4
 switch footway 5
 1

assign initialcost
 switch route=ferry 10000 # Kosten wenn eine Fähre verwendet wird
 switch highway=steps 1000 # Kosten für Stufen
 switch cycleway 100 # Kosten für Radwege
 switch footway 1000 # Kosten für Fußwege
 0

# Kosten ab hier als Meter für jeden tatsächlichen Meter

assign oneway
 switch oneway=
 junction=roundabout
 or oneway=yes or oneway=true oneway=1

assign onewaypenalty
 switch switch reversedirection=yes oneway oneway=-1
  switch or cycleway=opposite or cycleway=opposite_lane or cycleway=opposite_track oneway:bicycle=no 0 #zusätzliche Kosten für in Gegenrichtung für Radfahrer freigegebene Einbahnstraßen in Gegenrichtung
  switch or highway=primary highway=primary_link add lmc 50 #zusätzliche Kosten für Bundesstraßen Einbahnstraßen in Gegenrichtung
  switch or highway=secondary highway=secondary_link add lmc 30 #zusätzliche Kosten für Landstraßen Einbahnstraßen in Gegenrichtung
  switch or highway=tertiary highway=tertiary_link add lmc 25 #zusätzliche Kosten für Kreisstraßen Einbahnstraßen in Gegenrichtung
  20.0 #zusätzliche Kosten für sonstige Einbahnstraßen in Gegenrichtung
 0.0

assign defaultaccess
 switch access=
  not motorroad=yes
 switch or access=private access=no
  0
 1

assign bikeaccess
 or any_cycleroute
 switch bicycle=
  switch bicycle_road=yes
    1
    switch vehicle=
     defaultaccess
  switch or vehicle=private vehicle=no
   0
  1
 not or bicycle=private or and not ignore_bicycle_no bicycle=no bicycle=dismount


assign footaccess
 or bikeaccess
 or and bicycle=dismount ignore_bicycle_no
 switch foot=
  defaultaccess
 not or foot=private foot=no

assign accesspenalty
 switch bikeaccess
  0
 switch footaccess
  10 #Zusatzkosten fürs Schieben
 10000 #Zusatzkosten für gesperrte oder private Wege

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
  0

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
  0

assign maxspeed
  switch and reversedirection=yes maxspeed_backward maxspeed_backward
  switch and not reversedirection=yes maxspeed_forward maxspeed_forward
  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
  999


assign downspeedpenalty
 switch equal maxspeed 10 4 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Gefälle
 switch equal maxspeed 20 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Gefälle
 switch equal maxspeed 30 0.7 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Gefälle
 switch equal maxspeed 40 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h bei Gefälle
 switch equal maxspeed 50 0.2 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h bei Gefälle
 0

assign flatspeedpenalty
 switch equal maxspeed 10 2 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h in der Ebene
 switch equal maxspeed 20 0.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h in der Ebene
 switch equal maxspeed 30 0.15 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h in der Ebene
 switch equal maxspeed 40 0.12 # Zusatzkosten für Geschwindigkeitsbegrenzung 40 km/h bei Gefälle
 switch equal maxspeed 50 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 50 km/h in der Ebene
 0

assign upspeedpenalty
 switch equal maxspeed 10 1.5 # Zusatzkosten für Geschwindigkeitsbegrenzung 10 km/h bei Anstiegen
 switch equal maxspeed 20 0.4 # Zusatzkosten für Geschwindigkeitsbegrenzung 20 km/h bei Anstiegen
 switch equal maxspeed 30 0.1 # Zusatzkosten für Geschwindigkeitsbegrenzung 30 km/h bei Anstiegen
 0


assign surfacepenalty
 add switch embedded_rails=tram|yes|rail 10 # Zusatzkosten bei Schienen in der Fahrbahn
 0
 switch surface=asphalt|paved 0 #Zusatzkosten für Teer oder versiegelte Flächen
 switch concrete=plates 1 # Zusatzkosten für Betonplattenwege
 switch concrete=lanes  2 # Zusatzkosten für Betonspurplatten
 switch surface=concrete|paving_stones|wood|metal 0.4 #Zusatzkosten für Beton, Pflastersteine, Holz oder Metall
 switch surface=cobblestone|fine_gravel|compacted|sett|grass_paver 4 #Zusatzkosten für Kopfsteinpflaster, Splitt, verdichtete Deckschicht, behauene Pflastersteine oder Rasengittersteine
 switch surface=gravel|sand|pebblestone add lmc 10 #Zusatzkosten für Schotter, Sand oder Kies
 switch surface=ground|grass|unpaved|dirt|earth|mud|clay add lmc 50 #Zusatzkosten für naturbelassene Wege, Grasswege, unbefestigte Wege, Schmutzwege, erdige Wege, schlammige Wege oder Lehmwege
 0

assign smoothnesspenalty
 switch smoothness=excellent|good|very_good 0 #Zusatzkosten für excellente, gute, oder sehr gute Oberflächen
 switch smoothness=intermediate|medium 0.2 #Zusatzkosten für mittelmäßige Oberflächen
 switch smoothness=rough|poor 2 #Zusatzkosten für raue oder schlechte Oberflächen
 switch smoothness=robust_wheels|bad add lmc 10 #Zusatzkosten für Oberflächen die robuste Reifen benötigen oder schlechte Oberflächen
 switch smoothness=high_clearance|off_road_wheels|very_bad|horrible|very_horrible|impassable add lmc 100 #Zusatzkosten für Oberflächen die eine erhöhte Bodenfreiheit oder Geländebereifung benötigen, schrecklich, sehr schrecklich oder unpasierbar sind
 0


assign costfactor

# dieser Abschnitt ist für die Kosten in der Ebene

 switch and highway= not route=ferry 10000 # Kosten für alles ohne higway tag außer Fähren
 switch or highway=proposed highway=abandoned 10000 # Kosten für geplante oder Wege im Bau

 min 9999

 add onewaypenalty
 add accesspenalty
 add surfacepenalty
 add switch consider_smoothness_tags smoothnesspenalty 0
 add flatspeedpenalty

 switch highway=motorway|motorway_link 10000 # Kosten für Autobahnen
 switch route=ferry 10.67 # Kosten für Fähren
 switch highway=trunk|trunk_link 5 # Kosten für eine autobahnänliche Straße
 switch highway=primary|primary_link 2 # Kosten für Bundesstraßen
 switch highway=secondary|secondary_link 1 # Kosten für Landstraßen
 switch highway=tertiary|tertiary_link 1 # Kosten für Kreisstraßen
 switch highway=unclassified 1 # Kosten für Verbindungsstraßen
 switch highway=residential|service 1.2 # Kosten für Wohn- und Zufahrtsstraßen
 switch highway=track
  switch tracktype=grade1 1.2 # Kosten für geteerte, betonierte oder gepflasterte Feldwege
  switch tracktype=grade2 7 # Kosten für geschotterte Feldwege
  switch tracktype=grade3 add lmc 40 # Kosten für Feldwege mit weichem Untergrund
  switch tracktype=grade4 add lmc 50 # Kosten für unbefestigte Feldwege
  switch tracktype=grade5 add lmc 50 # Kosten für kaum erkennbare Feldwege
  add lmc 20 # Kosten für Feldwege ohne Oberflächenangabe
 switch cycleway 1.3 # Kosten für Fahrradwege
 switch ( or highway=living_street living_street=yes ) 4 # Kosten für Spielstraßen
 switch highway=road 7 # Kosten für noch nicht genauer beschriebene Straße
 switch footway 15 # Kosten für Fußwege
 switch highway=pedestrian 20 # Kosten für Gehwege
 switch highway=steps 30 # Kosten für Stufen
 switch highway=path
  switch surface= add lmc 40 # Kosten für Pfade ohne Oberflächenangabe
  1.3 # Kosten für Pfade mit Oberflächenangabe
 switch highway=bridleway add lmc 80 # Kosten für Reitwege
 add lmc 20 # Kosten für sonstige Wege

assign uphillcostfactor

# dieser Abschnitt ist für die Kosten bei Anstiegen
# da er von der Struktur identisch wie der vorherige Abschnitt werde ich die Beschreibung hier nicht wiederholen

 switch and highway= not route=ferry 10000
 switch or highway=proposed highway=abandoned 10000

 min 9999

 add upspeedpenalty
 add onewaypenalty
 add accesspenalty
 add switch consider_smoothness_tags smoothnesspenalty 0
 add surfacepenalty

 switch highway=motorway|motorway_link 10000
 switch route=ferry 10.67
 switch highway=trunk|trunk_link 7
 switch highway=primary|primary_link 3
 switch highway=secondary|secondary_link 1.2
 switch highway=tertiary|tertiary_link 1
 switch highway=unclassified 1
 switch highway=residential|service 1
 switch highway=track
  switch tracktype=grade1 1
  switch tracktype=grade2 3
  switch tracktype=grade3 add lmc 40
  switch tracktype=grade4 add lmc 50
  switch tracktype=grade5 add lmc 50
  add lmc 20
 switch cycleway 1
 switch ( or highway=living_street living_street=yes ) 2.5
 switch highway=road 5
 switch footway 15
 switch highway=pedestrian 20
 switch highway=steps 30
 switch highway=path
  switch surface= add lmc 30
  1
 switch highway=bridleway add lmc 80
 add lmc 20

assign downhillcostfactor

# dieser Abschnitt ist für die Kosten bei Gefälle
# da er von der Struktur identisch wie der vorvorherige Abschnitt werde ich die Beschreibung hier auch nicht wiederholen

 switch and highway= not route=ferry 10000
 switch or highway=proposed highway=abandoned 10000

 min 9999

 add downspeedpenalty
 add onewaypenalty
 add accesspenalty
 add switch consider_smoothness_tags smoothnesspenalty 0
 add surfacepenalty

 switch highway=motorway|motorway_link 10000
 switch route=ferry 10.67
 switch highway=trunk|trunk_link 3
 switch highway=primary|primary_link 2
 switch highway=secondary|secondary_link 1
 switch highway=tertiary|tertiary_link 1
 switch highway=unclassified 1.2
 switch highway=residential|service 2
 switch highway=track
  switch tracktype=grade1 2
  switch tracktype=grade2 8
  switch tracktype=grade3 add lmc 40
  switch tracktype=grade4 add lmc 50
  switch tracktype=grade5 add lmc 50
  add lmc 20
 switch cycleway 2
 switch ( or highway=living_street living_street=yes ) 8
 switch highway=road 10
 switch footway 20
 switch highway=pedestrian 30
 switch highway=steps 40
 switch highway=path
  switch surface= add lmc 40
  2
 switch highway=bridleway add lmc 80
 add lmc 20


# hier kommen Variablen die zur Generierung der Abiegehinweise benötigt werden

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 ( or highway=residential|living_street living_street=yes ) then 6
 else if ( highway=service                                        ) then 6
 else if ( highway=cycleway                                       ) then 6
 else if ( or bicycle=designated bicycle_road=yes                 ) then 6
 else if ( highway=track                                          ) then if tracktype=grade1 then 6 else 4
 else if ( highway=bridleway|road|path|footway                    ) then 4
 else if ( highway=steps                                          ) then 2
 else if ( highway=pedestrian                                     ) then 2
 else 0



assign isbadoneway = not equal onewaypenalty 0
assign isgoodoneway = if reversedirection=yes then oneway=-1
           else if oneway= then junction=roundabout else oneway=yes|true|1
assign isroundabout = junction=roundabout
assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link
assign isgoodforcars = if greater priorityclassifier 6 then true
         else if ( or highway=residential|living_street|service living_street=yes ) then true
         else if ( and highway=track tracktype=grade1 ) then true
         else false

assign classifiermask add     isbadoneway
           add multiply isgoodoneway  2
           add multiply isroundabout  4
           add multiply islinktype   8
             multiply isgoodforcars 16



---context:node # following code refers to node tags

# Parameter für Knotenpunkte
# Kosten an Knotenpunkten in Meter


assign defaultaccess
 switch access=
  1 # add default barrier restrictions here!
 switch or access=private access=no
  0
 1

assign bikeaccess
 or nodeaccessgranted=yes
 switch bicycle=
  switch vehicle=
   defaultaccess
  switch or vehicle=private vehicle=no
   0
  1
 switch or bicycle=private or and not or highway=crossing ignore_bicycle_no bicycle=no bicycle=dismount
  0
 1

assign footaccess
 or bicycle=dismount
 switch foot=
  defaultaccess
 switch or foot=private foot=no
  0
 1

assign initialcost
 add switch highway=traffic_signals 200 # Kosten für Ampel
  switch highway=stop 150 # Kosten für Stoppschild
  switch railway=crossing|level_crossing 200 # Kosten für Bahnübergang
  0
 switch bikeaccess
  0
 switch footaccess
  10000 # Kosten fürs Absteigen
 1000000 #Kosten für verbotene oder private Wege
