source: josm/trunk/resources/data/validator/combinations.mapcss@ 17038

Last change on this file since 17038 was 17038, checked in by Klumbumbus, 4 years ago

fix #19805, see #17296 - Improve "Is the fixme fixed?" validator warning

  • Property svn:eol-style set to native
File size: 40.0 KB
RevLine 
[6548]1/* Rules partially derived from Taginfo statistics - see ticket #5017
2 * Taginfo query: select keypairs.key1, keypairs.key2, keypairs.count_all, keys.count_all, cast(keypairs.count_all as real)/keys.count_all as from_fraction_all from keys, keypairs where key1='waterway' and keys.key=keypairs.key2 and (key1<>'highway' or keypairs.count_all>12000) and (key1<>'railway' or keypairs.count_all>3000) and (key1<>'waterway' or keypairs.count_all>800) and key2 not like '%:%' and from_fraction_all>0.97 and 1 union select keypairs.key2, keypairs.key1, keypairs.count_all, keys.count_all, cast(keypairs.count_all as real)/keys.count_all as from_fraction_all from keys, keypairs where key2='waterway' and keys.key=keypairs.key1 and (key2<>'highway' or keypairs.count_all>12000) and (key2<>'railway' or keypairs.count_all>3000) and (key2<>'waterway' or keypairs.count_all>800) and key1 not like '%:%' and from_fraction_all>0.97 and 1 order by keypairs.count_all desc limit 1000;
3 */
4
[15268]5way[surface=~/^(unpaved|compacted|gravel|fine_gravel|pebblestone|ground|earth|dirt|grass|sand|mud|ice|salt|snow|woodchips)$/] { /* without grass_paver as it is controversial */
6 set unpaved_surface;
7}
8
[7229]9/* {0.key} without {1.key} (warning level) */
[16233]10way[junction ][!highway][junction!=yes][!area:highway],
[11407]11way[lanes ][!highway][leisure!=track][leisure!=swimming_pool],
[11305]12way[living_street ][!highway],
13way[maintenance ][!highway],
14way[median ][!highway],
15way[motorroad ][!highway],
16node[ntd_id ][!highway],
17way[sac_scale ][!highway],
18way[sidewalk ][!highway],
[13566]19way[step_count ][!highway][man_made!=tower],
[11305]20way[tracktype ][!highway],
[13092]21way[trail_visibility ][!highway], /* #15029 */
[11305]22way[trolley_wire ][!highway],
23way[zip_left ][!highway],
24way[zip_right ][!highway],
25way[detail ][!railway][route!=railway],
26way[eddy_current_brake ][!railway][route!=railway],
[13452]27way[electrified ][!railway][route!=railway][!highway], /* #16007 */
[11305]28way[etcs ][!railway][route!=railway],
29way[gauge ][!railway][route!=railway],
30way[grade_of_track ][!railway][route!=railway],
31way[kursbuchstrecke ][!railway][route!=railway],
32way[lzb ][!railway][route!=railway],
33way[old_railway_operator ][!railway][route!=railway],
34way[operating_procedure ][!railway][route!=railway],
35way[pzb ][!railway][route!=railway],
36way[structure_gauge ][!railway][route!=railway],
37way[tilting_technology ][!railway][route!=railway],
38way[track_class ][!railway][route!=railway],
39way[tracks ][!railway][route!=railway],
40way[traffic_mode ][!railway][route!=railway],
41way[workrules ][!railway][route!=railway],
42way[length_unit ][!waterway],
43way[canal ][!waterway],
44way[have_riverbank ][!waterway],
[6548]45*[border_type ][!boundary],
[8121]46*[piste:difficulty ][!piste:type],
[14799]47*[place ][!name][place!=islet],
[15260]48*[transformer ][!power],
[6548]49*[source:date ][!source],
[16255]50*[source:name ][!name][noname!=yes],
[13032]51*[source:maxspeed:forward ][!maxspeed:forward][!maxspeed],
52*[source:maxspeed:backward ][!maxspeed:backward][!maxspeed],
[6548]53*[source:building ][!building],
[16255]54*[source:ref ][!ref][noref!=yes],
[6548]55*[source:population ][!population],
56*[source:postal_code ][!postal_code],
57*[source:ele ][!ele],
58*[source:ref:INSEE ][!ref:INSEE],
59*[source:lit ][!lit],
60*[source:hgv ][!hgv],
61*[source:highway ][!highway],
62*[source:maxaxleload ][!maxaxleload],
63*[source:surface ][!surface],
64*[source:bridge ][!bridge],
65*[source:old_name ][!old_name],
66*[source:bicycle ][!bicycle],
67*[source:designation ][!designation],
68*[source:height ][!height],
69*[source:lanes ][!lanes],
[6645]70*[source:postcode ][!addr:postcode],
71*[source:housenumber ][!addr:housenumber],
72*[source:addr:postcode ][!addr:postcode],
[16255]73*[source:addr:housenumber ][!addr:housenumber] {
[6548]74 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
[11146]75 group: tr("missing tag");
[6548]76 assertMatch: "way lanes=42";
77 assertNoMatch: "way lanes=42 highway=unclassified";
78 assertMatch: "node source:addr:postcode=postman";
79}
80
[7229]81/* {0.key} without {1.key} (info level) */
[11305]82way[lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1],
83way[lanes:backward][!lanes:forward][oneway!=yes][oneway!=-1],
[7229]84*[leaf_type ][!leaf_cycle],
85*[leaf_cycle][!leaf_type] {
86 throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
[11146]87 group: tr("missing tag");
[7229]88}
89
[15267]90/* {0.key} without {1.tag}, #17997 */
[15433]91node[railway:switch ][railway!=switch],
[15267]92*[generator:source ][power!=generator],
93*[generator:method ][power!=generator],
94*[generator:type ][power!=generator],
[14593]95node[fire_hydrant:type ][emergency!=fire_hydrant][disused:emergency!=fire_hydrant],
[15260]96node[manhole ][man_made!=manhole],
[11305]97way[fence_type ][barrier!=fence],
[6548]98*[recycling_type ][amenity!=recycling],
[7996]99*[information ][tourism!=information],
[11305]100node[board_type ][information!=board],
[6548]101*[shelter_type ][amenity!=shelter],
[11305]102node[lamp_type ][highway!=street_lamp],
103node[map_type ][information!=map],
[6548]104*[site_type ][historic!=archaeological_site],
[13508]105*[artwork_type ][tourism!=artwork][exhibit!=artwork],
[6548]106*[castle_type ][historic!=castle],
[15624]107*[parking ][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking)$/][parking!=yes][parking!=no],
[11305]108way[cutline ][man_made!=cutline],
[6548]109*[bunker_type ][military!=bunker] {
110 throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
[11146]111 group: tr("missing tag");
[6548]112}
113
[15325]114/* {0.key} without {1.tag} or {2.tag}, #15107 */
115*[iata ][aeroway!=aerodrome][aeroway!=helipad],
116*[icao ][aeroway!=aerodrome][aeroway!=helipad],
[12677]117*[bridge:movable ][bridge!=movable][man_made!=bridge],
[9903]118*[substation ][power!=substation][pipeline!=substation],
[13972]119*[reservoir_type ][landuse!=reservoir][water!=reservoir],
120way[waterway=pressurised ][tunnel!=flooded][man_made!=pipeline] {
[9903]121 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.tag}", "{2.tag}");
[11146]122 group: tr("missing tag");
[9903]123}
124
[15584]125/* {0.tag} without {1.key} (warning level), #18411, #18246 */
126way[railway=construction][!construction],
[15467]127way[highway=construction][!construction],
[15190]128node[traffic_sign=maxspeed][!maxspeed],
[15139]129node[actuator=manual][!handle],
[14593]130node[emergency=fire_hydrant][!fire_hydrant:type],
[14800]131way[ boundary=administrative][!admin_level],
[13084]132relation[boundary=administrative][!admin_level],
[14798]133relation[route=bicycle ][!network][type=route],
134relation[route=hiking ][!network][type=route],
135relation[route=foot ][!network][type=route],
136relation[route=horse ][!network][type=route],
[10320]137relation[route=piste][!piste:type][type=route],
[14798]138relation[route=ski ][!piste:type][type=route],
[7996]139*[tourism=information][!information],
[11153]140*[leisure=pitch][!sport],
[7929]141*[aeroway=terminal][!building],
[15634]142*[office=government][!government],
[7967]143*[power=generator][!generator:source],
[11398]144*[amenity=social_facility][!social_facility],
[16705]145*[amenity=place_of_worship][!religion],
146*[man_made=tower][!tower:type] {
[7923]147 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}");
[11146]148 group: tr("missing tag");
[7923]149}
150
[15325]151/* {0.tag} without {1.key} (info level), #15107 */
152*[aeroway=runway ][!ref],
153*[aeroway=runway ][!surface],
[15635]154node[highway=crossing ][!crossing],
[11428]155way[highway=track ][!tracktype],
[9495]156way[power=cable ][!location],
[13814]157node[power=transformer ][!voltage:primary],
158node[power=transformer ][!voltage:secondary],
159node[transformer=distribution ][!voltage:primary][power=pole],
160node[transformer=distribution ][!voltage:secondary][power=pole],
[9500]161way[power=line ][!voltage],
162way[power=minor_line ][!voltage],
163way[power=cable ][!voltage],
164*[power=generator ][!voltage][generator:output:electricity],
165*[power=plant ][!voltage][plant:output:electricity],
166*[power=substation ][!substation],
[12997]167*[power=switch ][!switch],
[9500]168*[power=transformer ][!transformer],
[14799]169*[amenity=bank ][!operator],
170*[amenity=cinema ][!operator],
171*[amenity=fast_food ][!operator],
172*[amenity=fuel ][!operator],
173*[mountain_pass=yes ][!ele],
174*[natural=peak ][!ele],
[15568]175*[natural=water ][!water],
[14818]176*[amenity=place_of_worship ][!denomination],
[8080]177*[amenity=parking ][!parking],
178*[amenity=parking_entrance ][!parking] {
179 throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
[11146]180 group: tr("missing tag");
[9500]181 assertMatch: "way power=line";
182 assertNoMatch: "way power=line voltage=1";
[12997]183 assertMatch: "way power=switch";
[9500]184 assertMatch: "way power=substation";
185 assertMatch: "way power=substation transformer=foobar";
186 assertNoMatch: "way power=substation substation=foobar";
187 assertMatch: "way power=generator generator:output:electricity=yes";
188 assertNoMatch: "way power=generator";
189 assertNoMatch: "way power=generator generator:output:electricity=yes voltage=1";
[8080]190}
191
[6548]192/* {0.key} without {1.key} or {2.tag} */
[13026]193way[bridge:structure ][!bridge][man_made!=bridge],
[10068]194*[smoothness ][!highway][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking)$/],
[9003]195*[segregated ][!highway][railway!=crossing] {
[6548]196 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.tag}");
[11146]197 group: tr("missing tag");
[6548]198}
199
[8746]200/* {0.tag} without {1.tag} (info level) see #11600 #11393 #11850 */
[11305]201way[highway=motorway][!oneway][junction!=roundabout],
202way[highway=motorway_link][!oneway][junction!=roundabout] {
[8591]203 throwOther: tr("{0} without {1}", "{0.tag}", "{1.tag}");
[11146]204 group: tr("missing tag");
[8545]205}
206
[13972]207/* {0.tag} without {1.tag} */
208way[usage=penstock][man_made!=pipeline],
209way[usage=penstock][waterway!=pressurised] {
210 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
211 group: tr("missing tag");
212}
213
[8411]214/* {0.tag} without {1.tag} or {2.tag} */
215*[amenity=recycling][recycling_type!=container][recycling_type!=centre] {
216 throwWarning: tr("{0} without {1} or {2}", "{0.tag}", "{1.tag}", "{2.tag}");
[11146]217 group: tr("missing tag");
[8411]218}
219
[8057]220/* {0.key} without {1.key}, {2.tag} or {3.tag} */
[14127]221*[intermittent ][!waterway][natural!~/^(water|spring)$/][landuse!~/^(basin|reservoir)$/][ford!=yes],
222*[boat ][!waterway][natural!=water ][landuse!~/^(basin|reservoir)$/][ford!=yes] {
223 throwWarning: tr("{0} without {1}, {2}, {3} or {4}", "{0.key}", "{1.key}", "{2.tag}", "{3.tag}", "{4.tag}");
[11146]224 group: tr("missing tag");
[7767]225}
226
[14735]227/* {0.key} without {1.key}, {2.key} or {3.key}, #17253 */
[15254]228way[oneway ][!highway][!railway][!aerialway][attraction!=summer_toboggan][aeroway!~/^(runway|taxiway)$/],
[14735]229*[snowplowing][!highway][!amenity][!leisure] {
[6880]230 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.key}");
[11146]231 group: tr("missing tag");
[6880]232}
233
[16859]234/* {0.key} without {1.key}, {2.key} or {3.tag} */
[7250]235*[toll ][!highway][!barrier][route!~/^(ferry|road)$/] {
236 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.tag}");
[11146]237 group: tr("missing tag");
[7250]238}
239
[15110]240/* {0.tag} together with {1.key}, see #17664, #17707, #16464, #10837, #14034, #9389, #11977, #13156, #16888 */
241*[power=plant][/^generator:/],
242*[power=generator][/^plant:/],
[15075]243*[power=plant][voltage],
244*[power=plant][frequency],
[14042]245*[internet_access=no][internet_access:fee],
[13814]246node[power=transformer][voltage],
247node[transformer=distribution][voltage][power=pole],
[11346]248*[amenity=vending_machine][shop],
[13401]249*[noname?][name],
[14364]250way[oneway=yes][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][oneway:bicycle!=no][oneway:psv!=no],
251way[oneway=yes][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][oneway:bicycle!=no][oneway:psv!=no],
252way[oneway=-1 ][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][oneway:bicycle!=no][oneway:psv!=no],
253way[oneway=-1 ][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][oneway:bicycle!=no][oneway:psv!=no] {
[8077]254 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
[11146]255 group: tr("suspicious tag combination");
[15110]256 assertMatch: "way power=plant generator:source=wind";
257 assertMatch: "way power=generator plant:source=combustion";
[8077]258}
259
[8044]260/* {0.tag} together with {1.tag} (info level), see #9696 */
[11305]261way[highway=footway][oneway=no] {
[8044]262 throwOther: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[11146]263 group: tr("suspicious tag combination");
[8044]264}
265
[15648]266/* {0.tag} together with {1.tag}, see #18411, #17950, #17330, #17623, #17592, #17594, #17542, #16861, #16147, #10186 */
267*[barrier=kerb][kerb=no],
268way[highway=construction][construction=yes],
269way[railway=construction][construction=yes],
[15595]270*[man_made=bridge][bridge=yes],
271*[man_made=tunnel][tunnel=yes],
[15307]272*[amenity=police][police],
[15286]273node[highway=crossing][crossing=no],
274node[railway=crossing][crossing=no],
[15094]275way[junction=yes][highway],
[15268]276way[tracktype=grade1][surface].unpaved_surface,
[14987]277way[tracktype=grade2][surface][surface=~/^(sand|mud)$/],
[14356]278way[segregated][bicycle=no],
279way[segregated][foot=no],
[14041]280way[man_made=pipeline][tunnel=flooded],
[14943]281way[waterway=canal][tunnel=yes] {
[8117]282 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[11146]283 group: tr("suspicious tag combination");
[8117]284}
285
[14808]286/* {0.tag} together with {1.tag} (error level) */
287relation[type=multipolygon][area=no] {
288 throwError: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
289 group: tr("suspicious tag combination");
290}
291
[15526]292/* {0.key} together with {1.key}, #18267, #17630, #17604 */
293node[marker][cover],
294node[marker][voltage],
295node[marker][pressure],
296node[marker][diameter],
297node[marker][substance],
[15004]298*[building:part][building],
[15256]299*[addr:street][addr:place][outside("CZ,DK")] {
[14998]300 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
[13401]301 group: tr("suspicious tag combination");
302}
303
[15722]304/* {0.tag} together with {1.tag} and {2.key}, #18471 */
305way[highway=~/^(cycleway|footway|path)$/][segregated=no][sidewalk =~/^(left|right|both)$/] {
306 throwWarning: tr("{0} together with {1} and {2}", "{0.tag}", "{1.tag}", "{2.key}");
307 group: tr("suspicious tag combination");
308}
309
[17025]310/* {0.key} together with {1.tag} and {2.key}, #19747 */
311way[railway][electrified=no][frequency],
312way[railway][electrified=no][voltage] {
313 throwWarning: tr("{0} together with {1} and {2}", "{0.key}", "{1.tag}", "{2.key}");
314 group: tr("suspicious tag combination");
315}
316
[11074]317/* #11127, #13727 */
318way[waterway][bridge=yes][waterway!=weir] {
[8089]319 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
320 suggestAlternative: "bridge=aqueduct";
[11146]321 group: tr("suspicious tag combination");
[8089]322 fixAdd: "bridge=aqueduct";
323}
[11074]324way[waterway=weir][bridge=yes][highway] {
325 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
326 suggestAlternative: "waterway=weir + ford=yes";
327 suggestAlternative: "waterway=dam";
328 suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
[11146]329 group: tr("suspicious tag combination");
[11074]330}
[8089]331
[13787]332/* #16214 */
333relation[type=multipolygon] >[role="inner"] way[area][eval(number_of_tags()) = 1] {
334 throwWarning: tr("{0} on an inner multipolygon ring without further tags", "{0.tag}");
335 fixRemove: "area";
336 set area_yes_autofix;
337 group: tr("suspicious tag combination");
338}
339
[12416]340/* only {0.key}, see #11104 #12422 #14950 */
341*[access][eval(number_of_tags()) = 1],
[13787]342*[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
[8054]343*[name][eval(number_of_tags()) = 1],
[9837]344*[ref][eval(number_of_tags()) = 1],
345*[lit][eval(number_of_tags()) = 1] {
[8054]346 throwWarning: tr("incomplete object: only {0}", "{0.key}");
[11146]347 group: tr("missing tag");
[8054]348}
[13086]349/* only {0.key} and {1.key} */
[8054]350*[name][area][eval(number_of_tags()) = 2],
351*[name][ref][eval(number_of_tags()) = 2] {
352 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
[11146]353 group: tr("missing tag");
[8054]354}
[13086]355/* only {0.tag}, #15269 */
356*[tourism=attraction][eval(number_of_tags()) = 1] {
357 throwWarning: tr("incomplete object: only {0}", "{0.tag}");
358 group: tr("missing tag");
359}
360/* only {0.key} and {1.tag} */
361*[name][tourism=attraction][eval(number_of_tags()) = 2] {
362 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
363 group: tr("missing tag");
364}
[8054]365
[11548]366/* #9811, #11491, #12865, #14310 */
367*[place][place!=farm][/^(addr:housenumber|addr:housename|addr:flats|addr:conscriptionnumber|addr:street|addr:place|addr:city|addr:country|addr:full|addr:hamlet|addr:suburb|addr:subdistrict|addr:district|addr:province|addr:state|addr:interpolation|addr:interpolation|addr:inclusion)$/],
368/* addr:postcode is used together with place in some countries */
[8043]369*[boundary][/^addr:/],
[8730]370*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
[16255]371 throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
[11146]372 group: tr("suspicious tag combination");
[11548]373 assertMatch: "node place=foo addr:housenumber=5";
374 assertMatch: "node place=foo addr:housenumber=5 addr:postcode=12345";
375 assertNoMatch: "node place=foo addr:postcode=12345";
[8043]376}
[8730]377*[!highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
378 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
[11146]379 group: tr("suspicious tag combination");
[8730]380}
381*[!highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
382 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
[11146]383 group: tr("suspicious tag combination");
[8730]384}
385way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
386 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
[11146]387 group: tr("suspicious tag combination");
[8730]388 fixRemove: "addr:postcode";
389}
390way[highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
391 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
[11146]392 group: tr("suspicious tag combination");
[8730]393}
[10272]394way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
[11052]395 throwWarning: tr("{0} together with {1}", "{0.key}", "{4.key}");
[8730]396 suggestAlternative: "postal_code";
[11146]397 group: tr("suspicious tag combination");
[8730]398 fixChangeKey: "addr:postcode=>postal_code";
399}
[8043]400
[10350]401/* #9195 */
[11305]402way[highway=footway][cycleway=lane] {
[8042]403 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[8046]404 suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
[11146]405 group: tr("suspicious tag combination");
[8042]406}
407
[16859]408/* {0} on suspicious object, #17255, #19650 */
409*[tunnel ][!highway][!railway][!waterway][!piste:type][public_transport!=platform][route!=ferry][man_made!=pipeline][man_made!=goods_conveyor][man_made!=wildlife_crossing][man_made!=tunnel],
410*[bridge ][!highway][!railway][!waterway][!piste:type][public_transport!=platform][route!=ferry][man_made!=pipeline][man_made!=goods_conveyor][man_made!=wildlife_crossing][man_made!=bridge][building!=bridge],
411*[psv ][!highway][!railway][!waterway][barrier!=bollard][amenity !~ /^parking.*/],
412*[width ][!highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone][leisure!=track],
413*[maxspeed ][!highway][!railway][traffic_sign !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][traffic_sign:forward !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][traffic_sign:backward !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][type != enforcement][waterway !~ /^(river|canal|lock)$/][!traffic_calming][aerialway!=zip_line],
414way[incline][!highway][!railway][aeroway!~/^(runway|taxiway)$/][attraction!=summer_toboggan][leisure!=slipway] {
[6548]415 throwWarning: tr("{0} on suspicious object", "{0.key}");
[11146]416 group: tr("suspicious tag combination");
[6548]417}
418
[14798]419*[amenity][amenity =~ /^(restaurant|cafe|fast_food|pub|place_of_worship|school|university|hospital|library|theatre|courthouse|bank|cinema|pharmacy|fuel)$/][!name][noname!=yes] {
[11146]420 throwOther: tr("{0} without {1}", "{0.tag}", "{2.key}");
421 group: tr("missing tag");
[6548]422 assertMatch: "node amenity=restaurant";
[7932]423 assertNoMatch: "node amenity=restaurant noname=yes";
[6548]424 assertNoMatch: "node amenity=restaurant name=Foobar";
425}
426
[13645]427/* #10193, #16157 */
[6550]428way[highway][barrier],
[8559]429*[highway][waterway][waterway!=dam][waterway!=weir],
[11429]430way[highway][natural][natural!=ridge],
[14275]431*[landuse][building][landuse!=retail] {
[11146]432 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
433 group: tr("suspicious tag combination");
[13645]434 assertNoMatch: "node highway=street_lamp natural=birds_nest";
[6548]435}
436
[10350]437/* #6932 */
[10798]438*[natural=water][leisure=swimming_pool] {
[6548]439 throwWarning: tr("natural water used for swimming pool");
[11146]440 group: tr("suspicious tag combination");
[7274]441 fixRemove: "natural";
[6548]442}
[6860]443
[16514]444/* #9593, #11183, #12418, #12761, #17254, #19311 */
445*[sport][sport!=skiing][!building][!club][tourism != hotel][highway != raceway][!leisure][natural !~ /^(beach|bare_rock|cliff|peak|water)$/][amenity !~ /^(dojo|pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/][barrier !~ /^(wall|retaining_wall)$/][!"piste:type"][shop!=sports][attraction!=summer_toboggan] {
[6860]446 throwWarning: tr("sport without physical feature");
[11146]447 group: tr("missing tag");
[6860]448 assertMatch: "node sport=tennis";
449 assertNoMatch: "node sport=tennis leisure=pitch";
450 assertNoMatch: "node sport=beachvolleyball natural=beach";
[11159]451 assertNoMatch: "node sport=skiing"; /* skiing has deprecated warning */
[6860]452 assertNoMatch: "node sport=swimming tourism=hotel";
453 assertNoMatch: "node sport=10pin amenity=restaurant";
[7243]454}
455
[13972]456/* {0.key} without {1.key} or {2.key} see #10140 */
457*[building:levels][!building][!building:part],
458way[usage][!railway][!waterway][route!=railway][man_made!=pipeline] {
[7243]459 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
[11146]460 group: tr("missing tag");
[7243]461}
[7488]462
[16713]463/* any other *_name tag (with some exceptions) but not a name , see #10837 #11297 #11539 #16437 #17026 */
464*[/_name$/][!name][!old_name][!loc_name][!reg_name][!uic_name][!artist_name][!lock_name][!"osak:municipality_name"][!"osak:street_name"][noname!=yes] {
[7818]465 throwWarning: tr("alternative name without {0}", "{1.key}");
[11146]466 group: tr("missing tag");
[7818]467}
468
[16829]469/* #19604 */
470way[name][alt_name][name=*alt_name] {
471 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
472 group: tr("suspicious tag combination");
473 fixRemove: "alt_name";
474}
475
[10350]476/* #10837 */
[9386]477way[destination][!oneway?][junction!=roundabout][highway] {
[7818]478 throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
479 suggestAlternative: "destination:forward";
480 suggestAlternative: "destination:backward";
[8700]481}
482
[16501]483/* #11389, #19010 */
[17024]484way[maxspeed:forward][maxspeed:backward][!maxspeed]["maxspeed:forward"=*"maxspeed:backward"] {
[8700]485 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
486 suggestAlternative: "maxspeed";
[11146]487 group: tr("suspicious tag combination");
[8700]488 fixChangeKey: "maxspeed:forward=>maxspeed";
489 fixRemove: "maxspeed:backward";
490}
[17024]491way[maxspeed:forward][maxspeed:backward][maxspeed]["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed] {
[8700]492 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
493 set AllSameMaxspeed;
494 suggestAlternative: "maxspeed";
[11146]495 group: tr("suspicious tag combination");
[8700]496 fixRemove: "maxspeed:forward";
497 fixRemove: "maxspeed:backward";
498}
[17024]499way[cycleway:left][cycleway:right][!cycleway]["cycleway:left"=*"cycleway:right"] {
[16501]500 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
501 suggestAlternative: "cycleway";
502 group: tr("suspicious tag combination");
503 fixChangeKey: "cycleway:left=>cycleway";
504 fixRemove: "cycleway:right";
505}
[17024]506way[cycleway:left][cycleway:right][cycleway]["cycleway:left"=*cycleway]["cycleway:right"=*cycleway] {
[16501]507 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
508 set AllSameCycleway;
509 suggestAlternative: "cycleway";
510 group: tr("suspicious tag combination");
511 fixRemove: "cycleway:left";
512 fixRemove: "cycleway:right";
513}
[17024]514way[sidewalk:left][sidewalk:right][!sidewalk]["sidewalk:left"=*"sidewalk:right"] {
[16501]515 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
516 suggestAlternative: "sidewalk";
517 group: tr("suspicious tag combination");
518 fixChangeKey: "sidewalk:left=>sidewalk";
519 fixRemove: "sidewalk:right";
520}
[17024]521way[sidewalk:left][sidewalk:right][sidewalk]["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk] {
[16501]522 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
523 set AllSameSidewalk;
524 suggestAlternative: "sidewalk";
525 group: tr("suspicious tag combination");
526 fixRemove: "sidewalk:left";
527 fixRemove: "sidewalk:right";
528}
529way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed,
530way["cycleway:left"]["cycleway:right"][cycleway]!.AllSameCycleway,
531way["sidewalk:left"]["sidewalk:right"][sidewalk]!.AllSameSidewalk {
[8700]532 throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
[11146]533 group: tr("suspicious tag combination");
[8700]534}
535way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
[16501]536way["maxspeed:backward"][maxspeed][!"maxspeed:forward"],
537way["cycleway:left"][cycleway][!"cycleway:right"],
538way["cycleway:right"][cycleway][!"cycleway:left"],
539way["sidewalk:left"][sidewalk][!"sidewalk:right"],
540way["sidewalk:right"][sidewalk][!"sidewalk:left"] {
[8700]541 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
[11146]542 group: tr("suspicious tag combination");
[8754]543}
544
[10350]545/* #11837 */
[8754]546way[layer][layer<0][bridge][bridge!=no][location!=underground][indoor!=yes][!tunnel],
547way[layer][layer>0][tunnel][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
[11146]548 throwWarning: tr("{0} together with {1}", "{2.tag}", "{0.tag}");
549 group: tr("suspicious tag combination");
[10350]550}
551
552/* #12942 */
553relation[oneway][type!=route] {
554 throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
[10388]555}
556
557/* #9182 */
[10419]558way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
559 throwWarning: tr("Long waterway with {0} but without a tag which defines it as tunnel or underground. Remove {1} or add a tunnel tag if applicable. Also check crossing bridges and their {1} tags.", "{1.tag}", "{1.key}");
[11146]560 group: tr("suspicious tag combination");
[10388]561}
[10419]562way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
563 throwOther: tr("Short waterway with {0} but without a tag which defines it as tunnel or underground. Remove {1} or add a tunnel tag if applicable. Also check crossing bridges and their {1} tags.", "{1.tag}", "{1.key}");
[11146]564 group: tr("suspicious tag combination");
[10537]565}
566
[13102]567/* #13144, #15536 */
568*[unisex=yes][female=yes][male!=yes][shop=hairdresser],
569*[unisex=yes][male=yes][female!=yes][shop=hairdresser] {
[10537]570 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[11146]571 group: tr("suspicious tag combination");
[10537]572}
[13102]573*[unisex=yes][female=yes][male=yes][shop=hairdresser] {
[10537]574 throwWarning: tr("{0} together with {1} and {2}. Remove {1} and {2}", "{0.tag}", "{1.tag}", "{2.tag}");
[11146]575 group: tr("suspicious tag combination");
[10537]576 fixRemove: "female";
577 fixRemove: "male";
578}
[13102]579*[female=yes][male=yes][!unisex][shop=hairdresser] {
[10537]580 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
581 suggestAlternative: "unisex=yes";
[11146]582 group: tr("suspicious tag combination");
[10537]583 fixRemove: "female";
584 fixRemove: "male";
585 fixAdd: "unisex=yes";
[10538]586}
587
[14883]588/* {1.key} without {2.tag} see #13138, #14468 */
589way!:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir], /* water=intermittent is deprecated and has an own warning */
590area:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir] {
[10538]591 throwWarning: tr("{0} without {1}", "{1.key}", "{2.tag}");
[11146]592 group: tr("missing tag");
[10538]593}
[10995]594
[11047]595/* #13680 */
596area[golf=bunker][natural=beach] {
597 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
598 suggestAlternative: "natural=sand";
599 suggestAlternative: "surface=sand";
[11146]600 group: tr("suspicious tag combination");
[11080]601}
602
603/* #13705 */
604relation[type=multipolygon][building] > way {
605 set part_of_building_MP;
606}
607way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier]!.part_of_building_MP {
608 /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
[11146]609 throwOther: tr("possibly missing {0} tag", "{1.key}");
610 group: tr("missing tag");
[11371]611}
612
[16769]613/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
[16860]614way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/] {
615 set MotorwayTrunk;
616}
617way.MotorwayTrunk[lanes][turn:lanes ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
618way.MotorwayTrunk[lanes][change:lanes ][tag(lanes)!=eval(count(split("|", tag("change:lanes"))))],
619way.MotorwayTrunk[lanes][maxspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("maxspeed:lanes"))))],
620way.MotorwayTrunk[lanes][minspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("minspeed:lanes"))))],
621way.MotorwayTrunk[lanes][destination:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:lanes"))))],
622way.MotorwayTrunk[lanes][destination:ref:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:ref:lanes"))))],
623way.MotorwayTrunk[lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
[16769]624 throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
625 group: tr("suspicious tag combination");
626}
627
[15393]628/* #14125, #14323, #18185 */
[16860]629way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][highway!=motorway][junction!=roundabout][lanes>2][get(split(".", tag(lanes)/2), 1)=5] {
[11406]630 throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
[11371]631 group: tr("missing tag");
632 assertNoMatch: "way highway=primary lanes=2";
633 assertNoMatch: "way highway=primary lanes=3 lanes:backward=2";
634 assertNoMatch: "way highway=primary lanes=3 oneway=-1";
[11406]635 assertNoMatch: "way highway=primary lanes=4";
[11371]636 assertMatch: "way highway=primary lanes=3";
[14593]637}
638
[16860]639/* #10932, #19609 */
640way[highway][!lanes][/^.*:lanes$/][!source:lanes],
641way[highway][!lanes][/^.*:lanes:(forward|backward|both_ways)$/],
[16769]642way[highway][!lanes:both_ways][/^.*:lanes:both_ways$/] {
643 throwWarning: tr("{0} without {1}", "{2.key}", "{1.key}");
644 group: tr("missing tag");
645 assertMatch: "way highway=primary turn:lanes=left|right";
[16860]646 assertMatch: "way highway=primary turn:lanes:forward=left|right";
[16769]647 assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
[16860]648}
649way[highway][!lanes:forward][/^.*:lanes:forward$/][!lanes:backward][!get(split(".", tag(lanes)/2), 1)=5],
650way[highway][!lanes:backward][/^.*:lanes:backward$/][!lanes:forward][!get(split(".", tag(lanes)/2), 1)=5] {
651 throwOther: tr("{0} without {1}", "{2.key}", "{1.key}");
652 group: tr("missing tag");
653 assertMatch: "way highway=primary turn:lanes:forward=left|right lanes=2";
[16769]654 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
[16860]655 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes=3";
[16769]656}
657
[14593]658/* #15774 */
659node[emergency=fire_hydrant][fire_hydrant:count][fire_hydrant:count!=1] {
660 throwOther: tr("{0} together with {1}. Tag each hydrant separately.", "{0.tag}", "{1.tag}");
[14798]661}
[14830]662
663/* #12502 */
664node[leisure=park][natural=tree] {
665 throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
666 group: tr("suspicious tag combination");
667 fixRemove: "leisure";
[14831]668}
669
670/* #17305 */
671area[boundary=administrative][landuse=residential] {
672 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
673 group: tr("suspicious tag combination");
674}
675
676/* #17391 */
[14910]677way[highway=pedestrian][width][width<3] {
[14831]678 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
679 suggestAlternative: "highway=footway";
680 group: tr("suspicious tag combination");
681 fixAdd: "highway=footway";
682 assertMatch: "way highway=pedestrian width=0.8";
683 assertMatch: "way highway=pedestrian width=1";
[14910]684 assertNoMatch: "way highway=pedestrian width=3";
[14831]685 assertNoMatch: "way highway=pedestrian width=5.5";
[15094]686}
687
688/* see #17623 */
[15131]689way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|bus_guideway|bridleway/][area!=yes] {
[15094]690 throwOther: tr("A linear object {0} without {1} has a tag indicating that it is an area.", "{1.tag}", "{3.tag}");
691 group: tr("suspicious tag combination");
[15169]692}
693
694/* #17804 */
695area[cemetery=sector][landuse=cemetery] {
696 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
697 group: tr("suspicious tag combination");
[15265]698}
699
700/* #17967 */
701*[highway=cycleway][cycleway=track] {
702 throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
703 group: tr("suspicious tag combination");
704 fixRemove: "cycleway";
[15268]705}
706
[15524]707/* #17973, #18183, #18331 */
708way[highway=path ][foot][foot!=no ][foot!=use_sidepath ][!segregated][bicycle][bicycle!=no][bicycle!=use_sidepath][bicycle!=dismount]!.unpaved_surface,
709way[highway=footway ][bicycle][bicycle!=no][bicycle!=use_sidepath][!segregated][bicycle!=dismount]!.unpaved_surface,
[15402]710way[highway=cycleway][foot][foot!=no ][foot!=use_sidepath ][!segregated]!.unpaved_surface {
[15403]711 throwWarning: tr("Combined foot- and cycleway without {0}.", "{4.key}");
[15268]712 group: tr("missing tag");
[15311]713}
714
715/* #17989 */
716node[emergency_ward_entrance][emergency!=emergency_ward_entrance] {
717 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
718 group: tr("missing tag");
719 fixAdd: "emergency=emergency_ward_entrance";
[15414]720}
721
722/* #18203 */
[15619]723way[construction][construction!=yes][construction!=minor][highway][highway!=construction] {
[15758]724 throwWarning: tr("{0} together with {1}", "{3.tag}", "{0.tag}");
[15414]725 group: tr("suspicious tag combination");
[15648]726}
727
728/* #18374 */
729*[amenity=recycling][collection_times="24/7"][!opening_hours],
730*[amenity=recycling][collection_times ][!opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
731 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
732 group: tr("suspicious tag combination");
733 fixChangeKey: "collection_times => opening_hours";
[15765]734 assertMatch: "node amenity=recycling collection_times=\"Mo-Fr 06:00-20:00\"";
735 assertNoMatch: "node amenity=recycling collection_times=\"Mo-Fr 15:00\"";
736 assertNoMatch: "node amenity=recycling collection_times=\"Mo 08:00-11:00\"";
737 assertNoMatch: "node amenity=recycling collection_times=\"Sa[2,4] 8:00-11:00\"";
[15648]738}
739*[amenity=recycling][collection_times="24/7"][opening_hours],
740*[amenity=recycling][collection_times ][opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
741 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
742 group: tr("suspicious tag combination");
[16254]743}
744
[16256]745/* #19018 */
746way[highway][crossing][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/] {
747 throwWarning: tr("{0} together with {1}. Should be used on a minor highway type or a node", "{1.key}", "{0.tag}");
748 group: tr("suspicious tag combination");
749 fixRemove: "crossing";
750 assertMatch: "way highway=trunk crossing=unmarked";
751 assertNoMatch: "way highway=construction construction=footway crossing=unmarked";
752}
753
[16254]754/* #19066 */
755*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
756 throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
757 group: tr("missing tag");
[16255]758}
759*[source:addr][!/^addr:/] {
760 throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
761 group: tr("missing tag");
[16258]762 assertMatch: "node source:addr=postman";
763 assertNoMatch: "node source:addr=postman addr:housenumber=42";
[16255]764}
765*[source:maxspeed][!/^maxspeed:?/] {
766 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
767 group: tr("missing tag");
[16705]768}
769
770/* #16898, tower vs. communications_tower, wiki suggests 100m as rough guideline, so we warn for < 75m */
771*[man_made=communications_tower][height][height =~ /^((7[0-4]|[1-6]?[0-9])(\.[0-9]*)?( m)?|(2(4[0-5]|[0-3][0-9])|1?[0-9]?[0-9])((\.[0-9]*)?( ft|\')|\'(11|10|[0-9])(\.[0-9]*)?\"))$/] { /* 75m ~ 246ft ~ 246' */
772 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
773 suggestAlternative: "man_made=tower + tower:type=communication + height";
774 group: tr("suspicious tag combination");
775 assertMatch: "node man_made=communications_tower height=58";
776 assertMatch: "node man_made=communications_tower height=\"74 m\"";
777 assertMatch: "node man_made=communications_tower height=0.8";
778 assertMatch: "node man_made=communications_tower height=245'";
779 assertMatch: "node man_made=communications_tower height=\"224.22 ft\"";
780 assertMatch: "node man_made=communications_tower height=231'10.22\"";
781 assertNoMatch: "node man_made=communications_tower height=\"75 m\"";
782 assertNoMatch: "node man_made=communications_tower height=75.72";
783 assertNoMatch: "node man_made=communications_tower height=\"328.22 ft\"";
784 assertNoMatch: "node man_made=communications_tower height=4358'8\"";
785 assertNoMatch: "node height=4358'";
[16769]786}
[16775]787
788/* #17296, If the value of fixme is only an osm key, it is often a leftover from a time when the object didn't have this key. The fixme was forgotten to remove when the key was added. Or the value of fixme should be described better what exactly needs to be fixed. */
[17038]789*[fixme][count(split(" ", tag("fixme"))) == 1][has_tag_key(tag("fixme"))],
790*[FIXME][count(split(" ", tag("FIXME"))) == 1][has_tag_key(tag("FIXME"))] {
[16775]791 throwWarning: tr("{0} together with {1}. Is the fixme fixed?", "{0.tag}", "{0.value}");
792 group: tr("suspicious tag combination");
793 assertMatch: "way name=\"Florist Gump\" fixme=name";
[16777]794 assertMatch: "way name=\"Florist Gump\" FIXME=name";
[16775]795 assertNoMatch: "way fixme=name";
796 assertNoMatch: "way name=\"Florist Gump\"";
797 assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
[16778]798}
799
800/* #19094 */
801way[highway][placement=transition][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition],
802way[highway][!placement][/^placement:.*$/][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition] {
803 throwWarning: tr("Use {0} only as value of {1}", "transition", "placement");
804 set PlacementTransitionWarning;
805 fixAdd: "placement=transition";
806 fixRemove: "placement:forward";
807 fixRemove: "placement:backward";
808 fixRemove: "placement:both_ways";
809 assertMatch: "way highway=primary placement=transition placement:both_ways=transition";
810 assertMatch: "way highway=primary placement:backward=transition placement:forward=transition";
811 assertNoMatch: "way highway=primary placement:backward=middle_of:1 placement:forward=transition";
812 assertNoMatch: "way highway=primary placement=middle_of:1 placement:backward=transition placement:forward=transition";
813}
814way[highway][placement][/^placement:.*$/]!.PlacementTransitionWarning,
815way[highway]["placement:forward"]["placement:backward"]!.PlacementTransitionWarning,
816way[highway]["placement:forward"]["placement:both_ways"]!.PlacementTransitionWarning,
817way[highway]["placement:backward"]["placement:both_ways"]!.PlacementTransitionWarning {
818 throwError: tr("{0} together with {1}", "{1.key}", "{2.key}");
819 group: tr("suspicious tag combination");
820 assertMatch: "way highway=primary placement=left_of:2 placement:forward=right_of:1";
821 assertNoMatch: "way highway=primary placement:forward=right_of:1";
822 assertNoMatch: "way highway=primary placement:forward=transition placement:both_ways=transition";
[16993]823}
824
825/* #19742 */
826node:righthandtraffic[highway=mini_roundabout][direction=clockwise] {
827 throwWarning: tr("{0} together with {1} at right-hand traffic", "{1.tag}", "{2.tag}");
828 group: tr("suspicious tag combination");
829}
830node!:righthandtraffic[highway=mini_roundabout][direction=anticlockwise] {
831 throwWarning: tr("{0} together with {1} at left-hand traffic", "{1.tag}", "{2.tag}");
832 group: tr("suspicious tag combination");
[16775]833}
Note: See TracBrowser for help on using the repository browser.