meta { title: "transmission-grid-mapping-style"; description: "A style for fast electrical grid mapping of wide-area transmission networks. Adapted from the 'detailed power grid style' by FLacombe."; version: "0.4"; author: "Mwiche", "FLacombe", "Map Your Grid Initiative"; } /* Settings */ setting::hide_icons { type: boolean; label: tr("Hide icons at low zoom"); default: true; } setting::shrink_nodes { type: boolean; label: tr("Less obtrusive node symbols at low zoom"); default: true; } setting::hide_tagged_waynodes { type: boolean; label: tr("Hide tagged waynodes at low zoom"); default: true; } setting::partial_fill { type: boolean; label: tr("Areas are drawn with fill only around their inner edges"); default: true; } /* Canvas defaults */ canvas { default-points: false; } node { text: auto; } /****************************/ /* Power nodes and supports */ /****************************/ /* Basic power nodes - visible only at z10+ */ node|z10-[power] { set power_node; } node.power_node[power=portal] { icon-image: "presets/power/portal.svg"; } node.power_node[power=tower] { icon-image: "presets/power/tower.svg"; } node.power_node[power=pole] { icon-image: "presets/power/pole.svg"; } node.power_node[power=generator] { icon-image: "presets/power/generator.svg"; } node.power_node[power=heliostat] { icon-image: "presets/power/heliostat.svg"; } node.power_node[power=substation] { icon-image: "presets/power/substation.svg"; } node.power_node[power=transformer] { icon-image: "presets/power/transformer.svg"; } node.power_node[power=terminal] { icon-image: "presets/power/terminal.svg"; } node.power_node[power=switch] { icon-image: "presets/power/switch.svg"; } node.power_node[power=converter] { icon-image: "presets/power/converter.svg"; } node.power_node[power=compensator] { icon-image: "presets/power/compensator.svg"; } node.power_node[power=connection] { icon-image: "presets/power/connection.svg"; } node.power_node[power=insulator] { icon-image: "presets/power/insulator.svg"; } node.power_node { set icon_z17; } /* Specialized power nodes */ node|z10-[power=pole][switch] { icon-image: "presets/power/pole_switch.svg"; } node|z10-[power=pole][transformer=distribution] { icon-image: "presets/power/pole_transformer.svg"; } node|z10-[power=catenary_mast] { icon-image: "presets/power/catenary_mast.svg"; } node|z10-[man_made=street_cabinet][street_cabinet=power] { icon-image: "presets/power/cable_distribution_cabinet.svg"; set icon_z17; } /* Power portals as ways */ way|z15-[power=portal] { width: 3; color: #e6e6e6; } way|z15-[power="portal"] node[!power]{ symbol-shape:triangle; symbol-size:10; symbol-fill-color: #e6e6e6; } /* Design label for towers */ node|z15-19[power=tower][design] { text: "design"; text-color: black; text-halo-color: white; text-halo-radius: 1; text-offset-y: -15; font-size: 8; } /* Only show unconnected towers at z16+ */ node|z9-[power=tower]:unconnected { symbol-shape: square; symbol-fill-color: #0000FF; symbol-size: 6; symbol-fill-opacity: 0.7; major-z-index: 1; } node|z-16[power=switch] { font-size: 0; symbol-size: 2; } /* Power substation node styling */ node|z-18[power=substation][substation=industrial] { text: "operator"; font-size: 0; symbol-size: 2; color: #FF0000; fill-opacity: 0.05; } node|z18-[power=substation][substation=industrial] { text: "operator"; font-size: 8; symbol-size: 4; color: #FF0000; fill-opacity: 0.05; } node|z-18[power=substation][substation=minor_distribution] { font-size: 0; symbol-size: 2; color: white; fill-opacity: 0.05; } /* Power transformer node styling */ node|z10-[power=transformer], way|z10-[power=transformer] { icon-size: 6; text: name; text-size: 12; text-position: center; color: #2BFAFA; fill-color: #2BFAFA; width: 1; } /* Power generator node styling */ node[power=generator]{ z-index: 4; } node|z-15[power=generator] { font-size: 0; color: #FFD700; symbol-shape: circle; symbol-stroke-color: #FFD700; symbol-stroke-width: 4; symbol-fill-color: #FFD700; symbol-size: 2; symbol-fill-opacity: 0.7; } /* Generator sources node styling - visible only at z10+ */ node|z10-[generator:source=nuclear] { icon-image: "presets/power/power_source-nuclear.svg"; set icon_z17; } node|z10-[generator:source=wind] { icon-image: "presets/power/power_source-wind.svg"; set icon_z17; } node|z10-[generator:source=hydro] { icon-image: "presets/power/power_source-water.svg"; set icon_z17; } node|z10-[generator:source=solar] { icon-image: "presets/power/power_source-sun.svg"; set icon_z17; } node|z10-[generator:source=coal] { icon-image: "presets/power/power_source-coal.svg"; set icon_z17; } node|z10-[generator:source=gas] { icon-image: "presets/power/power_source-gas.svg"; set icon_z17; } node|z10-[generator:source=biomass] { icon-image: "presets/power/power_source-biofuel.svg"; set icon_z17; } node|z10-[generator:source=oil] { icon-image: "presets/power/power_source-oil.svg"; set icon_z17; } /* Zoom level behaviors for nodes */ node|z-15[setting("hide_icons")].icon_z17!.icon_z0, relation|z-16[type=restriction][setting("hide_icons")] { icon-image: none; } node|z-17[setting("hide_icons")]!.text_z0 { text: none; } way > node|z-15[setting("shrink_nodes")]!:tagged { symbol-shape: none; } node|z-17:tagged { symbol-stroke-color: none; symbol-fill-color: none; text: none; font-size: 0; } node.power_node:selected { symbol-shape: square; symbol-size: 6; symbol-fill-color: yellow; color: yellow; text-color: red; font-size: 16; priority: 1000; major-z-index: 400; } /*****************/ /* Area styling */ /*****************/ /* Power substations */ area[power=substation]{ color: #FFFFFF; text-color: black; text-halo-color: white; text-halo-radius: 2; text-halo-opacity: 0.8; font-weight: bold; text-position: center; z-index: 200; major-z-index: 200; } area|z0-15[power=substation] { width: 0.5; symbol-size: 3; fill-opacity: 0.07; } area|z16-19[power=substation] { width: 2; symbol-size: 5; fill-opacity: 0.1; text: "name"; font-size: 18; } area|z20-[power=substation] { width: 1; symbol-size: 6; fill-opacity: 0.15; text: "name"; font-size: 20; } area|z12-13[power=substation] { text: "name"; font-size: 14; } area|z14-16[power=substation] { text: "name"; font-size: 16; } /* Substations roles */ area[power=substation][substation=transmission] { color: #DC143C; fill-color: #DC143C; z-index:205; } area[power=substation][substation=distribution] { color: #008F11; fill-color: #008F11; z-index:201; } area[power=substation][substation=generation] { color: #ffb100; fill-color: #ffb100; z-index: 203; } area[power=substation][substation=industrial] { color: #0046aa; fill-color: #0046aa; z-index: 202; } /* Switchgears from zoom 15 */ area|z15-[power=switchgear] { text: voltage; text-halo-radius: 2; text-halo-opacity: 0.8; font-size: 15; font-weight: bold; text-position: center; z-index: 6; } /* Switchgears voltage-based styles */ area[power=switchgear][voltage<50000]{ set .voltage_lt50; } area[power=switchgear][voltage>=50000][voltage<132000]{ set .voltage_50-132; } area[power=switchgear][voltage>=132000][voltage<200000]{ set .voltage_132-200; } area[power=switchgear][voltage>=200000][voltage<310000]{ set .voltage_200-310; } area[power=switchgear][voltage>=310000][voltage<550000]{ set .voltage_310-550; } area[power=switchgear][voltage>=550000]{ set .voltage_gt550; } /* End of switchgears voltage-based styles */ /* Dynamic widths for industrial areas */ area|z0-15[landuse=industrial][!power] { color: darkorange; width: 0.5; dashes: 4,4; } area|z16-19[landuse=industrial][!power] { color: darkorange; width: 1; dashes: 4,4; } area|z20-[landuse=industrial][!power] { color: darkorange; width: 2; dashes: 4,4; } /* Power plants */ area[power=plant]{ color: #01FFFF; fill-color: #01FFFF; text-color: black; text-halo-color: white; text-halo-radius: 2; text-halo-opacity: 0.8; font-weight: bold; text-position: center; z-index: 6; major-z-index: 6; } area|z0-15[power=plant] { width: 0.5; fill-opacity: 0; } way|z16-19[power=plant] { width: 2; fill-opacity: 0.1; } way|z20-[power=plant] { width: 1; fill-opacity: 0.15; text: "name"; font-size: 20; } area|z12-13[power=plant] { text: "name"; font-size: 14; } area|z14-16[power=plant] { text: "name"; font-size: 16; } area|z17-19[power=plant] { text: "name"; font-size: 18; } /* Power generators */ area[power=generator]{ color: #ffd800; fill-color: #ffd800; text-color: black; text-halo-color: white; text-halo-radius: 2; text-halo-opacity: 0.8; font-weight: bold; text-position: center; z-index: 4; } area|z0-15[power=generator] { width: 0.5; fill-opacity: 0; } way|z16-18[power=generator] { width: 2; fill-opacity: 0.8; } way|z19-[power=generator] { width: 1; fill-opacity: 0.8; text: "name"; font-size: 20; } area|z12-13[power=generator] { text: "name"; font-size: 14; } area|z14-16[power=generator] { text: "name"; font-size: 16; } area|z17-19[power=generator] { text: "name"; font-size: 18; } /* Area fill settings */ area[setting("partial_fill")] { fill-extent: 15; } area|z-13[setting("partial_fill")] { fill-extent-threshold: 1.0; } area[setting("partial_fill")]:closed2 { fill-extent: 25; fill-extent-threshold: JOSM_pref("draw.area.extent_threshold", 0.5); } relation[boundary=administrative] > way::core_boundary, way[boundary=administrative]::core_boundary { z-index: 2; modifier: false; width: 1; color: #fb0379; dashes: 18,6,7,6; } way[boundary=administrative][admin_level=1]::core_boundary, relation[boundary=administrative][admin_level=1] > way::core_boundary, way[boundary=administrative][admin_level=2]::core_boundary, relation[boundary=administrative][admin_level=2] > way::core_boundary, way[boundary=administrative][admin_level=3]::core_boundary, relation[boundary=administrative][admin_level=3] > way::core_boundary, way[boundary=administrative][admin_level=4]::core_boundary, relation[boundary=administrative][admin_level=4] > way::core_boundary { width: 4; } /******************/ /* Line styling */ /******************/ way:new!:tagged { width: 6; z-index: 19; } way[/^(construction:|disused:|removed:)?power$/=~/line|minor_line|cable/]{ set .power_segment_all;} way[/^(construction:)?power$/=~/line|minor_line|cable/][!disused][!removed]{ set .power_segment_live;} way[power=~/line|minor_line|cable/]{ set .power_segment_current;} way["construction:power"=~/line|minor_line|cable/], way[power=~/line|minor_line|cable/][construction=yes]{ set .power_segment_construction;} way["disused:power"=~/line|minor_line|cable/], way[power=~/line|minor_line|cable/][disused=yes]{ set .power_segment_disused;} way["removed:power"=~/line|minor_line|cable/]{ set .power_segment_removed;} /* Zoom-dependent line widths */ way|z0-15.power_segment_all { width: 1; } way|z16-19.power_segment_all { width: 2; } way|z20-.power_segment_all { width: 3; } /* Zoom-dependent casing widths */ way|z0-19.power_segment_all[line=~/busbar|bay/] { casing-width: 0.5; } way|z20-22.power_segment_all[line=~/busbar|bay/] { casing-width: 1; } way|z23-.power_segment_all[line=~/busbar|bay/]{ casing-width: 2; } /* Multi-circuit line casing width by zoom */ way|z0-19.power_segment_current[cables>3], way|z0-19.power_segment_current[circuits>1] { left-casing-width: 1; right-casing-width: 1; } way|z20-22.power_segment_current[cables>3], way|z20-22.power_segment_current[circuits>1] { left-casing-width: 3; right-casing-width: 3; } way|z23-.power_segment_current[cables>3], way|z23-.power_segment_current[circuits>1] { left-casing-width: 5; right-casing-width: 5; } way.power_segment_current[cables>3], way.power_segment_current[circuits>1] { left-casing-dashes: 2,14; right-casing-dashes: 2,14; } way[power=minor_line][cables>3], way[power=minor_line][circuits>1] { left-casing-dashes: 2,10; right-casing-dashes: 2,10; } /* Basic power lines - visible at all zoom levels */ way.power_segment_all { color: power#eeeeee; fill-opacity: 0; } way[power=cable] { dashes: 2,2; } /* Power line special types */ way[line=busbar] { casing-color: #FFD800; } way[line=bay] { casing-color: lightgray; } /* Show voltage label for all segments at z18+ only */ way|z-18.power_segment_live { text: ; } way|z18-.power_segment_live { text: voltage; font-size: 10; font-weight: bold; text-allow-overlap: true; text-position: line; text-halo-radius: 2; } /* Power lines voltage-based styles */ way.power_segment_live[!voltage], way.power_segment_live[voltage=0] { set .voltage_no; } way.power_segment_live[to_int(get(split(";",tag(voltage)),0))<50000] { set .voltage_lt50; z-index: 21 } way.power_segment_live[(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))<50000] { set .voltage_2nd_lt50; } way.power_segment_live[to_int(get(split(";",tag(voltage)),0))>=50000][to_int(get(split(";",tag(voltage)),0))<132000] { set .voltage_50-132; z-index: 22 } way.power_segment_live[(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))>=50000][(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))<132000] { set .voltage_2nd_50-132; } way.power_segment_live[to_int(get(split(";",tag(voltage)),0))>=132000][to_int(get(split(";",tag(voltage)),0))<200000] { set .voltage_132-200; z-index: 23 } way.power_segment_live[(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))>=132000][(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))<200000] { set .voltage_2nd_132-200; } way.power_segment_live[to_int(get(split(";",tag(voltage)),0))>=200000][to_int(get(split(";",tag(voltage)),0))<310000] { set .voltage_200-310; z-index: 24 } way.power_segment_live[(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))>=200000][(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))<310000] { set .voltage_2nd_200-310; } way.power_segment_live[to_int(get(split(";",tag(voltage)),0))>=310000][to_int(get(split(";",tag(voltage)),0))<550000] { set .voltage_310-550; z-index: 25 } way.power_segment_live[(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))>=310000][(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))<550000] { set .voltage_2nd_310-550; } way.power_segment_live[to_int(get(split(";",tag(voltage)),0))>=550000] { set .voltage_gt550; z-index: 26 } way.power_segment_live[(count(split(";",tag(voltage)))>1 ? to_int(get(split(";",tag(voltage)),1)) : tag(voltage))>=550000] { set .voltage_2nd_gt550; } /* End of power lines voltage-based styles */ /* Proposed and construction power lines */ way.power_segment_construction { dashes: 8, 4; opacity: 0.8; } way|z14-.power_segment_construction { text: eval("construction"); font-size: 11; font-weight: bold; text-allow-overlap: true; text-opacity: 1; text-position: line; text-halo-radius: 2; } way|z15-.power_segment_construction[opening_date] { text: "opening_date"; text-halo-radius: 1; text-offset-y: 8; font-size: 8; } /* Disused and removed power lines */ way.power_segment_disused, way.power_segment_removed { width: 2; dashes: 10,6; color: #9A9A9A; } way|z14-.power_segment_disused, way.power_segment_removed { text: eval("disused"); text-color: #000000; font-size: 11; font-weight: bold; text-allow-overlap: true; text-opacity: 1; text-position: line; text-halo-radius: 2; } /* Bridge/Tunnel styling for power */ way.power_segment_all[bridge=yes]::bridge_power { major-z-index: 2; object-z-index: -1; width: +4; color: #0000FF; opacity: 0.9; } way.power_segment_all[tunnel=yes]::tunnel_power { major-z-index: 2; object-z-index: -1; width: +3; color: #964B00; opacity: 0.9; } /* Power circuits relations */ relation[power=line_section] > way { casing-width: 4; casing-opacity: 0.5; casing-color: #989898; casing-dashes: 16,9; } relation[power=circuit] > way { casing-width: 4; casing-opacity: 0.5; casing-color: #989898; casing-dashes: 0; } /* Osmose issue styling */ node[item=7040] { symbol-shape: triangle; symbol-fill-color: brown; symbol-size: 10; symbol-fill-opacity: 1.0; } node[item=7190] { symbol-shape: square; symbol-fill-color: #06470C; symbol-size: 10; symbol-fill-opacity: 1.0; } node[item=8270] { symbol-shape: rectangle; symbol-fill-color: #FF00FF; symbol-size: 10; symbol-fill-opacity: 1.0; } node[item=8280] { symbol-shape: square; symbol-fill-color: #0B6623; symbol-size: 10; symbol-fill-opacity: 1.0; } node[item=8282] { symbol-shape: square; symbol-fill-color: #008F11; symbol-size: 10; symbol-fill-opacity: 1.0; } node[item=9100] { symbol-shape: hexagon; symbol-fill-color: #FFFF00; symbol-size: 10; symbol-fill-opacity: 1.0; } /* GEM Per Country*/ node[Type] { symbol-shape: hexagon; symbol-fill-color:#800080; symbol-size: 12; symbol-fill-opacity: 1.0; } /* WIKIDATA Per Country*/ node[type] { symbol-shape: square; symbol-fill-color:#700070; symbol-size: 12; symbol-fill-opacity: 1.0; } node[reason] { symbol-shape: circle; symbol-size: 10; symbol-fill-color: red; color: black; width: 1; } /**************************/ /* Common colours classes */ /**************************/ /* Voltage-based classes with voltage labels for all lines/cables */ way.voltage_no, area.voltage_no { color: #FFFFFF; fill-color: #FFFFFF; text-color: #FFFFFF; left-casing-color: #FFFFFF; right-casing-color: #FFFFFF; text-halo-color: #000000; } way.voltage_lt50, area.voltage_lt50 { color: #7c7c7c; fill-color: #7c7c7c; text-color: #7c7c7c; text-halo-color: #FFFFFF; } way.voltage_2nd_lt50, area.voltage_2nd_lt50 { left-casing-color: #7c7c7c; right-casing-color: #7c7c7c; } way.voltage_50-132, area.voltage_50-132 { color: #deb887; fill-color: #deb887; text-color: #deb887; text-halo-color: #000000; } way.voltage_2nd_50-132, area.voltage_2nd_50-132 { left-casing-color: #deb887; right-casing-color: #deb887; } way.voltage_132-200, area.voltage_132-200 { color: #FF7F50; fill-color: #FF7F50; text-color: #FF7F50; text-halo-color: #FFFFFF; } way.voltage_2nd_132-200, area.voltage_2nd_132-200 { left-casing-color: #FF7F50; right-casing-color: #FF7F50; } way.voltage_200-310, area.voltage_200-310 { color: #cd5c5c; fill-color: #cd5c5c; text-color: #cd5c5c; text-halo-color: #FFFFFF; } way.voltage_2nd_200-310, area.voltage_2nd_200-310 { left-casing-color: #cd5c5c; right-casing-color: #cd5c5c; } way.voltage_310-550, area.voltage_310-550 { color: #9400D3; fill-color: #9400D3; text-color: #9400D3; text-halo-color: #FFFFFF; } way.voltage_2nd_310-550, area.voltage_2nd_310-550 { left-casing-color: #9400D3; right-casing-color: #9400D3; } way.voltage_gt550, area.voltage_gt550 { color: #00ced1; fill-color: #00ced1; text-color: #00ced1; text-halo-color: #000000; } way.voltage_2nd_gt550, area.voltage_2nd_gt550 { left-casing-color: #00ced1; right-casing-color: #00ced1; } /* End of voltage-based classes */