meta { title: "NL+DE traffic signs"; description: "Visualization of Dutch (and German) roadsigns."; author: "Sander H"; version: "0.5_2015-11-04"; license: "CC-BY-SA"; icon: "images/icon.png"; min-josm-version: "8260"; } meta[lang=nl] { title: "NL+DE verkeersborden"; description: "Visualisatie voor Nederlandse (en Duitse) verkeersborden"; } /* Create mappaint user settings. */ setting::rotate_based_on_direction { type: boolean; label: tr("Use the direction tag to rotate traffic signs on nodes"); default: true; } setting::way_show_icons { type: boolean; label: tr("Show icons on ways"); default: true; } /* display individual traffic_sign */ node[traffic_sign^="NL"]::* { /* Get rid of superfluous NL: */ list1: replace(replace(tag(traffic_sign),",NL:",","),";NL:",";"); /* Map "," to ';" and insert NL: */ sign_list: split(";", replace(replace(prop(list1),",",";"), ";",";NL:")); } node[traffic_sign^="NL"] { one_sign: get(prop("sign_list"),0); icon-image: eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/NL/", replace(prop("one_sign"),":", "_"), ".svg")); icon-width: 20; } node[traffic_sign^="NL"]::traffic_sign_layer1 { foo: prop("sign_list"); /* Why do we need this? */ one_sign: get(prop("sign_list"),1); icon-image: prop(one_sign) != none ? eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/NL/", replace(prop("one_sign"),":", "_"), ".svg")) : none; icon-width: 20; icon-offset-x: 0; icon-offset-y: 20; } node[traffic_sign^="NL"]::traffic_sign_layer2 { foo: prop("sign_list"); /* Why do we need this? */ one_sign: get(prop("sign_list"),2); icon-image: prop(one_sign) != none ? eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/NL/", replace(prop("one_sign"),":", "_"), ".svg")) : none; icon-width: 20; icon-offset-x: 0; icon-offset-y: 40; } node[traffic_sign^="DE"] { icon-image: eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/DE/", replace(tag(traffic_sign),":", "_"), ".svg")); icon-width: 20; } /* draw traffic_sign on way */ way[traffic_sign^="NL"][setting("way_show_icons")] { repeat-image: eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/NL/", replace(tag(traffic_sign),":", "_"), ".svg")); repeat-image-width: 16; repeat-image-spacing: 250; } way[traffic_sign^="DE"][setting("way_show_icons")] { repeat-image: eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/DE/", replace(tag(traffic_sign),":", "_"), ".svg")); repeat-image-width: 16; repeat-image-spacing: 250; } /* exception for traffic_sign G13/14 which are a bit wider */ node[traffic_sign=~/^NL:G13.*/][setting("way_show_icons")], node[traffic_sign=~/^NL:G14.*/][setting("way_show_icons")] { icon-width: 40; } /* also for ways, but direction of way may cause sign to be drawn upside down */ way[traffic_sign=~/^NL:G13.*/][setting("way_show_icons")], way[traffic_sign=~/^NL:G14.*/][setting("way_show_icons")] { repeat-image: eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/NL/", replace(tag(traffic_sign),":", "_"), ".svg")); repeat-image-width: 40; repeat-image-spacing: 250; } /* from HenkL: if direction is present, rotate icon */ node[traffic_sign^="NL"][direction][setting("rotate_based_on_direction")]::* { icon-rotation: eval(degree_to_radians(180 + (tag(direction) = "N" ? 0 : tag(direction) = "NE" ? 45 : tag(direction) = "E" ? 90 : tag(direction) = "SE" ? 135 : tag(direction) = "S" ? 180 : tag(direction) = "SW" ? 225 : tag(direction) = "W" ? 270 : tag(direction) = "NW" ? 315 : tag(direction)))); } node[traffic_sign^="NL"][traffic_sign:direction="backward"]::* { icon-rotation: degree_to_radians(180); } /* node[traffic_sign =~ /.*\(.*\)/] { /* _match: regexp_match("((?[a-zA-Z]+)(?:[:])(?[a-zA-Z]+)(?:[0]?)(?[0-9a-zA-Z-]+)(?:\()(?.*?)(?:\)))", tag("traffic_sign"));* / /* _match: regexp_match("((?[a-zA-Z]+)(?:[:])(?[a-zA-Z]+)(?:[0]?)(?[0-9a-zA-Z-]+)(?:\()(?.*?)(?:\)))", tag("traffic_sign"));* / _match: regexp_match("((?[a-zA-Z]+)(?:[:])(?[a-zA-Z]+)(?:[0]?)(?[0-9a-zA-Z-]+)(?:\()(?.*?)(?:\)))", tag("traffic_sign")); /*text: eval(concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/NL/", get(prop("_match"),1), get(prop("_match"),2), get(prop("_match"),3), get(prop("_match"),4), "<" ));* / } above didn't work, so using the below workaround from HenkL */ node[traffic_sign*="(U"] { _temp1: split("(U", tag(traffic_sign)); _temp2: get(prop(_temp1), 0); _temp3: replace(prop(_temp2), ":", "_"); _temp4: concat("http://duinoord.home.xs4all.nl/OSM/JOSM/NL_traffic_signs/traffic_signs/NL/", prop(_temp3), ".svg"); icon-image: eval(prop(_temp4)); } /* TODO */ /* render nodes with multiple traffic signs */