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

Last change on this file since 16859 was 16859, checked in by Klumbumbus, 6 years ago

fix #19650 - Do not warn about incline on leisure=slipway (patch by gileri)

  • 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} */
236*[toll ][!highway][!barrier][route!~/^(ferry|road)$/] {
237 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.tag}");
238 group: tr("missing tag");
239}
240
241/* {0.tag} together with {1.key}, see #17664, #17707, #16464, #10837, #14034, #9389, #11977, #13156, #16888 */
242*[power=plant][/^generator:/],
243*[power=generator][/^plant:/],
244*[power=plant][voltage],
245*[power=plant][frequency],
246*[internet_access=no][internet_access:fee],
247node[power=transformer][voltage],
248node[transformer=distribution][voltage][power=pole],
249*[amenity=vending_machine][shop],
250*[noname?][name],
251way[oneway=yes][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][oneway:bicycle!=no][oneway:psv!=no],
252way[oneway=yes][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][oneway:bicycle!=no][oneway:psv!=no],
253way[oneway=-1 ][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][oneway:bicycle!=no][oneway:psv!=no],
254way[oneway=-1 ][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][oneway:bicycle!=no][oneway:psv!=no] {
255 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
256 group: tr("suspicious tag combination");
257 assertMatch: "way power=plant generator:source=wind";
258 assertMatch: "way power=generator plant:source=combustion";
259}
260
261/* {0.tag} together with {1.tag} (info level), see #9696 */
262way[highway=footway][oneway=no] {
263 throwOther: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
264 group: tr("suspicious tag combination");
265}
266
267/* {0.tag} together with {1.tag}, see #18411, #17950, #17330, #17623, #17592, #17594, #17542, #16861, #16147, #10186 */
268*[barrier=kerb][kerb=no],
269way[highway=construction][construction=yes],
270way[railway=construction][construction=yes],
271*[man_made=bridge][bridge=yes],
272*[man_made=tunnel][tunnel=yes],
273*[amenity=police][police],
274node[highway=crossing][crossing=no],
275node[railway=crossing][crossing=no],
276way[junction=yes][highway],
277way[tracktype=grade1][surface].unpaved_surface,
278way[tracktype=grade2][surface][surface=~/^(sand|mud)$/],
279way[segregated][bicycle=no],
280way[segregated][foot=no],
281way[man_made=pipeline][tunnel=flooded],
282way[waterway=canal][tunnel=yes] {
283 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
284 group: tr("suspicious tag combination");
285}
286
287/* {0.tag} together with {1.tag} (error level) */
288relation[type=multipolygon][area=no] {
289 throwError: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
290 group: tr("suspicious tag combination");
291}
292
293/* {0.key} together with {1.key}, #18267, #17630, #17604 */
294node[marker][cover],
295node[marker][voltage],
296node[marker][pressure],
297node[marker][diameter],
298node[marker][substance],
299*[building:part][building],
300*[addr:street][addr:place][outside("CZ,DK")] {
301 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
302 group: tr("suspicious tag combination");
303}
304
305/* {0.tag} together with {1.tag} and {2.key}, #18471 */
306way[highway=~/^(cycleway|footway|path)$/][segregated=no][sidewalk =~/^(left|right|both)$/] {
307 throwWarning: tr("{0} together with {1} and {2}", "{0.tag}", "{1.tag}", "{2.key}");
308 group: tr("suspicious tag combination");
309}
310
311/* #11127, #13727 */
312way[waterway][bridge=yes][waterway!=weir] {
313 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
314 suggestAlternative: "bridge=aqueduct";
315 group: tr("suspicious tag combination");
316 fixAdd: "bridge=aqueduct";
317}
318way[waterway=weir][bridge=yes][highway] {
319 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
320 suggestAlternative: "waterway=weir + ford=yes";
321 suggestAlternative: "waterway=dam";
322 suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
323 group: tr("suspicious tag combination");
324}
325
326/* #16214 */
327relation[type=multipolygon] >[role="inner"] way[area][eval(number_of_tags()) = 1] {
328 throwWarning: tr("{0} on an inner multipolygon ring without further tags", "{0.tag}");
329 fixRemove: "area";
330 set area_yes_autofix;
331 group: tr("suspicious tag combination");
332}
333
334/* only {0.key}, see #11104 #12422 #14950 */
335*[access][eval(number_of_tags()) = 1],
336*[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
337*[name][eval(number_of_tags()) = 1],
338*[ref][eval(number_of_tags()) = 1],
339*[lit][eval(number_of_tags()) = 1] {
340 throwWarning: tr("incomplete object: only {0}", "{0.key}");
341 group: tr("missing tag");
342}
343/* only {0.key} and {1.key} */
344*[name][area][eval(number_of_tags()) = 2],
345*[name][ref][eval(number_of_tags()) = 2] {
346 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
347 group: tr("missing tag");
348}
349/* only {0.tag}, #15269 */
350*[tourism=attraction][eval(number_of_tags()) = 1] {
351 throwWarning: tr("incomplete object: only {0}", "{0.tag}");
352 group: tr("missing tag");
353}
354/* only {0.key} and {1.tag} */
355*[name][tourism=attraction][eval(number_of_tags()) = 2] {
356 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
357 group: tr("missing tag");
358}
359
360/* #9811, #11491, #12865, #14310 */
361*[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)$/],
362/* addr:postcode is used together with place in some countries */
363*[boundary][/^addr:/],
364*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
365 throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
366 group: tr("suspicious tag combination");
367 assertMatch: "node place=foo addr:housenumber=5";
368 assertMatch: "node place=foo addr:housenumber=5 addr:postcode=12345";
369 assertNoMatch: "node place=foo addr:postcode=12345";
370}
371*[!highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
372 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
373 group: tr("suspicious tag combination");
374}
375*[!highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
376 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
377 group: tr("suspicious tag combination");
378}
379way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
380 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
381 group: tr("suspicious tag combination");
382 fixRemove: "addr:postcode";
383}
384way[highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
385 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
386 group: tr("suspicious tag combination");
387}
388way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
389 throwWarning: tr("{0} together with {1}", "{0.key}", "{4.key}");
390 suggestAlternative: "postal_code";
391 group: tr("suspicious tag combination");
392 fixChangeKey: "addr:postcode=>postal_code";
393}
394
395/* #9195 */
396way[highway=footway][cycleway=lane] {
397 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
398 suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
399 group: tr("suspicious tag combination");
400}
401
402/* {0} on suspicious object, #17255, #19650 */
403*[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],
404*[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],
405*[psv ][!highway][!railway][!waterway][barrier!=bollard][amenity !~ /^parking.*/],
406*[width ][!highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone][leisure!=track],
407*[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],
408way[incline][!highway][!railway][aeroway!~/^(runway|taxiway)$/][attraction!=summer_toboggan][leisure!=slipway] {
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.