Enhanced Lanes and Road Attributes mappaint style
The differences between this and the normal style are :
- Ability to show the end segments as a square.
- All roads that are higher then unclassified will be showed with red, so you can easily find and fix them.
- Ability to see your edits with green
This style visualizes a number of lane and road specific attributes. Namely common variants of the following tags are considered:
- lanes: Number of lanes for motorized traffic.
- width: The width of the carriageway. Lane-dependent width using width:lanes is fully supported.
- change: Allowed resp. forbidden lane changes.
- turn: Indication of turning lanes, including preliminary support for values hook_right and hook_left (this might change!)
- cycleway: Only cycle tracks are supported if specified with cycleway. Cycle lanes need bicycle:lanes=...|designated|... to be visible.
- bicycle:lanes: Dedicated bicycle lanes.
- bus:lanes: Dedicated bus lanes.
- psv:lanes: Dedicated PSV (public service vehicle) lanes.
- placement: Placement of the road relative to the OSM-way. The value placement=transition is not supported.
- man_made=bridge: Used to indicate the outline of a bridge and group together all features of that bridge.
- lit: Indication if a road is lit or not.
- highway=street_lamp: Street lamp
- destination: Signposted destination of a road. Only rudimentary support without lane-dependent values. The subkeys destination:ref and destination:country are also supported.
- highway=junction: Can be used to indicate the outline of a junction and group together all features of it.
- Relation enforcement: The to and from members of such relations are highlighted
- traffic_sign: Traffic signs for speed limits and overtaking are displayed if tagged with traffic_sign=maxspeed/overtaking and maxspeed=<limit> resp. overtaking=yes/no. The value implicit for maxspeed is interpreted as the end of the speed limit. Combinations like traffic_sign=maxspeed;overtaking are also supported.
- hov:lanes: Dedicated HOV lanes. The minimum requirement can be specified by hov:minimum (supported values: 2 and 3)
- Relation destination_sign: Experimental and very limited support!
- driving_side: Used to specify the driving side of the traffic. This is only supported on ways.
- railway: Tracks of railways are rendered with limited support for gauge, embedded and electrified.
- transit: Specify how a lane continues in the next road segment. Only verification of valid values!
Furthermore:
- Common suffixes like :forward, :backward, :left, :right: and :both as well as the proposed :both_ways (for lanes in both directions) are supported where appropriate.
- Some common tagging errors are detected and displayed, e.g. inconsistent number of lane-dependent values and typos in the keys turn and change.
- The style also supports left-hand traffic; see section Settings.
Use the Map Style Dialog to download and activate the style. A good starting point to see it in action is the area around Graz in Austria.
To report bugs or provide feedback send me a message.
Settings
Some settings of the style can be configured using Edit -> Preferences -> Display settings -> Colours. All settings start with mappaint.lane.and.road.attributes. Settings that contain the text "boolean" treat white as yes and any other color as no. Settings that contain the text "opacity" use the lightness to specify the opacity (the values for transparency or alpha are completely ignored!)
- The settings carriage.way.backward, carriage.way.forward and carriage.way.both_ways specify the colour of the respective lanes.
- The settings sidewalk, cycletrack and combined.sidewalk.and.cycletrack specify the colour of the sidewalk, a cycletrack and a combined sidewalk and cycletrack
- If boolean.right.hand.traffic is set to white, lanes are rendered for right hand traffic, if set to black for left hand traffic and if set to anything else (which is now the default) the right- and left-hand traffic database from JOSM is used to automatically determine the side.
- If boolean.use.svg.for.turning.markings is set to white, the markings for turning lanes are rendered more precisely. If you run into memory problems, set this to black. If this is set to black, the setting integer.png.turn.variant can be used to specify which set of png images should be used for turn markings. Currently two sets are supplied (value 000000 and 000001).
- The settings opacity.lane, opacity.markings and opacity.sidewalk specify the opacity of the lane background, road markings and the sidewalk background. If set to white they are opaque; if set to black they are completely transparent, any grey setting in between is treated an appropriate opacity.
Known limitations/bugs
- A bug in JOSM leads sometimes to rendering artefacts.
- Left-hand traffic is nearly untested. Please provide feedback.
- Roads with oneway=-1 may lead to incorrect results. Please provide feedback.
- change:lanes without suffix is currently only supported on one-ways and for the special case of change:lanes=no|no.
- In forward and backward direction a maximum of eight lanes and for lanes in both directions a maximum of four lanes is displayed.
Acknowledgments
- To Wolfgang Hinsch who created a first style which visualizes many lane-specific features. Before I saw his style I wouldn't believe that this is possible.
- To Paul Hartmann who implemented some desperately needed extensions for JOSM which made the implementation of this style a lot easier and improved performance significantly.
- To all who provided valuable feedback during the creation of this style.
Preset
An appropriate preset for lane attributes is available at Lane Attributes.
Code
meta { title: "Enhanced Lane and road attributes"; description: "Visualization of lanes, width, turn lanes, changing the lane, destination, lighting and street lamps, sidewalk, cycletracks, bicycle lanes, bus lanes, psv lanes. Added modification by Florin Badita : - You can see the end of each road segment as a square. - If you modify the lines from ~70 until ~80 and you add your own name, you will be able to see with green your modifications, so that you can inspect the other ways that already have lanes attributes, but were not made by you. - We only show lanes to road categoryes highwer then unclassified, residential."; original_link: "https://josm.openstreetmap.de/wiki/Styles/Lane_and_Road_Attributes"; link: "https://josm.openstreetmap.de/wiki/Styles/Enhanced_Lane_and_Road_Attributes"; author: "Martin Vonwald,Florin Badita"; version: "2.9_2020-04-27"; license: "CC-BY-SA"; icon: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNyAxOCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM4NSAtNTI0LjM2KSI+PHBhdGggZmlsbD0iIzIwMmQyMCIgZD0ibSAzODUgNTI0LjM2IGggMTcgdiAxOCBoIC0xNyB6Ii8+PGcgZmlsbD0ibm9uZSI+PGcgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLXdpZHRoPSIxLjgiPjxwYXRoIGQ9Im0gMzg3LjUgNTI1LjI2IHYgMTYuMiIgc3Ryb2tlPSIjZTRlN2U0Ii8+PHBhdGggZD0ibSAzOTkuNSA1MjUuMjYgdiAxNi4yIiBzdHJva2U9IiNlNWU3ZTUiLz48L2c+PHBhdGggZD0ibSAzOTMuNSA1MjYuMzYgdiA0IiBzdHJva2U9IiNlNWU3ZTUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjciLz48L2c+PHBhdGggZD0ibSAzOTMuNSA1MzUuMzYgdiA0IiBmaWxsPSIjZTRlN2U0IiBzdHJva2U9IiNlNWU3ZTUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjciLz48L2c+PC9zdmc+"; min-josm-version: "7287"; } meta[lang=de] { title: "Fahrspur- und Straßenattribute"; description: "Anzeige von Fahrspuren, Breite, Abbiegespuren, Spurwechsel, Zielangaben, Beleuchtung inkl. Straßenlampen, Gehsteig/Bürgersteig, Radwege, Fahrradspuren, Busspuren, Öffi-Spuren."; link: "https://josm.openstreetmap.de/wiki/De:Styles/Lane_and_Road_Attributes"; } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Global settings and initialization */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*TODO - Hide other types of highways/* /* highlight boundary */ way[highway=residential][!lanes], way[highway=unclassified][!lanes], way[highway=tertiary][!lanes], way[highway=tertiary_link][!lanes], way[highway=secondary][!lanes], way[highway=secondary_link][!lanes], way[highway=primary][!lanes], way[highway=primary_link][!lanes], way[highway=trunk][!lanes], way[highway=trunk_link][!lanes], way[highway=motorway][!lanes], way[highway=motorway_link][!lanes] { z-index: -1; color: red; width: 3; opacity: 0.6; dashes: 12,12; } way[highway=residential][lanes], way[highway=unclassified][lanes], way[highway=tertiary][lanes], way[highway=tertiary_link][lanes], way[highway=secondary][lanes], way[highway=secondary_link][lanes], way[highway=primary][lanes], way[highway=primary_link][lanes], way[highway=trunk][!lanes], way[highway=trunk_link][lanes], way[highway=motorway][lanes], way[highway=motorway_link][lanes] { z-index: -1; color: white; width: 2; opacity: 0.4; } way[highway=residential][lanes][JOSM_search("user:hoream_telenav")]::my_edits, way[highway=unclassified][lanes][!JOSM_search("user:hoream_telenav")], way[highway=tertiary][lanes][!JOSM_search("user:hoream_telenav")], way[highway=tertiary_link][lanes][!JOSM_search("user:hoream_telenav")], way[highway=secondary][lanes][!JOSM_search("user:hoream_telenav")], way[highway=secondary_link][lanes][!JOSM_search("user:hoream_telenav")], way[highway=primary][lanes][!JOSM_search("user:hoream_telenav")], way[highway=primary_link][lanes][!JOSM_search("user:hoream_telenav")], way[highway=trunk][!lanes][!JOSM_search("user:hoream_telenav")], way[highway=trunk_link][lanes][!JOSM_search("user:hoream_telenav")], way[highway=motorway][lanes][!JOSM_search("user:hoream_telenav")], way[highway=motorway_link][lanes][!JOSM_search("user:hoream_telenav")] { z-index: -1; color: green; width: 12; opacity: 0.4; } /* zoom out */ node|z-13:connection { symbol-shape: square; symbol-size: 20; symbol-stroke-color: red; symbol-stroke-size: 20; z-index: 10; } /* The last node of the way is square and grey, so we can quickly select the end of a way and Unglue Ways in JOSM using the Keyboard letter "G" */ way[highway] >[index=-1] node|z18-21 { /* matches the last node of a way */ symbol-fill-color: grey; symbol-shape: square; symbol-stroke-color: white; symbol-size: 15; } /* The last node of the way is square and grey, so we can quickly select the end of a way and Unglue Ways in JOSM using the Keyboard letter "G" */ way[highway] >[index=-1] node|z15-19 { /* matches the last node of a way */ symbol-fill-color: grey; symbol-shape: square; symbol-stroke-color: white; symbol-size: 8; } way!:closed >[index=1] node!:connection, way!:closed >[index=-1] node!:connection { /* matches all single way end nodes */ symbol-stroke-color: blue; symbol-size: 10; } way { /* Settings: change if necessary */ style_right_hand_traffic: yes; /* Will be overriden by ugly hack below */ style_lane_opacity: 0.5; /* Will be overriden by ugly hack below */ style_sidewalk_opacity: 0.5; /* Will be overriden by ugly hack below */ style_markings_opacity: 0.8; /* Will be overriden by ugly hack below */ style_show_warnings: yes; /* Will be overriden by ugly hack below */ style_show_errors: yes; /* Will be overriden by ugly hack below */ style_show_disputed: no; /* Will be overriden by ugly hack below */ style_use_svg_turn: yes; /* Will be overriden by ugly hack below */ /* Ugly hack to make opacity configurable */ ugly_lane_opacity: Opacity_lane#000000; style_lane_opacity: eval((red(prop(ugly_lane_opacity))+green(prop(ugly_lane_opacity))+blue(prop(ugly_lane_opacity)))/3); ugly_sidewalk_opacity: Opacity_sidewalk#808080; style_sidewalk_opacity: eval((red(prop(ugly_sidewalk_opacity))+green(prop(ugly_sidewalk_opacity))+blue(prop(ugly_sidewalk_opacity)))/3); ugly_markings_opacity: Opacity_markings#CCCCCC; style_markings_opacity: eval((red(prop(ugly_markings_opacity))+green(prop(ugly_markings_opacity))+blue(prop(ugly_markings_opacity)))/3); /* Ugly hack to make boolean configurable */ ugly_right_hand_traffic: Boolean_right_hand_traffic#888888; /*style_right_hand_traffic: eval(red(prop(ugly_right_hand_traffic)))=1;*/ /*style_right_hand_traffic: eval(is_right_hand_traffic());*/ style_right_hand_traffic: eval((red(prop(ugly_right_hand_traffic))=1)?yes:((red(prop(ugly_right_hand_traffic))=0)?no:is_right_hand_traffic())); ugly_show_warnings: Boolean_show_warnings#FFFFFF; style_show_warnings: eval(red(prop(ugly_show_warnings)))=1; ugly_show_errors: Boolean_show_errors#FFFFFF; style_show_errors: eval(red(prop(ugly_show_errors)))=1; ugly_show_disputed: Boolean_show_disputed#000000; style_show_disputed: eval(red(prop(ugly_show_disputed)))=1; ugly_use_svg_turn: Boolean_use_svg_for_turning_markings#FFFFFF; style_use_svg_turn: eval(red(prop(ugly_use_svg_turn)))=1; ugly_png_turn_variant: Integer_PNG_turn_variant#000000; style_png_turn_variant: eval(round(blue(prop((ugly_png_turn_variant)))*256)); ugly_use_svg_destination: Boolean_use_svg_for_destination#FFFFFF; style_use_svg_destination: eval(red(prop(ugly_use_svg_destination)))=1; /* Color of the sidewalk: none (ignored), sidewalk only, cycletrack only, sidewalk and cycletrack */ style_sidewalk_color: eval(list(#000000,Sidewalk#808080,Cycletrack#8080C0,Combined_sidewalk_and_cycletrack#C08080)); /* Color of the dashes if lane is access=no */ style_noaccess_color: No_access#FF0000; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Decide which roads should be rendered */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way[lanes][!leisure], way[lanes:forward], way[lanes:backward], way[turn:lanes],way[turn:lanes:forward],way[turn:lanes:backward],way[turn:lanes:both_ways], way[change:lanes],way[change:lanes:forward],way[change:lanes:backward],way[change:lanes:both_ways], way[sidewalk][highway], way[cycleway=track],way[cycleway:left],way[cycleway:right],way[cycleway:both], way[destination],way[destination:forward],way[destination:backward] { ok: yes; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* One-ways */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way[is_prop_set(ok)] { oneway_type: 0; } way[is_prop_set(ok)][oneway?] { oneway_type: 1; } way[is_prop_set(ok)][oneway=-1] { oneway_type: -1; } way[is_prop_set(ok)][junction=roundabout][!oneway] { oneway_type: 1; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Overrule left-hand/right-hand traffic */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way[driving_side] { style_right_hand_traffic: eval((tag(driving_side)="left")?no:yes); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Pixel per metre (on average) */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ *|z16 { pixel_per_metre: 0.625; } *|z17 { pixel_per_metre: 1.25; } *|z18 { pixel_per_metre: 2.5; } *|z19 { pixel_per_metre: 5; } *|z20 { pixel_per_metre: 10; } *|z21 { pixel_per_metre: 20; } *|z22 { pixel_per_metre: 40; } *|z23 { pixel_per_metre: 80; } *|z24 { pixel_per_metre: 160; } *|z25 { pixel_per_metre: 320; } *|z26- { pixel_per_metre: 640; } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Colors */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way[is_prop_set(ok)] { /* Base color of the carriage way */ /* TODO: obsolete - remove in future release: ground-color: #404040; */ /* Individual colors for each direction */ color_forward: Carriage_way_forward#405A40; color_backward: Carriage_way_backward#5A4040; color_bothways: Carriage_way_bothways#40405A; } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Lane initializiation */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way|z17- {} /* ATTENTION: For whatever reason this is needed, otherwise the following won't be interpreted correctly */ way|z17-[is_prop_set(ok)] { change_forward_1_left: yes; change_forward_1_right: yes; change_forward_2_left: yes; change_forward_2_right: yes; change_forward_3_left: yes; change_forward_3_right: yes; change_forward_4_left: yes; change_forward_4_right: yes; change_forward_5_left: yes; change_forward_5_right: yes; change_forward_6_left: yes; change_forward_6_right: yes; change_forward_7_left: yes; change_forward_7_right: yes; change_forward_8_left: yes; change_forward_8_right: yes; change_backward_1_left: yes; change_backward_1_right: yes; change_backward_2_left: yes; change_backward_2_right: yes; change_backward_3_left: yes; change_backward_3_right: yes; change_backward_4_left: yes; change_backward_4_right: yes; change_backward_5_left: yes; change_backward_5_right: yes; change_backward_6_left: yes; change_backward_6_right: yes; change_backward_7_left: yes; change_backward_7_right: yes; change_backward_8_left: yes; change_backward_8_right: yes; change_bothways_1_left: yes; change_bothways_1_right: yes; change_bothways_2_left: yes; change_bothways_2_right: yes; change_bothways_3_left: yes; change_bothways_3_right: yes; change_bothways_4_left: yes; change_bothways_4_right: yes; color_forward_1: prop(color_forward); color_forward_2: prop(color_forward); color_forward_3: prop(color_forward); color_forward_4: prop(color_forward); color_forward_5: prop(color_forward); color_forward_6: prop(color_forward); color_forward_7: prop(color_forward); color_forward_8: prop(color_forward); color_backward_1: prop(color_backward); color_backward_2: prop(color_backward); color_backward_3: prop(color_backward); color_backward_4: prop(color_backward); color_backward_5: prop(color_backward); color_backward_6: prop(color_backward); color_backward_7: prop(color_backward); color_backward_8: prop(color_backward); color_bothways_1: prop(color_bothways); color_bothways_2: prop(color_bothways); color_bothways_3: prop(color_bothways); color_bothways_4: prop(color_bothways); sign_forward_1: ""; sign_backward_1: ""; sign_forward_2: ""; sign_backward_2: ""; sign_forward_3: ""; sign_backward_3: ""; sign_forward_4: ""; sign_backward_4: ""; sign_forward_5: ""; sign_backward_5: ""; sign_forward_6: ""; sign_backward_6: ""; sign_forward_7: ""; sign_backward_7: ""; sign_forward_8: ""; sign_backward_8: ""; tag_lanes_all_min: 9999; tag_lanes_all_max: 0; tag_lanes_fwd_min: 9999; tag_lanes_fwd_max: 0; tag_lanes_bwd_min: 9999; tag_lanes_bwd_max: 0; tag_lanes_both_min: 9999; tag_lanes_both_max: 0; } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Determine allowed lane changes */ /* TODO: change:lanes without oneway, but only with values yes or no */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Error checking */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way["change"] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change"))?prop(data_error):"invalid change value"); } way["change:forward"] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change:forward"))?prop(data_error):"invalid change:forward value"); } way["change:backward"] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change:backward"))?prop(data_error):"invalid change:backward value"); } way["change:both_ways"] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change:both_ways"))?prop(data_error):"invalid change:both_ways value"); } way["change:lanes"][!(prop(oneway_type)=0)] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes"))?prop(data_error):"invalid change:lanes value"); } way["change:lanes"][prop(oneway_type)=0] { data_error: eval(regexp_test("^(yes|no|\\|)*$",tag("change:lanes"))?prop(data_error):"invalid change:lanes value"); } way["change:lanes:forward"] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes:forward"))?prop(data_error):"invalid change:lanes:forward value"); } way["change:lanes:backward"] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes:backward"))?prop(data_error):"invalid change:lanes:backward value"); } way["change:lanes:both_ways"] { data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes:both_ways"))?prop(data_error):"invalid change:lanes:both_ways value"); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["change:lanes:forward"], way|z17-[is_prop_set(ok)]["change:forward"], way|z17-[is_prop_set(ok)]["change:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)]["change"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("change:lanes"),tag("change:lanes"),cond(has_tag_key("change"),tag("change"), cond(has_tag_key("change:lanes:forward"),tag("change:lanes:forward"),tag("change:forward"))))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); change_forward_1_left: eval((prop(temp_length)>0) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),0))); change_forward_1_right: eval((prop(temp_length)>0) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),0))); change_forward_2_left: eval((prop(temp_length)>1) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),1))); change_forward_2_right: eval((prop(temp_length)>1) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),1))); change_forward_3_left: eval((prop(temp_length)>2) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),2))); change_forward_3_right: eval((prop(temp_length)>2) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),2))); change_forward_4_left: eval((prop(temp_length)>3) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),3))); change_forward_4_right: eval((prop(temp_length)>3) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),3))); change_forward_5_left: eval((prop(temp_length)>4) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),4))); change_forward_5_right: eval((prop(temp_length)>4) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),4))); change_forward_6_left: eval((prop(temp_length)>5) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),5))); change_forward_6_right: eval((prop(temp_length)>5) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),5))); change_forward_7_left: eval((prop(temp_length)>6) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),6))); change_forward_7_right: eval((prop(temp_length)>6) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),6))); change_forward_8_left: eval((prop(temp_length)>7) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),7))); change_forward_8_right: eval((prop(temp_length)>7) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),7))); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("change:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("change:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("change:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("change:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["change:lanes:backward"], way|z17-[is_prop_set(ok)]["change:backward"], way|z17-[is_prop_set(ok)]["change:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)]["change"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("change:lanes"),tag("change:lanes"),cond(has_tag_key("change"),tag("change"), cond(has_tag_key("change:lanes:backward"),tag("change:lanes:backward"),tag("change:backward"))))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); change_lanes_bwd: eval(length(prop(temp_list))); change_backward_1_left: eval((prop(temp_length)>0) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),0))); change_backward_1_right: eval((prop(temp_length)>0) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),0))); change_backward_2_left: eval((prop(temp_length)>1) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),1))); change_backward_2_right: eval((prop(temp_length)>1) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),1))); change_backward_3_left: eval((prop(temp_length)>2) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),2))); change_backward_3_right: eval((prop(temp_length)>2) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),2))); change_backward_4_left: eval((prop(temp_length)>3) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),3))); change_backward_4_right: eval((prop(temp_length)>3) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),3))); change_backward_5_left: eval((prop(temp_length)>4) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),4))); change_backward_5_right: eval((prop(temp_length)>4) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),4))); change_backward_6_left: eval((prop(temp_length)>5) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),5))); change_backward_6_right: eval((prop(temp_length)>5) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),5))); change_backward_7_left: eval((prop(temp_length)>6) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),6))); change_backward_7_right: eval((prop(temp_length)>6) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),6))); change_backward_8_left: eval((prop(temp_length)>7) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),7))); change_backward_8_right: eval((prop(temp_length)>7) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),7))); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(has_tag_key("change:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("change:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Bothways lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["change:lanes:both_ways"], way|z17-[is_prop_set(ok)]["change:both_ways"] { temp: eval(cond(has_tag_key("change:lanes:both_ways"),tag("change:lanes:both_ways"),tag("change:both_ways"))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); change_lanes_bth: eval(length(prop(temp_list))); change_bothways_1_left: eval((prop(temp_length)>0) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),0))); change_bothways_1_right: eval((prop(temp_length)>0) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),0))); change_bothways_2_left: eval((prop(temp_length)>1) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),1))); change_bothways_2_right: eval((prop(temp_length)>1) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),1))); change_bothways_3_left: eval((prop(temp_length)>2) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),2))); change_bothways_3_right: eval((prop(temp_length)>2) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),2))); change_bothways_4_left: eval((prop(temp_length)>3) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),3))); change_bothways_4_right: eval((prop(temp_length)>3) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),3))); /* Lane count based on :lanes values */ tag_lanes_both_min: eval(has_tag_key("change:lanes:both_ways")?min(prop(tag_lanes_both_min),prop(temp_length)):prop(tag_lanes_both_min)); tag_lanes_both_max: eval(has_tag_key("change:lanes:both_ways")?max(prop(tag_lanes_both_max),prop(temp_length)):prop(tag_lanes_both_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Extra support for change:lanes=no|no on twoway streets */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["change:lanes"="no|no"][prop(oneway_type)=0] { change_forward_1_left: false; change_forward_1_right: false; change_backward_1_left: false; change_backward_1_right: false; /* Lane count based on :lanes values */ tag_lanes_all_min: eval(min(prop(tag_lanes_all_min),2)); tag_lanes_all_max: eval(max(prop(tag_lanes_all_max),2)); tag_lanes_fwd_min: eval(min(1,prop(tag_lanes_fwd_min))); tag_lanes_fwd_max: eval(max(1,prop(tag_lanes_fwd_max))); tag_lanes_bwd_min: eval(min(1,prop(tag_lanes_bwd_min))); tag_lanes_bwd_max: eval(max(1,prop(tag_lanes_bwd_max))); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Determine turning lanes */ /* Note: rendering of "reverse" only when using svg */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Error checking */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way["turn"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn"))?prop(data_error):"invalid turn value"); } way["turn:forward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn:forward"))?prop(data_error):"invalid turn:forward value"); } way["turn:backward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn:backward"))?prop(data_error):"invalid turn:backward value"); } way["turn:both_ways"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn:both_ways"))?prop(data_error):"invalid turn:both_ways value"); } way["turn:lanes"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes"))?prop(data_error):"invalid turn:lanes value"); } way["turn:lanes:forward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes:forward"))?prop(data_error):"invalid turn:lanes:forward value"); } way["turn:lanes:backward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes:backward"))?prop(data_error):"invalid turn:lanes:backward value"); } way["turn:lanes:both_ways"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes:both_ways"))?prop(data_error):"invalid turn:lanes:both_ways value"); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Forward lanes (standard images) */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes:forward"], way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:forward"], way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"), cond(has_tag_key("turn"),tag("turn"), cond(has_tag_key("turn:lanes:forward"),tag("turn:lanes:forward"), tag("turn:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); t: eval(get(prop(temp_list),0)); turn_image_forward_1: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),1)); turn_image_forward_2: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),2)); turn_image_forward_3: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),3)); turn_image_forward_4: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),4)); turn_image_forward_5: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),5)); turn_image_forward_6: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),6)); turn_image_forward_7: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),7)); turn_image_forward_8: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png") ) ) ); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("turn:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("turn:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("turn:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("turn:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Backward lanes (standard images) */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes:backward"], way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:backward"], way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"), cond(has_tag_key("turn"),tag("turn"), cond(has_tag_key("turn:lanes:backward"),tag("turn:lanes:backward"), tag("turn:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); t: eval(get(prop(temp_list),0)); turn_image_backward_1: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),1)); turn_image_backward_2: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),2)); turn_image_backward_3: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),3)); turn_image_backward_4: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),4)); turn_image_backward_5: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),5)); turn_image_backward_6: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),6)); turn_image_backward_7: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); t: eval(get(prop(temp_list),7)); turn_image_backward_8: eval( ((prop(t)="none") || (prop(t)=""))?prop(unset_property): ( (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")): ( regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"): concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png") ) ) ); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(has_tag_key("turn:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("turn:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* SVG for turn images */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)] { turn_svg_through_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,67.5-5,0,7.5,32.5-10-32.5-10,0,7.5z'/>"); turn_svg_slight_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,67.5-5c11.462-1.0193,18.459,10.285,20.46,13.902l-7.96,4.2,17.5,4.3683,2.5-15-7.753,4.1421c-2.247-4.5-6.12-15.4-24.747-16.6z'/>"); turn_svg_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,67.5-5c6.31-0.505,17.5,5,17.5,10h-10l12.5,12.5,12.5-12.5h-10c0-5-8.43-13.3-22.5-15z'/>"); turn_svg_sharp_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15l62.497-4.7c7.5026,0.7633,2.5026,7.1294,0.0026,11.156l-7.5-4.0271,2.5,15,17.5-4.3125-7.878-4.2954c4.3284-6.3921,6.7048-17.943-4.6246-19.263z'/>"); turn_svg_slight_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_slight_right_forward),"</g>")); turn_svg_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_right_forward),"</g>")); turn_svg_sharp_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_sharp_right_forward),"</g>")); turn_svg_reverse_right_hand_forward: eval("<path fill='#FFF' d='m0,40,0-15,62.497,4.6294c12.503,0.4,15.003-10,0.003-12.1v5.4671l-16.238-7.9671,16.238-7.5v5c15-2.1079,22.5,22.5-0.003,22.871z'/>"); turn_svg_reverse_left_hand_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_reverse_right_hand_forward),"</g>")); turn_svg_merge_to_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,50.034-3.7063c7.4655-0.5212,13.016,2.3222,19.541,4.8112l-2.922,6.3951,33.347,5-25-22.5-3.2955,6.6794c-8.1542-5.6073-14.204-7.5071-21.734-7.9779z'/>"); turn_svg_merge_to_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_merge_to_right_forward),"</g>")); turn_svg_hook_right_forward: eval("<path fill='#FFF' d='m0,22.5,0,15,37.474-2.7759c11.051-1.2406,20.026-5.8731,20.026-15.873,0-5,5-3.8509,13.359-3.8509,9.1412,0,14.141-1.3338,14.141,5v17.5h-10l12.5,12.5,12.5-12.5h-10v-17.5c0-11.271-2.5-12.5-19.23-12.5-15.77,0-20.77,1.351-20.77,11.351,0,5-6.8784,6.8562-12.531,6.4246z'/>"); turn_svg_hook_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_hook_right_forward),"</g>")); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Forward lanes (SVG) */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes:forward"], way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:forward"], way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"), cond(has_tag_key("turn"),tag("turn"), cond(has_tag_key("turn:lanes:forward"),tag("turn:lanes:forward"), tag("turn:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); turn_image_forward_1: ""; t: eval(get(prop(temp_list),0)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_1: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_1: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_1)); turn_image_forward_1: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_1)); turn_image_forward_1: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_1)); turn_image_forward_1: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_1)); turn_image_forward_1: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_1)); turn_image_forward_1: eval((prop(turn_image_forward_1)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_1),"</g></svg>")); turn_image_forward_2: ""; t: eval(get(prop(temp_list),1)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_2: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_2: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_2)); turn_image_forward_2: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_2)); turn_image_forward_2: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_2)); turn_image_forward_2: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_2)); turn_image_forward_2: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_2)); turn_image_forward_2: eval((prop(turn_image_forward_2)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_2),"</g></svg>")); turn_image_forward_3: ""; t: eval(get(prop(temp_list),2)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_3: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_3: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_3)); turn_image_forward_3: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_3)); turn_image_forward_3: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_3)); turn_image_forward_3: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_3)); turn_image_forward_3: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_3)); turn_image_forward_3: eval((prop(turn_image_forward_3)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_3),"</g></svg>")); turn_image_forward_4: ""; t: eval(get(prop(temp_list),3)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_4: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_4: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_4)); turn_image_forward_4: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_4)); turn_image_forward_4: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_4)); turn_image_forward_4: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_4)); turn_image_forward_4: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_4)); turn_image_forward_4: eval((prop(turn_image_forward_4)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_4),"</g></svg>")); turn_image_forward_5: ""; t: eval(get(prop(temp_list),4)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_5: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_5: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_5)); turn_image_forward_5: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_5)); turn_image_forward_5: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_5)); turn_image_forward_5: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_5)); turn_image_forward_5: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_5)); turn_image_forward_5: eval((prop(turn_image_forward_5)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_5),"</g></svg>")); turn_image_forward_6: ""; t: eval(get(prop(temp_list),5)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_6: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_6: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_6)); turn_image_forward_6: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_6)); turn_image_forward_6: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_6)); turn_image_forward_6: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_6)); turn_image_forward_6: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_6)); turn_image_forward_6: eval((prop(turn_image_forward_6)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_6),"</g></svg>")); turn_image_forward_7: ""; t: eval(get(prop(temp_list),6)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_7: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_7: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_7)); turn_image_forward_7: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_7)); turn_image_forward_7: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_7)); turn_image_forward_7: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_7)); turn_image_forward_7: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_7)); turn_image_forward_7: eval((prop(turn_image_forward_7)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_7),"</g></svg>")); turn_image_forward_8: ""; t: eval(get(prop(temp_list),7)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_forward_8: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_forward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_forward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_forward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_forward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_forward_8: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_8)); turn_image_forward_8: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_8)); turn_image_forward_8: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_8)); turn_image_forward_8: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_8)); turn_image_forward_8: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_8)); turn_image_forward_8: eval((prop(turn_image_forward_8)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_8),"</g></svg>")); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("turn:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("turn:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("turn:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("turn:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Backward lanes (SVG) */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes:backward"], way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:backward"], way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"), cond(has_tag_key("turn"),tag("turn"), cond(has_tag_key("turn:lanes:backward"),tag("turn:lanes:backward"), tag("turn:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); turn_image_backward_1: ""; t: eval(get(prop(temp_list),0)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_1: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_1: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_1)); turn_image_backward_1: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_1)); turn_image_backward_1: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_1)); turn_image_backward_1: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_1)); turn_image_backward_1: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_1)); turn_image_backward_1: eval((prop(turn_image_backward_1)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_1),"</g></svg>")); turn_image_backward_2: ""; t: eval(get(prop(temp_list),1)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_2: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_2: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_2)); turn_image_backward_2: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_2)); turn_image_backward_2: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_2)); turn_image_backward_2: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_2)); turn_image_backward_2: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_2)); turn_image_backward_2: eval((prop(turn_image_backward_2)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_2),"</g></svg>")); turn_image_backward_3: ""; t: eval(get(prop(temp_list),2)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_3: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_3: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_3)); turn_image_backward_3: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_3)); turn_image_backward_3: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_3)); turn_image_backward_3: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_3)); turn_image_backward_3: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_3)); turn_image_backward_3: eval((prop(turn_image_backward_3)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_3),"</g></svg>")); turn_image_backward_4: ""; t: eval(get(prop(temp_list),3)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_4: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_4: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_4)); turn_image_backward_4: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_4)); turn_image_backward_4: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_4)); turn_image_backward_4: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_4)); turn_image_backward_4: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_4)); turn_image_backward_4: eval((prop(turn_image_backward_4)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_4),"</g></svg>")); turn_image_backward_5: ""; t: eval(get(prop(temp_list),4)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_5: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_5)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_5: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_5)); turn_image_backward_5: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_5)); turn_image_backward_5: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_5)); turn_image_backward_5: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_5)); turn_image_backward_5: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_5)); turn_image_backward_5: eval((prop(turn_image_backward_5)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_5),"</g></svg>")); turn_image_backward_6: ""; t: eval(get(prop(temp_list),5)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_6: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_6)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_6: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_6)); turn_image_backward_6: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_6)); turn_image_backward_6: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_6)); turn_image_backward_6: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_6)); turn_image_backward_6: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_6)); turn_image_backward_6: eval((prop(turn_image_backward_6)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_6),"</g></svg>")); turn_image_backward_7: ""; t: eval(get(prop(temp_list),6)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_7: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_7)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_7: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_7)); turn_image_backward_7: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_7)); turn_image_backward_7: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_7)); turn_image_backward_7: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_7)); turn_image_backward_7: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_7)); turn_image_backward_7: eval((prop(turn_image_backward_7)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_7),"</g></svg>")); turn_image_backward_8: ""; t: eval(get(prop(temp_list),7)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_backward_8: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_backward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_backward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_backward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_backward_8)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_backward_8: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_8)); turn_image_backward_8: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_8)); turn_image_backward_8: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_8)); turn_image_backward_8: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_8)); turn_image_backward_8: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_8)); turn_image_backward_8: eval((prop(turn_image_backward_8)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_8),"</g></svg>")); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(has_tag_key("turn:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("turn:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Both-way lanes (SVG) */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes:both_ways"], way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:both_ways"] { temp: eval(cond(has_tag_key("turn:lanes:both_ways"),tag("turn:lanes:both_ways"),tag("turn:both_ways"))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); turn_image_bothways_1: ""; t: eval(get(prop(temp_list),0)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_bothways_1: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_bothways_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_bothways_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_bothways_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_bothways_1)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_bothways_1: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_1)); turn_image_bothways_1: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_1)); turn_image_bothways_1: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_1)); turn_image_bothways_1: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_1)); turn_image_bothways_1: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_1)); turn_image_bothways_1: eval((prop(turn_image_bothways_1)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_1),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_1),"</g></svg>")); turn_image_bothways_2: ""; t: eval(get(prop(temp_list),1)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_bothways_2: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_bothways_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_bothways_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_bothways_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_bothways_2)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_bothways_2: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_2)); turn_image_bothways_2: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_2)); turn_image_bothways_2: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_2)); turn_image_bothways_2: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_2)); turn_image_bothways_2: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_2)); turn_image_bothways_2: eval((prop(turn_image_bothways_2)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_2),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_2),"</g></svg>")); turn_image_bothways_3: ""; t: eval(get(prop(temp_list),2)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_bothways_3: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_bothways_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_bothways_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_bothways_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_bothways_3)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_bothways_3: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_3)); turn_image_bothways_3: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_3)); turn_image_bothways_3: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_3)); turn_image_bothways_3: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_3)); turn_image_bothways_3: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_3)); turn_image_bothways_3: eval((prop(turn_image_bothways_3)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_3),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_3),"</g></svg>")); turn_image_bothways_4: ""; t: eval(get(prop(temp_list),3)); t_scale: 1.0; t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t))); turn_image_bothways_4: eval(prop(t_test)?prop(turn_svg_through_forward): prop(turn_image_bothways_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale_after_through: eval(prop(t_scale)); t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t))); turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t))); turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"): prop(turn_image_bothways_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t))); turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_scale: eval(prop(t_scale_after_through)); t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t))); turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t))); turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"): prop(turn_image_bothways_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t))); turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"): prop(turn_image_bothways_4)); t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale)); turn_image_bothways_4: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_4)); turn_image_bothways_4: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_4)); turn_image_bothways_4: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_4)); turn_image_bothways_4: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_4)); turn_image_bothways_4: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_4)); turn_image_bothways_4: eval((prop(turn_image_bothways_4)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_4),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_4),"</g></svg>")); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Lane access */ /* The property restriction_color_xxx will be overwritten by later rules */ /* TODO: both_ways is not implemented */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Access=no forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["access:lanes:forward"], way|z17-[is_prop_set(ok)]["access:forward"], way|z17-[is_prop_set(ok)]["access:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)]["access"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"), cond(has_tag_key("access"),tag("access"), cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"), tag("access:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); restriction_color_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="no") || (get(prop(temp_list),0)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_1)); restriction_color_forward_2: eval(((prop(temp_length)>0) && ((get(prop(temp_list),1)="no") || (get(prop(temp_list),1)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_2)); restriction_color_forward_3: eval(((prop(temp_length)>0) && ((get(prop(temp_list),2)="no") || (get(prop(temp_list),2)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_3)); restriction_color_forward_4: eval(((prop(temp_length)>0) && ((get(prop(temp_list),3)="no") || (get(prop(temp_list),3)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_4)); restriction_color_forward_5: eval(((prop(temp_length)>0) && ((get(prop(temp_list),4)="no") || (get(prop(temp_list),4)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_5)); restriction_color_forward_6: eval(((prop(temp_length)>0) && ((get(prop(temp_list),5)="no") || (get(prop(temp_list),5)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_6)); restriction_color_forward_7: eval(((prop(temp_length)>0) && ((get(prop(temp_list),6)="no") || (get(prop(temp_list),6)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_7)); restriction_color_forward_8: eval(((prop(temp_length)>0) && ((get(prop(temp_list),7)="no") || (get(prop(temp_list),7)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("access:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("access:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("access:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("access:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Access=no backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["access:lanes:backward"], way|z17-[is_prop_set(ok)]["access:backward"], way|z17-[is_prop_set(ok)]["access:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)]["access"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"), cond(has_tag_key("access"),tag("access"), cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"), tag("access:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); restriction_color_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="no") || (get(prop(temp_list),0)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_1)); restriction_color_backward_2: eval(((prop(temp_length)>0) && ((get(prop(temp_list),1)="no") || (get(prop(temp_list),1)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_2)); restriction_color_backward_3: eval(((prop(temp_length)>0) && ((get(prop(temp_list),2)="no") || (get(prop(temp_list),2)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_3)); restriction_color_backward_4: eval(((prop(temp_length)>0) && ((get(prop(temp_list),3)="no") || (get(prop(temp_list),3)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_4)); restriction_color_backward_5: eval(((prop(temp_length)>0) && ((get(prop(temp_list),4)="no") || (get(prop(temp_list),4)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_5)); restriction_color_backward_6: eval(((prop(temp_length)>0) && ((get(prop(temp_list),5)="no") || (get(prop(temp_list),5)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_6)); restriction_color_backward_7: eval(((prop(temp_length)>0) && ((get(prop(temp_list),6)="no") || (get(prop(temp_list),6)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_7)); restriction_color_backward_8: eval(((prop(temp_length)>0) && ((get(prop(temp_list),7)="no") || (get(prop(temp_list),7)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("access:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("access:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_bwd_min: eval(has_tag_key("access:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("access:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Lane designation */ /* TODO: both_ways is not implemented */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Bus forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["bus:lanes:forward"], way|z17-[is_prop_set(ok)]["bus:forward"], way|z17-[is_prop_set(ok)]["bus:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)]["bus"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("bus:lanes"),tag("bus:lanes"), cond(has_tag_key("bus"),tag("bus"), cond(has_tag_key("bus:lanes:forward"),tag("bus:lanes:forward"), tag("bus:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"), cond(has_tag_key("access"),tag("access"), cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"), tag("access:forward") )))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/bus forward.png"):prop(sign_forward_1)); sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/bus forward.png"):prop(sign_forward_2)); sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/bus forward.png"):prop(sign_forward_3)); sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/bus forward.png"):prop(sign_forward_4)); sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/bus forward.png"):prop(sign_forward_5)); sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/bus forward.png"):prop(sign_forward_6)); sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/bus forward.png"):prop(sign_forward_7)); sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/bus forward.png"):prop(sign_forward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("bus:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("bus:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("bus:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("bus:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Bus backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["bus:lanes:backward"], way|z17-[is_prop_set(ok)]["bus:backward"], way|z17-[is_prop_set(ok)]["bus:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)]["bus"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("bus:lanes"),tag("bus:lanes"), cond(has_tag_key("bus"),tag("bus"), cond(has_tag_key("bus:lanes:backward"),tag("bus:lanes:backward"), tag("bus:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); /* TODO: oneway=-1*/ tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward"))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/bus backward.png"):prop(sign_backward_1)); sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/bus backward.png"):prop(sign_backward_2)); sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/bus backward.png"):prop(sign_backward_3)); sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/bus backward.png"):prop(sign_backward_4)); sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/bus backward.png"):prop(sign_backward_5)); sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/bus backward.png"):prop(sign_backward_6)); sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/bus backward.png"):prop(sign_backward_7)); sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/bus backward.png"):prop(sign_backward_8)); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(has_tag_key("bus:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("bus:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Taxi forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["taxi:lanes:forward"], way|z17-[is_prop_set(ok)]["taxi:forward"], way|z17-[is_prop_set(ok)]["taxi:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)]["taxi"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("taxi:lanes"),tag("taxi:lanes"), cond(has_tag_key("taxi"),tag("taxi"), cond(has_tag_key("taxi:lanes:forward"),tag("taxi:lanes:forward"), tag("taxi:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"), cond(has_tag_key("access"),tag("access"), cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"), tag("access:forward") )))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/taxi forward.png"):prop(sign_forward_1)); sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/taxi forward.png"):prop(sign_forward_2)); sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/taxi forward.png"):prop(sign_forward_3)); sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/taxi forward.png"):prop(sign_forward_4)); sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/taxi forward.png"):prop(sign_forward_5)); sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/taxi forward.png"):prop(sign_forward_6)); sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/taxi forward.png"):prop(sign_forward_7)); sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/taxi forward.png"):prop(sign_forward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("taxi:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("taxi:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("taxi:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("taxi:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Taxi backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["taxi:lanes:backward"], way|z17-[is_prop_set(ok)]["taxi:backward"], way|z17-[is_prop_set(ok)]["taxi:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)]["taxi"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("taxi:lanes"),tag("taxi:lanes"), cond(has_tag_key("taxi"),tag("taxi"), cond(has_tag_key("taxi:lanes:backward"),tag("taxi:lanes:backward"), tag("taxi:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); /* TODO: oneway=-1*/ tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward"))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/taxi backward.png"):prop(sign_backward_1)); sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/taxi backward.png"):prop(sign_backward_2)); sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/taxi backward.png"):prop(sign_backward_3)); sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/taxi backward.png"):prop(sign_backward_4)); sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/taxi backward.png"):prop(sign_backward_5)); sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/taxi backward.png"):prop(sign_backward_6)); sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/taxi backward.png"):prop(sign_backward_7)); sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/taxi backward.png"):prop(sign_backward_8)); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(has_tag_key("taxi:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("taxi:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* PSV forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["psv:lanes:forward"], way|z17-[is_prop_set(ok)]["psv:forward"], way|z17-[is_prop_set(ok)]["psv:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)]["psv"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("psv:lanes"),tag("psv:lanes"), cond(has_tag_key("psv"),tag("psv"), cond(has_tag_key("psv:lanes:forward"),tag("psv:lanes:forward"), tag("psv:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"), cond(has_tag_key("access"),tag("access"), cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"), tag("access:forward") )))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/psv forward.png"):prop(sign_forward_1)); sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/psv forward.png"):prop(sign_forward_2)); sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/psv forward.png"):prop(sign_forward_3)); sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/psv forward.png"):prop(sign_forward_4)); sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/psv forward.png"):prop(sign_forward_5)); sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/psv forward.png"):prop(sign_forward_6)); sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/psv forward.png"):prop(sign_forward_7)); sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/psv forward.png"):prop(sign_forward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("psv:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("psv:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("psv:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("psv:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* PSV backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["psv:lanes:backward"], way|z17-[is_prop_set(ok)]["psv:backward"], way|z17-[is_prop_set(ok)]["psv:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)]["psv"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("psv:lanes"),tag("psv:lanes"), cond(has_tag_key("psv"),tag("psv"), cond(has_tag_key("psv:lanes:backward"),tag("psv:lanes:backward"), tag("psv:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); /* TODO: oneway=-1*/ tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward"))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/psv backward.png"):prop(sign_backward_1)); sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/psv backward.png"):prop(sign_backward_2)); sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/psv backward.png"):prop(sign_backward_3)); sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/psv backward.png"):prop(sign_backward_4)); sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/psv backward.png"):prop(sign_backward_5)); sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/psv backward.png"):prop(sign_backward_6)); sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/psv backward.png"):prop(sign_backward_7)); sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/psv backward.png"):prop(sign_backward_8)); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(has_tag_key("psv:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("psv:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Bicycle forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["bicycle:lanes:forward"], way|z17-[is_prop_set(ok)]["bicycle:forward"], way|z17-[is_prop_set(ok)]["bicycle:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)]["bicycle"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("bicycle:lanes"),tag("bicycle:lanes"), cond(has_tag_key("bicycle"),tag("bicycle"), cond(has_tag_key("bicycle:lanes:forward"),tag("bicycle:lanes:forward"), tag("bicycle:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"), cond(has_tag_key("access"),tag("access"), cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"), tag("access:forward") )))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/bicycle forward.png"):prop(sign_forward_1)); sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/bicycle forward.png"):prop(sign_forward_2)); sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/bicycle forward.png"):prop(sign_forward_3)); sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/bicycle forward.png"):prop(sign_forward_4)); sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/bicycle forward.png"):prop(sign_forward_5)); sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/bicycle forward.png"):prop(sign_forward_6)); sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/bicycle forward.png"):prop(sign_forward_7)); sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/bicycle forward.png"):prop(sign_forward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("bicycle:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("bicycle:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("bicycle:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("bicycle:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Bicycle backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["bicycle:lanes:backward"], way|z17-[is_prop_set(ok)]["bicycle:backward"], way|z17-[is_prop_set(ok)]["bicycle:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)]["bicycle"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("bicycle:lanes"),tag("bicycle:lanes"), cond(has_tag_key("bicycle"),tag("bicycle"), cond(has_tag_key("bicycle:lanes:backward"),tag("bicycle:lanes:backward"), tag("bicycle:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); /* TODO: oneway=-1*/ tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward"))); tempa_list: eval(split("|",prop(tempa))); tempa_length: eval(length(prop(tempa_list))); sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/bicycle backward.png"):prop(sign_backward_1)); sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/bicycle backward.png"):prop(sign_backward_2)); sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/bicycle backward.png"):prop(sign_backward_3)); sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/bicycle backward.png"):prop(sign_backward_4)); sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/bicycle backward.png"):prop(sign_backward_5)); sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/bicycle backward.png"):prop(sign_backward_6)); sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/bicycle backward.png"):prop(sign_backward_7)); sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/bicycle backward.png"):prop(sign_backward_8)); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(has_tag_key("bicycle:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("bicycle:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* HOV forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["hov:lanes:forward"], way|z17-[is_prop_set(ok)]["hov:forward"], way|z17-[is_prop_set(ok)]["hov:lanes"][prop(oneway_type)=1], way|z17-[is_prop_set(ok)]["hov"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("hov:lanes"),tag("hov:lanes"), cond(has_tag_key("hov:lanes:forward"),tag("hov:lanes:forward"), cond(has_tag_key("hov"),tag("hov"), tag("hov:forward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); hov_minimum: eval(has_tag_key("hov:minimum:forward")?tag("hov:minimum:forward"):(has_tag_key("hov:minimum")?tag("hov:minimum"):0)); hov_image: eval((prop(hov_minimum)=2)?";images/hov2 forward.png":((prop(hov_minimum)=3)?";images/hov3 forward.png":";images/hov forward.png")); t: eval(get(prop(temp_list),0)); sign_forward_1: eval(((prop(temp_length)>0) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_1),prop(hov_image)):prop(sign_forward_1)); t: eval(get(prop(temp_list),1)); sign_forward_2: eval(((prop(temp_length)>1) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_2),prop(hov_image)):prop(sign_forward_2)); t: eval(get(prop(temp_list),2)); sign_forward_3: eval(((prop(temp_length)>2) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_3),prop(hov_image)):prop(sign_forward_3)); t: eval(get(prop(temp_list),3)); sign_forward_4: eval(((prop(temp_length)>3) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_4),prop(hov_image)):prop(sign_forward_4)); t: eval(get(prop(temp_list),4)); sign_forward_5: eval(((prop(temp_length)>4) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_5),prop(hov_image)):prop(sign_forward_5)); t: eval(get(prop(temp_list),5)); sign_forward_6: eval(((prop(temp_length)>5) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_6),prop(hov_image)):prop(sign_forward_6)); t: eval(get(prop(temp_list),6)); sign_forward_7: eval(((prop(temp_length)>6) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_7),prop(hov_image)):prop(sign_forward_7)); t: eval(get(prop(temp_list),7)); sign_forward_8: eval(((prop(temp_length)>7) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_8),prop(hov_image)):prop(sign_forward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("hov:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("hov:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_fwd_min: eval(has_tag_key("hov:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval(has_tag_key("hov:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* HOV backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["hov:lanes:backward"], way|z17-[is_prop_set(ok)]["hov:backward"], way|z17-[is_prop_set(ok)]["hov:lanes"][prop(oneway_type)=(-1)], way|z17-[is_prop_set(ok)]["hov"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("hov:lanes"),tag("hov:lanes"), cond(has_tag_key("hov"),tag("hov"), cond(has_tag_key("hov:lanes:backward"),tag("hov:lanes:backward"), tag("hov:backward") )))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); hov_minimum: eval(has_tag_key("hov:minimum:backward")?tag("hov:minimum:backward"):(has_tag_key("hov:minimum")?tag("hov:minimum"):0)); hov_image: eval((prop(hov_minimum)=2)?";images/hov2 backward.png":((prop(hov_minimum)=3)?";images/hov3 backward.png":";images/hov backward.png")); t: eval(get(prop(temp_list),0)); sign_backward_1: eval(((prop(temp_length)>0) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_1),prop(hov_image)):prop(sign_backward_1)); t: eval(get(prop(temp_list),1)); sign_backward_2: eval(((prop(temp_length)>1) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_2),prop(hov_image)):prop(sign_backward_2)); t: eval(get(prop(temp_list),2)); sign_backward_3: eval(((prop(temp_length)>2) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_3),prop(hov_image)):prop(sign_backward_3)); t: eval(get(prop(temp_list),3)); sign_backward_4: eval(((prop(temp_length)>3) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_4),prop(hov_image)):prop(sign_backward_4)); t: eval(get(prop(temp_list),4)); sign_backward_5: eval(((prop(temp_length)>4) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_5),prop(hov_image)):prop(sign_backward_5)); t: eval(get(prop(temp_list),5)); sign_backward_6: eval(((prop(temp_length)>5) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_6),prop(hov_image)):prop(sign_backward_6)); t: eval(get(prop(temp_list),6)); sign_backward_7: eval(((prop(temp_length)>6) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_7),prop(hov_image)):prop(sign_backward_7)); t: eval(get(prop(temp_list),7)); sign_backward_8: eval(((prop(temp_length)>7) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_8),prop(hov_image)):prop(sign_backward_8)); /* Lane count based on :lanes values */ tag_lanes_all_min: eval(has_tag_key("hov:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min)); tag_lanes_all_max: eval(has_tag_key("hov:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max)); tag_lanes_bwd_min: eval(has_tag_key("hov:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval(has_tag_key("hov:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max)); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Check of the number of lane-dependent width */ /* The calculation itself depends on the lane count and therefore is done AFTER the determination of the lane count */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way|z17-["width:lanes:forward"], way|z17-["width:lanes"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("width:lanes:forward"),tag("width:lanes:forward"),tag("width:lanes"))); temp_length: eval(length(split("|",prop(temp)))); /* Lane count based on :lanes values */ tag_lanes_fwd_min: eval(min(prop(tag_lanes_fwd_min),prop(temp_length))); tag_lanes_fwd_max: eval(max(prop(tag_lanes_fwd_max),prop(temp_length))); } way|z17-["width:lanes:backward"], way|z17-["width:lanes"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("width:lanes:backward"),tag("width:lanes:backward"),tag("width:lanes"))); temp_length: eval(length(split("|",prop(temp)))); /* Lane count based on :lanes values */ tag_lanes_bwd_min: eval(min(prop(tag_lanes_bwd_min),prop(temp_length))); tag_lanes_bwd_max: eval(max(prop(tag_lanes_bwd_max),prop(temp_length))); } way|z17-["width:lanes:both_ways"] { temp: eval(tag("width:lanes:both_ways")); temp_length: eval(length(split("|",prop(temp)))); /* Lane count based on :lanes values */ tag_lanes_both_min: eval(min(prop(tag_lanes_both_min),prop(temp_length))); tag_lanes_both_max: eval(max(prop(tag_lanes_both_max),prop(temp_length))); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Retrieve the lane count from the lanes key, its subkeys and the :lanes-tags */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way[is_prop_set(ok)][lanes] { lanes_all: tag(lanes);} way[is_prop_set(ok)]["lanes:forward"] { lanes_fwd: tag("lanes:forward");} way[is_prop_set(ok)]["lanes:backward"] { lanes_bwd: tag("lanes:backward");} way[is_prop_set(ok)]["lanes:both_ways"] { lanes_both: tag("lanes:both_ways");} /* Nothing specified */ way[is_prop_set(ok)][prop(oneway_type)=0][!lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"] { lanes_all: 2; lanes_fwd: 1; lanes_bwd: 1; lanes_both: 0; } way[is_prop_set(ok)][prop(oneway_type)=1][!lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"] { lanes_all: 1; lanes_fwd: 1; lanes_bwd: 0; lanes_both: 0; } way[is_prop_set(ok)][prop(oneway_type)=(-1)][!lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"] { lanes_all: 1; lanes_fwd: 0; lanes_bwd: 1; lanes_both: 0; } /* One-ways */ way[is_prop_set(ok)][lanes][!"lanes:forward"][!"lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=1] { lanes_fwd: prop(lanes_all); lanes_bwd: 0; lanes_both: 0; } way[is_prop_set(ok)][lanes][!"lanes:forward"][!"lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=(-1)] { lanes_bwd: prop(lanes_all); lanes_fwd: 0; lanes_both: 0; } way[is_prop_set(ok)][!lanes]["lanes:forward"][!"lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=1] { lanes_all: prop(lanes_fwd); lanes_bwd: 0; lanes_both: 0; } way[is_prop_set(ok)][!lanes][!"lanes:forward"]["lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=(-1)] { lanes_all: prop(lanes_bwd); lanes_fwd: 0; lanes_both: 0; } /* One count besides both_ways is missing */ way[is_prop_set(ok)][lanes][!"lanes:forward"]["lanes:backward"][!"lanes:both_ways"] { lanes_fwd: eval((prop(lanes_all))-(prop(lanes_bwd))); lanes_both: 0; } way[is_prop_set(ok)][lanes]["lanes:forward"][!"lanes:backward"][!"lanes:both_ways"] { lanes_bwd: eval((prop(lanes_all))-(prop(lanes_fwd))); lanes_both: 0;} way[is_prop_set(ok)][!lanes]["lanes:forward"]["lanes:backward"][!"lanes:both_ways"] { lanes_all: eval((prop(lanes_fwd))+(prop(lanes_bwd))); lanes_both: 0; } /* One count is missing */ way[is_prop_set(ok)][lanes]["lanes:forward"]["lanes:backward"][!"lanes:both_ways"] { lanes_both: eval((prop(lanes_all))-((prop(lanes_fwd))+(prop(lanes_bwd)))); } way[is_prop_set(ok)][lanes]["lanes:forward"][!"lanes:backward"]["lanes:both_ways"] { lanes_bwd: eval((prop(lanes_all))-((prop(lanes_fwd))+(prop(lanes_both)))); } way[is_prop_set(ok)][lanes][!"lanes:forward"]["lanes:backward"]["lanes:both_ways"] { lanes_fwd: eval((prop(lanes_all))-((prop(lanes_bwd))+(prop(lanes_both)))); } way[is_prop_set(ok)][!lanes]["lanes:forward"]["lanes:backward"]["lanes:both_ways"] { lanes_all: eval((prop(lanes_fwd))+((prop(lanes_bwd))+(prop(lanes_both)))); } /* Only the lanes tag is set */ way[is_prop_set(ok)][prop(oneway_type)=0][lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"] { lanes_fwd: eval(max(1,floor(tag(lanes)/2))); lanes_bwd: eval(floor(tag(lanes)/2)); lanes_both: eval((prop(lanes_all))-(prop(lanes_fwd))-(prop(lanes_bwd))); } /* Safety check and adding lanes for "non-motorized or non-general traffic" */ way[is_prop_set(ok)] { /* Check for errors */ data_error: eval(((prop(tag_lanes_all_max)>0) && (prop(tag_lanes_all_min)<prop(tag_lanes_all_max)))?"Inconsistent <tag>:lanes":prop(data_error)); data_error: eval(((prop(tag_lanes_fwd_max)>0) && (prop(tag_lanes_fwd_min)<prop(tag_lanes_fwd_max)))?"Inconsistent <tag>:lanes:forward":prop(data_error)); data_error: eval(((prop(tag_lanes_bwd_max)>0) && (prop(tag_lanes_bwd_min)<prop(tag_lanes_bwd_max)))?"Inconsistent <tag>:lanes:backward":prop(data_error)); data_error: eval(((prop(tag_lanes_both_max)>0) && (prop(tag_lanes_both_min)<prop(tag_lanes_both_max)))?"Inconsistent <tag>:lanes:both_ways":prop(data_error)); /* Safety check */ lanes_fwd: eval(cond((prop(lanes_fwd)<0),0,prop(lanes_fwd))); lanes_bwd: eval(cond((prop(lanes_bwd)<0),0,prop(lanes_bwd))); lanes_both: eval(cond((prop(lanes_both)<0),0,prop(lanes_both))); /* In case of one-ways treat the number of all lanes as number of forward/backward lanes */ tag_lanes_fwd_min: eval((prop(oneway_type)=1)?min(prop(tag_lanes_all_min),prop(tag_lanes_fwd_min)):prop(tag_lanes_fwd_min)); tag_lanes_fwd_max: eval((prop(oneway_type)=1)?max(prop(tag_lanes_all_max),prop(tag_lanes_fwd_max)):prop(tag_lanes_fwd_max)); tag_lanes_bwd_min: eval((prop(oneway_type)=(-1))?min(prop(tag_lanes_all_min),prop(tag_lanes_bwd_min)):prop(tag_lanes_bwd_min)); tag_lanes_bwd_max: eval((prop(oneway_type)=(-1))?max(prop(tag_lanes_all_max),prop(tag_lanes_bwd_max)):prop(tag_lanes_bwd_max)); /* Difference to the lane count specified by :lanes-tags */ temp_add_fwd: eval(max(0,prop(tag_lanes_fwd_max)-prop(lanes_fwd))); temp_add_bwd: eval(max(0,prop(tag_lanes_bwd_max)-prop(lanes_bwd))); temp_add_both: eval(max(0,prop(tag_lanes_both_max)-prop(lanes_both))); /* Add the difference */ lanes_fwd: eval(prop(lanes_fwd)+prop(temp_add_fwd)); lanes_bwd: eval(prop(lanes_bwd)+prop(temp_add_bwd)); lanes_both: eval(prop(lanes_both)+prop(temp_add_both)); /* Number of all lanes */ lanes_all: eval(max(1,((prop(lanes_fwd)+prop(lanes_bwd))+prop(lanes_both)))); /* Check for some more errors */ data_error: eval(((prop(tag_lanes_all_max)>0) && (prop(tag_lanes_all_min)<prop(lanes_all)))?"Missing <tag>:lanes values values":prop(data_error)); data_error: eval(((prop(tag_lanes_fwd_max)>0) && (prop(tag_lanes_fwd_min)<prop(lanes_fwd)))?"Missing <tag>:lanes:forward values":prop(data_error)); data_error: eval(((prop(tag_lanes_bwd_max)>0) && (prop(tag_lanes_bwd_min)<prop(lanes_bwd)))?"Missing <tag>:lanes:backward values":prop(data_error)); data_error: eval(((prop(tag_lanes_both_max)>0) && (prop(tag_lanes_both_min)<prop(lanes_both)))?"Missing <tag>:lanes:both_ways values":prop(data_error)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Determine the width of the lanes, road markings and the inner lane width */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17[is_prop_set(ok)] { lane_min_width: 4; lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default"))))); change_allowed: list(6,9); road_marking_width: 1; road_marking_space: 0; } way|z18[is_prop_set(ok)] { lane_min_width: 8; lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default"))))); change_allowed: list(12,18); road_marking_width: 2; road_marking_space: 1; } way|z19[is_prop_set(ok)] { lane_min_width: 8; lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default"))))); change_allowed: list(24,36); road_marking_width: 2; road_marking_space: 1; } way|z20[is_prop_set(ok)] { lane_min_width: 8; lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default"))))); change_allowed: list(48,72); road_marking_width: 2; road_marking_space: 2; } way|z21-[is_prop_set(ok)] { lane_min_width: 12; lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default"))))); change_allowed: list(96,144); road_marking_width: 4; road_marking_space: 3; } way|z22-[is_prop_set(ok)] { lane_min_width: 20; lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default"))))); change_allowed: list(192,288); road_marking_width: 6; road_marking_space: 4; } /* Zoom indepedent variables and helpers */ way|z17-[is_prop_set(ok)] { lane_casing: eval((2*prop(road_marking_width))+prop(road_marking_space)); change_forbidden: 0; change_border: eval((has_tag_key("placement") && (tag("placement")="transition"))?list(1,2):prop(change_forbidden)); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Cleanup of allowed lane changes */ /* This must be done AFTER the determination of the lanes count */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way|z17-[is_prop_set(ok)] { change_forward_1_right: eval(prop(change_forward_1_right)?prop(change_allowed):prop(change_forbidden)); change_forward_1_left: eval(prop(change_forward_1_left)?prop(change_allowed):prop(change_forbidden)); change_forward_2_right: eval(prop(change_forward_2_right)?prop(change_allowed):prop(change_forbidden)); change_forward_2_left: eval(prop(change_forward_2_left)?prop(change_allowed):prop(change_forbidden)); change_forward_3_right: eval(prop(change_forward_3_right)?prop(change_allowed):prop(change_forbidden)); change_forward_3_left: eval(prop(change_forward_3_left)?prop(change_allowed):prop(change_forbidden)); change_forward_4_right: eval(prop(change_forward_4_right)?prop(change_allowed):prop(change_forbidden)); change_forward_4_left: eval(prop(change_forward_4_left)?prop(change_allowed):prop(change_forbidden)); change_forward_5_right: eval(prop(change_forward_5_right)?prop(change_allowed):prop(change_forbidden)); change_forward_5_left: eval(prop(change_forward_5_left)?prop(change_allowed):prop(change_forbidden)); change_forward_6_right: eval(prop(change_forward_6_right)?prop(change_allowed):prop(change_forbidden)); change_forward_6_left: eval(prop(change_forward_6_left)?prop(change_allowed):prop(change_forbidden)); change_forward_7_right: eval(prop(change_forward_7_right)?prop(change_allowed):prop(change_forbidden)); change_forward_7_left: eval(prop(change_forward_7_left)?prop(change_allowed):prop(change_forbidden)); change_forward_8_right: eval(prop(change_forward_8_right)?prop(change_allowed):prop(change_forbidden)); change_forward_8_left: eval(prop(change_forward_8_left)?prop(change_allowed):prop(change_forbidden)); change_backward_1_right: eval(prop(change_backward_1_right)?prop(change_allowed):prop(change_forbidden)); change_backward_1_left: eval(prop(change_backward_1_left)?prop(change_allowed):prop(change_forbidden)); change_backward_2_right: eval(prop(change_backward_2_right)?prop(change_allowed):prop(change_forbidden)); change_backward_2_left: eval(prop(change_backward_2_left)?prop(change_allowed):prop(change_forbidden)); change_backward_3_right: eval(prop(change_backward_3_right)?prop(change_allowed):prop(change_forbidden)); change_backward_3_left: eval(prop(change_backward_3_left)?prop(change_allowed):prop(change_forbidden)); change_backward_4_right: eval(prop(change_backward_4_right)?prop(change_allowed):prop(change_forbidden)); change_backward_4_left: eval(prop(change_backward_4_left)?prop(change_allowed):prop(change_forbidden)); change_backward_5_right: eval(prop(change_backward_5_right)?prop(change_allowed):prop(change_forbidden)); change_backward_5_left: eval(prop(change_backward_5_left)?prop(change_allowed):prop(change_forbidden)); change_backward_6_right: eval(prop(change_backward_6_right)?prop(change_allowed):prop(change_forbidden)); change_backward_6_left: eval(prop(change_backward_6_left)?prop(change_allowed):prop(change_forbidden)); change_backward_7_right: eval(prop(change_backward_7_right)?prop(change_allowed):prop(change_forbidden)); change_backward_7_left: eval(prop(change_backward_7_left)?prop(change_allowed):prop(change_forbidden)); change_backward_8_right: eval(prop(change_backward_8_right)?prop(change_allowed):prop(change_forbidden)); change_backward_8_left: eval(prop(change_backward_8_left)?prop(change_allowed):prop(change_forbidden)); change_bothways_1_right: eval(prop(change_bothways_1_right)?prop(change_allowed):prop(change_forbidden)); change_bothways_1_left: eval(prop(change_bothways_1_left)?prop(change_allowed):prop(change_forbidden)); change_bothways_2_right: eval(prop(change_bothways_2_right)?prop(change_allowed):prop(change_forbidden)); change_bothways_2_left: eval(prop(change_bothways_2_left)?prop(change_allowed):prop(change_forbidden)); change_bothways_3_right: eval(prop(change_bothways_3_right)?prop(change_allowed):prop(change_forbidden)); change_bothways_3_left: eval(prop(change_bothways_3_left)?prop(change_allowed):prop(change_forbidden)); change_bothways_4_right: eval(prop(change_bothways_4_right)?prop(change_allowed):prop(change_forbidden)); change_bothways_4_left: eval(prop(change_bothways_4_left)?prop(change_allowed):prop(change_forbidden)); /* If two adjacent road markings would look the same, remove one */ change_forward_1_right: eval(cond((prop(lanes_fwd)>1) && (prop(change_forward_2_left)=prop(change_forward_1_right)),list(0.1,999999),prop(change_forward_1_right))); change_forward_2_right: eval(cond((prop(lanes_fwd)>2) && (prop(change_forward_3_left)=prop(change_forward_2_right)),list(0.1,999999),prop(change_forward_2_right))); change_forward_3_right: eval(cond((prop(lanes_fwd)>3) && (prop(change_forward_4_left)=prop(change_forward_3_right)),list(0.1,999999),prop(change_forward_3_right))); change_forward_4_right: eval(cond((prop(lanes_fwd)>4) && (prop(change_forward_5_left)=prop(change_forward_4_right)),list(0.1,999999),prop(change_forward_4_right))); change_forward_5_right: eval(cond((prop(lanes_fwd)>5) && (prop(change_forward_6_left)=prop(change_forward_5_right)),list(0.1,999999),prop(change_forward_5_right))); change_forward_6_right: eval(cond((prop(lanes_fwd)>6) && (prop(change_forward_7_left)=prop(change_forward_6_right)),list(0.1,999999),prop(change_forward_6_right))); change_forward_7_right: eval(cond((prop(lanes_fwd)>7) && (prop(change_forward_8_left)=prop(change_forward_7_right)),list(0.1,999999),prop(change_forward_7_right))); change_backward_2_left: eval(cond((prop(lanes_bwd)>1) && (prop(change_backward_1_right)=prop(change_backward_2_left)),list(0.1,999999),prop(change_backward_2_left))); change_backward_3_left: eval(cond((prop(lanes_bwd)>2) && (prop(change_backward_2_right)=prop(change_backward_3_left)),list(0.1,999999),prop(change_backward_3_left))); change_backward_4_left: eval(cond((prop(lanes_bwd)>3) && (prop(change_backward_3_right)=prop(change_backward_4_left)),list(0.1,999999),prop(change_backward_4_left))); change_backward_5_left: eval(cond((prop(lanes_bwd)>4) && (prop(change_backward_4_right)=prop(change_backward_5_left)),list(0.1,999999),prop(change_backward_5_left))); change_backward_6_left: eval(cond((prop(lanes_bwd)>5) && (prop(change_backward_5_right)=prop(change_backward_6_left)),list(0.1,999999),prop(change_backward_6_left))); change_backward_7_left: eval(cond((prop(lanes_bwd)>6) && (prop(change_backward_6_right)=prop(change_backward_7_left)),list(0.1,999999),prop(change_backward_7_left))); change_backward_8_left: eval(cond((prop(lanes_bwd)>7) && (prop(change_backward_7_right)=prop(change_backward_8_left)),list(0.1,999999),prop(change_backward_8_left))); change_bothways_1_right: eval(cond((prop(lanes_fwd)>1) && (prop(change_bothways_2_left)=prop(change_bothways_1_right)),list(0.1,999999),prop(change_bothways_1_right))); change_bothways_2_right: eval(cond((prop(lanes_fwd)>2) && (prop(change_bothways_3_left)=prop(change_bothways_2_right)),list(0.1,999999),prop(change_bothways_2_right))); change_bothways_3_right: eval(cond((prop(lanes_fwd)>3) && (prop(change_bothways_4_left)=prop(change_bothways_3_right)),list(0.1,999999),prop(change_bothways_3_right))); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Make the borders always solid */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)][prop(style_right_hand_traffic)] { change_forward_1_left: eval(((prop(oneway_type)=1) || (prop(lanes_all)=1))?prop(change_border):prop(change_forward_1_left)); change_backward_1_left: eval((prop(oneway_type)=(-1))?prop(change_border):prop(change_backward_1_left)); } way|z17-[is_prop_set(ok)][!prop(style_right_hand_traffic)] { change_forward_1_left: prop(change_border); change_backward_1_left: prop(change_border); change_forward_1_right: eval((prop(lanes_all)=1)?prop(change_border):prop(change_forward_1_right)); } way|z17-[is_prop_set(ok)][prop(style_right_hand_traffic)], way|z17-[is_prop_set(ok)][!prop(style_right_hand_traffic)][prop(oneway_type)=1] { change_forward_1_right: eval((prop(lanes_fwd)=1)?prop(change_border):prop(change_forward_1_right)); change_forward_2_right: eval((prop(lanes_fwd)=2)?prop(change_border):prop(change_forward_2_right)); change_forward_3_right: eval((prop(lanes_fwd)=3)?prop(change_border):prop(change_forward_3_right)); change_forward_4_right: eval((prop(lanes_fwd)=4)?prop(change_border):prop(change_forward_4_right)); change_forward_5_right: eval((prop(lanes_fwd)=5)?prop(change_border):prop(change_forward_5_right)); change_forward_6_right: eval((prop(lanes_fwd)=6)?prop(change_border):prop(change_forward_6_right)); change_forward_7_right: eval((prop(lanes_fwd)=7)?prop(change_border):prop(change_forward_7_right)); change_forward_8_right: eval((prop(lanes_fwd)=8)?prop(change_border):prop(change_forward_8_right)); } way|z17-[is_prop_set(ok)][prop(style_right_hand_traffic)], way|z17-[is_prop_set(ok)][!prop(style_right_hand_traffic)][prop(oneway_type)=(-1)] { change_backward_1_right: eval((prop(lanes_bwd)=1)?prop(change_border):prop(change_backward_1_right)); change_backward_2_right: eval((prop(lanes_bwd)=2)?prop(change_border):prop(change_backward_2_right)); change_backward_3_right: eval((prop(lanes_bwd)=3)?prop(change_border):prop(change_backward_3_right)); change_backward_4_right: eval((prop(lanes_bwd)=4)?prop(change_border):prop(change_backward_4_right)); change_backward_5_right: eval((prop(lanes_bwd)=5)?prop(change_border):prop(change_backward_5_right)); change_backward_6_right: eval((prop(lanes_bwd)=6)?prop(change_border):prop(change_backward_6_right)); change_backward_7_right: eval((prop(lanes_bwd)=7)?prop(change_border):prop(change_backward_7_right)); change_backward_8_right: eval((prop(lanes_bwd)=8)?prop(change_border):prop(change_backward_8_right)); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Splitting the list of signs into separate properties */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way[!(prop(sign_forward_1)="")] { t: eval(split(";",prop(sign_forward_1))); sign_1_forward_1: eval(get(prop(t),1)); sign_2_forward_1: eval(get(prop(t),2)); sign_3_forward_1: eval(get(prop(t),3)); } way[!(prop(sign_forward_2)="")] { t: eval(split(";",prop(sign_forward_2))); sign_1_forward_2: eval(get(prop(t),1)); sign_2_forward_2: eval(get(prop(t),2)); sign_3_forward_2: eval(get(prop(t),3)); } way[!(prop(sign_forward_3)="")] { t: eval(split(";",prop(sign_forward_3))); sign_1_forward_3: eval(get(prop(t),1)); sign_2_forward_3: eval(get(prop(t),2)); sign_3_forward_3: eval(get(prop(t),3)); } way[!(prop(sign_forward_4)="")] { t: eval(split(";",prop(sign_forward_4))); sign_1_forward_4: eval(get(prop(t),1)); sign_2_forward_4: eval(get(prop(t),2)); sign_3_forward_4: eval(get(prop(t),3)); } way[!(prop(sign_forward_5)="")] { t: eval(split(";",prop(sign_forward_5))); sign_1_forward_5: eval(get(prop(t),1)); sign_2_forward_5: eval(get(prop(t),2)); sign_3_forward_5: eval(get(prop(t),3)); } way[!(prop(sign_forward_6)="")] { t: eval(split(";",prop(sign_forward_6))); sign_1_forward_6: eval(get(prop(t),1)); sign_2_forward_6: eval(get(prop(t),2)); sign_3_forward_6: eval(get(prop(t),3)); } way[!(prop(sign_forward_7)="")] { t: eval(split(";",prop(sign_forward_7))); sign_1_forward_7: eval(get(prop(t),1)); sign_2_forward_7: eval(get(prop(t),2)); sign_3_forward_7: eval(get(prop(t),3)); } way[!(prop(sign_forward_7)="")] { t: eval(split(";",prop(sign_forward_8))); sign_1_forward_8: eval(get(prop(t),1)); sign_2_forward_8: eval(get(prop(t),2)); sign_3_forward_8: eval(get(prop(t),3)); } way[!(prop(sign_backward_1)="")] { t: eval(split(";",prop(sign_backward_1))); sign_1_backward_1: eval(get(prop(t),1)); sign_2_backward_1: eval(get(prop(t),2)); sign_3_backward_1: eval(get(prop(t),3)); } way[!(prop(sign_backward_2)="")] { t: eval(split(";",prop(sign_backward_2))); sign_1_backward_2: eval(get(prop(t),1)); sign_2_backward_2: eval(get(prop(t),2)); sign_3_backward_2: eval(get(prop(t),3)); } way[!(prop(sign_backward_3)="")] { t: eval(split(";",prop(sign_backward_3))); sign_1_backward_3: eval(get(prop(t),1)); sign_2_backward_3: eval(get(prop(t),2)); sign_3_backward_3: eval(get(prop(t),3)); } way[!(prop(sign_backward_4)="")] { t: eval(split(";",prop(sign_backward_4))); sign_1_backward_4: eval(get(prop(t),1)); sign_2_backward_4: eval(get(prop(t),2)); sign_3_backward_4: eval(get(prop(t),3)); } way[!(prop(sign_backward_5)="")] { t: eval(split(";",prop(sign_backward_5))); sign_1_backward_5: eval(get(prop(t),1)); sign_2_backward_5: eval(get(prop(t),2)); sign_3_backward_5: eval(get(prop(t),3)); } way[!(prop(sign_backward_6)="")] { t: eval(split(";",prop(sign_backward_6))); sign_1_backward_6: eval(get(prop(t),1)); sign_2_backward_6: eval(get(prop(t),2)); sign_3_backward_6: eval(get(prop(t),3)); } way[!(prop(sign_backward_7)="")] { t: eval(split(";",prop(sign_backward_7))); sign_1_backward_7: eval(get(prop(t),1)); sign_2_backward_7: eval(get(prop(t),2)); sign_3_backward_7: eval(get(prop(t),3)); } way[!(prop(sign_backward_7)="")] { t: eval(split(";",prop(sign_backward_8))); sign_1_backward_8: eval(get(prop(t),1)); sign_2_backward_8: eval(get(prop(t),2)); sign_3_backward_8: eval(get(prop(t),3)); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Lane-dependent width */ /* This must be done AFTER the determination of the lanes count */ /* Note: the number of values is calcuated BEFORE the determination of the lanes count */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way|z17-[is_prop_set(ok)] { lane_width_forward_1: eval(prop(lane_default_width)); lane_width_forward_2: eval(prop(lane_default_width)); lane_width_forward_3: eval(prop(lane_default_width)); lane_width_forward_4: eval(prop(lane_default_width)); lane_width_forward_5: eval(prop(lane_default_width)); lane_width_forward_6: eval(prop(lane_default_width)); lane_width_forward_7: eval(prop(lane_default_width)); lane_width_forward_8: eval(prop(lane_default_width)); lane_width_backward_1: eval(prop(lane_default_width)); lane_width_backward_2: eval(prop(lane_default_width)); lane_width_backward_3: eval(prop(lane_default_width)); lane_width_backward_4: eval(prop(lane_default_width)); lane_width_backward_5: eval(prop(lane_default_width)); lane_width_backward_6: eval(prop(lane_default_width)); lane_width_backward_7: eval(prop(lane_default_width)); lane_width_backward_8: eval(prop(lane_default_width)); lane_width_bothways_1: eval(prop(lane_default_width)); lane_width_bothways_2: eval(prop(lane_default_width)); lane_width_bothways_3: eval(prop(lane_default_width)); lane_width_bothways_4: eval(prop(lane_default_width)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["width:lanes:forward"], way|z17-[is_prop_set(ok)]["width:lanes"][prop(oneway_type)=1] { temp: eval(cond(has_tag_key("width:lanes:forward"),tag("width:lanes:forward"),tag("width:lanes"))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); lane_width_forward_1: eval(((prop(temp_length)>0) && (get(prop(temp_list),0)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),0)))):prop(lane_default_width)); lane_width_forward_2: eval(((prop(temp_length)>1) && (get(prop(temp_list),1)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),1)))):prop(lane_default_width)); lane_width_forward_3: eval(((prop(temp_length)>2) && (get(prop(temp_list),2)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),2)))):prop(lane_default_width)); lane_width_forward_4: eval(((prop(temp_length)>3) && (get(prop(temp_list),3)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),3)))):prop(lane_default_width)); lane_width_forward_5: eval(((prop(temp_length)>4) && (get(prop(temp_list),4)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),4)))):prop(lane_default_width)); lane_width_forward_6: eval(((prop(temp_length)>5) && (get(prop(temp_list),5)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),5)))):prop(lane_default_width)); lane_width_forward_7: eval(((prop(temp_length)>6) && (get(prop(temp_list),6)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),6)))):prop(lane_default_width)); lane_width_forward_8: eval(((prop(temp_length)>7) && (get(prop(temp_list),7)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),7)))):prop(lane_default_width)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["width:lanes:backward"], way|z17-[is_prop_set(ok)]["width:lanes"][prop(oneway_type)=(-1)] { temp: eval(cond(has_tag_key("width:lanes:backward"),tag("width:lanes:backward"),tag("width:lanes"))); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); lane_width_backward_1: eval(((prop(temp_length)>0) && (get(prop(temp_list),0)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),0)))):prop(lane_default_width)); lane_width_backward_2: eval(((prop(temp_length)>1) && (get(prop(temp_list),1)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),1)))):prop(lane_default_width)); lane_width_backward_3: eval(((prop(temp_length)>2) && (get(prop(temp_list),2)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),2)))):prop(lane_default_width)); lane_width_backward_4: eval(((prop(temp_length)>3) && (get(prop(temp_list),3)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),3)))):prop(lane_default_width)); lane_width_backward_5: eval(((prop(temp_length)>4) && (get(prop(temp_list),4)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),4)))):prop(lane_default_width)); lane_width_backward_6: eval(((prop(temp_length)>5) && (get(prop(temp_list),5)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),5)))):prop(lane_default_width)); lane_width_backward_7: eval(((prop(temp_length)>6) && (get(prop(temp_list),6)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),6)))):prop(lane_default_width)); lane_width_backward_8: eval(((prop(temp_length)>7) && (get(prop(temp_list),7)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),7)))):prop(lane_default_width)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Bothways lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)]["width:lanes:both_ways"] { temp: eval(tag("width:lanes:both_ways")); temp_list: eval(split("|",prop(temp))); temp_length: eval(length(prop(temp_list))); lane_width_bothways_1: eval(((prop(temp_length)>0) && (get(prop(temp_list),0)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),0)))):prop(lane_default_width)); lane_width_bothways_2: eval(((prop(temp_length)>1) && (get(prop(temp_list),1)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),1)))):prop(lane_default_width)); lane_width_bothways_3: eval(((prop(temp_length)>2) && (get(prop(temp_list),2)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),2)))):prop(lane_default_width)); lane_width_bothways_4: eval(((prop(temp_length)>3) && (get(prop(temp_list),3)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),3)))):prop(lane_default_width)); } way|z17-[is_prop_set(ok)] { lane_width_all_forward: eval( ((prop(lanes_fwd)>0)?prop(lane_width_forward_1):0)+ ((prop(lanes_fwd)>1)?prop(lane_width_forward_2):0)+ ((prop(lanes_fwd)>2)?prop(lane_width_forward_3):0)+ ((prop(lanes_fwd)>3)?prop(lane_width_forward_4):0)+ ((prop(lanes_fwd)>4)?prop(lane_width_forward_5):0)+ ((prop(lanes_fwd)>5)?prop(lane_width_forward_6):0)+ ((prop(lanes_fwd)>6)?prop(lane_width_forward_7):0)+ ((prop(lanes_fwd)>7)?prop(lane_width_forward_8):0) ); lane_width_all_backward: eval( ((prop(lanes_bwd)>0)?prop(lane_width_backward_1):0)+ ((prop(lanes_bwd)>1)?prop(lane_width_backward_2):0)+ ((prop(lanes_bwd)>2)?prop(lane_width_backward_3):0)+ ((prop(lanes_bwd)>3)?prop(lane_width_backward_4):0)+ ((prop(lanes_bwd)>4)?prop(lane_width_backward_5):0)+ ((prop(lanes_bwd)>5)?prop(lane_width_backward_6):0)+ ((prop(lanes_bwd)>6)?prop(lane_width_backward_7):0)+ ((prop(lanes_bwd)>7)?prop(lane_width_backward_8):0) ); lane_width_all_bothways: eval( ((prop(lanes_both)>0)?prop(lane_width_bothways_1):0)+ ((prop(lanes_both)>1)?prop(lane_width_bothways_2):0)+ ((prop(lanes_both)>2)?prop(lane_width_bothways_3):0)+ ((prop(lanes_both)>3)?prop(lane_width_bothways_4):0) ); lane_width_all: eval((prop(lane_width_all_forward)+prop(lane_width_all_backward))+prop(lane_width_all_bothways)); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Offset of the road given by the placement tag */ /* It is assumed that only one of the placement tags is set, otherwise the result will most certainly be incorrect */ /* TODO: placement:both_ways is currently not supported, verify support for left-hand-traffic */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Error checking */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way["placement"] { data_error: eval(regexp_test("^(transition|middle_of:[0-9]+|right_of:[0-9]+|left_of:[0-9]+)$",tag("placement"))?prop(data_error):"invalid placement value"); } way["placement:forward"] { data_error: eval(regexp_test("^(transition|middle_of:[0-9]+|right_of:[0-9]+|left_of:[0-9]+)$",tag("placement:forward"))?prop(data_error):"invalid placement:forward value"); } way["placement:backward"] { data_error: eval(regexp_test("^(transition|middle_of:[0-9]+|right_of:[0-9]+|left_of:[0-9]+)$",tag("placement:backward"))?prop(data_error):"invalid placement:backward value"); } way["placement"]["placement:forward"], way["placement"]["placement:backward"], way["placement:forward"]["placement:backward"] { data_error: eval("multiple placement tags"); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* 1. Calculate the borders without consideration of placement */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way[is_prop_set(ok)] { /* Determine the borders of the parts of the carriageway assuming no placement was specified */ placement_offset: 0; placement_transition: eval(has_tag_key("placement") && (tag("placement")="transition")); left_carriageway_border: eval(prop(lane_width_all)/2.0); left_forward_border: eval(cond(prop(style_right_hand_traffic), (prop(left_carriageway_border) - (prop(lane_width_all_backward)+prop(lane_width_all_bothways))), prop(left_carriageway_border) ) ); right_backward_border: eval(cond(prop(style_right_hand_traffic), (prop(left_carriageway_border) - prop(lane_width_all_backward)), (prop(left_carriageway_border) - prop(lane_width_all)) ) ); left_bothways_border: eval(cond(prop(style_right_hand_traffic), (prop(left_carriageway_border) - prop(lane_width_all_backward)), (prop(left_carriageway_border) - prop(lane_width_all_forward)) ) ); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* 2.a. Offset of the forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)] { lane_offset_forward_1: eval(prop(left_forward_border)- (prop(lane_width_forward_1)/2)); lane_offset_forward_2: eval(prop(lane_offset_forward_1)- ((prop(lane_width_forward_1)+ prop(lane_width_forward_2))/2)); lane_offset_forward_3: eval(prop(lane_offset_forward_2)- ((prop(lane_width_forward_2)+ prop(lane_width_forward_3))/2)); lane_offset_forward_4: eval(prop(lane_offset_forward_3)- ((prop(lane_width_forward_3)+ prop(lane_width_forward_4))/2)); lane_offset_forward_5: eval(prop(lane_offset_forward_4)- ((prop(lane_width_forward_4)+ prop(lane_width_forward_5))/2)); lane_offset_forward_6: eval(prop(lane_offset_forward_5)- ((prop(lane_width_forward_5)+ prop(lane_width_forward_6))/2)); lane_offset_forward_7: eval(prop(lane_offset_forward_6)- ((prop(lane_width_forward_6)+ prop(lane_width_forward_7))/2)); lane_offset_forward_8: eval(prop(lane_offset_forward_7)- ((prop(lane_width_forward_7)+ prop(lane_width_forward_8))/2)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* 2.b. Offset of the backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)] { lane_offset_backward_1: eval(prop(right_backward_border)+ (prop(lane_width_backward_1)/2)); lane_offset_backward_2: eval(prop(lane_offset_backward_1)+ ((prop(lane_width_backward_1)+ prop(lane_width_backward_2))/2)); lane_offset_backward_3: eval(prop(lane_offset_backward_2)+ ((prop(lane_width_backward_2)+ prop(lane_width_backward_3))/2)); lane_offset_backward_4: eval(prop(lane_offset_backward_3)+ ((prop(lane_width_backward_3)+ prop(lane_width_backward_4))/2)); lane_offset_backward_5: eval(prop(lane_offset_backward_4)+ ((prop(lane_width_backward_4)+ prop(lane_width_backward_5))/2)); lane_offset_backward_6: eval(prop(lane_offset_backward_5)+ ((prop(lane_width_backward_5)+ prop(lane_width_backward_6))/2)); lane_offset_backward_7: eval(prop(lane_offset_backward_6)+ ((prop(lane_width_backward_6)+ prop(lane_width_backward_7))/2)); lane_offset_backward_8: eval(prop(lane_offset_backward_7)+ ((prop(lane_width_backward_7)+ prop(lane_width_backward_8))/2)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* 2.c. Offset of the both_ways lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok)] { lane_offset_bothways_1: eval(prop(left_bothways_border)- (prop(lane_width_bothways_1)/2)); lane_offset_bothways_2: eval(prop(lane_offset_bothways_1)- ((prop(lane_width_bothways_1)+ prop(lane_width_bothways_2))/2)); lane_offset_bothways_3: eval(prop(lane_offset_bothways_2)- ((prop(lane_width_bothways_2)+ prop(lane_width_bothways_3))/2)); lane_offset_bothways_4: eval(prop(lane_offset_bothways_3)- ((prop(lane_width_bothways_3)+ prop(lane_width_bothways_4))/2)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* 3. Now determine the offset given by the placement tag */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way[is_prop_set(ok)]["placement:forward"]["placement:forward"!=transition], way[is_prop_set(ok)][prop(oneway_type)=1][placement][placement!=transition] { placement_value: eval(has_tag_key("placement")?tag("placement"):tag("placement:forward")); placement_offset: eval( cond(prop("placement_value")="right_of:1",eval((prop(lane_width_forward_1)/2)-prop(lane_offset_forward_1)), cond(prop("placement_value")="right_of:2",eval((prop(lane_width_forward_2)/2)-prop(lane_offset_forward_2)), cond(prop("placement_value")="right_of:3",eval((prop(lane_width_forward_3)/2)-prop(lane_offset_forward_3)), cond(prop("placement_value")="right_of:4",eval((prop(lane_width_forward_4)/2)-prop(lane_offset_forward_4)), cond(prop("placement_value")="right_of:5",eval((prop(lane_width_forward_5)/2)-prop(lane_offset_forward_5)), cond(prop("placement_value")="right_of:6",eval((prop(lane_width_forward_6)/2)-prop(lane_offset_forward_6)), cond(prop("placement_value")="right_of:7",eval((prop(lane_width_forward_7)/2)-prop(lane_offset_forward_7)), cond(prop("placement_value")="right_of:8",eval((prop(lane_width_forward_8)/2)-prop(lane_offset_forward_8)), cond(prop("placement_value")="left_of:1",eval(-(prop(lane_offset_forward_1)+(prop(lane_width_forward_1)/2))), cond(prop("placement_value")="left_of:2",eval(-(prop(lane_offset_forward_2)+(prop(lane_width_forward_2)/2))), cond(prop("placement_value")="left_of:3",eval(-(prop(lane_offset_forward_3)+(prop(lane_width_forward_3)/2))), cond(prop("placement_value")="left_of:4",eval(-(prop(lane_offset_forward_4)+(prop(lane_width_forward_4)/2))), cond(prop("placement_value")="left_of:5",eval(-(prop(lane_offset_forward_5)+(prop(lane_width_forward_5)/2))), cond(prop("placement_value")="left_of:6",eval(-(prop(lane_offset_forward_6)+(prop(lane_width_forward_6)/2))), cond(prop("placement_value")="left_of:7",eval(-(prop(lane_offset_forward_7)+(prop(lane_width_forward_7)/2))), cond(prop("placement_value")="left_of:8",eval(-(prop(lane_offset_forward_8)+(prop(lane_width_forward_8)/2))), cond(prop("placement_value")="middle_of:1",eval(-prop(lane_offset_forward_1)), cond(prop("placement_value")="middle_of:2",eval(-prop(lane_offset_forward_2)), cond(prop("placement_value")="middle_of:3",eval(-prop(lane_offset_forward_3)), cond(prop("placement_value")="middle_of:4",eval(-prop(lane_offset_forward_4)), cond(prop("placement_value")="middle_of:5",eval(-prop(lane_offset_forward_5)), cond(prop("placement_value")="middle_of:6",eval(-prop(lane_offset_forward_6)), cond(prop("placement_value")="middle_of:7",eval(-prop(lane_offset_forward_7)), cond(prop("placement_value")="middle_of:8",eval(-prop(lane_offset_forward_8)), 0 )))))))))))))))))))))))) ); } way[is_prop_set(ok)]["placement:backward"]["placement:backward"!=transition], way[is_prop_set(ok)][prop(oneway_type)=(-1)][placement][placement!=transition] { placement_value: eval(has_tag_key("placement")?tag("placement"):tag("placement:backward")); placement_offset: eval( cond(prop("placement_value")="right_of:1",eval(-(prop(lane_offset_backward_1)+(prop(lane_width_backward_1)/2))), cond(prop("placement_value")="right_of:2",eval(-(prop(lane_offset_backward_2)+(prop(lane_width_backward_2)/2))), cond(prop("placement_value")="right_of:3",eval(-(prop(lane_offset_backward_3)+(prop(lane_width_backward_3)/2))), cond(prop("placement_value")="right_of:4",eval(-(prop(lane_offset_backward_4)+(prop(lane_width_backward_4)/2))), cond(prop("placement_value")="right_of:5",eval(-(prop(lane_offset_backward_5)+(prop(lane_width_backward_5)/2))), cond(prop("placement_value")="right_of:6",eval(-(prop(lane_offset_backward_6)+(prop(lane_width_backward_6)/2))), cond(prop("placement_value")="right_of:7",eval(-(prop(lane_offset_backward_7)+(prop(lane_width_backward_7)/2))), cond(prop("placement_value")="right_of:8",eval(-(prop(lane_offset_backward_8)+(prop(lane_width_backward_8)/2))), cond(prop("placement_value")="left_of:1",eval((prop(lane_width_backward_1)/2)-prop(lane_offset_backward_1)), cond(prop("placement_value")="left_of:2",eval((prop(lane_width_backward_2)/2)-prop(lane_offset_backward_2)), cond(prop("placement_value")="left_of:3",eval((prop(lane_width_backward_3)/2)-prop(lane_offset_backward_3)), cond(prop("placement_value")="left_of:4",eval((prop(lane_width_backward_4)/2)-prop(lane_offset_backward_4)), cond(prop("placement_value")="left_of:5",eval((prop(lane_width_backward_5)/2)-prop(lane_offset_backward_5)), cond(prop("placement_value")="left_of:6",eval((prop(lane_width_backward_6)/2)-prop(lane_offset_backward_6)), cond(prop("placement_value")="left_of:7",eval((prop(lane_width_backward_7)/2)-prop(lane_offset_backward_7)), cond(prop("placement_value")="left_of:8",eval((prop(lane_width_backward_8)/2)-prop(lane_offset_backward_8)), cond(prop("placement_value")="middle_of:1",eval(-prop(lane_offset_backward_1)), cond(prop("placement_value")="middle_of:2",eval(-prop(lane_offset_backward_2)), cond(prop("placement_value")="middle_of:3",eval(-prop(lane_offset_backward_3)), cond(prop("placement_value")="middle_of:4",eval(-prop(lane_offset_backward_4)), cond(prop("placement_value")="middle_of:5",eval(-prop(lane_offset_backward_5)), cond(prop("placement_value")="middle_of:6",eval(-prop(lane_offset_backward_6)), cond(prop("placement_value")="middle_of:7",eval(-prop(lane_offset_backward_7)), cond(prop("placement_value")="middle_of:8",eval(-prop(lane_offset_backward_8)), 0 )))))))))))))))))))))))) ); } way[is_prop_set(ok)]["placement:both_ways"]["placement:both_ways"!=transition] { placement_value: eval(tag("placement:both_ways")); placement_offset: eval( cond(prop("placement_value")="right_of:1",eval((prop(lane_width_bothways_1)/2)-prop(lane_offset_bothways_1)), cond(prop("placement_value")="right_of:2",eval((prop(lane_width_bothways_2)/2)-prop(lane_offset_bothways_2)), cond(prop("placement_value")="right_of:3",eval((prop(lane_width_bothways_3)/2)-prop(lane_offset_bothways_3)), cond(prop("placement_value")="right_of:4",eval((prop(lane_width_bothways_4)/2)-prop(lane_offset_bothways_4)), cond(prop("placement_value")="left_of:1",eval(-(prop(lane_offset_bothways_1)+(prop(lane_width_bothways_1)/2))), cond(prop("placement_value")="left_of:2",eval(-(prop(lane_offset_bothways_2)+(prop(lane_width_bothways_2)/2))), cond(prop("placement_value")="left_of:3",eval(-(prop(lane_offset_bothways_3)+(prop(lane_width_bothways_3)/2))), cond(prop("placement_value")="left_of:4",eval(-(prop(lane_offset_bothways_4)+(prop(lane_width_bothways_4)/2))), cond(prop("placement_value")="middle_of:1",eval(-prop(lane_offset_bothways_1)), cond(prop("placement_value")="middle_of:2",eval(-prop(lane_offset_bothways_2)), cond(prop("placement_value")="middle_of:3",eval(-prop(lane_offset_bothways_3)), cond(prop("placement_value")="middle_of:4",eval(-prop(lane_offset_bothways_4)), 0 )))))))))))) ); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* 4. Move the carriageway and the lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way[is_prop_set(ok)] { /* Move the carriageway borders */ left_carriageway_border: eval((prop(left_carriageway_border) + prop(placement_offset))); left_forward_border: eval((prop(left_forward_border) + prop(placement_offset))); right_backward_border: eval((prop(right_backward_border) + prop(placement_offset))); left_bothways_border: eval((prop(left_bothways_border) + prop(placement_offset))); /* Move the lanes */ lane_offset_forward_1: eval((prop(lane_offset_forward_1) + prop(placement_offset))); lane_offset_forward_2: eval((prop(lane_offset_forward_2) + prop(placement_offset))); lane_offset_forward_3: eval((prop(lane_offset_forward_3) + prop(placement_offset))); lane_offset_forward_4: eval((prop(lane_offset_forward_4) + prop(placement_offset))); lane_offset_forward_5: eval((prop(lane_offset_forward_5) + prop(placement_offset))); lane_offset_forward_6: eval((prop(lane_offset_forward_6) + prop(placement_offset))); lane_offset_forward_7: eval((prop(lane_offset_forward_7) + prop(placement_offset))); lane_offset_forward_8: eval((prop(lane_offset_forward_8) + prop(placement_offset))); lane_offset_backward_1: eval((prop(lane_offset_backward_1) + prop(placement_offset))); lane_offset_backward_2: eval((prop(lane_offset_backward_2) + prop(placement_offset))); lane_offset_backward_3: eval((prop(lane_offset_backward_3) + prop(placement_offset))); lane_offset_backward_4: eval((prop(lane_offset_backward_4) + prop(placement_offset))); lane_offset_backward_5: eval((prop(lane_offset_backward_5) + prop(placement_offset))); lane_offset_backward_6: eval((prop(lane_offset_backward_6) + prop(placement_offset))); lane_offset_backward_7: eval((prop(lane_offset_backward_7) + prop(placement_offset))); lane_offset_backward_8: eval((prop(lane_offset_backward_8) + prop(placement_offset))); lane_offset_bothways_1: eval((prop(lane_offset_bothways_1) + prop(placement_offset))); lane_offset_bothways_2: eval((prop(lane_offset_bothways_2) + prop(placement_offset))); lane_offset_bothways_3: eval((prop(lane_offset_bothways_3) + prop(placement_offset))); lane_offset_bothways_4: eval((prop(lane_offset_bothways_4) + prop(placement_offset))); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Render the carriageway */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way[is_prop_set(ok, "default")][is_prop_set(lanes_all, "default")]::Ground { linecap: none; /* The "ground" will be drawn by each lane, so that we can use different colors per lane */ opacity: 0.0; width: eval(prop(lane_width_all,"default")); offset: prop(placement_offset,"default"); major-z-index: -1.0; } /* Sidewalk and cycletrack */ way|z17- {} /* ATTENTION: For whatever reason this is needed, otherwise the following won't be interpreted correctly */ way|z17-[is_prop_set(ok, "default")][is_prop_set(lanes_all, "default")]::Ground { /* Cycletrack in an one-way on the left side? */ temp_allow_cycleway_left: eval(!( ((prop(oneway_type,"default")=1) && prop(style_right_hand_traffic,"default")) || ((prop(oneway_type,"default")=(-1)) && (!prop(style_right_hand_traffic,"default"))) )); temp_allow_cycleway_left: eval(prop(temp_allow_cycleway_left) || (has_tag_key("oneway:bicycle") && (tag("oneway:bicycle")="no"))); /* Explicitely no cycletrack on the left side? */ temp_allow_cycleway_left: eval((has_tag_key("cycleway:left") && (tag("cycleway:left")="no"))?false:prop(temp_allow_cycleway_left)); /* Cycletrack on the left side */ temp_cycleway_left: eval(((has_tag_key(cycleway) && ((tag(cycleway)="track") && prop(temp_allow_cycleway_left))) || (has_tag_key("cycleway:left") && (tag("cycleway:left")="track"))) || (has_tag_key("cycleway:both") && (tag("cycleway:both")="track")) ); /* Sidewalk on the left side? */ templ: eval((has_tag_key(sidewalk) && ((tag(sidewalk)="both") || (tag(sidewalk)="left")))?1:0); /* Combine sidewalk and cycletrack: 0=none; 1=sidewalk; 2=cycletrack; 3=sidewalk and cycletrack */ templ: eval(prop(templ)+(prop(temp_cycleway_left)?2:0)); /* Cycletrack in an one-way on the right side? */ temp_allow_cycleway_right: eval(!( ((prop(oneway_type,"default")=(-1)) && prop(style_right_hand_traffic,"default")) || ((prop(oneway_type,"default")=1) && (!prop(style_right_hand_traffic,"default"))) )); temp_allow_cycleway_right: eval(prop(temp_allow_cycleway_right) || (has_tag_key("oneway:bicycle") && (tag("oneway:bicycle")="no"))); /* Explicitely no cycletrack on the right side? */ temp_allow_cycleway_right: eval((has_tag_key("cycleway:right") && (tag("cycleway:right")="no"))?false:prop(temp_allow_cycleway_right)); /* Cycletrack on the right side */ temp_cycleway_right: eval(((has_tag_key(cycleway) && ((tag(cycleway)="track") && prop(temp_allow_cycleway_right))) || (has_tag_key("cycleway:right") && (tag("cycleway:right")="track"))) || (has_tag_key("cycleway:both") && (tag("cycleway:both")="track")) ); /* Sidewalk on the right side? */ tempr: eval((has_tag_key(sidewalk) && ((tag(sidewalk)="both") || (tag(sidewalk)="right")))?1:0); /* Combine sidewalk and cycletrack: 0=none; 1=sidewalk; 2=cycletrack; 3=sidewalk and cycletrack */ tempr: eval(prop(tempr)+(prop(temp_cycleway_right)?2:0)); left-casing-linecap: none; left-casing-width: eval((prop(templ)>0)?(prop(lane_default_width,"default")/2):0); left-casing-color: eval(get(prop(style_sidewalk_color,"default"),prop(templ))); left-casing-opacity: prop(style_sidewalk_opacity,"default"); right-casing-linecap: none; right-casing-width: eval((prop(tempr)>0)?(prop(lane_default_width,"default")/2):0); right-casing-color: eval(get(prop(style_sidewalk_color,"default"),prop(tempr))); right-casing-opacity: prop(style_sidewalk_opacity,"default"); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Render the lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Forward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 0]::Lane_Forward_1 { offset: eval(prop(lane_offset_forward_1,"default")); width: eval((prop(lane_width_forward_1,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_1_right,"default")); left-casing-dashes: eval(prop(change_forward_1_left,"default")); repeat-image: eval(prop(turn_image_forward_1,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 0]::Lane_Forward_1_Color { offset: eval(prop(lane_offset_forward_1,"default")); width: eval(prop(lane_width_forward_1,"default")); color: prop(color_forward_1,"default"); dashes: eval(is_prop_set(restriction_color_forward_1,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_1,"default")? prop(restriction_color_forward_1,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_1, "default")]::Lane_Forward_1_Sign_1 { repeat-image: eval(prop(sign_1_forward_1,"default")); repeat-image-offset: eval(prop(lane_offset_forward_1,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_1")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_1, "default")]::Lane_Forward_1_Sign_2 { repeat-image: eval(prop(sign_2_forward_1,"default")); repeat-image-offset: eval(prop(lane_offset_forward_1,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_1")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_1, "default")]::Lane_Forward_1_Sign_3 { repeat-image: eval(prop(sign_3_forward_1,"default")); repeat-image-offset: eval(prop(lane_offset_forward_1,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_1")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 1]::Lane_Forward_2 { offset: eval(prop(lane_offset_forward_2,"default")); width: eval((prop(lane_width_forward_2,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_2_right,"default")); left-casing-dashes: eval(prop(change_forward_2_left,"default")); repeat-image: eval(prop(turn_image_forward_2,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 1]::Lane_Forward_2_Color { offset: eval(prop(lane_offset_forward_2,"default")); width: eval(prop(lane_width_forward_2,"default")); color: prop(color_forward_2,"default"); dashes: eval(is_prop_set(restriction_color_forward_2,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_2,"default")? prop(restriction_color_forward_2,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_2, "default")]::Lane_Forward_2_Sign_1 { repeat-image: eval(prop(sign_1_forward_2,"default")); repeat-image-offset: eval(prop(lane_offset_forward_2,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_2")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_2, "default")]::Lane_Forward_2_Sign_2 { repeat-image: eval(prop(sign_2_forward_2,"default")); repeat-image-offset: eval(prop(lane_offset_forward_2,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_2")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_2, "default")]::Lane_Forward_2_Sign_3 { repeat-image: eval(prop(sign_3_forward_2,"default")); repeat-image-offset: eval(prop(lane_offset_forward_2,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_2")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 2]::Lane_Forward_3 { offset: eval(prop(lane_offset_forward_3,"default")); width: eval((prop(lane_width_forward_3,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_3_right,"default")); left-casing-dashes: eval(prop(change_forward_3_left,"default")); repeat-image: eval(prop(turn_image_forward_3,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 2]::Lane_Forward_3_Color { offset: eval(prop(lane_offset_forward_3,"default")); width: eval(prop(lane_width_forward_3,"default")); color: prop(color_forward_3,"default"); dashes: eval(is_prop_set(restriction_color_forward_3,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_3,"default")? prop(restriction_color_forward_3,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_3, "default")]::Lane_Forward_3_Sign_1 { repeat-image: eval(prop(sign_1_forward_3,"default")); repeat-image-offset: eval(prop(lane_offset_forward_3,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_3")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_3, "default")]::Lane_Forward_3_Sign_2 { repeat-image: eval(prop(sign_2_forward_3,"default")); repeat-image-offset: eval(prop(lane_offset_forward_3,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_3")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_3, "default")]::Lane_Forward_3_Sign_3 { repeat-image: eval(prop(sign_3_forward_3,"default")); repeat-image-offset: eval(prop(lane_offset_forward_3,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_3")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 3]::Lane_Forward_4 { offset: eval(prop(lane_offset_forward_4,"default")); width: eval((prop(lane_width_forward_4,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_4_right,"default")); left-casing-dashes: eval(prop(change_forward_4_left,"default")); repeat-image: eval(prop(turn_image_forward_4,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 3]::Lane_Forward_4_Color { offset: eval(prop(lane_offset_forward_4,"default")); width: eval(prop(lane_width_forward_4,"default")); color: prop(color_forward_4,"default"); dashes: eval(is_prop_set(restriction_color_forward_4,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_4,"default")? prop(restriction_color_forward_4,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_4, "default")]::Lane_Forward_4_Sign_1 { repeat-image: eval(prop(sign_1_forward_4,"default")); repeat-image-offset: eval(prop(lane_offset_forward_4,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_4")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_4, "default")]::Lane_Forward_4_Sign_2 { repeat-image: eval(prop(sign_2_forward_4,"default")); repeat-image-offset: eval(prop(lane_offset_forward_4,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_4")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_4, "default")]::Lane_Forward_4_Sign_3 { repeat-image: eval(prop(sign_3_forward_4,"default")); repeat-image-offset: eval(prop(lane_offset_forward_4,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_4")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 4]::Lane_Forward_5 { offset: eval(prop(lane_offset_forward_5,"default")); width: eval((prop(lane_width_forward_5,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_5_right,"default")); left-casing-dashes: eval(prop(change_forward_5_left,"default")); repeat-image: eval(prop(turn_image_forward_5,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 4]::Lane_Forward_5_Color { offset: eval(prop(lane_offset_forward_5,"default")); width: eval(prop(lane_width_forward_5,"default")); color: prop(color_forward_5,"default"); dashes: eval(is_prop_set(restriction_color_forward_5,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_5,"default")? prop(restriction_color_forward_5,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_5, "default")]::Lane_Forward_5_Sign_1 { repeat-image: eval(prop(sign_1_forward_5,"default")); repeat-image-offset: eval(prop(lane_offset_forward_5,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_5")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_5, "default")]::Lane_Forward_5_Sign_2 { repeat-image: eval(prop(sign_2_forward_5,"default")); repeat-image-offset: eval(prop(lane_offset_forward_5,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_5")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_5, "default")]::Lane_Forward_5_Sign_3 { repeat-image: eval(prop(sign_3_forward_5,"default")); repeat-image-offset: eval(prop(lane_offset_forward_5,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_5")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 5]::Lane_Forward_6 { offset: eval(prop(lane_offset_forward_6,"default")); width: eval((prop(lane_width_forward_6,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_6_right,"default")); left-casing-dashes: eval(prop(change_forward_6_left,"default")); repeat-image: eval(prop(turn_image_forward_6,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 5]::Lane_Forward_6_Color { offset: eval(prop(lane_offset_forward_6,"default")); width: eval(prop(lane_width_forward_6,"default")); color: prop(color_forward_6,"default"); dashes: eval(is_prop_set(restriction_color_forward_6,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_6,"default")? prop(restriction_color_forward_6,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_6, "default")]::Lane_Forward_6_Sign_1 { repeat-image: eval(prop(sign_1_forward_6,"default")); repeat-image-offset: eval(prop(lane_offset_forward_6,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_6")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_6, "default")]::Lane_Forward_6_Sign_2 { repeat-image: eval(prop(sign_2_forward_6,"default")); repeat-image-offset: eval(prop(lane_offset_forward_6,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_6")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_6, "default")]::Lane_Forward_6_Sign_3 { repeat-image: eval(prop(sign_3_forward_6,"default")); repeat-image-offset: eval(prop(lane_offset_forward_6,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_6")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 6]::Lane_Forward_7 { offset: eval(prop(lane_offset_forward_7,"default")); width: eval((prop(lane_width_forward_7,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_7_right,"default")); left-casing-dashes: eval(prop(change_forward_7_left,"default")); repeat-image: eval(prop(turn_image_forward_7,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 6]::Lane_Forward_7_Color { offset: eval(prop(lane_offset_forward_7,"default")); width: eval(prop(lane_width_forward_7,"default")); color: prop(color_forward_7,"default"); dashes: eval(is_prop_set(restriction_color_forward_7,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_7,"default")? prop(restriction_color_forward_7,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_7, "default")]::Lane_Forward_7_Sign_1 { repeat-image: eval(prop(sign_1_forward_7,"default")); repeat-image-offset: eval(prop(lane_offset_forward_7,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_7")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_7, "default")]::Lane_Forward_7_Sign_2 { repeat-image: eval(prop(sign_2_forward_7,"default")); repeat-image-offset: eval(prop(lane_offset_forward_7,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_7")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_7, "default")]::Lane_Forward_7_Sign_3 { repeat-image: eval(prop(sign_3_forward_7,"default")); repeat-image-offset: eval(prop(lane_offset_forward_7,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_7")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 7]::Lane_Forward_8 { offset: eval(prop(lane_offset_forward_8,"default")); width: eval((prop(lane_width_forward_8,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_forward_8_right,"default")); left-casing-dashes: eval(prop(change_forward_8_left,"default")); repeat-image: eval(prop(turn_image_forward_8,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 7]::Lane_Forward_8_Color { offset: eval(prop(lane_offset_forward_8,"default")); width: eval(prop(lane_width_forward_8,"default")); color: prop(color_forward_8,"default"); dashes: eval(is_prop_set(restriction_color_forward_8,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_forward_8,"default")? prop(restriction_color_forward_8,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_forward_8, "default")]::Lane_Forward_8_Sign_1 { repeat-image: eval(prop(sign_1_forward_8,"default")); repeat-image-offset: eval(prop(lane_offset_forward_8,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_8")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_forward_8, "default")]::Lane_Forward_8_Sign_2 { repeat-image: eval(prop(sign_2_forward_8,"default")); repeat-image-offset: eval(prop(lane_offset_forward_8,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_8")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_forward_8, "default")]::Lane_Forward_8_Sign_3 { repeat-image: eval(prop(sign_3_forward_8,"default")); repeat-image-offset: eval(prop(lane_offset_forward_8,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_8")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Backward lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 0]::Lane_Backward_1 { offset: eval(prop(lane_offset_backward_1,"default")); width: eval((prop(lane_width_backward_1,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_1_right,"default")); right-casing-dashes: eval(prop(change_backward_1_left,"default")); repeat-image: eval(prop(turn_image_backward_1,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 0]::Lane_Backward_1_Color { offset: eval(prop(lane_offset_backward_1,"default")); width: eval(prop(lane_width_backward_1,"default")); color: prop(color_backward_1,"default"); dashes: eval(is_prop_set(restriction_color_backward_1,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_1,"default")? prop(restriction_color_backward_1,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_1, "default")]::Lane_Backward_1_Sign_1 { repeat-image: eval(prop(sign_1_backward_1,"default")); repeat-image-offset: eval(prop(lane_offset_backward_1,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_1")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_1, "default")]::Lane_Backward_1_Sign_2 { repeat-image: eval(prop(sign_2_backward_1,"default")); repeat-image-offset: eval(prop(lane_offset_backward_1,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_1")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_1, "default")]::Lane_Backward_1_Sign_3 { repeat-image: eval(prop(sign_3_backward_1,"default")); repeat-image-offset: eval(prop(lane_offset_backward_1,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_1")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 1]::Lane_Backward_2 { offset: eval(prop(lane_offset_backward_2,"default")); width: eval((prop(lane_width_backward_2,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_2_right,"default")); right-casing-dashes: eval(prop(change_backward_2_left,"default")); repeat-image: eval(prop(turn_image_backward_2,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 1]::Lane_Backward_2_Color { offset: eval(prop(lane_offset_backward_2,"default")); width: eval(prop(lane_width_backward_2,"default")); color: prop(color_backward_2,"default"); dashes: eval(is_prop_set(restriction_color_backward_2,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_2,"default")? prop(restriction_color_backward_2,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_2, "default")]::Lane_Backward_2_Sign_1 { repeat-image: eval(prop(sign_1_backward_2,"default")); repeat-image-offset: eval(prop(lane_offset_backward_2,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_2")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_2, "default")]::Lane_Backward_2_Sign_2 { repeat-image: eval(prop(sign_2_backward_2,"default")); repeat-image-offset: eval(prop(lane_offset_backward_2,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_2")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_2, "default")]::Lane_Backward_2_Sign_3 { repeat-image: eval(prop(sign_3_backward_2,"default")); repeat-image-offset: eval(prop(lane_offset_backward_2,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_2")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 2]::Lane_Backward_3 { offset: eval(prop(lane_offset_backward_3,"default")); width: eval((prop(lane_width_backward_3,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_3_right,"default")); right-casing-dashes: eval(prop(change_backward_3_left,"default")); repeat-image: eval(prop(turn_image_backward_3,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 2]::Lane_Backward_3_Color { offset: eval(prop(lane_offset_backward_3,"default")); width: eval(prop(lane_width_backward_3,"default")); color: prop(color_backward_3,"default"); dashes: eval(is_prop_set(restriction_color_backward_3,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_3,"default")? prop(restriction_color_backward_3,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_3, "default")]::Lane_Backward_3_Sign_1 { repeat-image: eval(prop(sign_1_backward_3,"default")); repeat-image-offset: eval(prop(lane_offset_backward_3,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_3")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_3, "default")]::Lane_Backward_3_Sign_2 { repeat-image: eval(prop(sign_2_backward_3,"default")); repeat-image-offset: eval(prop(lane_offset_backward_3,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_3")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_3, "default")]::Lane_Backward_3_Sign_3 { repeat-image: eval(prop(sign_3_backward_3,"default")); repeat-image-offset: eval(prop(lane_offset_backward_3,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_3")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 3]::Lane_Backward_4 { offset: eval(prop(lane_offset_backward_4,"default")); width: eval((prop(lane_width_backward_4,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_4_right,"default")); right-casing-dashes: eval(prop(change_backward_4_left,"default")); repeat-image: eval(prop(turn_image_backward_4,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 3]::Lane_Backward_4_Color { offset: eval(prop(lane_offset_backward_4,"default")); width: eval(prop(lane_width_backward_4,"default")); color: prop(color_backward_4,"default"); dashes: eval(is_prop_set(restriction_color_backward_4,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_4,"default")? prop(restriction_color_backward_4,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_4, "default")]::Lane_Backward_4_Sign_1 { repeat-image: eval(prop(sign_1_backward_4,"default")); repeat-image-offset: eval(prop(lane_offset_backward_4,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_4")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_4, "default")]::Lane_Backward_4_Sign_2 { repeat-image: eval(prop(sign_2_backward_4,"default")); repeat-image-offset: eval(prop(lane_offset_backward_4,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_4")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_4, "default")]::Lane_Backward_4_Sign_3 { repeat-image: eval(prop(sign_3_backward_4,"default")); repeat-image-offset: eval(prop(lane_offset_backward_4,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_4")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 4]::Lane_Backward_5 { offset: eval(prop(lane_offset_backward_5,"default")); width: eval((prop(lane_width_backward_5,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_5_right,"default")); right-casing-dashes: eval(prop(change_backward_5_left,"default")); repeat-image: eval(prop(turn_image_backward_5,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 4]::Lane_Backward_5_Color { offset: eval(prop(lane_offset_backward_5,"default")); width: eval(prop(lane_width_backward_5,"default")); color: prop(color_backward_5,"default"); dashes: eval(is_prop_set(restriction_color_backward_5,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_5,"default")? prop(restriction_color_backward_5,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_5, "default")]::Lane_Backward_5_Sign_1 { repeat-image: eval(prop(sign_1_backward_5,"default")); repeat-image-offset: eval(prop(lane_offset_backward_5,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_5")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_5, "default")]::Lane_Backward_5_Sign_2 { repeat-image: eval(prop(sign_2_backward_5,"default")); repeat-image-offset: eval(prop(lane_offset_backward_5,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_5")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_5, "default")]::Lane_Backward_5_Sign_3 { repeat-image: eval(prop(sign_3_backward_5,"default")); repeat-image-offset: eval(prop(lane_offset_backward_5,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_5")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 5]::Lane_Backward_6 { offset: eval(prop(lane_offset_backward_6,"default")); width: eval((prop(lane_width_backward_6,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_6_right,"default")); right-casing-dashes: eval(prop(change_backward_6_left,"default")); repeat-image: eval(prop(turn_image_backward_6,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 5]::Lane_Backward_6_Color { offset: eval(prop(lane_offset_backward_6,"default")); width: eval(prop(lane_width_backward_6,"default")); color: prop(color_backward_6,"default"); dashes: eval(is_prop_set(restriction_color_backward_6,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_6,"default")? prop(restriction_color_backward_6,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_6, "default")]::Lane_Backward_6_Sign_1 { repeat-image: eval(prop(sign_1_backward_6,"default")); repeat-image-offset: eval(prop(lane_offset_backward_6,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_6")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_6, "default")]::Lane_Backward_6_Sign_2 { repeat-image: eval(prop(sign_2_backward_6,"default")); repeat-image-offset: eval(prop(lane_offset_backward_6,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_6")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_6, "default")]::Lane_Backward_6_Sign_3 { repeat-image: eval(prop(sign_3_backward_6,"default")); repeat-image-offset: eval(prop(lane_offset_backward_6,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_6")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 6]::Lane_Backward_7 { offset: eval(prop(lane_offset_backward_7,"default")); width: eval((prop(lane_width_backward_7,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_7_right,"default")); right-casing-dashes: eval(prop(change_backward_7_left,"default")); repeat-image: eval(prop(turn_image_backward_7,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 6]::Lane_Backward_7_Color { offset: eval(prop(lane_offset_backward_7,"default")); width: eval(prop(lane_width_backward_7,"default")); color: prop(color_backward_7,"default"); dashes: eval(is_prop_set(restriction_color_backward_7,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_7,"default")? prop(restriction_color_backward_7,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_7, "default")]::Lane_Backward_7_Sign_1 { repeat-image: eval(prop(sign_1_backward_7,"default")); repeat-image-offset: eval(prop(lane_offset_backward_7,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_7")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_7, "default")]::Lane_Backward_7_Sign_2 { repeat-image: eval(prop(sign_2_backward_7,"default")); repeat-image-offset: eval(prop(lane_offset_backward_7,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_7")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_7, "default")]::Lane_Backward_7_Sign_3 { repeat-image: eval(prop(sign_3_backward_7,"default")); repeat-image-offset: eval(prop(lane_offset_backward_7,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_7")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 7]::Lane_Backward_8 { offset: eval(prop(lane_offset_backward_8,"default")); width: eval((prop(lane_width_backward_8,"default")-prop(lane_casing,"default"))); left-casing-dashes: eval(prop(change_backward_8_right,"default")); right-casing-dashes: eval(prop(change_backward_8_left,"default")); repeat-image: eval(prop(turn_image_backward_8,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 7]::Lane_Backward_8_Color { offset: eval(prop(lane_offset_backward_8,"default")); width: eval(prop(lane_width_backward_8,"default")); color: prop(color_backward_8,"default"); dashes: eval(is_prop_set(restriction_color_backward_8,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_backward_8,"default")? prop(restriction_color_backward_8,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(sign_1_backward_8, "default")]::Lane_Backward_8_Sign_1 { repeat-image: eval(prop(sign_1_backward_8,"default")); repeat-image-offset: eval(prop(lane_offset_backward_8,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_8")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 3); } way|z17-[is_prop_set(sign_2_backward_8, "default")]::Lane_Backward_8_Sign_2 { repeat-image: eval(prop(sign_2_backward_8,"default")); repeat-image-offset: eval(prop(lane_offset_backward_8,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_8")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 2); } way|z17-[is_prop_set(sign_3_backward_8, "default")]::Lane_Backward_8_Sign_3 { repeat-image: eval(prop(sign_3_backward_8,"default")); repeat-image-offset: eval(prop(lane_offset_backward_8,"default")); repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_8")); repeat-image-spacing: eval(prop(repeat-image-height) * 4); repeat-image-phase: eval(prop(repeat-image-height) * 4); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Bothways lanes */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 0]::Lane_Bothways_1 { offset: eval(prop(lane_offset_bothways_1,"default")); width: eval((prop(lane_width_bothways_1,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_bothways_1_right,"default")); left-casing-dashes: eval(prop(change_bothways_1_left,"default")); repeat-image: eval(prop(turn_image_bothways_1,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 0]::Lane_Bothways_1_Color { offset: eval(prop(lane_offset_bothways_1,"default")); width: eval(prop(lane_width_bothways_1,"default")); color: prop(color_bothways_1,"default"); dashes: eval(is_prop_set(restriction_color_bothways_1,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_bothways_1,"default")? prop(restriction_color_bothways_1,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 1]::Lane_Bothways_2 { offset: eval(prop(lane_offset_bothways_2,"default")); width: eval((prop(lane_width_bothways_2,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_bothways_2_right,"default")); left-casing-dashes: eval(prop(change_bothways_2_left,"default")); repeat-image: eval(prop(turn_image_bothways_2,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 1]::Lane_Bothways_2_Color { offset: eval(prop(lane_offset_bothways_2,"default")); width: eval(prop(lane_width_bothways_2,"default")); color: prop(color_bothways_2,"default"); dashes: eval(is_prop_set(restriction_color_bothways_2,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_bothways_2,"default")? prop(restriction_color_bothways_2,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 2]::Lane_Bothways_3 { offset: eval(prop(lane_offset_bothways_3,"default")); width: eval((prop(lane_width_bothways_3,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_bothways_3_right,"default")); left-casing-dashes: eval(prop(change_bothways_3_left,"default")); repeat-image: eval(prop(turn_image_bothways_3,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 2]::Lane_Bothways_3_Color { offset: eval(prop(lane_offset_bothways_3,"default")); width: eval(prop(lane_width_bothways_3,"default")); color: prop(color_bothways_3,"default"); dashes: eval(is_prop_set(restriction_color_bothways_3,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_bothways_3,"default")? prop(restriction_color_bothways_3,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 3]::Lane_Bothways_4 { offset: eval(prop(lane_offset_bothways_4,"default")); width: eval((prop(lane_width_bothways_4,"default")-prop(lane_casing,"default"))); right-casing-dashes: eval(prop(change_bothways_4_right,"default")); left-casing-dashes: eval(prop(change_bothways_4_left,"default")); repeat-image: eval(prop(turn_image_bothways_4,"default")); opacity: 0.0; linecap: none; repeat-image-offset: eval(prop(offset)); repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width))); repeat-image-spacing: eval(prop(repeat-image-height) * 3); right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default")); left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default")); major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); } way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 3]::Lane_Bothways_4_Color { offset: eval(prop(lane_offset_bothways_4,"default")); width: eval(prop(lane_width_bothways_4,"default")); color: prop(color_bothways_4,"default"); dashes: eval(is_prop_set(restriction_color_bothways_4,"default")?list(20,20):prop(unset_property)); dashes-background-color: eval(is_prop_set(restriction_color_bothways_4,"default")? prop(restriction_color_bothways_4,"default"):prop(unset_property)); opacity: prop(style_lane_opacity,"default"); linecap: none; major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1; } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Railway rendering */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way|z18-[railway=rail]::Railway_Way, way|z18-[railway=light_rail]::Railway_Way, way|z18-[railway=subway]::Railway_Way, way|z18-[railway=miniature]::Railway_Way, way|z18-[railway=tram]::Railway_Way { /* Determine gauge (safety limits: 1 - 10000 mm) */ rail_gauge_list: eval(has_tag_key("gauge")?split(";",tag("gauge")):list(1435)); rail_gauge: eval(get(prop(rail_gauge_list),length(prop(rail_gauge_list))-1)); rail_gauge: eval(min(10000,cond(prop(rail_gauge)<1,1435,prop(rail_gauge)))); /* Ties should be rendered in case standard and miniature railways; this might be override by the key embedded */ rail_show_ties: eval(cond(((tag("railway")=="rail") || (tag("railway")=="miniature")),yes,no)); rail_show_ties: eval(cond(has_tag_key("embedded"),cond(tag("embedded")=="no",yes,no),prop(rail_show_ties))); /* Type of electrification: */ /* * rail -> show a yellow border on one rail */ /* * contact_line -> show a contact line near the middle of the track */ rail_show_contact_line: eval(cond(has_tag_key("electrified"),cond(tag("electrified")="contact_line",yes,no),no)); rail_electrified_rail: eval(cond(has_tag_key("electrified"),cond(tag("electrified")="rail",yes,no),no)); /* Make rails transparent within tunnels */ rail_image_opacity: eval(cond(((has_tag_key("tunnel")) && (tag("tunnel")=="yes")),0.2,0.8)); /* Create image */ rail_image: eval(concat( cond(prop(rail_show_ties),"<rect x='0' y='0' width='8' height='80' style='stroke:#301004; fill:#90300C;'/>",""), "<line x1='0' y1= '8' x2='32' y2= '8' style='stroke:",cond(prop(rail_electrified_rail),"#FFFF00","#301004"),";'/>", "<line x1='0' y1='10' x2='32' y2='10' style='stroke:#602008;stroke-width:3px'/>", "<line x1='0' y1='12' x2='32' y2='12' style='stroke:#301004;'/>", "<line x1='0' y1='67' x2='32' y2='67' style='stroke:#301004;'/>", "<line x1='0' y1='69' x2='32' y2='69' style='stroke:#602008;stroke-width:3px'/>", "<line x1='0' y1='71' x2='32' y2='71' style='stroke:#301004;'/>", cond(prop(rail_show_contact_line),"<line x1='0' y1='35' x2='32' y2='35' style='stroke:#060200;'/>","") )); repeat-image: concat("data:image/svg+xml,<svg width='32px' height='80px'><g fill-opacity='",prop(rail_image_opacity),"' opacity='",prop(rail_image_opacity),"'>",prop(rail_image),"</g></svg>"); repeat-image-height: eval(max(2,ceil((prop(rail_gauge)*prop(pixel_per_metre,"default"))*0.0012))); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Extra rendering for footways/cycleways if not already rendered */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way|z17-[!is_prop_set(ok, "default")][highway=footway], way|z17-[!is_prop_set(ok, "default")][highway=cycleway] { width: eval(2*prop(pixel_per_metre,"default")); linecap: none; opacity: eval(prop("style_lane_opacity","default")); right-casing-width: eval(max(1,0.15*prop(pixel_per_metre,"default"))); right-casing-color: gray; left-casing-width: eval(max(1,0.15*prop(pixel_per_metre,"default"))); left-casing-color: gray; casing-linecap: none; temp: 0; temp: eval(prop(temp)+(((tag("highway")="footway") || ((has_tag_key("foot")) && (tag("foot") ="designated")))?1:0)); temp: eval(prop(temp)+(((tag("highway")="cycleway") || ((has_tag_key("bicycle")) && (tag("bicycle")="designated")))?2:0)); color: eval(get(prop(style_sidewalk_color,"default"),prop(temp))); } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Additional attributes/features */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Proposed man_made=bridge */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ area[man_made=bridge] { fill-color: #808080; fill-opacity: 0.5; color: #404DA0; width: 5; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Proposed highway=junction */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ area[highway=junction] { fill-color: #808080; fill-opacity: 0.5; width: 2; color: #505050; opacity: 0.5; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Street lamp */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ node|z17-[highway="street_lamp"]::Lighting_1 { symbol-shape: circle; symbol-size: eval(12 * prop(pixel_per_metre,"default")); symbol-fill-color: white; symbol-fill-opacity: 0.07; } node|z17-[highway="street_lamp"]::Lighting_2 { symbol-shape: circle; symbol-size: eval(18 * prop(pixel_per_metre,"default")); symbol-fill-color: white; symbol-fill-opacity: 0.05; } node|z17-[highway="street_lamp"]::Lighting_3 { symbol-shape: circle; symbol-size: eval(25 * prop(pixel_per_metre,"default")); symbol-fill-color: white; symbol-fill-opacity: 0.05; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Lighting */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[lit?][is_prop_set(width,"Ground")]::Lighting_1 { width: eval(prop(width,"Ground")); width: eval(prop(width)+(is_prop_set(left-casing-width,"Ground")?prop(left-casing-width,"Ground"):0)); width: eval(prop(width)+(is_prop_set(right-casing-width,"Ground")?prop(right-casing-width,"Ground"):0)); opacity: 0.1; color: white; linecap: none; major-z-index: eval(prop(major-z-index,"Ground")-0.1); offset: eval(prop(offset,"Ground")); } way|z17-[lit?][is_prop_set(width,"Ground")]::Lighting_2 { width: eval(prop(width,"Lighting_1")+(3 * prop(pixel_per_metre,"default"))); opacity: 0.1; color: white; linecap: none; major-z-index: eval(prop(major-z-index,"Lighting_1")); offset: eval(prop(offset,"Lighting_1")); } way|z17-[lit?][is_prop_set(width,"Ground")]::Lighting_3 { width: eval(prop(width,"Lighting_2")+(3 * prop(pixel_per_metre,"default"))); opacity: 0.1; color: white; linecap: none; major-z-index: eval(prop(major-z-index,"Lighting_1")); offset: eval(prop(offset,"Lighting_1")); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Destination */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way|z17-[is_prop_set(ok, "default")][destination][!prop(style_use_svg_destination, "default")]::Destination { text-offset: eval(prop("placement_offset","default")); text: eval(get(split(";",tag(destination)),0)); text: eval(has_tag_key("destination:ref")?concat(prop(text)," (",get(split(";",tag("destination:ref")),0),")"):prop(text)); text: eval(has_tag_key("destination:country")?concat(prop(text)," [",get(split(";",tag("destination:country")),0),"]"):prop(text)); font-size: eval(prop(lane_default_width,"default")); text-color: white; text-opacity: 0.3; text-halo-radius: 2; text-halo-color: blue; text-halo-opacity: 0.3; } way|z17-[is_prop_set(ok, "default")]["destination:forward"][!prop(style_use_svg_destination, "default")]::Destination_Forward { text-offset: eval(prop("placement_offset","default")+(eval(prop(lane_width_all,"default"))/4)); text: eval(get(split(";",tag("destination:forward")),0)); text: eval(has_tag_key("destination:ref:forward")?concat(prop(text)," (",get(split(";",tag("destination:ref:forward")),0),")"):prop(text)); text: eval(has_tag_key("destination:country:forward")?concat(prop(text)," [",get(split(";",tag("destination:country:forward")),0),"]"):prop(text)); font-size: eval(prop(lane_default_width,"default")); text-color: white; text-opacity: 0.3; text-halo-radius: 2; text-halo-color: blue; text-halo-opacity: 0.3; } way|z17-[is_prop_set(ok, "default")]["destination:backward"][!prop(style_use_svg_destination, "default")]::Destination_Backward { text-offset: eval(prop("placement_offset","default")-(eval(prop(lane_width_all,"default"))/4)); text: eval(get(split(";",tag("destination:backward")),0)); text: eval(has_tag_key("destination:ref:backward")?concat(prop(text)," (",get(split(";",tag("destination:ref:backward")),0),")"):prop(text)); text: eval(has_tag_key("destination:country:backward")?concat(prop(text)," [",get(split(";",tag("destination:country:backward")),0),"]"):prop(text)); font-size: eval(prop(lane_default_width,"default")); text-color: white; text-opacity: 0.3; text-halo-radius: 2; text-halo-color: blue; text-halo-opacity: 0.3; } /* TODO: make opacity configurable */ way{} /* If this is removed the following won't be interpreted */ way|z17-[is_prop_set(ok, "default")][destination][prop(style_use_svg_destination, "default")]::Destination { complete_destination: eval(get(split(";",tag(destination)),0)); complete_destination: eval(has_tag_key("destination:ref")?concat(prop(complete_destination)," (",get(split(";",tag("destination:ref")),0),")"):prop(complete_destination)); complete_destination: eval(has_tag_key("destination:int_ref")?concat(prop(complete_destination)," <",get(split(";",tag("destination:int_ref")),0),">"):prop(complete_destination)); complete_destination: eval(has_tag_key("destination:country")?concat(prop(complete_destination)," [",get(split(";",tag("destination:country")),0),"]"):prop(complete_destination)); /* complete_destination: eval(replace(replace(replace(replace(replace(prop(complete_destination),"&","&"),"[","["),"]","]"),"<","<"),">",">")); */ complete_destination: eval(XML_encode(replace(prop(complete_destination),"%","prc"))); /* CDATA blocks are not working, XML_encode is not sufficient, currently no idea how to escape % */ repeat-image: eval(concat("data:image/svg+xml,<svg height='70px'><g fill-opacity='0.3' stroke-opacity='0.3'><text x='0' y='50' font-size='50' fill='white' stroke='blue'>",prop(complete_destination),"</text></g></svg>")); repeat-image-height: eval(prop(lane_default_width,"default")*prop(lanes_fwd,"default")); repeat-image-offset: eval(prop("placement_offset","default")); repeat-image-spacing: eval(prop(repeat-image-height)); repeat-image-phase: eval(prop(repeat-image-height)); } way{} /* If this is removed the following won't be interpreted */ way|z17-[is_prop_set(ok, "default")]["destination:forward"][prop(style_use_svg_destination, "default")]::Destination_Forward { complete_destination: eval(get(split(";",tag("destination:forward")),0)); complete_destination: eval(has_tag_key("destination:ref:forward")?concat(prop(complete_destination)," (",get(split(";",tag("destination:ref:forward")),0),")"):prop(complete_destination)); complete_destination: eval(has_tag_key("destination:int_ref:forward")?concat(prop(complete_destination)," <",get(split(";",tag("destination:int_ref:forward")),0),">"):prop(complete_destination)); complete_destination: eval(has_tag_key("destination:country:forward")?concat(prop(complete_destination)," [",get(split(";",tag("destination:country:forward")),0),"]"):prop(complete_destination)); complete_destination: eval(XML_encode(replace(prop(complete_destination),"%","prc"))); /* CDATA blocks are not working, XML_encode is not sufficient, currently no idea how to escape % */ repeat-image: eval(concat("data:image/svg+xml,<svg height='70px'><g fill-opacity='0.3' stroke-opacity='0.3'><text x='0' y='50' font-size='50' fill='white' stroke='blue'>",prop(complete_destination),"</text></g></svg>")); repeat-image-height: eval(prop(lane_default_width,"default")*prop(lanes_fwd,"default")); repeat-image-offset: eval(prop("left_forward_border","default")-(prop("lane_width_all_forward","default")/2)); repeat-image-spacing: eval(prop(repeat-image-height)); repeat-image-phase: eval(prop(repeat-image-height)); } way{} /* If this is removed the following won't be interpreted */ way|z17-[is_prop_set(ok, "default")]["destination:backward"][prop(style_use_svg_destination, "default")]::Destination_Backward { complete_destination: eval(get(split(";",tag("destination:backward")),0)); complete_destination: eval(has_tag_key("destination:ref:backward")?concat(prop(complete_destination)," (",get(split(";",tag("destination:ref:backward")),0),")"):prop(complete_destination)); complete_destination: eval(has_tag_key("destination:int_ref:backward")?concat(prop(complete_destination)," <",get(split(";",tag("destination:int_ref:backward")),0),">"):prop(complete_destination)); complete_destination: eval(has_tag_key("destination:country:backward")?concat(prop(complete_destination)," [",get(split(";",tag("destination:country:backward")),0),"]"):prop(complete_destination)); complete_destination: eval(XML_encode(replace(prop(complete_destination),"%","prc"))); /* CDATA blocks are not working, XML_encode is not sufficient, currently no idea how to escape % */ repeat-image: eval(concat("data:image/svg+xml,<svg height='70px'><g fill-opacity='0.3' stroke-opacity='0.3'><text x='0' y='50' font-size='50' fill='white' stroke='blue'>",prop(complete_destination),"</text></g></svg>")); repeat-image-height: eval(prop(lane_default_width,"default")*prop(lanes_bwd,"default")); repeat-image-offset: eval(prop("right_backward_border","default")+(prop("lane_width_all_backward","default")/2)); repeat-image-spacing: eval(prop(repeat-image-height)); repeat-image-phase: eval(prop(repeat-image-height)); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* destination_sign relation (experimental support - only one sign per way is supported) */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ relation[is_prop_set(ok, "default")][type="destination_sign"] >[role="to"] way|z17-::Destination_Sign { sign_font_size: 50; sign_border: 5; sign_height: 70; sign_opacity: 0.5; sign_text: eval(parent_tag(destination)); sign_temp: eval(parent_tag("distance")); sign_text: eval(is_prop_set(sign_temp)?concat(prop(sign_text)," ",replace(replace(prop(sign_temp)," km","")," mi","")):prop(sign_text)); sign_ref: eval(parent_tag("destination:ref")); sign_int_ref: eval(parent_tag("destination:int_ref")); sign_text_width: eval(length(prop(sign_text))*prop(sign_font_size)); /* As font-family=monospace is not working, this value is just a guess*/ sign_text_x: eval((prop(sign_text_width)/2)+(2*prop(sign_border))); sign_text_y: eval(prop(sign_font_size)); sign_ref_width: eval(is_prop_set(sign_ref)?(length(prop(sign_ref))*prop(sign_font_size)*1.2):0); sign_ref_x: eval(prop(sign_text_width)+(3*prop(sign_border))); sign_ref_y: eval(prop(sign_border)); sign_ref_height: eval(prop(sign_height)-(2*prop(sign_border))); sign_ref_text_x: eval(prop(sign_ref_x)+(prop(sign_ref_width)/2)); sign_ref_text_y: eval(prop(sign_font_size)); sign_int_ref_width: eval(is_prop_set(sign_int_ref)?(length(prop(sign_int_ref))*prop(sign_font_size)*1.2):0); sign_int_ref_x: eval(prop(sign_ref_x)+prop(sign_ref_width)); sign_int_ref_y: eval(prop(sign_border)); sign_int_ref_height: eval(prop(sign_height)-(2*prop(sign_border))); sign_int_ref_text_x: eval(prop(sign_int_ref_x)+(prop(sign_int_ref_width)/2)); sign_int_ref_text_y: eval(prop(sign_font_size)); sign_width: eval(((prop(sign_text_width)+(4*prop(sign_border)))+prop(sign_ref_width))+prop(sign_int_ref_width)); sign_border_width: eval(prop(sign_width)-(prop(sign_border)*2)); sign_border_height: eval(prop(sign_height)-(prop(sign_border)*2)); sign_colour_back: eval(parent_tag("colour:back")); sign_colour_back: eval(is_prop_set(sign_colour_back)?prop(sign_colour_back):"white"); sign_colour_text: eval(parent_tag("colour:text")); sign_colour_text: eval(is_prop_set(sign_colour_text)?prop(sign_colour_text):"blue"); sign_colour_arrow: eval(parent_tag("colour:arrow")); sign_colour_arrow: eval(is_prop_set(sign_colour_arrow)?prop(sign_colour_arrow):"blue"); sign_colour_ref_text: eval(parent_tag("colour:text:ref")); sign_colour_ref_text: eval(is_prop_set(sign_colour_ref)?prop(sign_colour_ref):"white"); sign_colour_ref_back: eval(parent_tag("colour:back:ref")); sign_colour_ref_back: eval(is_prop_set(sign_colour_ref)?prop(sign_colour_ref):"blue"); sign_colour_int_ref_text: eval(parent_tag("colour:text:int_ref")); sign_colour_int_ref_text: eval(is_prop_set(sign_colour_int_ref)?prop(sign_colour_int_ref):"white"); sign_colour_int_ref_back: eval(parent_tag("colour:back:int_ref")); sign_colour_int_ref_back: eval(is_prop_set(sign_colour_int_ref)?prop(sign_colour_int_ref):"green"); repeat-image: eval(concat("data:image/svg+xml,<svg height='",prop(sign_height),"px'><rect fill-opacity='",prop(sign_opacity),"' fill='",prop(sign_colour_back),"' stroke-opacity='",prop(sign_opacity),"' stroke='",prop(sign_colour_arrow),"' stroke-width='",prop(sign_border),"' x='",prop(sign_border),"' y='",prop(sign_border),"' width='",prop(sign_border_width),"' height='",prop(sign_border_height),"'/>", "<g fill-opacity='",prop(sign_opacity),"'><text text-anchor='middle' x='",prop(sign_text_x),"' y='",prop(sign_text_y),"' font-size='",prop(sign_font_size),"' fill='",prop(sign_colour_text),"'>",prop(sign_text),"</text></g>", "<rect fill-opacity='",prop(sign_opacity),"' fill='",prop(sign_colour_ref_back),"' x='",prop(sign_ref_x),"' y='",prop(sign_ref_y),"' width='",prop(sign_ref_width),"' height='",prop(sign_ref_height),"' />", "<g fill-opacity='",prop(sign_opacity),"'><text text-anchor='middle' x='",prop(sign_ref_text_x),"' y='",prop(sign_ref_text_y),"' font-size='",prop(sign_font_size),"' fill='",prop(sign_colour_ref_text),"'>",prop(sign_ref),"</text></g>", "<rect fill-opacity='",prop(sign_opacity),"' fill='",prop(sign_colour_int_ref_back),"' x='",prop(sign_int_ref_x),"' y='",prop(sign_int_ref_y),"' width='",prop(sign_int_ref_width),"' height='",prop(sign_int_ref_height),"' />", "<g fill-opacity='",prop(sign_opacity),"'><text text-anchor='middle' x='",prop(sign_int_ref_text_x),"' y='",prop(sign_int_ref_text_y),"' font-size='",prop(sign_font_size),"' fill='",prop(sign_colour_int_ref_text),"'>",prop(sign_int_ref),"</text></g>", "</svg>")); repeat-image-spacing: 100000; /* It means: do not repeat! */ repeat-image-offset: eval((is_prop_set(left_carriageway_border,"default")?(prop(left_carriageway_border,"default")):0)+(prop(pixel_per_metre,"default")*3)); repeat-image-height: eval(prop(pixel_per_metre,"default")*3); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Traffic signs */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Disable rendering of traffic signs on low zoom levels */ node|z-15[traffic_sign=~/^(.*;)*maxspeed(;.*)*$/], node|z-15[traffic_sign=~/^(.*;)*overtaking(;.*)*$/] { icon-image: prop(unset_property); } node|z16-[traffic_sign] { traffic_sign_svg: ""; traffic_sign_top: 0; } /* Speed limit in km/h */ node|z16-[traffic_sign~=maxspeed][maxspeed>0] { t: eval((tag(maxspeed)<10)?1.0:((tag(maxspeed)<100)?0.8:((tag(maxspeed)<1000)?0.6:0.4))); t_x: eval((tag(maxspeed)<10)?45:((tag(maxspeed)<100)?60:((tag(maxspeed)<1000)?80:120))); t_z: eval((has_tag_key("source:maxspeed") && regexp_test(".*zone.*",tag("source:maxspeed")))?concat("<rect x='0' y='",(prop(traffic_sign_top)+0),"' width='100' height='140' fill='white' /><text style='font-size:40px; font-weight:bold;' x='60' y='",(prop(traffic_sign_top)+135),"' text-anchor='middle' transform='scale(0.8 1.0)'>ZONE</text>"):""); traffic_sign_svg: eval(concat(prop(traffic_sign_svg),prop(t_z),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='45' stroke='red' stroke-width='10' fill='white' /><text style='font-size:60px; font-weight:bold;' x='",prop(t_x),"' y='",(prop(traffic_sign_top)+70),"' text-anchor='middle' transform='scale(",prop(t)," 1.0)'>",tag(maxspeed),"</text>")); traffic_sign_top: eval(prop(traffic_sign_top)+((prop(t_z)="")?100:140)); } /* Speed limit in mph */ node|z16-[traffic_sign~=maxspeed][maxspeed=~/[0-9]+ mph/] { t_speed: eval(get(split(" ",tag(maxspeed)),0)); t: eval((prop(t_speed)<10)?1.0:((prop(t_speed)<100)?0.8:((prop(t_speed)<1000)?0.6:0.4))); t_x: eval((prop(t_speed)<10)?45:((prop(t_speed)<100)?60:((prop(t_speed)<1000)?80:120))); t_z: eval((has_tag_key("source:maxspeed") && regexp_test(".*zone.*",tag("source:maxspeed")))?concat("<rect x='0' y='",(prop(traffic_sign_top)+0),"' width='100' height='140' fill='white' /><text style='font-size:40px; font-weight:bold;' x='60' y='",(prop(traffic_sign_top)+135),"' text-anchor='middle' transform='scale(0.8 1.0)'>ZONE</text>"):""); traffic_sign_svg: eval(concat(prop(traffic_sign_svg),prop(t_z),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='45' stroke='red' stroke-width='10' fill='yellow' /><text style='font-size:60px; font-weight:bold;' x='",prop(t_x),"' y='",(prop(traffic_sign_top)+70),"' text-anchor='middle' transform='scale(",prop(t)," 1.0)'>",prop(t_speed),"</text>")); traffic_sign_top: eval(prop(traffic_sign_top)+((prop(t_z)="")?100:140)); } /* End of speed limit but not overtaking allowed (otherwise single traffic sign -> see below) */ node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking!=yes], node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking=yes]["source:maxspeed"=~/.*zone.*/] { t_z: eval((has_tag_key("source:maxspeed") && regexp_test(".*zone.*",tag("source:maxspeed")))?"<rect x='0' y='0' width='100' height='140' fill='white' /><text style='font-size:40px; font-weight:bold;' x='60' y='135' text-anchor='middle' transform='scale(0.8 1.0)'>ZONE</text>":""); traffic_sign_svg: eval(concat(prop(traffic_sign_svg),prop(t_z),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='50' fill='white' /><circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='46' stroke='black' stroke-width='3' fill='white' /><text style='fill:#DDD; font-size:60px; font-weight:bold;' x='47' y='",(prop(traffic_sign_top)+70),"' text-anchor='middle'>XX</text><line x1='17' y1='",(prop(traffic_sign_top)+83),"' x2='83' y2='",(prop(traffic_sign_top)+17),"' stroke='black' stroke-width='15' />")); traffic_sign_top: eval(prop(traffic_sign_top)+((prop(t_z)="")?100:140)); } /* No overtaking */ node|z16-[traffic_sign~=overtaking][overtaking=no] { traffic_sign_svg: eval(concat(prop(traffic_sign_svg),"<g transform='translate(0,",prop(traffic_sign_top),")'><g transform='scale(0.137931)'><circle cx='362.5' cy='362.5' r='350' style='fill:white;stroke:black;stroke-width:2.5px' /><circle cx='362.5' cy='362.5' r='290' style='fill:white;stroke:#c00;stroke-width:93.75'/><path d='M 151.8,375.1 C 151.4,338.9 149.4,370.0 171.2,316.4 C 187.0,279.9 171.0,289.7 252.7,288.4 C 325.3,289.9 310.7,279.3 327.4,318.1 C 348.3,367.6 346.7,341.7 346.5,374.0 C 345.7,409.5 358.9,400.4 248.9,401.6 C 139.7,400.1 152.7,409.4 151.9,375.1 z M 174.0,340.1 L 188.9,305.6 C 191.7,299.5 190.8,300.4 197.3,300.4 L 301.8,300.4 C 307.4,300.4 306.6,300.0 308.9,305.4 L 323.8,339.7 L 174.0,340.1 z M 163.3,405.5 L 191.2,405.5 C 191.1,440.6 194.0,438.6 178.8,438.8 C 160.7,438.8 163.5,440.6 163.3,405.6 z M 307.2,405.8 L 335.2,405.8 C 335.0,440.9 337.5,438.5 321.7,438.6 C 305.3,438.4 307.4,441.0 307.2,405.8 z ' style='fill:#c00;fill-rule:evenodd' />", "<path d='M 377.4,375.1 C 376.9,338.9 375.0,370.0 396.8,316.4 C 412.6,279.9 396.6,289.7 478.2,288.4 C 550.9,289.9 536.2,279.3 552.9,318.1 C 573.8,367.6 572.2,341.7 572.1,374.0 C 571.3,409.5 584.4,400.4 474.4,401.6 C 365.3,400.1 378.2,409.4 377.4,375.1 z M 399.5,340.1 L 414.5,305.6 C 417.2,299.5 416.4,300.4 422.9,300.4 L 527.3,300.4 C 533.0,300.4 532.2,300.0 534.5,305.4 L 549.3,339.7 L 399.5,340.1 z M 388.8,405.6 L 416.8,405.5 C 416.7,440.6 419.6,438.6 404.4,438.8 C 386.2,438.8 389.1,440.6 388.8,405.6 z M 532.7,405.8 L 560.7,405.8 C 560.5,440.9 563.1,438.5 547.2,438.6 C 530.9,438.4 532.9,441.0 532.7,405.8 z ' style='fill:black;fill-rule:evenodd' /></g></g>")); traffic_sign_top: eval(prop(traffic_sign_top)+100); } /* Overtaking allowed and also not implicit speed limit (or implicit speed zone)*/ node|z16-[traffic_sign~=overtaking][overtaking=yes][maxspeed!=implicit], node|z16-[traffic_sign~=overtaking][overtaking=yes][maxspeed=implicit]["source:maxspeed"=~/.*zone.*/] { traffic_sign_svg: eval(concat(prop(traffic_sign_svg),"<g transform='translate(0,",prop(traffic_sign_top),")'><g transform='scale(0.137931)'><circle cx='362.5' cy='362.5' r='350' style='fill:white;stroke:black;stroke-width:2.5px' /><circle cx='362.5' cy='362.5' r='330' style='fill:white;stroke:black;stroke-width:20'/><path d='M 151.8,375.1 C 151.4,338.9 149.4,370.0 171.2,316.4 C 187.0,279.9 171.0,289.7 252.7,288.4 C 325.3,289.9 310.7,279.3 327.4,318.1 C 348.3,367.6 346.7,341.7 346.5,374.0 C 345.7,409.5 358.9,400.4 248.9,401.6 C 139.7,400.1 152.7,409.4 151.9,375.1 z M 174.0,340.1 L 188.9,305.6 C 191.7,299.5 190.8,300.4 197.3,300.4 L 301.8,300.4 C 307.4,300.4 306.6,300.0 308.9,305.4 L 323.8,339.7 L 174.0,340.1 z M 163.3,405.5 L 191.2,405.5 C 191.1,440.6 194.0,438.6 178.8,438.8 C 160.7,438.8 163.5,440.6 163.3,405.6 z M 307.2,405.8 L 335.2,405.8 C 335.0,440.9 337.5,438.5 321.7,438.6 C 305.3,438.4 307.4,441.0 307.2,405.8 z ' style='fill:gray;fill-rule:evenodd' />", "<path d='M 377.4,375.1 C 376.9,338.9 375.0,370.0 396.8,316.4 C 412.6,279.9 396.6,289.7 478.2,288.4 C 550.9,289.9 536.2,279.3 552.9,318.1 C 573.8,367.6 572.2,341.7 572.1,374.0 C 571.3,409.5 584.4,400.4 474.4,401.6 C 365.3,400.1 378.2,409.4 377.4,375.1 z M 399.5,340.1 L 414.5,305.6 C 417.2,299.5 416.4,300.4 422.9,300.4 L 527.3,300.4 C 533.0,300.4 532.2,300.0 534.5,305.4 L 549.3,339.7 L 399.5,340.1 z M 388.8,405.6 L 416.8,405.5 C 416.7,440.6 419.6,438.6 404.4,438.8 C 386.2,438.8 389.1,440.6 388.8,405.6 z M 532.7,405.8 L 560.7,405.8 C 560.5,440.9 563.1,438.5 547.2,438.6 C 530.9,438.4 532.9,441.0 532.7,405.8 z ' style='fill:gray;fill-rule:evenodd' /></g><line x1='18' y1='82' x2='82' y2='18' stroke='black' stroke-width='15' /></g>")); traffic_sign_top: eval(prop(traffic_sign_top)+100); } /* End of speed limit (not zone!) and also overtaking allowed -> single traffic sign*/ node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking=yes][!"source:maxspeed"], node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking=yes]["source:maxspeed"=~/^((?!zone).)*$/] { traffic_sign_svg: eval(concat(prop(traffic_sign_svg),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='50' fill='white' /><circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='46' stroke='black' stroke-width='3' fill='white' /><line x1='17' y1='",(prop(traffic_sign_top)+83),"' x2='83' y2='",(prop(traffic_sign_top)+17),"' stroke='black' stroke-width='15' />")); traffic_sign_top: eval(prop(traffic_sign_top)+100); } /* Now render the traffic sign */ node|z16-[!(prop(traffic_sign_svg,"default")="")] { major-z-index: 5; /* JOSM added some default rendering, which interferes with this */ icon-image: eval(concat("data:image/svg+xml,<svg width='100px' height='",prop(traffic_sign_top),"'>",prop(traffic_sign_svg),"</svg>")); icon-width: eval(max(12,prop(pixel_per_metre))); } /* Disable JOSMs default rendering (this is a hack and may fail at any time) */ /* Make sure, that the selector is identical to the one that actually renders the traffic sign */ node|z16-[!(prop(traffic_sign_svg,"default")="")]::core_maxnodebg { symbol-shape: none; } node|z16-[!(prop(traffic_sign_svg,"default")="")]::core_maxnodefg { text: none; symbol-shape: none; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Member nodes of enforcement relations */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ relation[type="enforcement"] >[role="from"] node { symbol-stroke-color: #00FF00; symbol-shape: square; symbol-size: 5; symbol-stroke-width: 2; } relation[type="enforcement"] >[role="to"] node { symbol-stroke-color: #FF0000; symbol-shape: square; symbol-size: 5; symbol-stroke-width: 2; } /***************************************************************************************************************************************************/ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Check for some common errors */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /***************************************************************************************************************************************************/ way{} /* Why-oh-why do I need this.... */ /* Discouraged alternative values for oneway */ way[oneway=true], way[oneway=1] { data_error: "use oneway=yes"; } /* Rejected turn lanes proposal */ way["lanes:turnright"], way["lanes:turnleft"], way["lanes:through"], way["lanes:merge"], way["lanes:turnright:forward"], way["lanes:turnleft:forward"], way["lanes:through:forward"], way["lanes:merge:forward"], way["lanes:turnright:backward"], way["lanes:turnleft:backward"], way["lanes:through:backward"], way["lanes:merge:backward"] { data_error: "lanes:<turn> rejected"; } /* Common typos in destination tags */ way["destination:forward:ref"] { data_error: "use destination:ref:forward"; } way["destination:backward:ref"] { data_error: "use destination:ref:backward"; } way["destination:forward:int_ref"] { data_error: "use destination:int_ref:forward"; } way["destination:backward:int_ref"] { data_error: "use destination:int_ref:backward"; } way["destination:forward:symbol"] { data_error: "use destination:symbol:forward"; } way["destination:backward:symbol"] { data_error: "use destination:symbol:backward"; } way["destination:forward:country"] { data_error: "use destination:country:forward"; } way["destination:backward:country"] { data_error: "use destination:country:backward"; } way["destination:sign"] { data_error: "use destination:symbol"; } way["destination:sign:forward"] { data_error: "use destination:symbol"; } way["destination:sign:backward"] { data_error: "use destination:symbol"; } way["destination:sign:lanes"] { data_error: "use destination:symbol"; } way["destination:sign:lanes:forward"] { data_error: "use destination:symbol"; } way["destination:sign:lanes:backward"] { data_error: "use destination:symbol"; } way[destination=~/:\S/] { data_error: "use ; instead of : to separate values"; } way[destination:lanes=~/:\S/] { data_error: "use ; instead of : to separate values"; } way[destination:lanes:forward=~/:\S/] { data_error: "use ; instead of : to separate values"; } way[destination:lanes:backward=~/:\S/] { data_error: "use ; instead of : to separate values"; } way[destination=~/,/] { data_error: "use ; instead of , to separate values"; } way[destination:lanes=~/,/] { data_error: "use ; instead of , to separate values"; } way[destination:lanes:forward=~/,/] { data_error: "use ; instead of , to separate values"; } way[destination:lanes:backward=~/,/] { data_error: "use ; instead of , to separate values"; } way["transit"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;)*$",tag("transit"))?prop(data_error):"invalid transit value"); } way["transit:forward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;)*$",tag("transit:forward"))?prop(data_error):"invalid transit:forward value"); } way["transit:backward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;)*$",tag("transit:backward"))?prop(data_error):"invalid transit:backward value"); } way["transit:lanes"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;|\\|)*$",tag("transit:lanes"))?prop(data_error):"invalid transit:lanes value"); } way["transit:lanes:forward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;|\\|)*$",tag("transit:lanes:forward"))?prop(data_error):"invalid transit:lanes:forward value"); } way["transit:lanes:backward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;|\\|)*$",tag("transit:lanes:backward"))?prop(data_error):"invalid transit:lanes:backward value"); } way["transit:both_ways"] { data_error: "use the relation instead of transit:both_ways"; } way["transit:lanes:both_ways"] { data_error: "use the relation instead of transit:lanes:both_ways"; } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Disputed checks: disabled by default */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* maxspeed should be numerical (yes, this is disputed, I know, that's why this is disabled by default) */ way[prop(style_show_disputed)][maxspeed] { data_error: eval(regexp_test("^[0-9]+(| mph| km/h)$",tag(maxspeed))?prop(data_error):"maxspeed not numerical"); } way[prop(style_show_disputed)]["maxspeed:forward"] { data_error: eval(regexp_test("^[0-9]+(| mph| km/h)$",tag("maxspeed:forward"))?prop(data_error):"maxspeed:forward not numerical"); } way[prop(style_show_disputed)]["maxspeed:backward"] { data_error: eval(regexp_test("^[0-9]+(| mph| km/h)$",tag("maxspeed:backward"))?prop(data_error):"maxspeed:backward not numerical"); } /* A source should be given for maxspeed */ way[prop(style_show_disputed)][maxspeed][!"source:maxspeed"] { data_warning: "source:maxspeed missing"; } /* Value of source:maxspeed should be <country code>:<context> */ way[prop(style_show_disputed)]["source:maxspeed"] { data_warning: eval(regexp_test("^([A-Z][A-Z]:.+|zone|sign)$",tag("source:maxspeed"))?prop(data_warning):"verify source:maxspeed"); } /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ /* Display warnings/errors */ /*-------------------------------------------------------------------------------------------------------------------------------------------------*/ way[is_prop_set(data_warning)][prop(style_show_warnings)=yes] { casing-width: 4; casing-color: yellow; text: eval(prop(data_warning)); font-size: 12; text-halo-radius: 1; } way[is_prop_set(data_error)][prop(style_show_errors)=yes] { casing-width: 5; casing-color: red; text: eval(prop(data_error)); font-size: 14; text-halo-radius: 1; }
Styles_Enhanced_Lane_and_Road_Attributes-style.mapcss, Styles_Enhanced_Lane_and_Road_Attributes.zip