query: ( way[highway=cycleway]; way[cyclestreet=yes]; way[bicycle_road=yes]; way[highway=path][bicycle][bicycle!=no]; way["cycleway"]["cycleway"!~"(no|separate)"]; way["cycleway:left"]["cycleway:left"!~"(no|separate)"]; way["cycleway:right"]["cycleway:right"!~"(no|separate)"]; way["cycleway:both"]["cycleway:both"!~"(no|separate)"]; ) feature: pre: | {% set type = tags.highway %} {% if tags.highway == 'path' and tags.bicycle and tags.bicycle != 'no' %} {% set type = 'cycleway' %} {% endif %} {% if tags.cyclestreet == 'yes' %} {% set type = 'cyclestreet' %} {% elseif tags.bicycle_road in ['yes', 'designated'] %} {% set type = 'bicycle_road' %} {% endif %} {% set oneway = attribute(tags, 'oneway:bicycle')|default(tags.oneway) %} {% if oneway == 'yes' %} {% set oneway = 1 %} {% elseif oneway == 'no' %} {% set oneway = 0 %} {% endif %} {% set leftCycle = '' %}{% set rightCycle = '' %} {% if tags.cycleway %} {% if tags.cycleway in ['crossing'] %} {% elseif (tags.oneway in ['yes', 1] and map.driving_side == 'right') or (tags.oneway in [-1] and map.driving_side == 'left') %} {{ tags.cycleway|debug }} {% if tags.cycleway matches '/^opposite/' %} {% set leftCycle = tags.cycleway %} {% else %} {% set rightCycle = tags.cycleway %} {% endif %} {% elseif (tags.oneway in ['yes', 1] and map.driving_side == 'left') or (tags.oneway in [-1] and map.driving_side == 'right') %} {% if tags.cycleway matches '/^opposite/' %} {% set rightCycle = tags.cycleway %} {% else %} {% set leftCycle = tags.cycleway %} {% endif %} {% else %} {% set leftCycle = tags.cycleway %} {% set rightCycle = tags.cycleway %} {% endif %} {% endif %} {% set leftCycle1 = attribute(tags, 'cycleway:left')|default(attribute(tags, 'cycleway:both')) %} {% if leftCycle1 %}{% set leftCycle = leftCycle1 %}{% endif %} {% if const.hiddenTypes[leftCycle] %} {% set leftCycle = '' %} {% endif %} {% set leftOneway = attribute(tags, 'cycleway:left:oneway')|default(attribute(tags, 'cycleway:both:oneway')) %} {% if not leftOneway or leftOneway in ['yes'] %} {% set leftOneway = map.driving_side == 'left' ? 1 : -1 %} {% elseif leftOneway in ['no'] %} {% set leftOneway = 0 %} {% endif %} {% set rightCycle1 = attribute(tags, 'cycleway:right')|default(attribute(tags, 'cycleway:both')) %} {% if rightCycle1 %}{% set rightCycle = rightCycle1 %}{% endif %} {% if const.hiddenTypes[rightCycle] %} {% set rightCycle = '' %} {% endif %} {% set rightOneway = attribute(tags, 'cycleway:right:oneway')|default(attribute(tags, 'cycleway:both:oneway')) %} {% if not rightOneway or rightOneway in ['yes'] %} {% set rightOneway = map.driving_side == 'left' ? -1 : 1 %} {% elseif rightOneway in ['no'] %} {% set rightOneway = 0 %} {% endif %} styles: | {% if tags.bridge and tags.bridge != 'no' %} bridge, {% endif %} {% if tags.cycleway in ['crossing'] or tags.path in ['crossing'] %} crossing, {% endif %} {% if tags.segregated %} footway, {% endif %} default {% if leftCycle %} ,left {% endif %} {% if rightCycle %} ,right {% endif %} style: width: | {% if tags.segregated == 'yes' %} {{ const.types[type].width / 2 }} {% else %} {{ const.types[type].width }} {% endif %} dashArray: | {% if oneway and tags.segregated == 'no' %} 5,5,5,20 {% elseif oneway %} 25,10 {% elseif tags.segregated == 'no' %} 5,5 {% endif %} dashOffset: | {% if oneway and tags.segregated == 'no' %} 5 {% elseif oneway %} 10 {% elseif tags.segregated == 'no' %} 0 {% endif %} lineCap: | {% if tags.segregated == 'no' or oneway %} butt {% else %} round {% endif %} color: | {{ const.types[type].color }} offset: | {% if tags.segregated == 'yes' %} {{ const.types[type].width / 2 - 1 }} {% endif %} pattern: | {% if oneway -%} arrowHead {%- endif %} pattern-repeat: | 35 pattern-offset: | {{ oneway == -1 ? 17 : 22 }} noClip: | {{ oneway != 0 }} pattern-polygon: true pattern-pixelSize: 9 pattern-angleCorrection: | {{ oneway == -1 ? 180 : 0 }} pattern-path-color: | {{ const.types[type].color }} pattern-path-width: 0 pattern-path-fillOpacity: 1 zIndex: |- {{ tags.layer|default(0) }} style:footway: color: | {{ const.types.footway.color }} width: | {% if tags.segregated == 'yes' %} {{ const.types.footway.width / 2 }} {% else %} {{ const.types.footway.width }} {% endif %} dashArray: | {% if oneway and tags.segregated == 'no' %} 5,5,5,5,5,10 {% elseif oneway %} 25,10 {% elseif tags.segregated == 'no' %} 5,5 {% endif %} dashOffset: | {% if oneway %} 10 {% elseif tags.segregated == 'no' %} 5 {% endif %} noClip: | {{ oneway != 0 }} lineCap: | {% if tags.segregated == 'no' or oneway %} butt {% else %} round {% endif %} offset: | {% if tags.segregated == 'yes' %} {{ (const.types.footway.width / 2 - 1) * -1 }} {% endif %} zIndex: |- {{ tags.layer|default(0) }} style:left: offset: -5 color: | {{ const.types[leftCycle].color|default('#ff0000') }} width: 3 lineCap: | {{ leftOneway ? 'butt' : 'round' }} dashArray: | {{ leftOneway ? '27,8' : '' }} dashOffset: | {{ leftOneway == -1 ? 28 : 0 }} noClip: true # {{ leftOneway }} pattern: | {% if leftOneway %}arrowHead{% endif %} pattern-offset: | {{ leftOneway == -1 ? 4 : 30.5 }} pattern-lineOffset: -5 pattern-repeat: 35 pattern-polygon: true pattern-pixelSize: 9 pattern-angleCorrection: | {{ leftOneway == -1 ? 180 : 0 }} pattern-path-width: 0 pattern-path-color: | {{ const.types[leftCycle].color|default('#ff0000') }} pattern-path-fillOpacity: 1 zIndex: |- {{ tags.layer|default(0) }} style:right: offset: 5 color: | {{ const.types[rightCycle].color|default('#ff0000') }} width: 3 lineCap: | {{ rightOneway ? 'butt' : 'round' }} dashArray: | {{ rightOneway ? '27,8' : '' }} dashOffset: | {{ rightOneway == -1 ? 28 : 0 }} noClip: true # {{ rightOneway }} pattern: | {% if rightOneway %}arrowHead{% endif %} pattern-offset: | {{ rightOneway == -1 ? 4 : 30.5 }} pattern-lineOffset: 5 pattern-repeat: 35 pattern-polygon: true pattern-pixelSize: 9 pattern-angleCorrection: | {{ rightOneway == -1 ? 180 : 0 }} pattern-path-width: 0 pattern-path-color: | {{ const.types[rightCycle].color|default('#ff0000') }} pattern-path-fillOpacity: 1 zIndex: |- {{ tags.layer|default(0) }} style:crossing: width: | {{ const.types[type].width + 4 }} color: black lineCap: butt dashArray: "4,4" zIndex: |- {{ tags.layer|default(0) - 0.1 }} style:bridge: width: | {{ const.types[type].width|default(5) + 4 }} color: black lineCap: butt zIndex: |- {{ tags.layer|default(0) - 0.2 }} description: | {% if tags.cyclestreet == 'yes' %} {{ keyTrans('cyclestreet') }} {% elseif tags.bicycle_road in ['yes', 'designated'] %} {{ keyTrans('bicycle_road') }} {% elseif tags.segregated %} {{ tagTrans('highway', 'cycleway segregated=' ~ tags.segregated) }} {% elseif tags.highway %} {{ tagTrans('highway', tags.highway) }} {% endif %} body: | markerSymbol: '' listMarkerSymbol: line info: | {% for k, v in const.types %} {% endfor %}
Symbol
{{ markerLine({ width: 4, color: v.color }) }} {{ k }}
const: types: cycleway: color: '#009f00' width: 4 footway: color: '#ff9f00' width: 4 cyclestreet: color: '#006f3f' width: 8 bicycle_road: color: '#006f4f' width: 8 lane: color: '#00df3f' track: color: '#009f00' shared: color: '#ff0000' warning: 'Deprecated tag! Use oneway:bicycle=no and cycleway=lane, cycleway:oneway=-1 instead.' shared_lane: color: '#003faf' share_busway: color: '#ff7f00' opposite: color: '#ff0000' warning: 'Deprecated tag! Use oneway:bicycle=no and cycleway:%other_driving_side%=lane, cycleway:%other_driving_side%:oneway=-1 instead.' opposite_lane: color: '#ff0000' warning: 'Deprecated tag! Use oneway:bicycle=no and cycleway:%other_driving_side%=lane, cycleway:%other_driving_side%:oneway=-1 instead.' opposite_share_busway: color: '#ff0000' warning: 'Deprecated tag! Use oneway:bicycle=no and cycleway:%other_driving_side%=share_busway, cycleway:%other_driving_side%:oneway=-1 instead.' opposite_track: color: '#ff0000' warning: 'Deprecated tag! Use oneway:bicycle=no and cycleway:%other_driving_side%=track, cycleway:%other_driving_side%:oneway=-1 instead.' hiddenTypes: 'no': true separate: true