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

Last change on this file since 16860 was 16860, checked in by Klumbumbus, 4 months ago

fix #19609 - Adjust lanes warnings (patch by skyper)

  • Property svn:eol-style set to native
File size: 39.2 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/* #11127, #13727 */
311way[waterway][bridge=yes][waterway!=weir] {
312  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
313  suggestAlternative: "bridge=aqueduct";
314  group: tr("suspicious tag combination");
315  fixAdd: "bridge=aqueduct";
316}
317way[waterway=weir][bridge=yes][highway] {
318  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
319  suggestAlternative: "waterway=weir + ford=yes";
320  suggestAlternative: "waterway=dam";
321  suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
322  group: tr("suspicious tag combination");
323}
324
325/* #16214 */
326relation[type=multipolygon] >[role="inner"] way[area][eval(number_of_tags()) = 1] {
327  throwWarning: tr("{0} on an inner multipolygon ring without further tags", "{0.tag}");
328  fixRemove: "area";
329  set area_yes_autofix;
330  group: tr("suspicious tag combination");
331}
332
333/* only {0.key}, see #11104 #12422 #14950 */
334*[access][eval(number_of_tags()) = 1],
335*[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
336*[name][eval(number_of_tags()) = 1],
337*[ref][eval(number_of_tags()) = 1],
338*[lit][eval(number_of_tags()) = 1] {
339  throwWarning: tr("incomplete object: only {0}", "{0.key}");
340  group: tr("missing tag");
341}
342/* only {0.key} and {1.key} */
343*[name][area][eval(number_of_tags()) = 2],
344*[name][ref][eval(number_of_tags()) = 2] {
345  throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
346  group: tr("missing tag");
347}
348/* only {0.tag}, #15269 */
349*[tourism=attraction][eval(number_of_tags()) = 1] {
350  throwWarning: tr("incomplete object: only {0}", "{0.tag}");
351  group: tr("missing tag");
352}
353/* only {0.key} and {1.tag} */
354*[name][tourism=attraction][eval(number_of_tags()) = 2] {
355  throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
356  group: tr("missing tag");
357}
358
359/* #9811, #11491, #12865, #14310 */
360*[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)$/],
361/* addr:postcode is used together with place in some countries */
362*[boundary][/^addr:/],
363*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
364  throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
365  group: tr("suspicious tag combination");
366  assertMatch: "node place=foo addr:housenumber=5";
367  assertMatch: "node place=foo addr:housenumber=5 addr:postcode=12345";
368  assertNoMatch: "node place=foo  addr:postcode=12345";
369}
370*[!highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
371  throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
372  group: tr("suspicious tag combination");
373}
374*[!highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
375  throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
376  group: tr("suspicious tag combination");
377}
378way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
379  throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
380  group: tr("suspicious tag combination");
381  fixRemove: "addr:postcode";
382}
383way[highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
384  throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
385  group: tr("suspicious tag combination");
386}
387way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
388  throwWarning: tr("{0} together with {1}", "{0.key}", "{4.key}");
389  suggestAlternative: "postal_code";
390  group: tr("suspicious tag combination");
391  fixChangeKey: "addr:postcode=>postal_code";
392}
393
394/* #9195 */
395way[highway=footway][cycleway=lane] {
396  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
397  suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
398  group: tr("suspicious tag combination");
399}
400
401/* {0} on suspicious object, #17255, #19650 */
402*[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],
403*[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],
404*[psv      ][!highway][!railway][!waterway][barrier!=bollard][amenity !~ /^parking.*/],
405*[width    ][!highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone][leisure!=track],
406*[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],
407way[incline][!highway][!railway][aeroway!~/^(runway|taxiway)$/][attraction!=summer_toboggan][leisure!=slipway] {
408  throwWarning: tr("{0} on suspicious object", "{0.key}");
409  group: tr("suspicious tag combination");
410}
411
412*[amenity][amenity =~ /^(restaurant|cafe|fast_food|pub|place_of_worship|school|university|hospital|library|theatre|courthouse|bank|cinema|pharmacy|fuel)$/][!name][noname!=yes] {
413  throwOther: tr("{0} without {1}", "{0.tag}", "{2.key}");
414  group: tr("missing tag");
415  assertMatch: "node amenity=restaurant";
416  assertNoMatch: "node amenity=restaurant noname=yes";
417  assertNoMatch: "node amenity=restaurant name=Foobar";
418}
419
420/* #10193, #16157 */
421way[highway][barrier],
422*[highway][waterway][waterway!=dam][waterway!=weir],
423way[highway][natural][natural!=ridge],
424*[landuse][building][landuse!=retail] {
425  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
426  group: tr("suspicious tag combination");
427  assertNoMatch: "node highway=street_lamp natural=birds_nest";
428}
429
430/* #6932 */
431*[natural=water][leisure=swimming_pool] {
432  throwWarning: tr("natural water used for swimming pool");
433  group: tr("suspicious tag combination");
434  fixRemove: "natural";
435}
436
437/* #9593, #11183, #12418, #12761, #17254, #19311  */
438*[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] {
439    throwWarning: tr("sport without physical feature");
440    group: tr("missing tag");
441    assertMatch: "node sport=tennis";
442    assertNoMatch: "node sport=tennis leisure=pitch";
443    assertNoMatch: "node sport=beachvolleyball natural=beach";
444    assertNoMatch: "node sport=skiing"; /* skiing has deprecated warning */
445    assertNoMatch: "node sport=swimming tourism=hotel";
446    assertNoMatch: "node sport=10pin amenity=restaurant";
447}
448
449/* {0.key} without {1.key} or {2.key} see #10140 */
450*[building:levels][!building][!building:part],
451way[usage][!railway][!waterway][route!=railway][man_made!=pipeline] {
452  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
453  group: tr("missing tag");
454}
455
456/* any other *_name tag (with some exceptions) but not a name , see #10837 #11297 #11539 #16437 #17026 */
457*[/_name$/][!name][!old_name][!loc_name][!reg_name][!uic_name][!artist_name][!lock_name][!"osak:municipality_name"][!"osak:street_name"][noname!=yes] {
458  throwWarning: tr("alternative name without {0}", "{1.key}");
459  group: tr("missing tag");
460}
461
462/* #19604 */
463way[name][alt_name][name=*alt_name] {
464  throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
465  group: tr("suspicious tag combination");
466  fixRemove: "alt_name";
467}
468
469/* #10837 */
470way[destination][!oneway?][junction!=roundabout][highway] {
471  throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
472  suggestAlternative: "destination:forward";
473  suggestAlternative: "destination:backward";
474}
475
476/* #11389, #19010 */
477way["maxspeed:forward"=*"maxspeed:backward"][!maxspeed] {
478  throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
479  suggestAlternative: "maxspeed";
480  group: tr("suspicious tag combination");
481  fixChangeKey: "maxspeed:forward=>maxspeed";
482  fixRemove: "maxspeed:backward";
483}
484way["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed][maxspeed] {
485  throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
486  set AllSameMaxspeed;
487  suggestAlternative: "maxspeed";
488  group: tr("suspicious tag combination");
489  fixRemove: "maxspeed:forward";
490  fixRemove: "maxspeed:backward";
491}
492way["cycleway:left"=*"cycleway:right"][!cycleway] {
493  throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
494  suggestAlternative: "cycleway";
495  group: tr("suspicious tag combination");
496  fixChangeKey: "cycleway:left=>cycleway";
497  fixRemove: "cycleway:right";
498}
499way["cycleway:left"=*cycleway]["cycleway:right"=*cycleway][cycleway] {
500  throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
501  set AllSameCycleway;
502  suggestAlternative: "cycleway";
503  group: tr("suspicious tag combination");
504  fixRemove: "cycleway:left";
505  fixRemove: "cycleway:right";
506}
507way["sidewalk:left"=*"sidewalk:right"][!sidewalk] {
508  throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
509  suggestAlternative: "sidewalk";
510  group: tr("suspicious tag combination");
511  fixChangeKey: "sidewalk:left=>sidewalk";
512  fixRemove: "sidewalk:right";
513}
514way["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk][sidewalk] {
515  throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
516  set AllSameSidewalk;
517  suggestAlternative: "sidewalk";
518  group: tr("suspicious tag combination");
519  fixRemove: "sidewalk:left";
520  fixRemove: "sidewalk:right";
521}
522way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed,
523way["cycleway:left"]["cycleway:right"][cycleway]!.AllSameCycleway,
524way["sidewalk:left"]["sidewalk:right"][sidewalk]!.AllSameSidewalk {
525  throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
526  group: tr("suspicious tag combination");
527}
528way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
529way["maxspeed:backward"][maxspeed][!"maxspeed:forward"],
530way["cycleway:left"][cycleway][!"cycleway:right"],
531way["cycleway:right"][cycleway][!"cycleway:left"],
532way["sidewalk:left"][sidewalk][!"sidewalk:right"],
533way["sidewalk:right"][sidewalk][!"sidewalk:left"] {
534  throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
535  group: tr("suspicious tag combination");
536}
537
538/* #11837 */
539way[layer][layer<0][bridge][bridge!=no][location!=underground][indoor!=yes][!tunnel],
540way[layer][layer>0][tunnel][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
541  throwWarning: tr("{0} together with {1}", "{2.tag}", "{0.tag}");
542  group: tr("suspicious tag combination");
543}
544
545/* #12942 */
546relation[oneway][type!=route] {
547  throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
548}
549
550/* #9182 */
551way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
552  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}");
553  group: tr("suspicious tag combination");
554}
555way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
556  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}");
557  group: tr("suspicious tag combination");
558}
559
560/* #13144, #15536 */
561*[unisex=yes][female=yes][male!=yes][shop=hairdresser],
562*[unisex=yes][male=yes][female!=yes][shop=hairdresser] {
563  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
564  group: tr("suspicious tag combination");
565}
566*[unisex=yes][female=yes][male=yes][shop=hairdresser] {
567  throwWarning: tr("{0} together with {1} and {2}. Remove {1} and {2}", "{0.tag}", "{1.tag}", "{2.tag}");
568  group: tr("suspicious tag combination");
569  fixRemove: "female";
570  fixRemove: "male";
571}
572*[female=yes][male=yes][!unisex][shop=hairdresser] {
573  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
574  suggestAlternative: "unisex=yes";
575  group: tr("suspicious tag combination");
576  fixRemove: "female";
577  fixRemove: "male";
578  fixAdd: "unisex=yes";
579}
580
581/* {1.key} without {2.tag} see #13138, #14468 */
582way!:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir], /* water=intermittent is deprecated and has an own warning */
583area:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir] {
584  throwWarning: tr("{0} without {1}", "{1.key}", "{2.tag}");
585  group: tr("missing tag");
586}
587
588/* #13680 */
589area[golf=bunker][natural=beach] {
590  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
591  suggestAlternative: "natural=sand";
592  suggestAlternative: "surface=sand";
593  group: tr("suspicious tag combination");
594}
595
596/* #13705 */
597relation[type=multipolygon][building] > way {
598  set part_of_building_MP;
599}
600way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier]!.part_of_building_MP {
601  /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
602  throwOther: tr("possibly missing {0} tag", "{1.key}");
603  group: tr("missing tag");
604}
605
606/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
607way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/] {
608  set MotorwayTrunk;
609}
610way.MotorwayTrunk[lanes][turn:lanes              ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
611way.MotorwayTrunk[lanes][change:lanes            ][tag(lanes)!=eval(count(split("|", tag("change:lanes"))))],
612way.MotorwayTrunk[lanes][maxspeed:lanes          ][tag(lanes)!=eval(count(split("|", tag("maxspeed:lanes"))))],
613way.MotorwayTrunk[lanes][minspeed:lanes          ][tag(lanes)!=eval(count(split("|", tag("minspeed:lanes"))))],
614way.MotorwayTrunk[lanes][destination:lanes       ][tag(lanes)!=eval(count(split("|", tag("destination:lanes"))))],
615way.MotorwayTrunk[lanes][destination:ref:lanes   ][tag(lanes)!=eval(count(split("|", tag("destination:ref:lanes"))))],
616way.MotorwayTrunk[lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
617    throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
618    group: tr("suspicious tag combination");
619}
620
621/* #14125, #14323, #18185 */
622way[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] {
623  throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
624  group: tr("missing tag");
625  assertNoMatch: "way highway=primary lanes=2";
626  assertNoMatch: "way highway=primary lanes=3 lanes:backward=2";
627  assertNoMatch: "way highway=primary lanes=3 oneway=-1";
628  assertNoMatch: "way highway=primary lanes=4";
629  assertMatch: "way highway=primary lanes=3";
630}
631
632/* #10932, #19609 */
633way[highway][!lanes][/^.*:lanes$/][!source:lanes],
634way[highway][!lanes][/^.*:lanes:(forward|backward|both_ways)$/],
635way[highway][!lanes:both_ways][/^.*:lanes:both_ways$/] {
636  throwWarning: tr("{0} without {1}", "{2.key}", "{1.key}");
637  group: tr("missing tag");
638  assertMatch: "way highway=primary turn:lanes=left|right";
639  assertMatch: "way highway=primary turn:lanes:forward=left|right";
640  assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
641}
642way[highway][!lanes:forward][/^.*:lanes:forward$/][!lanes:backward][!get(split(".", tag(lanes)/2), 1)=5],
643way[highway][!lanes:backward][/^.*:lanes:backward$/][!lanes:forward][!get(split(".", tag(lanes)/2), 1)=5] {
644  throwOther: tr("{0} without {1}", "{2.key}", "{1.key}");
645  group: tr("missing tag");
646  assertMatch: "way highway=primary turn:lanes:forward=left|right lanes=2";
647  assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
648  assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes=3";
649}
650
651/* #15774 */
652node[emergency=fire_hydrant][fire_hydrant:count][fire_hydrant:count!=1] {
653  throwOther: tr("{0} together with {1}. Tag each hydrant separately.", "{0.tag}", "{1.tag}");
654}
655
656/* #12502 */
657node[leisure=park][natural=tree] {
658  throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
659  group: tr("suspicious tag combination");
660  fixRemove: "leisure";
661}
662
663/* #17305 */
664area[boundary=administrative][landuse=residential] {
665  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
666  group: tr("suspicious tag combination");
667}
668
669/* #17391 */
670way[highway=pedestrian][width][width<3] {
671  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
672  suggestAlternative: "highway=footway";
673  group: tr("suspicious tag combination");
674  fixAdd: "highway=footway";
675  assertMatch: "way highway=pedestrian width=0.8";
676  assertMatch: "way highway=pedestrian width=1";
677  assertNoMatch: "way highway=pedestrian width=3";
678  assertNoMatch: "way highway=pedestrian width=5.5";
679}
680
681/* see #17623 */
682way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|bus_guideway|bridleway/][area!=yes] {
683  throwOther: tr("A linear object {0} without {1} has a tag indicating that it is an area.", "{1.tag}", "{3.tag}");
684  group: tr("suspicious tag combination");
685}
686
687/* #17804 */
688area[cemetery=sector][landuse=cemetery] {
689  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
690  group: tr("suspicious tag combination");
691}
692
693/* #17967 */
694*[highway=cycleway][cycleway=track] {
695  throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
696  group: tr("suspicious tag combination");
697  fixRemove: "cycleway";
698}
699
700/* #17973, #18183, #18331 */
701way[highway=path    ][foot][foot!=no      ][foot!=use_sidepath   ][!segregated][bicycle][bicycle!=no][bicycle!=use_sidepath][bicycle!=dismount]!.unpaved_surface,
702way[highway=footway ][bicycle][bicycle!=no][bicycle!=use_sidepath][!segregated][bicycle!=dismount]!.unpaved_surface,
703way[highway=cycleway][foot][foot!=no      ][foot!=use_sidepath   ][!segregated]!.unpaved_surface {
704  throwWarning: tr("Combined foot- and cycleway without {0}.", "{4.key}");
705  group: tr("missing tag");
706}
707
708/* #17989 */
709node[emergency_ward_entrance][emergency!=emergency_ward_entrance] {
710  throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
711  group: tr("missing tag");
712  fixAdd: "emergency=emergency_ward_entrance";
713}
714
715/* #18203 */
716way[construction][construction!=yes][construction!=minor][highway][highway!=construction] {
717  throwWarning: tr("{0} together with {1}", "{3.tag}", "{0.tag}");
718  group: tr("suspicious tag combination");
719}
720
721/* #18374 */
722*[amenity=recycling][collection_times="24/7"][!opening_hours],
723*[amenity=recycling][collection_times       ][!opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
724  throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
725  group: tr("suspicious tag combination");
726  fixChangeKey: "collection_times => opening_hours";
727  assertMatch: "node amenity=recycling collection_times=\"Mo-Fr 06:00-20:00\"";
728  assertNoMatch: "node amenity=recycling collection_times=\"Mo-Fr 15:00\"";
729  assertNoMatch: "node amenity=recycling collection_times=\"Mo 08:00-11:00\"";
730  assertNoMatch: "node amenity=recycling collection_times=\"Sa[2,4] 8:00-11:00\"";
731}
732*[amenity=recycling][collection_times="24/7"][opening_hours],
733*[amenity=recycling][collection_times       ][opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
734  throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
735  group: tr("suspicious tag combination");
736}
737
738/* #19018 */
739way[highway][crossing][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/] {
740  throwWarning: tr("{0} together with {1}. Should be used on a minor highway type or a node", "{1.key}", "{0.tag}");
741  group: tr("suspicious tag combination");
742  fixRemove: "crossing";
743  assertMatch: "way highway=trunk crossing=unmarked";
744  assertNoMatch: "way highway=construction construction=footway crossing=unmarked";
745}
746
747/* #19066 */
748*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
749  throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
750  group: tr("missing tag");
751}
752*[source:addr][!/^addr:/] {
753  throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
754  group: tr("missing tag");
755  assertMatch: "node source:addr=postman";
756  assertNoMatch: "node source:addr=postman addr:housenumber=42";
757}
758*[source:maxspeed][!/^maxspeed:?/] {
759  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
760  group: tr("missing tag");
761}
762
763/* #16898, tower vs. communications_tower, wiki suggests 100m as rough guideline, so we warn for < 75m */
764*[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' */
765  throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
766  suggestAlternative: "man_made=tower + tower:type=communication + height";
767  group: tr("suspicious tag combination");
768  assertMatch: "node man_made=communications_tower height=58";
769  assertMatch: "node man_made=communications_tower height=\"74 m\"";
770  assertMatch: "node man_made=communications_tower height=0.8";
771  assertMatch: "node man_made=communications_tower height=245'";
772  assertMatch: "node man_made=communications_tower height=\"224.22 ft\"";
773  assertMatch: "node man_made=communications_tower height=231'10.22\"";
774  assertNoMatch: "node man_made=communications_tower height=\"75 m\"";
775  assertNoMatch: "node man_made=communications_tower height=75.72";
776  assertNoMatch: "node man_made=communications_tower height=\"328.22 ft\"";
777  assertNoMatch: "node man_made=communications_tower height=4358'8\"";
778  assertNoMatch: "node height=4358'";
779}
780
781/* #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. */
782*[fixme][count(split(" ", tag("fixme"))) == 1][tag(tag("fixme")) != "none"],
783*[FIXME][count(split(" ", tag("FIXME"))) == 1][tag(tag("FIXME")) != "none"] {
784  throwWarning: tr("{0} together with {1}. Is the fixme fixed?", "{0.tag}", "{0.value}");
785  group: tr("suspicious tag combination");
786  assertMatch: "way name=\"Florist Gump\" fixme=name";
787  assertMatch: "way name=\"Florist Gump\" FIXME=name";
788  assertNoMatch: "way fixme=name";
789  assertNoMatch: "way name=\"Florist Gump\"";
790  assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
791}
792
793/* #19094 */
794way[highway][placement=transition][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition],
795way[highway][!placement][/^placement:.*$/][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition] {
796  throwWarning: tr("Use {0} only as value of {1}", "transition", "placement");
797  set PlacementTransitionWarning;
798  fixAdd: "placement=transition";
799  fixRemove: "placement:forward";
800  fixRemove: "placement:backward";
801  fixRemove: "placement:both_ways";
802  assertMatch: "way highway=primary placement=transition placement:both_ways=transition";
803  assertMatch: "way highway=primary placement:backward=transition placement:forward=transition";
804  assertNoMatch: "way highway=primary placement:backward=middle_of:1 placement:forward=transition";
805  assertNoMatch: "way highway=primary placement=middle_of:1 placement:backward=transition placement:forward=transition";
806}
807way[highway][placement][/^placement:.*$/]!.PlacementTransitionWarning,
808way[highway]["placement:forward"]["placement:backward"]!.PlacementTransitionWarning,
809way[highway]["placement:forward"]["placement:both_ways"]!.PlacementTransitionWarning,
810way[highway]["placement:backward"]["placement:both_ways"]!.PlacementTransitionWarning {
811  throwError: tr("{0} together with {1}", "{1.key}", "{2.key}");
812  group: tr("suspicious tag combination");
813  assertMatch: "way highway=primary placement=left_of:2 placement:forward=right_of:1";
814  assertNoMatch: "way highway=primary placement:forward=right_of:1";
815  assertNoMatch: "way highway=primary placement:forward=transition placement:both_ways=transition";
816}
Note: See TracBrowser for help on using the repository browser.