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

Last change on this file since 17324 was 17324, checked in by Klumbumbus, 2 months ago

fix #20119 - Don't warn about smoothness on barrier=kerb or kerb=*

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