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

Last change on this file since 17038 was 17038, checked in by Klumbumbus, 3 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
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[lanes                      ][!highway][leisure!=track][leisure!=swimming_pool],
12way[living_street              ][!highway],
13way[maintenance                ][!highway],
14way[median                     ][!highway],
15way[motorroad                  ][!highway],
16node[ntd_id                    ][!highway],
17way[sac_scale                  ][!highway],
18way[sidewalk                   ][!highway],
19way[step_count                 ][!highway][man_made!=tower],
20way[tracktype                  ][!highway],
21way[trail_visibility           ][!highway], /* #15029 */
22way[trolley_wire               ][!highway],
23way[zip_left                   ][!highway],
24way[zip_right                  ][!highway],
25way[detail                     ][!railway][route!=railway],
26way[eddy_current_brake         ][!railway][route!=railway],
27way[electrified                ][!railway][route!=railway][!highway], /* #16007 */
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],
45*[border_type                  ][!boundary],
46*[piste:difficulty             ][!piste:type],
47*[place                        ][!name][place!=islet],
48*[transformer                  ][!power],
49*[source:date                  ][!source],
50*[source:name                  ][!name][noname!=yes],
51*[source:maxspeed:forward      ][!maxspeed:forward][!maxspeed],
52*[source:maxspeed:backward     ][!maxspeed:backward][!maxspeed],
53*[source:building              ][!building],
54*[source:ref                   ][!ref][noref!=yes],
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],
70*[source:postcode              ][!addr:postcode],
71*[source:housenumber           ][!addr:housenumber],
72*[source:addr:postcode         ][!addr:postcode],
73*[source:addr:housenumber      ][!addr:housenumber] {
74  throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
75  group: tr("missing tag");
76  assertMatch: "way lanes=42";
77  assertNoMatch: "way lanes=42 highway=unclassified";
78  assertMatch: "node source:addr:postcode=postman";
79}
80
81/* {0.key} without {1.key} (info level) */
82way[lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1],
83way[lanes:backward][!lanes:forward][oneway!=yes][oneway!=-1],
84*[leaf_type ][!leaf_cycle],
85*[leaf_cycle][!leaf_type] {
86  throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
87  group: tr("missing tag");
88}
89
90/* {0.key} without {1.tag}, #17997 */
91node[railway:switch            ][railway!=switch],
92*[generator:source             ][power!=generator],
93*[generator:method             ][power!=generator],
94*[generator:type               ][power!=generator],
95node[fire_hydrant:type         ][emergency!=fire_hydrant][disused:emergency!=fire_hydrant],
96node[manhole                   ][man_made!=manhole],
97way[fence_type                 ][barrier!=fence],
98*[recycling_type               ][amenity!=recycling],
99*[information                  ][tourism!=information],
100node[board_type                ][information!=board],
101*[shelter_type                 ][amenity!=shelter],
102node[lamp_type                 ][highway!=street_lamp],
103node[map_type                  ][information!=map],
104*[site_type                    ][historic!=archaeological_site],
105*[artwork_type                 ][tourism!=artwork][exhibit!=artwork],
106*[castle_type                  ][historic!=castle],
107*[parking                      ][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking)$/][parking!=yes][parking!=no],
108way[cutline                    ][man_made!=cutline],
109*[bunker_type                  ][military!=bunker] {
110  throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
111  group: tr("missing tag");
112}
113
114/* {0.key} without {1.tag} or {2.tag}, #15107 */
115*[iata                         ][aeroway!=aerodrome][aeroway!=helipad],
116*[icao                         ][aeroway!=aerodrome][aeroway!=helipad],
117*[bridge:movable               ][bridge!=movable][man_made!=bridge],
118*[substation                   ][power!=substation][pipeline!=substation],
119*[reservoir_type               ][landuse!=reservoir][water!=reservoir],
120way[waterway=pressurised       ][tunnel!=flooded][man_made!=pipeline] {
121  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.tag}", "{2.tag}");
122  group: tr("missing tag");
123}
124
125/* {0.tag} without {1.key} (warning level), #18411, #18246 */
126way[railway=construction][!construction],
127way[highway=construction][!construction],
128node[traffic_sign=maxspeed][!maxspeed],
129node[actuator=manual][!handle],
130node[emergency=fire_hydrant][!fire_hydrant:type],
131way[     boundary=administrative][!admin_level],
132relation[boundary=administrative][!admin_level],
133relation[route=bicycle ][!network][type=route],
134relation[route=hiking  ][!network][type=route],
135relation[route=foot    ][!network][type=route],
136relation[route=horse   ][!network][type=route],
137relation[route=piste][!piste:type][type=route],
138relation[route=ski  ][!piste:type][type=route],
139*[tourism=information][!information],
140*[leisure=pitch][!sport],
141*[aeroway=terminal][!building],
142*[office=government][!government],
143*[power=generator][!generator:source],
144*[amenity=social_facility][!social_facility],
145*[amenity=place_of_worship][!religion],
146*[man_made=tower][!tower:type] {
147  throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}");
148  group: tr("missing tag");
149}
150
151/* {0.tag} without {1.key} (info level), #15107 */
152*[aeroway=runway               ][!ref],
153*[aeroway=runway               ][!surface],
154node[highway=crossing          ][!crossing],
155way[highway=track              ][!tracktype],
156way[power=cable                ][!location],
157node[power=transformer         ][!voltage:primary],
158node[power=transformer         ][!voltage:secondary],
159node[transformer=distribution  ][!voltage:primary][power=pole],
160node[transformer=distribution  ][!voltage:secondary][power=pole],
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],
167*[power=switch                 ][!switch],
168*[power=transformer            ][!transformer],
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],
175*[natural=water                ][!water],
176*[amenity=place_of_worship     ][!denomination],
177*[amenity=parking              ][!parking],
178*[amenity=parking_entrance     ][!parking] {
179  throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
180  group: tr("missing tag");
181  assertMatch: "way power=line";
182  assertNoMatch: "way power=line voltage=1";
183  assertMatch: "way power=switch";
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";
190}
191
192/* {0.key} without {1.key} or {2.tag} */
193way[bridge:structure           ][!bridge][man_made!=bridge],
194*[smoothness                   ][!highway][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking)$/],
195*[segregated                   ][!highway][railway!=crossing] {
196  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.tag}");
197  group: tr("missing tag");
198}
199
200/* {0.tag} without {1.tag} (info level) see #11600 #11393 #11850 */
201way[highway=motorway][!oneway][junction!=roundabout],
202way[highway=motorway_link][!oneway][junction!=roundabout] {
203  throwOther: tr("{0} without {1}", "{0.tag}", "{1.tag}");
204  group: tr("missing tag");
205}
206
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
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}");
217  group: tr("missing tag");
218}
219
220/* {0.key} without {1.key}, {2.tag} or {3.tag} */
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}");
224  group: tr("missing tag");
225}
226
227/* {0.key} without {1.key}, {2.key} or {3.key}, #17253 */
228way[oneway   ][!highway][!railway][!aerialway][attraction!=summer_toboggan][aeroway!~/^(runway|taxiway)$/],
229*[snowplowing][!highway][!amenity][!leisure] {
230  throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.key}");
231  group: tr("missing tag");
232}
233
234/* {0.key} without {1.key}, {2.key} or {3.tag} */
235*[toll                         ][!highway][!barrier][route!~/^(ferry|road)$/] {
236  throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.tag}");
237  group: tr("missing tag");
238}
239
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:/],
243*[power=plant][voltage],
244*[power=plant][frequency],
245*[internet_access=no][internet_access:fee],
246node[power=transformer][voltage],
247node[transformer=distribution][voltage][power=pole],
248*[amenity=vending_machine][shop],
249*[noname?][name],
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] {
254  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
255  group: tr("suspicious tag combination");
256  assertMatch: "way power=plant generator:source=wind";
257  assertMatch: "way power=generator plant:source=combustion";
258}
259
260/* {0.tag} together with {1.tag} (info level), see #9696 */
261way[highway=footway][oneway=no] {
262  throwOther: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
263  group: tr("suspicious tag combination");
264}
265
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],
270*[man_made=bridge][bridge=yes],
271*[man_made=tunnel][tunnel=yes],
272*[amenity=police][police],
273node[highway=crossing][crossing=no],
274node[railway=crossing][crossing=no],
275way[junction=yes][highway],
276way[tracktype=grade1][surface].unpaved_surface,
277way[tracktype=grade2][surface][surface=~/^(sand|mud)$/],
278way[segregated][bicycle=no],
279way[segregated][foot=no],
280way[man_made=pipeline][tunnel=flooded],
281way[waterway=canal][tunnel=yes] {
282  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
283  group: tr("suspicious tag combination");
284}
285
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
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],
298*[building:part][building],
299*[addr:street][addr:place][outside("CZ,DK")] {
300  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
301  group: tr("suspicious tag combination");
302}
303
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
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
317/* #11127, #13727 */
318way[waterway][bridge=yes][waterway!=weir] {
319  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
320  suggestAlternative: "bridge=aqueduct";
321  group: tr("suspicious tag combination");
322  fixAdd: "bridge=aqueduct";
323}
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");
329  group: tr("suspicious tag combination");
330}
331
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
340/* only {0.key}, see #11104 #12422 #14950 */
341*[access][eval(number_of_tags()) = 1],
342*[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
343*[name][eval(number_of_tags()) = 1],
344*[ref][eval(number_of_tags()) = 1],
345*[lit][eval(number_of_tags()) = 1] {
346  throwWarning: tr("incomplete object: only {0}", "{0.key}");
347  group: tr("missing tag");
348}
349/* only {0.key} and {1.key} */
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}");
353  group: tr("missing tag");
354}
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}
365
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 */
369*[boundary][/^addr:/],
370*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
371  throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
372  group: tr("suspicious tag combination");
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";
376}
377*[!highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
378  throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
379  group: tr("suspicious tag combination");
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}");
383  group: tr("suspicious tag combination");
384}
385way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
386  throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
387  group: tr("suspicious tag combination");
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}");
392  group: tr("suspicious tag combination");
393}
394way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
395  throwWarning: tr("{0} together with {1}", "{0.key}", "{4.key}");
396  suggestAlternative: "postal_code";
397  group: tr("suspicious tag combination");
398  fixChangeKey: "addr:postcode=>postal_code";
399}
400
401/* #9195 */
402way[highway=footway][cycleway=lane] {
403  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
404  suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
405  group: tr("suspicious tag combination");
406}
407
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] {
415  throwWarning: tr("{0} on suspicious object", "{0.key}");
416  group: tr("suspicious tag combination");
417}
418
419*[amenity][amenity =~ /^(restaurant|cafe|fast_food|pub|place_of_worship|school|university|hospital|library|theatre|courthouse|bank|cinema|pharmacy|fuel)$/][!name][noname!=yes] {
420  throwOther: tr("{0} without {1}", "{0.tag}", "{2.key}");
421  group: tr("missing tag");
422  assertMatch: "node amenity=restaurant";
423  assertNoMatch: "node amenity=restaurant noname=yes";
424  assertNoMatch: "node amenity=restaurant name=Foobar";
425}
426
427/* #10193, #16157 */
428way[highway][barrier],
429*[highway][waterway][waterway!=dam][waterway!=weir],
430way[highway][natural][natural!=ridge],
431*[landuse][building][landuse!=retail] {
432  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
433  group: tr("suspicious tag combination");
434  assertNoMatch: "node highway=street_lamp natural=birds_nest";
435}
436
437/* #6932 */
438*[natural=water][leisure=swimming_pool] {
439  throwWarning: tr("natural water used for swimming pool");
440  group: tr("suspicious tag combination");
441  fixRemove: "natural";
442}
443
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] {
446    throwWarning: tr("sport without physical feature");
447    group: tr("missing tag");
448    assertMatch: "node sport=tennis";
449    assertNoMatch: "node sport=tennis leisure=pitch";
450    assertNoMatch: "node sport=beachvolleyball natural=beach";
451    assertNoMatch: "node sport=skiing"; /* skiing has deprecated warning */
452    assertNoMatch: "node sport=swimming tourism=hotel";
453    assertNoMatch: "node sport=10pin amenity=restaurant";
454}
455
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] {
459  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
460  group: tr("missing tag");
461}
462
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] {
465  throwWarning: tr("alternative name without {0}", "{1.key}");
466  group: tr("missing tag");
467}
468
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
476/* #10837 */
477way[destination][!oneway?][junction!=roundabout][highway] {
478  throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
479  suggestAlternative: "destination:forward";
480  suggestAlternative: "destination:backward";
481}
482
483/* #11389, #19010 */
484way[maxspeed:forward][maxspeed:backward][!maxspeed]["maxspeed:forward"=*"maxspeed:backward"] {
485  throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
486  suggestAlternative: "maxspeed";
487  group: tr("suspicious tag combination");
488  fixChangeKey: "maxspeed:forward=>maxspeed";
489  fixRemove: "maxspeed:backward";
490}
491way[maxspeed:forward][maxspeed:backward][maxspeed]["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed] {
492  throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
493  set AllSameMaxspeed;
494  suggestAlternative: "maxspeed";
495  group: tr("suspicious tag combination");
496  fixRemove: "maxspeed:forward";
497  fixRemove: "maxspeed:backward";
498}
499way[cycleway:left][cycleway:right][!cycleway]["cycleway:left"=*"cycleway:right"] {
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}
506way[cycleway:left][cycleway:right][cycleway]["cycleway:left"=*cycleway]["cycleway:right"=*cycleway] {
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}
514way[sidewalk:left][sidewalk:right][!sidewalk]["sidewalk:left"=*"sidewalk:right"] {
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}
521way[sidewalk:left][sidewalk:right][sidewalk]["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk] {
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 {
532  throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
533  group: tr("suspicious tag combination");
534}
535way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
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"] {
541  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
542  group: tr("suspicious tag combination");
543}
544
545/* #11837 */
546way[layer][layer<0][bridge][bridge!=no][location!=underground][indoor!=yes][!tunnel],
547way[layer][layer>0][tunnel][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
548  throwWarning: tr("{0} together with {1}", "{2.tag}", "{0.tag}");
549  group: tr("suspicious tag combination");
550}
551
552/* #12942 */
553relation[oneway][type!=route] {
554  throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
555}
556
557/* #9182 */
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}");
560  group: tr("suspicious tag combination");
561}
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}");
564  group: tr("suspicious tag combination");
565}
566
567/* #13144, #15536 */
568*[unisex=yes][female=yes][male!=yes][shop=hairdresser],
569*[unisex=yes][male=yes][female!=yes][shop=hairdresser] {
570  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
571  group: tr("suspicious tag combination");
572}
573*[unisex=yes][female=yes][male=yes][shop=hairdresser] {
574  throwWarning: tr("{0} together with {1} and {2}. Remove {1} and {2}", "{0.tag}", "{1.tag}", "{2.tag}");
575  group: tr("suspicious tag combination");
576  fixRemove: "female";
577  fixRemove: "male";
578}
579*[female=yes][male=yes][!unisex][shop=hairdresser] {
580  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
581  suggestAlternative: "unisex=yes";
582  group: tr("suspicious tag combination");
583  fixRemove: "female";
584  fixRemove: "male";
585  fixAdd: "unisex=yes";
586}
587
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] {
591  throwWarning: tr("{0} without {1}", "{1.key}", "{2.tag}");
592  group: tr("missing tag");
593}
594
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";
600  group: tr("suspicious tag combination");
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. */
609  throwOther: tr("possibly missing {0} tag", "{1.key}");
610  group: tr("missing tag");
611}
612
613/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
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"))))] {
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
628/* #14125, #14323, #18185 */
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] {
630  throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
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";
635  assertNoMatch: "way highway=primary lanes=4";
636  assertMatch: "way highway=primary lanes=3";
637}
638
639/* #10932, #19609 */
640way[highway][!lanes][/^.*:lanes$/][!source:lanes],
641way[highway][!lanes][/^.*:lanes:(forward|backward|both_ways)$/],
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";
646  assertMatch: "way highway=primary turn:lanes:forward=left|right";
647  assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
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";
654  assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
655  assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes=3";
656}
657
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}");
661}
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";
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 */
677way[highway=pedestrian][width][width<3] {
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";
684  assertNoMatch: "way highway=pedestrian width=3";
685  assertNoMatch: "way highway=pedestrian width=5.5";
686}
687
688/* see #17623 */
689way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|bus_guideway|bridleway/][area!=yes] {
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");
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");
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";
705}
706
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,
710way[highway=cycleway][foot][foot!=no      ][foot!=use_sidepath   ][!segregated]!.unpaved_surface {
711  throwWarning: tr("Combined foot- and cycleway without {0}.", "{4.key}");
712  group: tr("missing tag");
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";
720}
721
722/* #18203 */
723way[construction][construction!=yes][construction!=minor][highway][highway!=construction] {
724  throwWarning: tr("{0} together with {1}", "{3.tag}", "{0.tag}");
725  group: tr("suspicious tag combination");
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";
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\"";
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");
743}
744
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
754/* #19066 */
755*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
756  throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
757  group: tr("missing tag");
758}
759*[source:addr][!/^addr:/] {
760  throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
761  group: tr("missing tag");
762  assertMatch: "node source:addr=postman";
763  assertNoMatch: "node source:addr=postman addr:housenumber=42";
764}
765*[source:maxspeed][!/^maxspeed:?/] {
766  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
767  group: tr("missing tag");
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'";
786}
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. */
789*[fixme][count(split(" ", tag("fixme"))) == 1][has_tag_key(tag("fixme"))],
790*[FIXME][count(split(" ", tag("FIXME"))) == 1][has_tag_key(tag("FIXME"))] {
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";
794  assertMatch: "way name=\"Florist Gump\" FIXME=name";
795  assertNoMatch: "way fixme=name";
796  assertNoMatch: "way name=\"Florist Gump\"";
797  assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
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";
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");
833}
Note: See TracBrowser for help on using the repository browser.