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

Last change on this file since 16829 was 16829, checked in by Klumbumbus, 4 years ago
  • fix #19579 - Ignore generator:output:electricity and plant:output:electricity
  • fix #19589 - Don't warn about duplicate housenumbers if one is tagged on a barrier=entrance or barrier=gate node
  • fix #19604 - Warn if the value of alt_name is the same as of name (patch by Famlam)
  • Property svn:eol-style set to native
File size: 39.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 set MissingKeyWarning;
76 group: tr("missing tag");
77 assertMatch: "way lanes=42";
78 assertNoMatch: "way lanes=42 highway=unclassified";
79 assertMatch: "node source:addr:postcode=postman";
80}
81
82/* {0.key} without {1.key} (info level) */
83way[lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1],
84way[lanes:backward][!lanes:forward][oneway!=yes][oneway!=-1],
85*[leaf_type ][!leaf_cycle],
86*[leaf_cycle][!leaf_type] {
87 throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
88 group: tr("missing tag");
89}
90
91/* {0.key} without {1.tag}, #17997 */
92node[railway:switch ][railway!=switch],
93*[generator:source ][power!=generator],
94*[generator:method ][power!=generator],
95*[generator:type ][power!=generator],
96node[fire_hydrant:type ][emergency!=fire_hydrant][disused:emergency!=fire_hydrant],
97node[manhole ][man_made!=manhole],
98way[fence_type ][barrier!=fence],
99*[recycling_type ][amenity!=recycling],
100*[information ][tourism!=information],
101node[board_type ][information!=board],
102*[shelter_type ][amenity!=shelter],
103node[lamp_type ][highway!=street_lamp],
104node[map_type ][information!=map],
105*[site_type ][historic!=archaeological_site],
106*[artwork_type ][tourism!=artwork][exhibit!=artwork],
107*[castle_type ][historic!=castle],
108*[parking ][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking)$/][parking!=yes][parking!=no],
109way[cutline ][man_made!=cutline],
110*[bunker_type ][military!=bunker] {
111 throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
112 group: tr("missing tag");
113}
114
115/* {0.key} without {1.tag} or {2.tag}, #15107 */
116*[iata ][aeroway!=aerodrome][aeroway!=helipad],
117*[icao ][aeroway!=aerodrome][aeroway!=helipad],
118*[bridge:movable ][bridge!=movable][man_made!=bridge],
119*[substation ][power!=substation][pipeline!=substation],
120*[reservoir_type ][landuse!=reservoir][water!=reservoir],
121way[waterway=pressurised ][tunnel!=flooded][man_made!=pipeline] {
122 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.tag}", "{2.tag}");
123 group: tr("missing tag");
124}
125
126/* {0.tag} without {1.key} (warning level), #18411, #18246 */
127way[railway=construction][!construction],
128way[highway=construction][!construction],
129node[traffic_sign=maxspeed][!maxspeed],
130node[actuator=manual][!handle],
131node[emergency=fire_hydrant][!fire_hydrant:type],
132way[ boundary=administrative][!admin_level],
133relation[boundary=administrative][!admin_level],
134relation[route=bicycle ][!network][type=route],
135relation[route=hiking ][!network][type=route],
136relation[route=foot ][!network][type=route],
137relation[route=horse ][!network][type=route],
138relation[route=piste][!piste:type][type=route],
139relation[route=ski ][!piste:type][type=route],
140*[tourism=information][!information],
141*[leisure=pitch][!sport],
142*[aeroway=terminal][!building],
143*[office=government][!government],
144*[power=generator][!generator:source],
145*[amenity=social_facility][!social_facility],
146*[amenity=place_of_worship][!religion],
147*[man_made=tower][!tower:type] {
148 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}");
149 group: tr("missing tag");
150}
151
152/* {0.tag} without {1.key} (info level), #15107 */
153*[aeroway=runway ][!ref],
154*[aeroway=runway ][!surface],
155node[highway=crossing ][!crossing],
156way[highway=track ][!tracktype],
157way[power=cable ][!location],
158node[power=transformer ][!voltage:primary],
159node[power=transformer ][!voltage:secondary],
160node[transformer=distribution ][!voltage:primary][power=pole],
161node[transformer=distribution ][!voltage:secondary][power=pole],
162way[power=line ][!voltage],
163way[power=minor_line ][!voltage],
164way[power=cable ][!voltage],
165*[power=generator ][!voltage][generator:output:electricity],
166*[power=plant ][!voltage][plant:output:electricity],
167*[power=substation ][!substation],
168*[power=switch ][!switch],
169*[power=transformer ][!transformer],
170*[amenity=bank ][!operator],
171*[amenity=cinema ][!operator],
172*[amenity=fast_food ][!operator],
173*[amenity=fuel ][!operator],
174*[mountain_pass=yes ][!ele],
175*[natural=peak ][!ele],
176*[natural=water ][!water],
177*[amenity=place_of_worship ][!denomination],
178*[amenity=parking ][!parking],
179*[amenity=parking_entrance ][!parking] {
180 throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
181 group: tr("missing tag");
182 assertMatch: "way power=line";
183 assertNoMatch: "way power=line voltage=1";
184 assertMatch: "way power=switch";
185 assertMatch: "way power=substation";
186 assertMatch: "way power=substation transformer=foobar";
187 assertNoMatch: "way power=substation substation=foobar";
188 assertMatch: "way power=generator generator:output:electricity=yes";
189 assertNoMatch: "way power=generator";
190 assertNoMatch: "way power=generator generator:output:electricity=yes voltage=1";
191}
192
193/* {0.key} without {1.key} or {2.tag} */
194way[bridge:structure ][!bridge][man_made!=bridge],
195*[smoothness ][!highway][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking)$/],
196*[segregated ][!highway][railway!=crossing] {
197 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.tag}");
198 group: tr("missing tag");
199}
200
201/* {0.tag} without {1.tag} (info level) see #11600 #11393 #11850 */
202way[highway=motorway][!oneway][junction!=roundabout],
203way[highway=motorway_link][!oneway][junction!=roundabout] {
204 throwOther: tr("{0} without {1}", "{0.tag}", "{1.tag}");
205 group: tr("missing tag");
206}
207
208/* {0.tag} without {1.tag} */
209way[usage=penstock][man_made!=pipeline],
210way[usage=penstock][waterway!=pressurised] {
211 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
212 group: tr("missing tag");
213}
214
215/* {0.tag} without {1.tag} or {2.tag} */
216*[amenity=recycling][recycling_type!=container][recycling_type!=centre] {
217 throwWarning: tr("{0} without {1} or {2}", "{0.tag}", "{1.tag}", "{2.tag}");
218 group: tr("missing tag");
219}
220
221/* {0.key} without {1.key}, {2.tag} or {3.tag} */
222*[intermittent ][!waterway][natural!~/^(water|spring)$/][landuse!~/^(basin|reservoir)$/][ford!=yes],
223*[boat ][!waterway][natural!=water ][landuse!~/^(basin|reservoir)$/][ford!=yes] {
224 throwWarning: tr("{0} without {1}, {2}, {3} or {4}", "{0.key}", "{1.key}", "{2.tag}", "{3.tag}", "{4.tag}");
225 group: tr("missing tag");
226}
227
228/* {0.key} without {1.key}, {2.key} or {3.key}, #17253 */
229way[oneway ][!highway][!railway][!aerialway][attraction!=summer_toboggan][aeroway!~/^(runway|taxiway)$/],
230*[snowplowing][!highway][!amenity][!leisure] {
231 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.key}");
232 group: tr("missing tag");
233}
234
235/* {0.key} without {1.key}, {2.key} or {3.tag}, #17255 */
236way[incline ][!highway][!railway][aeroway!~/^(runway|taxiway)$/][attraction!=summer_toboggan],
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/* #11127, #13727 */
313way[waterway][bridge=yes][waterway!=weir] {
314 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
315 suggestAlternative: "bridge=aqueduct";
316 group: tr("suspicious tag combination");
317 fixAdd: "bridge=aqueduct";
318}
319way[waterway=weir][bridge=yes][highway] {
320 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
321 suggestAlternative: "waterway=weir + ford=yes";
322 suggestAlternative: "waterway=dam";
323 suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
324 group: tr("suspicious tag combination");
325}
326
327/* #16214 */
328relation[type=multipolygon] >[role="inner"] way[area][eval(number_of_tags()) = 1] {
329 throwWarning: tr("{0} on an inner multipolygon ring without further tags", "{0.tag}");
330 fixRemove: "area";
331 set area_yes_autofix;
332 group: tr("suspicious tag combination");
333}
334
335/* only {0.key}, see #11104 #12422 #14950 */
336*[access][eval(number_of_tags()) = 1],
337*[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
338*[name][eval(number_of_tags()) = 1],
339*[ref][eval(number_of_tags()) = 1],
340*[lit][eval(number_of_tags()) = 1] {
341 throwWarning: tr("incomplete object: only {0}", "{0.key}");
342 group: tr("missing tag");
343}
344/* only {0.key} and {1.key} */
345*[name][area][eval(number_of_tags()) = 2],
346*[name][ref][eval(number_of_tags()) = 2] {
347 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
348 group: tr("missing tag");
349}
350/* only {0.tag}, #15269 */
351*[tourism=attraction][eval(number_of_tags()) = 1] {
352 throwWarning: tr("incomplete object: only {0}", "{0.tag}");
353 group: tr("missing tag");
354}
355/* only {0.key} and {1.tag} */
356*[name][tourism=attraction][eval(number_of_tags()) = 2] {
357 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
358 group: tr("missing tag");
359}
360
361/* #9811, #11491, #12865, #14310 */
362*[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)$/],
363/* addr:postcode is used together with place in some countries */
364*[boundary][/^addr:/],
365*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
366 throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
367 group: tr("suspicious tag combination");
368 assertMatch: "node place=foo addr:housenumber=5";
369 assertMatch: "node place=foo addr:housenumber=5 addr:postcode=12345";
370 assertNoMatch: "node place=foo addr:postcode=12345";
371}
372*[!highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
373 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
374 group: tr("suspicious tag combination");
375}
376*[!highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
377 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
378 group: tr("suspicious tag combination");
379}
380way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
381 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
382 group: tr("suspicious tag combination");
383 fixRemove: "addr:postcode";
384}
385way[highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
386 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
387 group: tr("suspicious tag combination");
388}
389way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
390 throwWarning: tr("{0} together with {1}", "{0.key}", "{4.key}");
391 suggestAlternative: "postal_code";
392 group: tr("suspicious tag combination");
393 fixChangeKey: "addr:postcode=>postal_code";
394}
395
396/* #9195 */
397way[highway=footway][cycleway=lane] {
398 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
399 suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
400 group: tr("suspicious tag combination");
401}
402
403/* {0} on suspicious object */
404*[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],
405*[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],
406*[psv ][!highway][!railway][!waterway][barrier!=bollard][amenity !~ /^parking.*/],
407*[width ][!highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone][leisure!=track],
408*[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] {
409 throwWarning: tr("{0} on suspicious object", "{0.key}");
410 group: tr("suspicious tag combination");
411}
412
413*[amenity][amenity =~ /^(restaurant|cafe|fast_food|pub|place_of_worship|school|university|hospital|library|theatre|courthouse|bank|cinema|pharmacy|fuel)$/][!name][noname!=yes] {
414 throwOther: tr("{0} without {1}", "{0.tag}", "{2.key}");
415 group: tr("missing tag");
416 assertMatch: "node amenity=restaurant";
417 assertNoMatch: "node amenity=restaurant noname=yes";
418 assertNoMatch: "node amenity=restaurant name=Foobar";
419}
420
421/* #10193, #16157 */
422way[highway][barrier],
423*[highway][waterway][waterway!=dam][waterway!=weir],
424way[highway][natural][natural!=ridge],
425*[landuse][building][landuse!=retail] {
426 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
427 group: tr("suspicious tag combination");
428 assertNoMatch: "node highway=street_lamp natural=birds_nest";
429}
430
431/* #6932 */
432*[natural=water][leisure=swimming_pool] {
433 throwWarning: tr("natural water used for swimming pool");
434 group: tr("suspicious tag combination");
435 fixRemove: "natural";
436}
437
438/* #9593, #11183, #12418, #12761, #17254, #19311 */
439*[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] {
440 throwWarning: tr("sport without physical feature");
441 group: tr("missing tag");
442 assertMatch: "node sport=tennis";
443 assertNoMatch: "node sport=tennis leisure=pitch";
444 assertNoMatch: "node sport=beachvolleyball natural=beach";
445 assertNoMatch: "node sport=skiing"; /* skiing has deprecated warning */
446 assertNoMatch: "node sport=swimming tourism=hotel";
447 assertNoMatch: "node sport=10pin amenity=restaurant";
448}
449
450/* {0.key} without {1.key} or {2.key} see #10140 */
451*[building:levels][!building][!building:part],
452way[usage][!railway][!waterway][route!=railway][man_made!=pipeline] {
453 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
454 group: tr("missing tag");
455}
456
457/* any other *_name tag (with some exceptions) but not a name , see #10837 #11297 #11539 #16437 #17026 */
458*[/_name$/][!name][!old_name][!loc_name][!reg_name][!uic_name][!artist_name][!lock_name][!"osak:municipality_name"][!"osak:street_name"][noname!=yes] {
459 throwWarning: tr("alternative name without {0}", "{1.key}");
460 group: tr("missing tag");
461}
462
463/* #19604 */
464way[name][alt_name][name=*alt_name] {
465 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
466 group: tr("suspicious tag combination");
467 fixRemove: "alt_name";
468}
469
470/* #10837 */
471way[destination][!oneway?][junction!=roundabout][highway] {
472 throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
473 suggestAlternative: "destination:forward";
474 suggestAlternative: "destination:backward";
475}
476
477/* #11389, #19010 */
478way["maxspeed:forward"=*"maxspeed:backward"][!maxspeed] {
479 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
480 suggestAlternative: "maxspeed";
481 group: tr("suspicious tag combination");
482 fixChangeKey: "maxspeed:forward=>maxspeed";
483 fixRemove: "maxspeed:backward";
484}
485way["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed][maxspeed] {
486 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
487 set AllSameMaxspeed;
488 suggestAlternative: "maxspeed";
489 group: tr("suspicious tag combination");
490 fixRemove: "maxspeed:forward";
491 fixRemove: "maxspeed:backward";
492}
493way["cycleway:left"=*"cycleway:right"][!cycleway] {
494 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
495 suggestAlternative: "cycleway";
496 group: tr("suspicious tag combination");
497 fixChangeKey: "cycleway:left=>cycleway";
498 fixRemove: "cycleway:right";
499}
500way["cycleway:left"=*cycleway]["cycleway:right"=*cycleway][cycleway] {
501 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
502 set AllSameCycleway;
503 suggestAlternative: "cycleway";
504 group: tr("suspicious tag combination");
505 fixRemove: "cycleway:left";
506 fixRemove: "cycleway:right";
507}
508way["sidewalk:left"=*"sidewalk:right"][!sidewalk] {
509 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
510 suggestAlternative: "sidewalk";
511 group: tr("suspicious tag combination");
512 fixChangeKey: "sidewalk:left=>sidewalk";
513 fixRemove: "sidewalk:right";
514}
515way["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk][sidewalk] {
516 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
517 set AllSameSidewalk;
518 suggestAlternative: "sidewalk";
519 group: tr("suspicious tag combination");
520 fixRemove: "sidewalk:left";
521 fixRemove: "sidewalk:right";
522}
523way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed,
524way["cycleway:left"]["cycleway:right"][cycleway]!.AllSameCycleway,
525way["sidewalk:left"]["sidewalk:right"][sidewalk]!.AllSameSidewalk {
526 throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
527 group: tr("suspicious tag combination");
528}
529way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
530way["maxspeed:backward"][maxspeed][!"maxspeed:forward"],
531way["cycleway:left"][cycleway][!"cycleway:right"],
532way["cycleway:right"][cycleway][!"cycleway:left"],
533way["sidewalk:left"][sidewalk][!"sidewalk:right"],
534way["sidewalk:right"][sidewalk][!"sidewalk:left"] {
535 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
536 group: tr("suspicious tag combination");
537}
538
539/* #11837 */
540way[layer][layer<0][bridge][bridge!=no][location!=underground][indoor!=yes][!tunnel],
541way[layer][layer>0][tunnel][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
542 throwWarning: tr("{0} together with {1}", "{2.tag}", "{0.tag}");
543 group: tr("suspicious tag combination");
544}
545
546/* #12942 */
547relation[oneway][type!=route] {
548 throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
549}
550
551/* #9182 */
552way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
553 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}");
554 group: tr("suspicious tag combination");
555}
556way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
557 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}");
558 group: tr("suspicious tag combination");
559}
560
561/* #13144, #15536 */
562*[unisex=yes][female=yes][male!=yes][shop=hairdresser],
563*[unisex=yes][male=yes][female!=yes][shop=hairdresser] {
564 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
565 group: tr("suspicious tag combination");
566}
567*[unisex=yes][female=yes][male=yes][shop=hairdresser] {
568 throwWarning: tr("{0} together with {1} and {2}. Remove {1} and {2}", "{0.tag}", "{1.tag}", "{2.tag}");
569 group: tr("suspicious tag combination");
570 fixRemove: "female";
571 fixRemove: "male";
572}
573*[female=yes][male=yes][!unisex][shop=hairdresser] {
574 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
575 suggestAlternative: "unisex=yes";
576 group: tr("suspicious tag combination");
577 fixRemove: "female";
578 fixRemove: "male";
579 fixAdd: "unisex=yes";
580}
581
582/* {1.key} without {2.tag} see #13138, #14468 */
583way!:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir], /* water=intermittent is deprecated and has an own warning */
584area:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir] {
585 throwWarning: tr("{0} without {1}", "{1.key}", "{2.tag}");
586 group: tr("missing tag");
587}
588
589/* #13680 */
590area[golf=bunker][natural=beach] {
591 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
592 suggestAlternative: "natural=sand";
593 suggestAlternative: "surface=sand";
594 group: tr("suspicious tag combination");
595}
596
597/* #13705 */
598relation[type=multipolygon][building] > way {
599 set part_of_building_MP;
600}
601way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier]!.part_of_building_MP {
602 /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
603 throwOther: tr("possibly missing {0} tag", "{1.key}");
604 group: tr("missing tag");
605}
606
607/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
608way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][turn:lanes ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
609way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][change:lanes ][tag(lanes)!=eval(count(split("|", tag("change:lanes"))))],
610way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][maxspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("maxspeed:lanes"))))],
611way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][minspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("minspeed:lanes"))))],
612way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][destination:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:lanes"))))],
613way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][destination:ref:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:ref:lanes"))))],
614way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
615 throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
616 group: tr("suspicious tag combination");
617}
618
619/* #14125, #14323, #18185 */
620way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][junction!=roundabout][lanes>2][get(split(".", tag(lanes)/2), 1)=5] {
621 throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
622 group: tr("missing tag");
623 assertNoMatch: "way highway=primary lanes=2";
624 assertNoMatch: "way highway=primary lanes=3 lanes:backward=2";
625 assertNoMatch: "way highway=primary lanes=3 oneway=-1";
626 assertNoMatch: "way highway=primary lanes=4";
627 assertMatch: "way highway=primary lanes=3";
628}
629
630/* #10932 */
631way[highway][!lanes][/^.*:lanes$/]!.MissingKeyWarning,
632way[highway][!lanes:forward][/^.*:lanes:forward$/],
633way[highway][!lanes:backward][/^.*:lanes:backward$/],
634way[highway][!lanes:both_ways][/^.*:lanes:both_ways$/] {
635 throwWarning: tr("{0} without {1}", "{2.key}", "{1.key}");
636 group: tr("missing tag");
637 assertMatch: "way highway=primary turn:lanes=left|right";
638 assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
639 assertMatch: "way highway=primary turn:lanes:forward=left|right";
640 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
641}
642
643/* #15774 */
644node[emergency=fire_hydrant][fire_hydrant:count][fire_hydrant:count!=1] {
645 throwOther: tr("{0} together with {1}. Tag each hydrant separately.", "{0.tag}", "{1.tag}");
646}
647
648/* #12502 */
649node[leisure=park][natural=tree] {
650 throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
651 group: tr("suspicious tag combination");
652 fixRemove: "leisure";
653}
654
655/* #17305 */
656area[boundary=administrative][landuse=residential] {
657 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
658 group: tr("suspicious tag combination");
659}
660
661/* #17391 */
662way[highway=pedestrian][width][width<3] {
663 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
664 suggestAlternative: "highway=footway";
665 group: tr("suspicious tag combination");
666 fixAdd: "highway=footway";
667 assertMatch: "way highway=pedestrian width=0.8";
668 assertMatch: "way highway=pedestrian width=1";
669 assertNoMatch: "way highway=pedestrian width=3";
670 assertNoMatch: "way highway=pedestrian width=5.5";
671}
672
673/* see #17623 */
674way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|bus_guideway|bridleway/][area!=yes] {
675 throwOther: tr("A linear object {0} without {1} has a tag indicating that it is an area.", "{1.tag}", "{3.tag}");
676 group: tr("suspicious tag combination");
677}
678
679/* #17804 */
680area[cemetery=sector][landuse=cemetery] {
681 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
682 group: tr("suspicious tag combination");
683}
684
685/* #17967 */
686*[highway=cycleway][cycleway=track] {
687 throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
688 group: tr("suspicious tag combination");
689 fixRemove: "cycleway";
690}
691
692/* #17973, #18183, #18331 */
693way[highway=path ][foot][foot!=no ][foot!=use_sidepath ][!segregated][bicycle][bicycle!=no][bicycle!=use_sidepath][bicycle!=dismount]!.unpaved_surface,
694way[highway=footway ][bicycle][bicycle!=no][bicycle!=use_sidepath][!segregated][bicycle!=dismount]!.unpaved_surface,
695way[highway=cycleway][foot][foot!=no ][foot!=use_sidepath ][!segregated]!.unpaved_surface {
696 throwWarning: tr("Combined foot- and cycleway without {0}.", "{4.key}");
697 group: tr("missing tag");
698}
699
700/* #17989 */
701node[emergency_ward_entrance][emergency!=emergency_ward_entrance] {
702 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
703 group: tr("missing tag");
704 fixAdd: "emergency=emergency_ward_entrance";
705}
706
707/* #18203 */
708way[construction][construction!=yes][construction!=minor][highway][highway!=construction] {
709 throwWarning: tr("{0} together with {1}", "{3.tag}", "{0.tag}");
710 group: tr("suspicious tag combination");
711}
712
713/* #18374 */
714*[amenity=recycling][collection_times="24/7"][!opening_hours],
715*[amenity=recycling][collection_times ][!opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
716 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
717 group: tr("suspicious tag combination");
718 fixChangeKey: "collection_times => opening_hours";
719 assertMatch: "node amenity=recycling collection_times=\"Mo-Fr 06:00-20:00\"";
720 assertNoMatch: "node amenity=recycling collection_times=\"Mo-Fr 15:00\"";
721 assertNoMatch: "node amenity=recycling collection_times=\"Mo 08:00-11:00\"";
722 assertNoMatch: "node amenity=recycling collection_times=\"Sa[2,4] 8:00-11:00\"";
723}
724*[amenity=recycling][collection_times="24/7"][opening_hours],
725*[amenity=recycling][collection_times ][opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
726 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
727 group: tr("suspicious tag combination");
728}
729
730/* #19018 */
731way[highway][crossing][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/] {
732 throwWarning: tr("{0} together with {1}. Should be used on a minor highway type or a node", "{1.key}", "{0.tag}");
733 group: tr("suspicious tag combination");
734 fixRemove: "crossing";
735 assertMatch: "way highway=trunk crossing=unmarked";
736 assertNoMatch: "way highway=construction construction=footway crossing=unmarked";
737}
738
739/* #19066 */
740*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
741 throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
742 group: tr("missing tag");
743}
744*[source:addr][!/^addr:/] {
745 throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
746 group: tr("missing tag");
747 assertMatch: "node source:addr=postman";
748 assertNoMatch: "node source:addr=postman addr:housenumber=42";
749}
750*[source:maxspeed][!/^maxspeed:?/] {
751 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
752 group: tr("missing tag");
753}
754
755/* #16898, tower vs. communications_tower, wiki suggests 100m as rough guideline, so we warn for < 75m */
756*[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' */
757 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
758 suggestAlternative: "man_made=tower + tower:type=communication + height";
759 group: tr("suspicious tag combination");
760 assertMatch: "node man_made=communications_tower height=58";
761 assertMatch: "node man_made=communications_tower height=\"74 m\"";
762 assertMatch: "node man_made=communications_tower height=0.8";
763 assertMatch: "node man_made=communications_tower height=245'";
764 assertMatch: "node man_made=communications_tower height=\"224.22 ft\"";
765 assertMatch: "node man_made=communications_tower height=231'10.22\"";
766 assertNoMatch: "node man_made=communications_tower height=\"75 m\"";
767 assertNoMatch: "node man_made=communications_tower height=75.72";
768 assertNoMatch: "node man_made=communications_tower height=\"328.22 ft\"";
769 assertNoMatch: "node man_made=communications_tower height=4358'8\"";
770 assertNoMatch: "node height=4358'";
771}
772
773/* #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. */
774*[fixme][count(split(" ", tag("fixme"))) == 1][tag(tag("fixme")) != "none"],
775*[FIXME][count(split(" ", tag("FIXME"))) == 1][tag(tag("FIXME")) != "none"] {
776 throwWarning: tr("{0} together with {1}. Is the fixme fixed?", "{0.tag}", "{0.value}");
777 group: tr("suspicious tag combination");
778 assertMatch: "way name=\"Florist Gump\" fixme=name";
779 assertMatch: "way name=\"Florist Gump\" FIXME=name";
780 assertNoMatch: "way fixme=name";
781 assertNoMatch: "way name=\"Florist Gump\"";
782 assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
783}
784
785/* #19094 */
786way[highway][placement=transition][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition],
787way[highway][!placement][/^placement:.*$/][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition] {
788 throwWarning: tr("Use {0} only as value of {1}", "transition", "placement");
789 set PlacementTransitionWarning;
790 fixAdd: "placement=transition";
791 fixRemove: "placement:forward";
792 fixRemove: "placement:backward";
793 fixRemove: "placement:both_ways";
794 assertMatch: "way highway=primary placement=transition placement:both_ways=transition";
795 assertMatch: "way highway=primary placement:backward=transition placement:forward=transition";
796 assertNoMatch: "way highway=primary placement:backward=middle_of:1 placement:forward=transition";
797 assertNoMatch: "way highway=primary placement=middle_of:1 placement:backward=transition placement:forward=transition";
798}
799way[highway][placement][/^placement:.*$/]!.PlacementTransitionWarning,
800way[highway]["placement:forward"]["placement:backward"]!.PlacementTransitionWarning,
801way[highway]["placement:forward"]["placement:both_ways"]!.PlacementTransitionWarning,
802way[highway]["placement:backward"]["placement:both_ways"]!.PlacementTransitionWarning {
803 throwError: tr("{0} together with {1}", "{1.key}", "{2.key}");
804 group: tr("suspicious tag combination");
805 assertMatch: "way highway=primary placement=left_of:2 placement:forward=right_of:1";
806 assertNoMatch: "way highway=primary placement:forward=right_of:1";
807 assertNoMatch: "way highway=primary placement:forward=transition placement:both_ways=transition";
808}
Note: See TracBrowser for help on using the repository browser.