meta { title: "Dutch specific rules"; version: "2023.01.26"; description: "Rules for The Netherlands only (European part)."; author: "Famlam"; min-josm-version: "15317"; /* due to tag_regex() usage */ link: "https://github.com/Famlam/OsmMapcssValidationNL"; } /* github: https://github.com/Famlam/OsmMapcssValidationNL forum: https://forum.openstreetmap.org/viewtopic.php?id=74817 */ /* --------------------------- */ /* ------ Traffic signs ------ */ /* --------------------------- */ /* Traffic signs - moped/mofa access cycleways */ /* (Permitting yes rather than designated to prevent overflooding with errors) */ way[highway=cycleway][traffic_sign~="NL:G11"][moped][moped=~/^(yes|designated)$/], way[highway=cycleway][traffic_sign~="NL:G12a"][moped][moped=~/^(no|use_sidepath)$/], way[highway=cycleway][traffic_sign~="NL:G12a"][mofa][mofa=~/^(no|use_sidepath)$/], way[highway=cycleway][traffic_sign~="NL:G13"][moped][moped=~/^(yes|designated)$/], way[highway=cycleway][traffic_sign~="NL:G13"][mofa][mofa=~/^(yes|designated)$/], way[highway][traffic_sign~="NL:D103"][moped][moped=~/^(no|use_sidepath)$/][highway!=construction], way[highway][traffic_sign~="NL:D104"][moped][moped=~/^(no|use_sidepath)$/][highway!=construction] { group: tr("NL traffic signs"); throwWarning: tr("{0} together with {1}", "{1.tag}", "{2.tag}"); } way[highway][traffic_sign~="NL:D103"][!moped], way[highway][traffic_sign~="NL:D104"][!moped], way[highway=cycleway][traffic_sign~="NL:G12a"][!moped] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "moped=designated"); } /* note: mind the Amsterdam-case: snorfietsers op de weg */ way[highway=cycleway][traffic_sign~="NL:G11"][!mofa], way[highway=cycleway][traffic_sign~="NL:G12a"][!mofa] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "{2.key}"); } way[highway=cycleway][traffic_sign~="NL:G13"][!mofa][!motor_vehicle][!access] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "mofa=no"); } /* Traffic signs - bus/hgv access */ way[highway][traffic_sign~="NL:F13"][!bus][!psv][highway!=busway][highway!=bus_guideway], way[highway][traffic_sign~="NL:F17"][!bus][!psv][highway!=busway][highway!=bus_guideway], way[highway][traffic_sign~="NL:F19"][!bus][!psv][highway!=busway][highway!=bus_guideway], way[highway][traffic_sign~="NL:F19"][!hgv], way[highway][traffic_sign~="NL:F21"][!hgv] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "{2.key}=designated"); fixAdd: "{2.key}=designated"; } way[highway][traffic_sign~="NL:F13"][bus=no][highway!=construction], way[highway][traffic_sign~="NL:F17"][bus=no][highway!=construction], way[highway][traffic_sign~="NL:F19"][bus=no][highway!=construction], way[highway][traffic_sign~="NL:F13"][psv=no][!bus][highway!=construction], way[highway][traffic_sign~="NL:F17"][psv=no][!bus][highway!=construction], way[highway][traffic_sign~="NL:F19"][psv=no][!bus][highway!=construction], way[highway][traffic_sign~="NL:F19"][hgv=no][highway!=construction], way[highway][traffic_sign~="NL:F21"][hgv=no][highway!=construction] { group: tr("NL traffic signs"); throwWarning: tr("{0} together with {1}", "{1.tag}", "{2.tag}"); } /* Traffic sign - road types */ way[highway][traffic_sign~="NL:F13"][highway!=busway][highway!=service][highway!=bus_guideway][highway!=construction], way[highway][traffic_sign~="NL:G5"][highway!=living_street][highway!=construction][highway!=path][highway!=cycleway][highway!=pedestrian], way[highway][traffic_sign~="NL:G05"][highway!=living_street][highway!=construction][highway!=path][highway!=cycleway][highway!=pedestrian], way[highway][traffic_sign~="NL:G7"][highway!=footway][highway!=steps][highway!=pedestrian][highway!=construction], way[highway][traffic_sign~="NL:G07"][highway!=footway][highway!=steps][highway!=pedestrian][highway!=construction], way[highway][traffic_sign~="NL:G9"][highway!=bridleway][highway!=construction], way[highway][traffic_sign~="NL:G09"][highway!=bridleway][highway!=construction], way[highway][traffic_sign~="NL:G11"][highway!=cycleway][highway!=construction], way[highway][traffic_sign~="NL:G12a"][highway!=cycleway][highway!=construction], way[highway][traffic_sign~="NL:G13"][highway!=cycleway][highway!=construction] { group: tr("NL traffic signs"); throwWarning: tr("{0} together with {1}", "{1.tag}", "{0.tag}"); } way[highway][traffic_sign~="NL:L51"][!cyclestreet][highway!=construction] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "cyclestreet=yes"); } /* Traffic signs - access prohibited */ way[highway][traffic_sign~="NL:C1"][!vehicle][!/^(motor_)?vehicle(:forward|:backward|:both_ways)?(:conditional)?$/][!/^access(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C1"][!vehicle:forward][!/^(motor_)?vehicle(:forward|:both_ways)?(:conditional)?$/][!/^access(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C1"][!vehicle:backward][!/^(motor_)?vehicle(:backward|:both_ways)?(:conditional)?$/][!/^access(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway!=yes], way[highway][traffic_sign~="NL:C01"][!vehicle][!/^(motor_)?vehicle(:forward|:backward|:both_ways)?(:conditional)?$/][!/^access(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C01"][!vehicle:forward][!/^(motor_)?vehicle(:forward|:both_ways)?(:conditional)?$/][!/^access(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C01"][!vehicle:backward][!/^(motor_)?vehicle(:backward|:both_ways)?(:conditional)?$/][!/^access(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway!=yes], way[highway][traffic_sign~="NL:C6"][!motor_vehicle][!/^(motor_)?vehicle(:forward|:backward|:both_ways)?(:conditional)?$/][!/^access(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C6"][!motor_vehicle:forward][!/^(motor_)?vehicle(:forward|:both_ways)?(:conditional)?$/][!/^access(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C6"][!motor_vehicle:backward][!/^(motor_)?vehicle(:backward|:both_ways)?(:conditional)?$/][!/^access(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway!=yes][oneway:motor_vehicle!=yes], way[highway][traffic_sign~="NL:C06"][!motor_vehicle][!/^(motor_)?vehicle(:forward|:backward|:both_ways)?(:conditional)?$/][!/^access(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C06"][!motor_vehicle:forward][!/^(motor_)?vehicle(:forward|:both_ways)?(:conditional)?$/][!/^access(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C06"][!motor_vehicle:backward][!/^(motor_)?vehicle(:backward|:both_ways)?(:conditional)?$/][!/^access(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway!=yes][oneway:motor_vehicle!=yes], way[highway][traffic_sign~="NL:C7"][!hgv][!/^hgv(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C7"][!hgv:forward][!/^hgv(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C7"][!hgv:backward][!/^hgv(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:hgv!=yes], way[highway][traffic_sign~="NL:C07"][!hgv][!/^hgv(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C07"][!hgv:forward][!/^hgv(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C07"][!hgv:backward][!/^hgv(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:hgv!=yes], way[highway][traffic_sign~="NL:C9"][!bicycle][!/^bicycle(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C9"][!bicycle:forward][!/^bicycle(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C9"][!bicycle:backward][!/^bicycle(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:bicycle!=yes], way[highway][traffic_sign~="NL:C9"][!moped][!/^moped(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C9"][!moped:forward][!/^moped(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C9"][!moped:backward][!/^moped(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:moped!=yes], way[highway][traffic_sign~="NL:C09"][!bicycle][!/^bicycle(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C09"][!bicycle:forward][!/^bicycle(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C09"][!bicycle:backward][!/^bicycle(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:bicycle!=yes], way[highway][traffic_sign~="NL:C09"][!moped][!/^moped(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C09"][!moped:forward][!/^moped(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C09"][!moped:backward][!/^moped(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:moped!=yes], way[highway][traffic_sign~="NL:C10"][!trailer][!/^trailer(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C10"][!trailer:forward][!/^trailer(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C10"][!trailer:backward][!/^trailer(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:trailer!=yes], way[highway][traffic_sign~="NL:C11"][!motorcycle][!/^motorcycle(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C11"][!motorcycle:forward][!/^motorcycle(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C11"][!motorcycle:backward][!/^motorcycle(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:motorcycle!=yes], way[highway][traffic_sign~="NL:C12"][!motor_vehicle][!/^(motor_)?vehicle(:forward|:backward|:both_ways)?(:conditional)?$/][!/^access(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C12"][!motor_vehicle:forward][!/^(motor_)?vehicle(:forward|:both_ways)?(:conditional)?$/][!/^access(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C12"][!motor_vehicle:backward][!/^(motor_)?vehicle(:backward|:both_ways)?(:conditional)?$/][!/^access(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway!=yes][oneway:motor_vehicle!=yes], way[highway][traffic_sign~="NL:C13"][!moped][!/^moped(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C13"][!moped:forward][!/^moped(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C13"][!moped:backward][!/^moped(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:moped!=yes], way[highway][traffic_sign~="NL:C14"][!bicycle][!/^bicycle(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C14"][!bicycle:forward][!/^bicycle(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C14"][!bicycle:backward][!/^bicycle(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:bicycle!=yes], way[highway][traffic_sign~="NL:C15"][!bicycle][!/^bicycle(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C15"][!bicycle:forward][!/^bicycle(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C15"][!bicycle:backward][!/^bicycle(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:bicycle!=yes], way[highway][traffic_sign~="NL:C15"][!moped][!/^moped(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C15"][!moped:forward][!/^moped(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C15"][!moped:backward][!/^moped(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:moped!=yes], way[highway][traffic_sign~="NL:C16"][!foot][!/^foot(:forward|:backward|:both_ways)?(:conditional)?$/][!/^access(:forward|:backward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:forward~="NL:C16"][!foot:forward][!/^foot(:forward|:both_ways)?(:conditional)?$/][!/^access(:forward|:both_ways)?(:conditional)?$/][highway!=construction], way[highway][traffic_sign:backward~="NL:C16"][!foot:backward][!/^foot(:backward|:both_ways)?(:conditional)?$/][!/^access(:backward|:both_ways)?(:conditional)?$/][highway!=construction][oneway:foot!=yes] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "{2.key}=no/private/destination/..."); assertMatch: "way highway=service traffic_sign=\"NL:C01\""; assertMatch: "way highway=service traffic_sign:forward=\"NL:C9;NL:OB58\""; assertMatch: "way highway=service traffic_sign:forward=\"NL:C9;NL:OB58\" traffic_sign:backward=\"NL:C1\" access:backward=no"; assertNoMatch: "way highway=service traffic_sign=\"NL:C01;NL:C16\" access=no"; assertNoMatch: "way highway=service traffic_sign=\"NL:C01;NL:OB51;NL:OB54\" motor_vehicle=no"; assertNoMatch: "way highway=service traffic_sign:backward=\"NL:C07;NL:C16\" hgv=no foot=no"; assertNoMatch: "way highway=service traffic_sign:backward=\"NL:C07;NL:C16\" hgv:backward=no foot=no"; assertNoMatch: "way highway=track traffic_sign=\"NL:C12\" motor_vehicle=no"; assertNoMatch: "way highway=track traffic_sign:backward=\"NL:C12\" oneway=yes oneway:bicycle=no"; } /* Voertuiglimieten */ way[traffic_sign][traffic_sign=~/(^|;)NL:C17\b/][!maxlength][!/^maxlength(:forward|:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:forward][traffic_sign:forward=~/(^|;)NL:C17\b/][!maxlength:forward][!/^maxlength(:forward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:backward][traffic_sign:backward=~/(^|;)NL:C17\b/][!maxlength:backward][!/^maxlength(:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign][traffic_sign=~/(^|;)NL:C18\b/][!maxwidth][!/^maxwidth(:forward|:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:forward][traffic_sign:forward=~/(^|;)NL:C18\b/][!maxwidth:forward][!/^maxwidth(:forward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:backward][traffic_sign:backward=~/(^|;)NL:C18\b/][!maxwidth:backward][!/^maxwidth(:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign][traffic_sign=~/(^|;)NL:C19\b/][!maxheight][!/^maxheight(:forward|:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:forward][traffic_sign:forward=~/(^|;)NL:C19\b/][!maxheight:forward][!/^maxheight(:forward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:backward][traffic_sign:backward=~/(^|;)NL:C19\b/][!maxheight:backward][!/^maxheight(:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign][traffic_sign=~/(^|;)NL:C20\b/][!maxaxleload][!/^maxaxleload(:forward|:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:forward][traffic_sign:forward=~/(^|;)NL:C20\b/][!maxaxleload:forward][!/^maxaxleload(:forward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:backward][traffic_sign:backward=~/(^|;)NL:C20\b/][!maxaxleload:backward][!/^maxaxleload(:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign][traffic_sign=~/(^|;)NL:C21\b/][!maxweight][!/^maxweight(:forward|:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:forward][traffic_sign:forward=~/(^|;)NL:C21\b/][!maxweight:forward][!/^maxweight(:forward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:backward][traffic_sign:backward=~/(^|;)NL:C21\b/][!maxweight:backward][!/^maxweight(:backward|:both_ways)?(:conditional)?$/][highway] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{0.tag}", "{2.key}"); assertMatch: "way highway=residential traffic_sign=NL:C21[2.1]"; assertMatch: "way highway=residential traffic_sign:forward=NL:C21[2.1]"; assertNoMatch: "way highway=residential traffic_sign=NL:C21[2.1] maxweight=2.1"; assertNoMatch: "way highway=residential traffic_sign:backward=NL:C21[2.1] maxweight:backward=2.1"; } /* Eenrichtingsverkeer */ way[highway][traffic_sign~="NL:C2"][oneway!=yes][regexp_test("^(no|0)*$", join_list("", tag_regex("^oneway:")))][oneway!=-1][highway!=construction], way[highway][traffic_sign~="NL:C02"][oneway!=yes][regexp_test("^(no|0)*$", join_list("", tag_regex("^oneway:")))][oneway!=-1][highway!=construction], way[highway][traffic_sign~="NL:C3"][oneway!=yes][regexp_test("^(no|0)*$", join_list("", tag_regex("^oneway:")))][oneway!=-1][highway!=construction], way[highway][traffic_sign~="NL:C03"][oneway!=yes][regexp_test("^(no|0)*$", join_list("", tag_regex("^oneway:")))][oneway!=-1][highway!=construction], way[highway][traffic_sign:forward~="NL:C3"][oneway!=yes][regexp_test("^(no|-1|0)*$", join_list("", tag_regex("^oneway:")))][highway!=construction][traffic_sign:backward!~/\bNL:C0?2\b/], way[highway][traffic_sign:forward~="NL:C03"][oneway!=yes][regexp_test("^(no|-1|0)*$", join_list("", tag_regex("^oneway:")))][highway!=construction][traffic_sign:backward!~/\bNL:C0?2\b/], way[highway][traffic_sign:backward~="NL:C2"][oneway!=yes][regexp_test("^(no|-1|0)*$", join_list("", tag_regex("^oneway:")))][highway!=construction], way[highway][traffic_sign:backward~="NL:C02"][oneway!=yes][regexp_test("^(no|-1|0)*$", join_list("", tag_regex("^oneway:")))][highway!=construction] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "{2.tag}"); assertMatch: "way highway=residential traffic_sign=\"NL:C02\""; assertMatch: "way highway=residential traffic_sign=\"NL:C02\" oneway:bicycle=no oneway=no"; assertMatch: "way highway=residential traffic_sign:forward=\"NL:C3\""; assertMatch: "way highway=residential traffic_sign:forward=\"NL:C3\" oneway=-1"; assertMatch: "way highway=residential traffic_sign=\"NL:C3;NL:OB58\""; assertMatch: "way highway=residential traffic_sign:backward=\"NL:C02;NL:OB58\""; assertMatch: "way highway=residential traffic_sign:forward=\"NL:C3\" oneway:motor_vehicle=-1"; assertNoMatch: "way highway=residential traffic_sign=\"NL:C02;NL:OB58\" oneway=yes"; assertNoMatch: "way highway=residential traffic_sign=\"NL:C02;NL:OB58\" oneway=-1"; assertNoMatch: "way highway=residential traffic_sign=\"NL:C3\" oneway:motor_vehicle=yes"; assertNoMatch: "way highway=residential traffic_sign:forward=\"NL:C3\" oneway:motor_vehicle=yes"; assertNoMatch: "way highway=residential traffic_sign:forward=\"NL:C3\" oneway=yes"; assertNoMatch: "way highway=residential traffic_sign=\"NL:C3\" oneway:motor_vehicle=-1"; assertNoMatch: "way highway=residential traffic_sign:backward=\"NL:C2\" oneway=yes oneway:bicycle=no"; assertNoMatch: "way highway=residential traffic_sign:backward=\"NL:C2\" oneway:motor_vehicle=yes"; assertNoMatch: "way highway=residential traffic_sign=\"NL:C3\" oneway:agricultural=no oneway:motor_vehicle=yes oneway:motorcycle=no oneway=no"; } way[highway][traffic_sign~="NL:C5"][oneway?][highway!=construction], way[highway][traffic_sign~="NL:C05"][oneway?][highway!=construction] { group: tr("NL traffic signs"); throwWarning: tr("{0} together with {1}", "{1.tag}", "{2.tag}"); suggestAlternative: "oneway=no"; assertMatch: "way highway=residential traffic_sign=\"NL:C05\" oneway=yes"; assertNoMatch: "way highway=residential traffic_sign=\"NL:C5;NL:OB58\" oneway=no"; assertNoMatch: "way highway=residential traffic_sign=\"NL:C05\""; } /* Rotondes en verkeerspleinen met verplichte rijrichting */ way[highway][traffic_sign~="NL:D1"][junction!=roundabout][junction!=circular], way[highway][traffic_sign~="NL:D01"][junction!=roundabout][junction!=circular] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1} or {2}", "{1.tag}", "{2.tag}", "{3.tag}"); assertMatch: "way highway=residential traffic_sign=NL:D1 oneway=yes"; assertNoMatch: "way highway=residential traffic_sign=NL:D1 junction=circular"; assertNoMatch: "way highway=residential traffic_sign=NL:D1 junction=roundabout"; } way[highway][traffic_sign~="NL:D1"][junction=circular][oneway!~/^(yes|-?1)$/], way[highway][traffic_sign~="NL:D01"][junction=circular][oneway!~/^(yes|-?1)$/] { group: tr("NL traffic signs"); throwWarning: tr("{0} together with {1} but without {2}", "{2.tag}", "{1.tag}", "oneway=yes"); assertMatch: "way highway=residential traffic_sign=NL:D1 oneway=no junction=circular"; assertMatch: "way highway=residential traffic_sign=NL:D1 junction=circular"; assertNoMatch: "way highway=residential traffic_sign=NL:D1 junction=circular oneway=yes"; assertNoMatch: "way highway=residential traffic_sign=NL:D1 junction=circular oneway=-1"; } /* Voorrangsborden bij kruising */ way[highway] > node[traffic_sign~="NL:B7"][highway!=stop], way[highway] > node[traffic_sign~="NL:B07"][highway!=stop], way[highway] > node[traffic_sign~="NL:B6"][highway!=give_way], way[highway] > node[traffic_sign~="NL:B06"][highway!=give_way] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}"); fixAdd: "{1.tag}"; } /* Voorrangsweg */ way[traffic_sign="NL:B1"][!priority_road][!priority_road:forward][!priority_road:backward][!priority_road:both_ways][highway], way[traffic_sign="NL:B01"][!priority_road][!priority_road:forward][!priority_road:backward][!priority_road:both_ways][highway], way[traffic_sign:forward="NL:B1"][!priority_road][!priority_road:forward][!priority_road:both_ways][highway], way[traffic_sign:forward="NL:B01"][!priority_road][!priority_road:forward][!priority_road:both_ways][highway], way[traffic_sign:backward="NL:B1"][!priority_road][!priority_road:backward][!priority_road:both_ways][highway], way[traffic_sign:backward="NL:B01"][!priority_road][!priority_road:backward][!priority_road:both_ways][highway] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}"); suggestAlternative: "{0.key}=designated"; } /* Stop- of parkeerverboden */ /* Let op: kan gecombineerd zijn met parkeervakken waarbij in het vak wel geparkeerd mag worden */ way[parking:condition:both!=no_parking][traffic_sign~="NL:E01"][highway][parking:lane:both=no][parking:condition:right!=no_parking][parking:condition:left!=no_parking], way[parking:condition:both!=no_parking][traffic_sign~="NL:E01"][highway][parking:lane:left=no][parking:lane:right=no][parking:condition:right!=no_parking][parking:condition:left!=no_parking], way[parking:condition:both!=no_parking][traffic_sign~="NL:E1"][highway][parking:lane:both=no][parking:condition:right!=no_parking][parking:condition:left!=no_parking], way[parking:condition:both!=no_parking][traffic_sign~="NL:E1"][highway][parking:lane:left=no][parking:lane:right=no][parking:condition:right!=no_parking][parking:condition:left!=no_parking], way[parking:condition:right!=no_parking][traffic_sign:right~="NL:E01"][highway][parking:lane:both=no][parking:condition:both!=no_parking], way[parking:condition:right!=no_parking][traffic_sign:right~="NL:E01"][highway][parking:lane:right=no][parking:condition:both!=no_parking], way[parking:condition:right!=no_parking][traffic_sign:right~="NL:E1"][highway][parking:lane:both=no][parking:condition:both!=no_parking], way[parking:condition:right!=no_parking][traffic_sign:right~="NL:E1"][highway][parking:lane:right=no][parking:condition:both!=no_parking], way[parking:condition:left!=no_parking][traffic_sign:left~="NL:E01"][highway][parking:lane:both=no][parking:condition:both!=no_parking], way[parking:condition:left!=no_parking][traffic_sign:left~="NL:E01"][highway][parking:lane:left=no][parking:condition:both!=no_parking], way[parking:condition:left!=no_parking][traffic_sign:left~="NL:E1"][highway][parking:lane:both=no][parking:condition:both!=no_parking], way[parking:condition:left!=no_parking][traffic_sign:left~="NL:E1"][highway][parking:lane:left=no][parking:condition:both!=no_parking], way[parking:condition:both!=no_stopping][traffic_sign~="NL:E02"][highway][parking:lane:both=no][parking:condition:right!=no_stopping][parking:condition:left!=no_stopping], way[parking:condition:both!=no_stopping][traffic_sign~="NL:E02"][highway][parking:lane:left=no][parking:lane:right=no][parking:condition:right!=no_stopping][parking:condition:left!=no_stopping], way[parking:condition:both!=no_stopping][traffic_sign~="NL:E2"][highway][parking:lane:both=no][parking:condition:right!=no_stopping][parking:condition:left!=no_stopping], way[parking:condition:both!=no_stopping][traffic_sign~="NL:E2"][highway][parking:lane:left=no][parking:lane:right=no][parking:condition:right!=no_stopping][parking:condition:left!=no_stopping], way[parking:condition:right!=no_stopping][traffic_sign:right~="NL:E02"][highway][parking:lane:both=no][parking:condition:both!=no_stopping], way[parking:condition:right!=no_stopping][traffic_sign:right~="NL:E02"][highway][parking:lane:right=no][parking:condition:both!=no_stopping], way[parking:condition:right!=no_stopping][traffic_sign:right~="NL:E2"][highway][parking:lane:both=no][parking:condition:both!=no_stopping], way[parking:condition:right!=no_stopping][traffic_sign:right~="NL:E2"][highway][parking:lane:right=no][parking:condition:both!=no_stopping], way[parking:condition:left!=no_stopping][traffic_sign:left~="NL:E02"][highway][parking:lane:both=no][parking:condition:both!=no_stopping], way[parking:condition:left!=no_stopping][traffic_sign:left~="NL:E02"][highway][parking:lane:left=no][parking:condition:both!=no_stopping], way[parking:condition:left!=no_stopping][traffic_sign:left~="NL:E2"][highway][parking:lane:both=no][parking:condition:both!=no_stopping], way[parking:condition:left!=no_stopping][traffic_sign:left~="NL:E2"][highway][parking:lane:left=no][parking:condition:both!=no_stopping], /* Above: old syntax, below: new syntax */ way[parking:both:restriction!=no_parking][traffic_sign~="NL:E01"][highway][parking:both=no][parking:right:restriction!=no_parking][parking:left:restriction!=no_parking], way[parking:both:restriction!=no_parking][traffic_sign~="NL:E01"][highway][parking:left=no][parking:lane:right=no][parking:right:restriction!=no_parking][parking:left:restriction!=no_parking], way[parking:both:restriction!=no_parking][traffic_sign~="NL:E1"][highway][parking:both=no][parking:right:restriction!=no_parking][parking:left:restriction!=no_parking], way[parking:both:restriction!=no_parking][traffic_sign~="NL:E1"][highway][parking:left=no][parking:lane:right=no][parking:right:restriction!=no_parking][parking:left:restriction!=no_parking], way[parking:right:restriction!=no_parking][traffic_sign:right~="NL:E01"][highway][parking:both=no][parking:both:restriction!=no_parking], way[parking:right:restriction!=no_parking][traffic_sign:right~="NL:E01"][highway][parking:right=no][parking:both:restriction!=no_parking], way[parking:right:restriction!=no_parking][traffic_sign:right~="NL:E1"][highway][parking:both=no][parking:both:restriction!=no_parking], way[parking:right:restriction!=no_parking][traffic_sign:right~="NL:E1"][highway][parking:right=no][parking:both:restriction!=no_parking], way[parking:left:restriction!=no_parking][traffic_sign:left~="NL:E01"][highway][parking:both=no][parking:both:restriction!=no_parking], way[parking:left:restriction!=no_parking][traffic_sign:left~="NL:E01"][highway][parking:left=no][parking:both:restriction!=no_parking], way[parking:left:restriction!=no_parking][traffic_sign:left~="NL:E1"][highway][parking:both=no][parking:both:restriction!=no_parking], way[parking:left:restriction!=no_parking][traffic_sign:left~="NL:E1"][highway][parking:left=no][parking:both:restriction!=no_parking], way[parking:both:restriction!=no_stopping][traffic_sign~="NL:E02"][highway][parking:both=no][parking:right:restriction!=no_stopping][parking:left:restriction!=no_stopping], way[parking:both:restriction!=no_stopping][traffic_sign~="NL:E02"][highway][parking:left=no][parking:right=no][parking:right:restriction!=no_stopping][parking:left:restriction!=no_stopping], way[parking:both:restriction!=no_stopping][traffic_sign~="NL:E2"][highway][parking:both=no][parking:right:restriction!=no_stopping][parking:left:restriction!=no_stopping], way[parking:both:restriction!=no_stopping][traffic_sign~="NL:E2"][highway][parking:left=no][parking:right=no][parking:right:restriction!=no_stopping][parking:left:restriction!=no_stopping], way[parking:right:restriction!=no_stopping][traffic_sign:right~="NL:E02"][highway][parking:both=no][parking:both:restriction!=no_stopping], way[parking:right:restriction!=no_stopping][traffic_sign:right~="NL:E02"][highway][parking:right=no][parking:both:restriction!=no_stopping], way[parking:right:restriction!=no_stopping][traffic_sign:right~="NL:E2"][highway][parking:both=no][parking:both:restriction!=no_stopping], way[parking:right:restriction!=no_stopping][traffic_sign:right~="NL:E2"][highway][parking:right=no][parking:both:restriction!=no_stopping], way[parking:left:restriction!=no_stopping][traffic_sign:left~="NL:E02"][highway][parking:both=no][parking:both:restriction!=no_stopping], way[parking:left:restriction!=no_stopping][traffic_sign:left~="NL:E02"][highway][parking:left=no][parking:both:restriction!=no_stopping], way[parking:left:restriction!=no_stopping][traffic_sign:left~="NL:E2"][highway][parking:both=no][parking:both:restriction!=no_stopping], way[parking:left:restriction!=no_stopping][traffic_sign:left~="NL:E2"][highway][parking:left=no][parking:both:restriction!=no_stopping] { group: tr("NL traffic signs"); throwWarning: tr("{0} without {1}", "{1.tag}", "{0.tag}"); fixAdd: "{0.tag}"; assertMatch: "way highway=residential traffic_sign:left=NL:E02 parking:lane:left=no"; assertMatch: "way highway=residential traffic_sign:left=NL:E02 parking:lane:both=no"; assertNoMatch: "way highway=residential traffic_sign:left=NL:E02 parking:lane:left=parallel"; assertNoMatch: "way highway=residential traffic_sign:left=NL:E02 traffic_sign:right=NL:E02 parking:lane:both=no parking:condition:both=no_stopping"; /* Above: old syntax, below: new syntax */ assertMatch: "way highway=residential traffic_sign:left=NL:E02 parking:left=no"; assertMatch: "way highway=residential traffic_sign:left=NL:E02 parking:both=no"; assertNoMatch: "way highway=residential traffic_sign:left=NL:E02 parking:left=parallel"; assertNoMatch: "way highway=residential traffic_sign:left=NL:E02 traffic_sign:right=NL:E02 parking:both=no parking:both:restriction=no_stopping"; assertNoMatch: "way highway=residential traffic_sign=NL:E01 parking:both=no parking:left:restriction=no_parking parking:right:restriction=no_parking"; } /* Traffic signs not following the default syntax with uppercase NL and first letters of sign */ *[traffic_sign][traffic_sign=~/(?i)\bNL:\w+\d+/][traffic_sign!~/\bNL:[A-Z]+\d+/], *[traffic_sign:forward][traffic_sign:forward=~/(?i)\bNL:\w+\d+/][traffic_sign:forward!~/\bNL:[A-Z]+\d+/], *[traffic_sign:backward][traffic_sign:backward=~/(?i)\bNL:\w+\d+/][traffic_sign:backward!~/\bNL:[A-Z]+\d+/] { throwOther: tr("{0} zonder hoofdletters waar gangbaar", "{0.tag}"); group: tr("NL traffic signs"); assertMatch: "way traffic_sign=\"nl:C1\""; assertMatch: "way traffic_sign=\"NL:g12a\""; assertNoMatch: "way traffic_sign=\"NL:C1\""; assertNoMatch: "way traffic_sign=\"NL:G12a\""; assertNoMatch: "way traffic_sign=city_limit"; } /* ---------------------------- */ /* -- Addresses and contacts -- */ /* ---------------------------- */ /* Phone numbers - preceding zeros */ node[contact:phone=~/^(00|\+)31 ?0[0-9]{8,}/], node[contact:mobile=~/^(00|\+)31 ?0[0-9]{8,}/], node[phone=~/^(00|\+)31 ?0[0-9]{8,}/] { throwWarning: tr("Invalid tag {0}: country code should not be followed by a 0", "{0.key}"); group: tr("NL addresses and contacts"); assertMatch: "node phone=\"+31 06123456789\""; assertMatch: "node phone=\"003106123456789\""; assertNoMatch: "node phone=\"00316123456789\""; assertNoMatch: "node phone=\"+31 6123456789\""; assertNoMatch: "node phone=\"06123456789\""; assertNoMatch: "node phone=\"+31 08008844\""; /* different test */ set .badPhoneNumber; } /* Phone numbers - internationalized national/local numbers */ node[contact:phone=~/^(\+|00)31 ?0?[0-9]{3,7}$/], node[contact:mobile=~/^(\+|00)31 ?0?[0-9]{3,7}$/], node[phone=~/^(\+|00)31 ?0?[0-9]{3,7}$/] { throwWarning: tr("Invalid tag {0}: short phone numbers cannot be used with international prefix (or: wrong phone number length)", "{0.key}"); group: tr("NL addresses and contacts"); assertMatch: "node phone=\"+318008844\""; assertMatch: "node phone=\"+31 08008844\""; assertMatch: "node phone=\"+3114024\""; assertMatch: "node phone=\"00318008844\""; assertNoMatch: "node phone=\"00316123456789\""; assertNoMatch: "node phone=\"+31 6123456789\""; assertNoMatch: "node phone=\"06123456789\""; assertNoMatch: "node phone=\"08008844\""; assertNoMatch: "node phone=\"14024\""; set .badPhoneNumber; } /* Phone numbers - too many digits */ node[contact:phone=~/^(0031|\+31|0) ?[1-9]( ?[0-9]){10}/][inside("NL")]!.badPhoneNumber, node[contact:mobile=~/^(0031|\+31|0) ?[1-9]( ?[0-9]){10}/][inside("NL")]!.badPhoneNumber, node[phone=~/^(0031|\+31|0) ?[1-9]( ?[0-9]){10}/][inside("NL")]!.badPhoneNumber { throwWarning: tr("Invalid tag {0}: too many digits (or foreign number, if so: ignore)", "{0.key}"); group: tr("NL addresses and contacts"); assertNoMatch: "node phone=\"0031612345678\""; assertNoMatch: "node phone=\"+31 6 12345678\""; assertNoMatch: "node phone=\"06 12345678\""; assertNoMatch: "node phone=\"0800 1234567\""; /* Lang infonr, 11 cijfers */ } /* address tags on building */ relation[type=multipolygon][building][/^addr:/][amenity!=place_of_worship][building!~/houseboat|static_caravan/][inside("NL")], way[building][/^addr:/][amenity!=place_of_worship][building!~/houseboat|static_caravan/][inside("NL")]:closed { throwWarning: tr("In Nederland is het gebouw niet gekoppeld aan het adres. Het adres is wel gekoppeld aan het gebruiksdoel."); group: tr("NL addresses and contacts"); } /* Postcodes using invalid format */ node["addr:postcode"]["addr:postcode"!~/[0-9]{4} ?[A-Z]{2}/][inside("NL")] { throwWarning: tr("Invalid tag {0}: expected 4 digits followed by 2 letters", "{0.tag}"); group: tr("NL addresses and contacts"); } /* --------------------------- */ /* -- Foreign style tagging -- */ /* --------------------------- */ /* Unwanted German style cycleway and footway tagging */ /* https://forum.openstreetmap.org/viewtopic.php?id=65612 */ way[cycleway:surface][surface][highway=cycleway][surface=*"cycleway:surface"][inside("NL")], way[footway:surface][surface][highway=footway][surface=*"footway:surface"][inside("NL")] { throwWarning: tr("{0} together with {1} and {2}. Remove {0}.", "{0.key}", "{1.key}", "{2.tag}"); group: tr("NL German style tagging"); fixRemove: "{0.key}"; } way[cycleway:surface][surface][highway=cycleway][surface!=*"cycleway:surface"][inside("NL")], way[footway:surface][surface][highway=footway][surface!=*"footway:surface"][inside("NL")] { throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.tag}"); group: tr("NL German style tagging"); } way[cycleway:surface][highway=cycleway][!surface][inside("NL")], way[footway:surface][highway=footway][!surface][inside("NL")] { throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}"); group: tr("NL German style tagging"); suggestAlternative: "surface=*"; fixChangeKey: "{0.key}=>surface"; } way[footway:surface][cycleway:surface][segregated=no][highway][footway:surface!=*"cycleway:surface"][inside("NL")] { throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.tag}"); group: tr("NL German style tagging"); } way[/^footway(:left|:right|:both)?:/][/^sidewalk:(left|right|both)$/][/^sidewalk:(left|right|both)$/=~/^yes$/][inside("NL")], way[/^footway(:left|:right|:both)?:/][sidewalk][sidewalk=~/^(left|right|both|yes)$/][inside("NL")] { throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}"); group: tr("NL German style tagging"); suggestAlternative: "sidewalk:*"; } /* -------------------------------- */ /* -- Tags considered deprecated -- */ /* -------------------------------- */ /* cycleway=opposite */ /* https://forum.openstreetmap.org/viewtopic.php?id=65612 */ way[cycleway=opposite][inside("NL")], way[cycleway:left=opposite][inside("NL")], way[cycleway:right=opposite][inside("NL")], way[cycleway:both=opposite][inside("NL")] { throwWarning: tr("{0} is deprecated", "{0.value}"); group: tr("NL deprecated features"); suggestAlternative: "oneway:bicycle/mofa/moped=no"; } way[cycleway][cycleway^=opposite_][inside("NL")], way[cycleway:left][cycleway:left^=opposite_][inside("NL")], way[cycleway:right][cycleway:right^=opposite_][inside("NL")], way[cycleway:both][cycleway:both^=opposite_][inside("NL")] { throwWarning: tr("{0} is deprecated", "{0.value}"); group: tr("NL deprecated features"); suggestAlternative: "oneway:bicycle/mofa/moped=no + {0.key}=*[zonder opposite_]"; } /* sidewalk=none */ /* https://forum.openstreetmap.org/viewtopic.php?id=58656 */ way[sidewalk=none][inside("NL")] { throwWarning: tr("{0} is deprecated", "{0.tag}"); group: tr("NL deprecated features"); suggestAlternative: "sidewalk=no"; fixAdd: "{0.key}=no"; } /* associatedStreet */ /* https://forum.openstreetmap.org/viewtopic.php?id=70631 */ relation[type=associatedStreet][inside("NL")] { throwWarning: tr("{0} is deprecated", "{0.tag}"); group: tr("NL deprecated features"); suggestAlternative: "type=street"; suggestAlternative: "geen relatie"; } /* postal_code */ /* https://forum.openstreetmap.org/viewtopic.php?id=73675 */ way[postal_code][inside("NL")] { throwWarning: tr("{0} is deprecated", "{0.tag}"); group: tr("NL deprecated features"); suggestAlternative: "addr:postcode via BAG imports on addresses"; } /* building=terrace instead of multiple building=house (or leisure=outdoor_seating) */ /* https://forum.openstreetmap.org/viewtopic.php?id=74992 */ way[building=terrace][inside("NL")] { throwWarning: tr("Rijtjeshuizen ({0}) worden in Nederland individueel geïmporteerd uit de BAG", "{0.tag}"); group: tr("NL deprecated features"); suggestAlternative: "building=house via een BAG importverzoek voor huizen"; suggestAlternative: "leisure=outdoor_seating voor 'terrasjes'"; } /* addr:interpolation instead of multiple separate addresses */ *[addr:interpolation][inside("NL")] { throwWarning: tr("Adressen ({0}) worden in Nederland individueel geïmporteerd uit de BAG", "{0.key}"); group: tr("NL deprecated features"); suggestAlternative: "meerdere addr:housenumber via een BAG importverzoek"; } /* is_in */ /* https://forum.openstreetmap.org/viewtopic.php?id=73675 */ *[is_in=NL], *[is_in:country][inside("NL")], *[is_in:city][inside("NL")], *[is_in:province][inside("NL")], *[is_in:continent][inside("NL")], *[is_in:country_code=NL] { throwWarning: tr("{0} is deprecated", "{0.tag}"); group: tr("NL deprecated features"); fixRemove: "{0.key}"; } /* ov-chipkaart spelling */ /* https://forum.openstreetmap.org/viewtopic.php?pid=863615 */ node[/payment:O[vV][-_]?[cC]hipkaart/] { throwWarning: tr("{0} is deprecated", "{0.tag}"); group: tr("NL deprecated features"); suggestAlternative: "payment:ov-chipkaart"; fixChangeKey: "{0.key}=>payment:ov-chipkaart"; } /* Niet los ingetekende sporen */ /* https://forum.openstreetmap.org/viewtopic.php?id=55768 */ /* https://wiki.openstreetmap.org/wiki/OpenRailwayMap/Tagging_in_Netherlands */ way[railway][tracks][tracks!=1][inside("NL")] { throwWarning: tr("Railway lines should be drawn as separate ways per track, rather than one way with {0}", "{1.tag}"); group: tr("NL deprecated features"); suggestAlternative: "passenger_lines=* if the tracks are already drawn separately"; } /* Gebouwnaam op los ingetekende gebouwen (of building:part) is gewoon de naam */ /* https://forum.openstreetmap.org/viewtopic.php?id=71738 */ way[addr:housename][/^building(:part)?$/][inside("NL")], way[building:name][/^building(:part)?$/][inside("NL")] { throwWarning: tr("{0} is deprecated", "{0.key}"); group: tr("NL deprecated features"); suggestAlternative: "name=*"; } /* landuse=education op het grondgebruik rondom scholen e.d. */ /* Voorbereiding voor deprecated amenity=* verwijderen */ /* https://forum.openstreetmap.org/viewtopic.php?id=72837 */ way[amenity=college][landuse!=education][!building][inside("NL")]:closed, way[amenity=university][landuse!=education][!building][inside("NL")]:closed, way[amenity=kindergarten][landuse!=education][!building][inside("NL")]:closed, way[amenity=school][landuse!=education][!building][inside("NL")]:closed { throwOther: tr("{0} without {1}", "{0.tag}", "{1.tag}"); group: tr("NL deprecated features"); fixAdd: "landuse=education"; } /* Currently no active covid restrictions */ *[delivery:covid19][inside("NL")], *[takeaway:covid19][inside("NL")], *[opening_hours:covid19][inside("NL")] { throwWarning: tr("There are no active covid-19 restrictions at the moment. Remove {0}.", "{0.key}"); group: tr("NL deprecated features"); fixRemove: "{0.key}"; } /* bicycle_road doesn't exist in NL */ way[bicycle_road?][inside("NL")] { throwWarning: tr("Het concept {0} bestaat niet in Nederland", "{0.key}"); group: tr("NL deprecated features"); suggestAlternative: "highway=* + cyclestreet=yes (fietsstraat)"; suggestAlternative: "highway=cycleway (fietspad)"; suggestAlternative: "highway=* + cycleway=* (fietsstrook)"; } /* --------------------------- */ /* ---------- Names ---------- */ /* --------------------------- */ /* Descriptive (Dutch) names */ way[name][highway=service][name=~/(?i)(parkeren$|parkeerplaats$|^toegang(sweg)?\s|^richting\s|drive.thro?u(gh)?)/], way[name][highway][name=~/(?i)(^|\sen\s)((on)?verplicht\s)?(\(?brom\)?)?fietspad$/], way[name][highway][name=~/(?i)^roltrap(pen)?$/], way[name][highway][name=~/(?i)(rolstoel|invaliden)/], way[name][highway][name=~/(?i)(uit?laa[dt]|honden.*wandel|los.?loop)/], way[name][highway][name=~/(?i)bus\s?(baan|strook)/][highway!=busway][highway!=service][highway!=construction], way[name][highway][name=~/\bbouwweg/], node[name][highway][name=~/(?i)^(lift)$/], node[name][amenity=drinking_water][name=~/(?i)(drinkwater|\swater|kraan)/], node[name][amenity=charging_station][name=~/(?i)(oplaad|laadpunt|laadpaal)/], *[name][amenity^=parking][name=~/(?i)(parkeren|parkeerplaats|parkeergarage|^garage)$/], *[name][name=~/(?i)^gratis\s|gratis\)/], *[name][name=~/(?i)(klanten|bezoek(ers)?|medewerkers)\b/][!route], *[name][leisure=playground][name=~/(?i)^speeltuin$/], *[name][leisure^=dog][name=~/(?i)^(honden\s?)?(toilet|uitlaa[dt]|los.?loop)/], *[name][leisure=pitch][name=~/(?i)ball?(veld(je)?)?$/][!sport] { throwWarning: tr("descriptive name"); group: tr("NL nomenclature"); assertNoMatch: "way highway=unclassified name=Landbouwweg"; } *[name][name=~/(?i)(voormalige?)/][!historic][tourism!=information][!landuse][!highway][!boundary][!waterway] { throwWarning: tr("descriptive name"); group: tr("NL nomenclature"); suggestAlternative: "old_name=*"; suggestAlternative: "description=*"; suggestAlternative: "disused=yes"; } /* Street-, area or railway names with abbreviations */ way[name][highway][name=~/\b(Adm|Burg|Dr|Drs|Ds|Gen|Ing|Ir|Mgr|Mr|Past|Prof|St|Weth)\.? [A-Za-z]/][inside("NL")]!.abbrname, way[name][highway][name=~/^[A-Z][a-z]{1,4}\. /][inside("NL")]!.abbrname { throwWarning: tr("Straatnaam met afkorting"); group: tr("NL nomenclature"); assertNoMatch: "way highway=residential name=\"De Visserstraat\""; assertNoMatch: "way highway=residential name=\"J.T. de Visserstraat\""; assertNoMatch: "node highway=residential name=\"Pieter Cornelisz. Hooftstraat\""; set .abbrname; } *[name][place][name=~/\b(Adm|Burg|Dr|Drs|Ds|Gen|Ing|Ir|Mgr|Mr|Past|Prof|St|Weth)\.? [A-Za-z]/][inside("NL")]!.abbrname, *[name][place][name=~/^[A-Z][a-z]{1,4}\. /][inside("NL")]!.abbrname { throwWarning: tr("Gebiedsnaam met afkorting"); group: tr("NL nomenclature"); set .abbrname; } *[railway][name][name=~/(?i)(aansl|empl|goed|ind|inhaalsp|opstel|overloopw|racc|rang|terr)\./][inside("NL")]!.abbrname, *[railway][name][name=~/(?i)\b(aansl|empl|goed|ind|inhaalsp|opstel|overloopw|racc|rang|terr)\b/][inside("NL")]!.abbrname { throwWarning: tr("Spoorgebied met afgekorte naam"); group: tr("NL nomenclature"); suggestAlternative: "aansluiting, emplacement, goederen, industrieterrein, inhaalspoor, opstelterrein, overloopwissel, raccordement of rangeerterrein"; assertNoMatch: "node railway=tram_stop name=Landgoed"; set .abbrname; } /* Nederlandse naam zonder name */ *[name:nl][!name][inside("NL")][type!=route][name:fy]["name:fy"=*"name:nl"], *[name:nl][!name][inside("NL")][type!=route][!name:fy] { throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}"); group: tr("NL nomenclature"); suggestAlternative: "name"; fixChangeKey: "{0.key}=>{1.key}"; assertNoMatch: "node name=x name:nl=x name:en=y"; assertNoMatch: "node name:nl=x name:fy=y"; } /* Regelmatig foutgespelde namen met minimaal 2500 objecten verspreid over heel NL */ node[operator][operator!=PostNL][operator=~/(?i)post\W?nl$/][amenity=post_box] { throwWarning: tr("Suspected typo in {0}", "{0.tag}"); group: tr("NL nomenclature"); assertNoMatch: "node amenity=post_box operator=PostNL"; assertMatch: "node amenity=post_box operator=postnl"; assertMatch: "node amenity=post_box operator=\"post nl\""; suggestAlternative: "operator=PostNL"; fixAdd: "operator=PostNL"; } /* --------------------------- */ /* --------- Erfgoed --------- */ /* --------------------------- */ *[heritage=1][heritage:operator!=whc], *[heritage=2][heritage:operator!=rce][inside("NL")] { throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}"); group: tr("NL heritage"); fixAdd: "{1.tag}"; } *[ref:rce][!heritage:operator] { throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}=*"); group: tr("NL heritage"); fixAdd: "heritage:operator=rce"; } *[heritage:operator=rce][!heritage] { throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}=*"); group: tr("NL heritage"); fixAdd: "heritage=2"; } /* ----------------------------- */ /* ------ Route relations ------ */ /* ----------------------------- */ /* Public transport routes should be in a route_master relation; busses also in a consession network relation */ relation[route_master] > relation[route] { set .hasRouteMaster; } relation[network] > relation[route_master] { set .hasNetworkRelation; } relation[route][route=~/^((trolley)?bus|light_rail|subway|train|tram)$/][inside("NL")]!.hasRouteMaster:new { throwWarning: tr("{0} not in route_master relation", "{0.tag}"); group: tr("NL routes"); } relation[route_master][route_master=~/^(trolley)?bus$/][inside("NL")]!.hasNetworkRelation:new { throwWarning: tr("{0} not in network relation", "{0.tag}"); group: tr("NL routes"); } /* --------------------------- */ /* ----- Maximumsnelheid ----- */ /* --------------------------- */ /* Maximum speeds per road defaults and signage */ way[highway=living_street][maxspeed!=15][!/^maxspeed(:forward|:backward|:both_ways)?$/][inside("NL")], way[maxspeed:type="NL:zone30"][maxspeed!=30][maxspeed:both_ways!=30][highway], way[maxspeed:type="NL:zone60"][maxspeed!=60][maxspeed:both_ways!=60][highway], way[maxspeed:type="NL:urban"][maxspeed!=50][maxspeed:both_ways!=50][highway], way[maxspeed:type="NL:rural"][maxspeed!=80][maxspeed:both_ways!=80][highway]{ throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}"); group: tr("NL speed limits"); } way[maxspeed:type][!maxspeed][maxspeed:type^="NL:zone"][!maxspeed:both_ways][maxspeed:type!~/^NL:zone[36]0$/][highway], way[traffic_sign][!maxspeed][traffic_sign=~/(^|;)NL:A0?1-/][!/^maxspeed(:forward|:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:forward][!maxspeed:forward][traffic_sign:forward=~/(^|;)NL:A0?1-/][!/^maxspeed(:forward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:backward][!maxspeed:backward][traffic_sign:backward=~/(^|;)NL:A0?1-/][!/^maxspeed(:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign][!maxspeed:advisory][traffic_sign=~/(^|;)NL:A0?4\b/][!/^maxspeed:advisory(:forward|:backward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:forward][!maxspeed:advisory:forward][traffic_sign:forward=~/(^|;)NL:A0?4\b/][!/^maxspeed:advisory(:forward|:both_ways)?(:conditional)?$/][highway], way[traffic_sign:backward][!maxspeed:advisory:backward][traffic_sign:backward=~/(^|;)NL:A0?4\b/][!/^maxspeed:advisory(:backward|:both_ways)?(:conditional)?$/][highway] { throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}"); group: tr("NL speed limits"); assertMatch: "way highway=residential traffic_sign=NL:A01-30"; assertMatch: "way highway=residential traffic_sign:forward=NL:A1-30"; assertMatch: "way highway=residential traffic_sign=NL:A04-30"; assertMatch: "way highway=residential traffic_sign=NL:A4"; assertMatch: "way highway=residential traffic_sign=NL:A4[60]"; assertNoMatch: "way highway=residential traffic_sign:forward=NL:A1-30 maxspeed:forward=30"; assertNoMatch: "way highway=residential traffic_sign=NL:A01-30 maxspeed=30"; assertNoMatch: "way highway=residential traffic_sign=NL:A4[50] maxspeed:advisory:both_ways=50"; } /* The majority voted to use maxspeed=100 as the default, and maxspeed:conditional=* for the night-time speed on autosnelwegen */ /* https://forum.openstreetmap.org/viewtopic.php?id=68803 */ way[highway=motorway][maxspeed][maxspeed=~/^1[23]0$/][maxspeed:conditional=~/100.+19:00/][inside("NL")] { throwWarning: tr("Agreed upon was to use 100 as the maximum speed and {0} as the conditional maximum speed", "{1.value}"); group: tr("NL speed limits"); } /* Speed restrictions imposed by RVV art. 21 */ way[highway=motorway][maxspeed][maxspeed>130][inside("NL")], way[highway=motorway_link][maxspeed][maxspeed>130][inside("NL")], way[highway=trunk][maxspeed][maxspeed>100][inside("NL")], way[highway=trunk_link][maxspeed][maxspeed>100][inside("NL")], way[motorroad=yes][maxspeed][maxspeed>100][inside("NL")][highway!~/^(motorway(_link)?|construction|proposed)$/], way[highway][maxspeed][maxspeed>80][highway!~/^(motorway(_link)?|trunk(_link)?|cycleway|service|busway|construction|proposed|raceway)$/][motorroad!=yes][inside("NL")], way[highway=cycleway][maxspeed][maxspeed>40][!motor_vehicle][!vehicle][!access][inside("NL")] { throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}"); group: tr("NL speed limits"); assertNoMatch: "way highway=motorway maxspeed=120"; assertNoMatch: "way highway=motorway_link motorroad=yes maxspeed=130"; assertNoMatch: "way highway=trunk_link maxspeed=100"; assertNoMatch: "way highway=tertiary motorroad=yes maxspeed=100"; assertNoMatch: "way highway=trunk maxspeed=90"; assertNoMatch: "way highway=unclassified maxspeed=80"; } /* Speed restrictions imposed by RVV art. 22 */ way[maxspeed:mofa][maxspeed:mofa>25][inside("NL")], way[maxspeed:moped][maxspeed:moped>45][inside("NL")], way[maxspeed:bus][maxspeed:bus>100][inside("NL")], way[maxspeed:trailer][maxspeed:trailer>90][inside("NL")], way[maxspeed:hgv][maxspeed:hgv>80][inside("NL")] { throwWarning: tr("{0} overschrijdt de maximumsnelheid van RVV art. 22", "{0.tag}"); group: tr("NL speed limits"); assertNoMatch: "way highway=unclassified maxspeed:moped=45"; } /* ---------------------------- */ /* ------- Snorfietsers ------- */ /* ---------------------------- */ /* In practically all cases, oneway:bicycle=no (uitgezonderd fietsers) implies oneway:mofa=no too */ way[oneway:bicycle?!][!oneway:mofa][oneway?][inside("NL")] { throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}"); group: tr("NL mofa tagging"); } /* In practically all cases, something that applies to mopeds and bicycles, also applies to mofa's */ way[bicycle:forward][moped:forward][bicycle:forward=*"moped:forward"][!mofa][!mofa:forward][bicycle:forward!=designated][bicycle:forward!=yes][inside("NL")], way[bicycle:backward][moped:backward][bicycle:backward=*"moped:backward"][!mofa][!mofa:backward][bicycle:backward!=designated][bicycle:backward!=yes][inside("NL")], way[bicycle:both_ways][moped:both_ways][bicycle:both_ways=*"moped:both_ways"][!mofa][!mofa:both_ways][bicycle:both_ways!=designated][bicycle:both_ways!=yes][inside("NL")], way[bicycle][moped][bicycle=*moped][!mofa][bicycle!=designated][bicycle!=yes][inside("NL")] { throwWarning: tr("{0} and {1} without {2}", "{0.tag}", "{1.tag}", "{3.key}={0.value}"); group: tr("NL mofa tagging"); fixAdd: "{3.key}={0.value}"; }