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

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

fix #19742 - Warn about much likely wrong direction tag on highway=mini_roundabout, remove icon for solely direction=clockwise tag

  • Property svn:eol-style set to native
File size: 39.6 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}
817
818/* #19742 */
819node:righthandtraffic[highway=mini_roundabout][direction=clockwise] {
820 throwWarning: tr("{0} together with {1} at right-hand traffic", "{1.tag}", "{2.tag}");
821 group: tr("suspicious tag combination");
822}
823node!:righthandtraffic[highway=mini_roundabout][direction=anticlockwise] {
824 throwWarning: tr("{0} together with {1} at left-hand traffic", "{1.tag}", "{2.tag}");
825 group: tr("suspicious tag combination");
826}
Note: See TracBrowser for help on using the repository browser.