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

Last change on this file since 19165 was 19165, checked in by taylor.smock, 4 months ago

Fix #23298: Improper warning for aerialway=zip_line

Exclude aerialway from combinations check and add usage values to aerialway
presets (where someone has already used the key with the aerialway tag).

  • Property svn:eol-style set to native
File size: 53.5 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}
8way[surface=~/^(paved|asphalt|cobblestone|cobblestone:flattened|sett|concrete|concrete:plates|paving_stones|metal|wood|unhewn_cobblestone)$/] {
9 set fully_paved_surface;
10}
11
12/* {0.key} without {1.key} (warning level) */
13node[voltage:primary ][!transformer],
14node[voltage:secondary ][!transformer],
15node[voltage:tertiary ][!transformer],
16way[junction ][!highway][junction!=yes][!area:highway],
17way[living_street ][!highway],
18way[maintenance ][!highway],
19way[median ][!highway],
20way[motorroad ][!highway],
21node[ntd_id ][!highway],
22way[sac_scale ][!highway],
23way[sidewalk ][!highway],
24way[step_count ][!highway][man_made!=tower],
25way[tracktype ][!highway],
26way[trail_visibility ][!highway], /* #15029 */
27way[trolley_wire ][!highway],
28way[zip_left ][!highway],
29way[zip_right ][!highway],
30way[detail ][!railway][route!=railway],
31way[eddy_current_brake ][!railway][route!=railway],
32way[electrified ][!railway][route!=railway][!highway], /* #16007 */
33way[etcs ][!railway][route!=railway],
34way[gauge ][!railway][route!=railway],
35way[grade_of_track ][!railway][route!=railway],
36way[kursbuchstrecke ][!railway][route!=railway],
37way[lzb ][!railway][route!=railway],
38way[old_railway_operator ][!railway][route!=railway],
39way[operating_procedure ][!railway][route!=railway],
40way[pzb ][!railway][route!=railway],
41way[structure_gauge ][!railway][route!=railway],
42way[tilting_technology ][!railway][route!=railway],
43way[track_class ][!railway][route!=railway],
44way[tracks ][!railway][route!=railway],
45way[traffic_mode ][!railway][route!=railway],
46way[workrules ][!railway][route!=railway],
47way[length_unit ][!waterway],
48way[canal ][!waterway],
49way[have_riverbank ][!waterway],
50area[min_height ][!height][/^(building|building:part)$/], /* #21286 */
51area[building:min_level ][!building:levels][/^(building|building:part)$/], /* #21286 */
52*[border_type ][!boundary],
53*[piste:difficulty ][!piste:type],
54*[place ][!name][place!=islet][place!=plot][noname!=yes],
55*[transformer ][!power],
56*[source:date ][!source],
57*[source:name ][!name][noname!=yes],
58*[source:maxspeed:forward ][!maxspeed:forward][!maxspeed],
59*[source:maxspeed:backward ][!maxspeed:backward][!maxspeed],
60*[source:building ][!building],
61*[source:ref ][!ref][noref!=yes],
62*[source:population ][!population],
63*[source:postal_code ][!postal_code],
64*[source:ele ][!ele],
65*[source:ref:INSEE ][!ref:INSEE],
66*[source:lit ][!lit],
67*[source:hgv ][!hgv],
68*[source:highway ][!highway],
69*[source:maxaxleload ][!maxaxleload],
70*[source:surface ][!surface],
71*[source:bridge ][!bridge],
72*[source:old_name ][!old_name],
73*[source:bicycle ][!bicycle],
74*[source:designation ][!designation],
75*[source:height ][!height],
76*[source:lanes ][!lanes],
77*[source:postcode ][!addr:postcode],
78*[source:housenumber ][!addr:housenumber],
79*[source:addr:postcode ][!addr:postcode],
80*[source:addr:housenumber ][!addr:housenumber] {
81 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
82 group: tr("missing tag");
83 assertMatch: "node source:addr:postcode=postman";
84}
85
86/* {0.key} without {1.key} (info level), #21736 */
87way[lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1],
88way[lanes:backward][!lanes:forward][oneway!=yes][oneway!=-1],
89way[lanes:forward][!lanes:backward][oneway=~/^(yes|-1)$/][/^oneway:(psv|bus)$/=~/^no$/],
90way[lanes:backward][!lanes:forward][oneway=~/^(yes|-1)$/][/^oneway:(psv|bus)$/=~/^no$/],
91*[leaf_type ][!leaf_cycle],
92*[leaf_cycle][!leaf_type] {
93 throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
94 group: tr("missing tag");
95}
96
97/* {0.key} without {1.tag}, #17997 */
98node[railway:switch ][railway!=switch],
99*[generator:source ][power!=generator],
100*[generator:method ][power!=generator],
101*[generator:type ][power!=generator],
102node[fire_hydrant:type ][emergency!=fire_hydrant][disused:emergency!=fire_hydrant],
103node[manhole ][man_made!=manhole],
104way[fence_type ][barrier!=fence],
105*[recycling_type ][amenity!=recycling],
106*[information ][tourism!=information],
107node[board_type ][information!=board],
108*[shelter_type ][amenity!=shelter],
109node[lamp_type ][highway!=street_lamp],
110node[map_type ][information!=map],
111*[archaeological_site ][historic!=archaeological_site],
112*[artwork_type ][tourism!=artwork][exhibit!=artwork],
113*[castle_type ][historic!=castle],
114*[parking ][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking)$/][parking!=yes][parking!=no],
115way[cutline ][man_made!=cutline],
116*[zoo ][tourism!=zoo],
117*[bunker_type ][military!=bunker] {
118 throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
119 group: tr("missing tag");
120}
121
122/* #20742 - No warning about barrier with inappropriate access tags on highway, #22739 */
123way[highway=~/^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link)$/][!access][!vehicle] > node[barrier][barrier!~/entrance|border_control|cattle_grid|height_restrictor|toll_booth/][!access][!motor_vehicle][!vehicle] {
124 throwWarning: tr("{0} without access tags such as {1}, {2}, or {3}.", "{0.tag}", "{2.key}", "{3.key}", "{4.key}");
125 group: tr("suspicious barrier");
126}
127
128way[highway=~/^(footway|path|bridleway|cycleway|service)$/] > node[barrier]:connection {
129 set barrierSmallRoadConnection;
130}
131
132way[highway=~/^(unclassified|residential)$/] >[index = 1] node.barrierSmallRoadConnection,
133way[highway=~/^(unclassified|residential)$/] >[index = -1] node.barrierSmallRoadConnection {
134 set barrierAllowedAtConnection;
135}
136
137/* 20742; warnings for major roads set by other rule, also issue 20742 */
138way[highway=~/^(unclassified|residential)$/] > node[barrier][barrier!=bollard][!access][!access:conditional][!vehicle][!vehicle:conditional][!motor_vehicle][!motor_vehicle:conditional].barrierSmallRoadConnection!.barrierAllowedAtConnection {
139 throwWarning: tr("Suspicious {0} on a connection of a small highway with a larger highway", "{0.tag}");
140 set hasWarningForBarrierOnWay;
141 group: tr("suspicious barrier");
142}
143
144way[highway=~/^(unclassified|residential)$/] > node[barrier].barrierSmallRoadConnection!.hasWarningForBarrierOnWay {
145 throwOther: tr("Suspicious {0} on a connection of a small highway with a larger highway", "{0.tag}");
146 group: tr("suspicious barrier");
147}
148
149/* {0.key} without {1.tag} or {2.tag} */
150*[bridge:movable ][bridge!=movable][man_made!=bridge],
151*[substation ][power!=substation][pipeline!=substation],
152*[reservoir_type ][landuse!=reservoir][water!=reservoir],
153way[waterway=pressurised ][tunnel!=flooded][man_made!=pipeline] {
154 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.tag}", "{2.tag}");
155 group: tr("missing tag");
156}
157
158/* {0.key} without {1.tag}, {2.tag} or {3.tag}, #15107, #20241 */
159*[iata ][aeroway!=aerodrome][aeroway!=heliport][aeroway!=helipad],
160*[icao ][aeroway!=aerodrome][aeroway!=heliport][aeroway!=helipad] {
161 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.tag}", "{2.tag}", "{3.tag}");
162 group: tr("missing tag");
163}
164
165/* {0.key} without {1.tag}, {2.tag}, {3.tag} or {4.tag}, #20530 */
166*[pump_mechanism][man_made!=pump][man_made!=windpump][man_made!=water_well][man_made!=petroleum_well] {
167 throwWarning: tr("{0} without {1}, {2}, {3} or {4}", "{0.key}", "{1.tag}", "{2.tag}", "{3.tag}", "{4.tag}");
168 group: tr("missing tag");
169}
170
171/* {0.tag} without {1.key} (warning level), #18411, #18246, #20530, #20960 */
172way[railway=construction][!construction][!construction:railway],
173way[highway=construction][!construction][!construction:highway],
174area[building=construction][!construction][!construction:building],
175area[landuse=construction][!construction][!construction:landuse],
176node[traffic_sign=maxspeed][!maxspeed][!/^maxspeed:.+/],
177*[actuator=manual][!handle],
178*[mechanical_driver=manual][!handle],
179node[emergency=fire_hydrant][!fire_hydrant:type],
180way[ boundary=administrative][!admin_level],
181relation[boundary=administrative][!admin_level],
182relation[route=bicycle ][!network][type=route],
183relation[route=hiking ][!network][type=route],
184relation[route=foot ][!network][type=route],
185relation[route=horse ][!network][type=route],
186relation[route=piste][!piste:type][type=route],
187relation[route=ski ][!piste:type][type=route],
188*[tourism=information][!information],
189*[leisure=pitch][!sport],
190*[aeroway=terminal][!building],
191*[office=government][!government],
192*[power=generator][!generator:source],
193*[amenity=social_facility][!social_facility],
194*[amenity=place_of_worship][!religion],
195*[man_made=tower][!tower:type] {
196 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}");
197 group: tr("missing tag");
198 assertNoMatch: "node traffic_sign=maxspeed maxspeed:hgv:conditional=\"80 @ (weight>7.5 AND 22:00-05:00)\"";
199}
200
201/* {0.tag} without {1.key} (info level), #15107 */
202*[aeroway=runway ][!ref],
203*[aeroway=runway ][!surface],
204node[highway=crossing ][!crossing],
205way[highway=track ][!tracktype],
206way[power=cable ][!location],
207node[power=transformer ][!voltage:primary],
208node[power=transformer ][!voltage:secondary],
209node[transformer=distribution ][!voltage:primary][power=pole],
210node[transformer=distribution ][!voltage:secondary][power=pole],
211way[power=line ][!voltage],
212way[power=minor_line ][!voltage],
213way[power=cable ][!voltage],
214*[power=generator ][!voltage][generator:output:electricity],
215*[power=plant ][!voltage][plant:output:electricity],
216*[power=substation ][!substation],
217*[power=switch ][!switch],
218*[power=transformer ][!transformer],
219*[amenity=bank ][!operator],
220*[amenity=cinema ][!operator],
221*[amenity=fast_food ][!operator],
222*[amenity=fuel ][!operator],
223*[mountain_pass=yes ][!ele],
224*[natural=peak ][!ele],
225*[natural=water ][!water],
226*[amenity=place_of_worship ][!denomination],
227*[amenity=parking ][!parking],
228*[amenity=parking_entrance ][!parking] {
229 throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
230 group: tr("missing tag");
231 assertMatch: "way power=line";
232 assertNoMatch: "way power=line voltage=1";
233 assertMatch: "way power=switch";
234 assertMatch: "way power=substation";
235 assertMatch: "way power=substation transformer=foobar";
236 assertNoMatch: "way power=substation substation=foobar";
237 assertMatch: "way power=generator generator:output:electricity=yes";
238 assertNoMatch: "way power=generator";
239 assertNoMatch: "way power=generator generator:output:electricity=yes voltage=1";
240}
241
242/* {0.key} without {1.key} or {2.tag} */
243way[bridge:structure ][!bridge][man_made!=bridge],
244*[segregated ][!highway][railway!=crossing] {
245 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.tag}");
246 group: tr("missing tag");
247}
248/* {0.key} without {1.key} or {2.tag}, #22547 */
249way[tunnel=culvert][man_made!=tunnel][!waterway] {
250 throwWarning: tr("{0} without {1} or {2}", "{0.tag}", "{1.tag}", "{2.key}");
251 group: tr("suspicious tag combination");
252 set TunnelCulvertWithoutWaterway;
253}
254
255/* {0.tag} without {1.tag} (info level) see #11600 #11393 #11850 */
256way[highway=motorway][!oneway][junction!=roundabout],
257way[highway=motorway_link][!oneway][junction!=roundabout] {
258 throwOther: tr("{0} without {1}", "{0.tag}", "{1.tag}");
259 group: tr("missing tag");
260}
261
262/* {0.tag} without {1.tag} */
263way[usage=penstock][man_made!=pipeline],
264way[usage=penstock][waterway!=pressurised] {
265 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
266 group: tr("missing tag");
267}
268
269/* {0.tag} without {1.tag} or {2.tag} */
270*[amenity=recycling][recycling_type!=container][recycling_type!=centre] {
271 throwWarning: tr("{0} without {1} or {2}", "{0.tag}", "{1.tag}", "{2.tag}");
272 group: tr("missing tag");
273}
274
275/* {0.key} without {1.key}, {2.tag}, {3.tag} or {4.key} */
276*[smoothness][!highway][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking)$/][barrier!=kerb][!kerb] {
277 throwWarning: tr("{0} without {1}, {2}, {3} or {4}", "{0.key}", "{1.key}", "{2.tag}", "{3.tag}", "{4.key}");
278 group: tr("missing tag");
279}
280
281/* {0.key} without {1.key}, {2.tag}, {3.tag} or {4.tag} */
282*[intermittent ][!waterway][natural!~/^(water|spring)$/][landuse!~/^(basin|reservoir)$/][ford!~/^(yes|stepping_stones)$/],
283*[boat ][!waterway][natural!=water ][landuse!~/^(basin|reservoir)$/][ford!=yes] {
284 throwWarning: tr("{0} without {1}, {2}, {3} or {4}", "{0.key}", "{1.key}", "{2.tag}", "{3.tag}", "{4.tag}");
285 group: tr("missing tag");
286}
287
288/* {0.key} without {1.key}, {2.key} or {3.key} */
289*[snowplowing][!highway][!amenity][!leisure] {
290 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.key}");
291 group: tr("missing tag");
292}
293
294/* {0.key} without {1.key}, {2.key} or {3.tag} */
295*[toll ][!highway][!barrier][route!~/^(ferry|road)$/] {
296 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.tag}");
297 group: tr("missing tag");
298}
299
300/* {0.tag} together with {1.key}, see #22576, #17664, #17707, #16464, #10837, #14034, #9389, #11977, #13156, #16888, #20530, #21736, #22076, #21778 */
301*[amenity=marketplace][highway],
302*[power=plant][/^generator:/],
303*[power=generator][/^plant:/],
304*[power=plant][voltage],
305*[power=plant][frequency],
306*[internet_access=no][internet_access:fee],
307node[power=transformer][voltage],
308node[transformer=distribution][voltage][power=pole],
309*[amenity=vending_machine][shop],
310*[noname?][name],
311*[noref?][ref],
312*[nohousenumber?][addr:housenumber],
313*[actuator][handle][actuator !~ /(^|;)manual(;|$)/],
314*[mechanical_driver][handle][mechanical_driver !~ /(^|;)manual(;|$)/],
315way[oneway? ][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/],
316way[oneway? ][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/],
317way[oneway=-1][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/],
318way[oneway=-1][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/] {
319 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
320 group: tr("suspicious tag combination");
321 assertMatch: "way power=plant generator:source=wind";
322 assertMatch: "way power=generator plant:source=combustion";
323 assertMatch: "way oneway=yes bicycle:backward=destination";
324 assertNoMatch: "way oneway=-1 bicycle:forward=destination oneway:bicycle=no";
325 assertNoMatch: "way oneway=yes bicycle:backward=destination oneway:bicycle=no";
326 assertNoMatch: "way oneway=yes bicycle:backward:conditional=\"yes @ (Mo-Fr)\" oneway:bicycle:conditional=\"no @ (Mo-Fr)\"";
327}
328
329/* {0.tag} together with {1.tag} (info level), see #9696 */
330way[highway=footway][oneway=no] {
331 throwOther: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
332 group: tr("suspicious tag combination");
333}
334
335/* {0.tag} together with {1.tag}, see #18411, #17950, #17330, #17623, #17592, #17594, #17542, #16861, #16147, #10186, #18815, #20960 */
336*[barrier=kerb][kerb=no],
337way[highway=construction][construction][construction=~/^(yes|minor|no)$/],
338way[railway=construction][construction][construction=~/^(yes|minor|no)$/],
339area[building=construction][construction][construction=~/^(yes|minor|no)$/],
340area[landuse=construction][construction][construction=~/^(yes|minor|no)$/],
341*[man_made=bridge][bridge=yes],
342*[man_made=tunnel][tunnel=yes],
343*[amenity=police][police],
344node[highway=crossing][crossing=no],
345node[railway=crossing][crossing=no],
346way[junction=yes][highway],
347way[tracktype=grade1][surface].unpaved_surface,
348way[tracktype=grade2][surface][surface=~/^(sand|mud|ground|earth|dirt|grass|ice|salt|snow|woodchips)$/],
349way[tracktype=grade4][surface].fully_paved_surface,
350way[tracktype=grade5][surface].fully_paved_surface,
351way[segregated][bicycle=no],
352way[segregated][foot=no],
353way[man_made=pipeline][tunnel=flooded] {
354 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
355 group: tr("suspicious tag combination");
356}
357
358/* {0.tag} together with {1.tag} (error level) */
359relation[type=multipolygon][area=no] {
360 throwError: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
361 group: tr("suspicious tag combination");
362}
363
364/* {0.key} together with {1.key}, #18267, #17630, #17604, #21836 */
365node[transformer][voltage],
366node[marker][cover],
367node[marker][voltage],
368node[marker][pressure],
369node[marker][diameter],
370node[marker][substance],
371*[building:part][building],
372*[addr:street][addr:place][outside("CZ,DK")] {
373 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
374 group: tr("suspicious tag combination");
375}
376
377/* {0.tag} together with {1.tag} and {2.key}, #18471 */
378way[highway=~/^(cycleway|footway|path)$/][segregated=no][sidewalk =~/^(left|right|both)$/] {
379 throwWarning: tr("{0} together with {1} and {2}", "{0.tag}", "{1.tag}", "{2.key}");
380 group: tr("suspicious tag combination");
381}
382
383/* {0.key} together with {1.tag} and {2.key}, #19747 */
384way[railway][electrified=no][frequency],
385way[railway][electrified=no][voltage] {
386 throwWarning: tr("{0} together with {1} and {2}", "{0.key}", "{1.tag}", "{2.key}");
387 group: tr("suspicious tag combination");
388}
389
390/* #11127, #13727 */
391way[waterway][bridge=yes][waterway!=weir] {
392 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
393 suggestAlternative: "bridge=aqueduct";
394 group: tr("suspicious tag combination");
395 fixAdd: "bridge=aqueduct";
396}
397way[waterway=weir][bridge=yes][highway] {
398 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
399 suggestAlternative: "waterway=weir + ford=yes";
400 suggestAlternative: "waterway=dam";
401 suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
402 group: tr("suspicious tag combination");
403}
404
405/* #16214 */
406relation[type=multipolygon] >[role="inner"] way[area][eval(number_of_tags()) = 1] {
407 throwWarning: tr("{0} on an inner multipolygon ring without further tags", "{0.tag}");
408 fixRemove: "area";
409 set area_yes_autofix;
410 group: tr("suspicious tag combination");
411}
412
413/* only {0.key}, #11104, #12422, #14950, #19572, #20902 */
414/* relations excluded as there is a test for missing type=* plus several other test depending on the type exist */
415node[access][eval(number_of_tags()) = 1],
416way[access][eval(number_of_tags()) = 1],
417node[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
418way[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
419node[lanes][eval(number_of_tags()) = 1],
420way[lanes][eval(number_of_tags()) = 1],
421node[layer][eval(number_of_tags()) = 1],
422way[layer][eval(number_of_tags()) = 1],
423way[level][eval(number_of_tags()) = 1], /* nodes might be valid, e.g. start and end nodes of steps */
424node[lit][eval(number_of_tags()) = 1],
425way[lit][eval(number_of_tags()) = 1],
426node[name][eval(number_of_tags()) = 1],
427way[name][eval(number_of_tags()) = 1],
428node[ref][eval(number_of_tags()) = 1],
429way[ref][eval(number_of_tags()) = 1],
430node[surface][eval(number_of_tags()) = 1],
431way[surface][eval(number_of_tags()) = 1] {
432 throwWarning: tr("incomplete object: only {0}", "{0.key}");
433 set only_one_tag;
434 group: tr("missing tag");
435}
436/* only {0.key} and {1.key} */
437node[name][area][eval(number_of_tags()) = 2],
438way[name][area][eval(number_of_tags()) = 2],
439node[name][ref][eval(number_of_tags()) = 2],
440way[name][ref][eval(number_of_tags()) = 2] {
441 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
442 group: tr("missing tag");
443}
444/* only {0.tag}, #15269 */
445node[tourism=attraction][eval(number_of_tags()) = 1],
446way[tourism=attraction][eval(number_of_tags()) = 1] {
447 throwWarning: tr("incomplete object: only {0}", "{0.tag}");
448 group: tr("missing tag");
449}
450/* only {0.key} and {1.tag} */
451node[name][tourism=attraction][eval(number_of_tags()) = 2],
452way[name][tourism=attraction][eval(number_of_tags()) = 2] {
453 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
454 group: tr("missing tag");
455}
456
457/* #9811, #11491, #12865, #14310 */
458*[place][place!=farm][place!=plot][/^(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)$/],
459/* addr:postcode is used together with place in some countries */
460*[boundary][/^addr:/],
461*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
462 throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
463 group: tr("suspicious tag combination");
464 assertMatch: "node place=foo addr:housenumber=5";
465 assertMatch: "node place=foo addr:housenumber=5 addr:postcode=12345";
466 assertNoMatch: "node place=foo addr:postcode=12345";
467}
468*[postal_code]["addr:postcode"][!highway][postal_code=*"addr:postcode"] {
469 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
470 group: tr("suspicious tag combination");
471}
472*[postal_code]["addr:postcode"][!highway][postal_code!=*"addr:postcode"] {
473 throwWarning: tr("{0} together with {1} and conflicting values", "{0.key}", "{1.key}");
474 group: tr("suspicious tag combination");
475}
476way[postal_code]["addr:postcode"][highway][postal_code=*"addr:postcode"] {
477 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
478 group: tr("suspicious tag combination");
479 fixRemove: "addr:postcode";
480}
481way[postal_code]["addr:postcode"][highway][postal_code!=*"addr:postcode"] {
482 throwWarning: tr("{0} together with {1} and conflicting values", "{0.key}", "{1.key}");
483 group: tr("suspicious tag combination");
484}
485way[highway]["addr:postcode"][highway!=services][highway!=rest_area][!postal_code] {
486 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
487 suggestAlternative: "postal_code";
488 group: tr("suspicious tag combination");
489 fixChangeKey: "addr:postcode=>postal_code";
490}
491
492/* #9195 */
493way[highway=footway][cycleway=lane] {
494 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
495 suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
496 group: tr("suspicious tag combination");
497}
498
499/* {0} on suspicious object, #17255, #19650, #19572, #17253, #19821, #15667, #19930, #20435, #20471, #18815 */
500way[oneway ][!highway][!area:highway][!railway][!aerialway][attraction!=summer_toboggan][aeroway!~/^(runway|taxiway)$/][leisure!=track][waterway !~ /^(canal|fairway|lock|river|tidal_channel)$/],
501node[lanes ][!barrier][!ford][highway!=mini_roundabout][!junction][leisure!~/^(bowling_alley|slipway|swimming_pool|track)$/][!traffic_calming]!.only_one_tag,
502way[lanes ][!barrier][!ford][!highway ][!area:highway][!junction][leisure!~/^(bowling_alley|slipway|swimming_pool|track)$/][!traffic_calming]!.only_one_tag,
503*[tunnel ][!highway][!area:highway][!railway][!waterway][!piste:type][type!=tunnel][public_transport!=platform][route!=ferry][man_made!=pipeline][man_made!=goods_conveyor][man_made!=wildlife_crossing][man_made!=tunnel][power!=cable]!.TunnelCulvertWithoutWaterway,
504*[bridge ][!highway][!area:highway][!railway][!waterway][!piste:type][type!=bridge][public_transport!=platform][route!=ferry][man_made!=pipeline][man_made!=goods_conveyor][man_made!=wildlife_crossing][man_made!=bridge][building!=bridge],
505*[psv ][!highway][!area:highway][!railway][!waterway][barrier !~ /^(bollard|bump_gate|bus_trap|cattle_grid|chain|coupure|entrance|gate|height_restrictor|jersey_barrier|kerb|lift_gate|rope|sally_port|sliding_beam|sliding_gate|spikes|swing_gate|toll_booth|yes)$/][amenity !~ /^parking.*/],
506*[width ][!highway][!area:highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone][leisure!=track],
507*[maxspeed ][!highway][!area: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 !~ /^(canal|fairway|lock|river|tidal_channel)$/][!traffic_calming][aerialway!=zip_line],
508way[incline][!highway][!area:highway][!railway][aeroway!~/^(runway|taxiway)$/][attraction!=summer_toboggan][leisure!=slipway] {
509 throwWarning: tr("{0} on suspicious object", "{0.key}");
510 group: tr("suspicious tag combination");
511}
512
513/* #15667, #19930 */
514way[waterway][oneway][waterway =~ /^(canal|fairway|lock|river|tidal_channel)$/] {
515 throwOther: tr("{0} together with {1}. The flow direction is defined by the way direction. Use {1} on {0} only in the rare case of a access restriction.", "{0.key}", "{1.key}");
516 group: tr("suspicious tag combination");
517}
518
519*[amenity][!name][amenity =~ /^(restaurant|cafe|fast_food|pub|place_of_worship|school|university|hospital|library|theatre|courthouse|bank|cinema|pharmacy|fuel)$/][noname!=yes] {
520 throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
521 group: tr("missing tag");
522 assertMatch: "node amenity=restaurant";
523 assertNoMatch: "node amenity=restaurant noname=yes";
524 assertNoMatch: "node amenity=restaurant name=Foobar";
525}
526
527/* #10193, #16157 */
528way[highway][barrier],
529*[highway][waterway][waterway!=dam][waterway!=weir],
530way[highway][natural][natural!=ridge],
531*[landuse][building][landuse!=retail] {
532 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
533 group: tr("suspicious tag combination");
534 assertNoMatch: "node highway=street_lamp natural=birds_nest";
535}
536
537/* #6932 */
538*[natural=water][leisure=swimming_pool] {
539 throwWarning: tr("natural water used for swimming pool");
540 group: tr("suspicious tag combination");
541 fixRemove: "natural";
542}
543
544/* #9593, #11183, #12418, #12761, #17254, #19311,#23604 */
545*[sport][sport!=skiing][!building][!"building:part"][!club][tourism != hotel][highway !~ /^(pedestrian|raceway)$/][!leisure][natural !~ /^(beach|bare_rock|cliff|peak|water)$/][amenity !~ /^(bar|dojo|pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/][barrier !~ /^(wall|retaining_wall)$/][!"piste:type"][shop!=sports][attraction!=summer_toboggan] {
546 throwWarning: tr("sport without physical feature");
547 group: tr("missing tag");
548 assertMatch: "node sport=tennis";
549 assertNoMatch: "node sport=tennis leisure=pitch";
550 assertNoMatch: "node sport=beachvolleyball natural=beach";
551 assertNoMatch: "node sport=skiing"; /* skiing has deprecated warning */
552 assertNoMatch: "node sport=swimming tourism=hotel";
553 assertNoMatch: "node sport=10pin amenity=restaurant";
554 assertNoMatch: "node sport=boxing building:part=yes";
555}
556
557/* {0.key} without {1.key} or {2.key} see #10140 */
558*[building:levels][!building][!building:part],
559way[usage][!railway][!waterway][route!=railway][man_made!=pipeline][!aerialway] {
560 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
561 group: tr("missing tag");
562}
563
564/* any other *_name tag (with some exceptions) but not a name , see #10837 #11297 #11539 #16437 #17026 #22033 */
565*[/_name$/][!name][!old_name][!loc_name][!reg_name][!uic_name][!artist_name][!lock_name][!"osak:municipality_name"][!"osak:street_name"][NHD:subbasin_name !~ /^(Des Moines Headwaters|Upper Des Moines|East Fork Des Moines)$/][noname!=yes] {
566 throwWarning: tr("alternative name without {0}", "{1.key}");
567 group: tr("missing tag");
568 assertMatch: "way alt_name=Foo";
569 assertNoMatch: "way alt_name=Foo name=Bar";
570}
571
572/* #19604 */
573way[name][alt_name][name=*alt_name] {
574 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
575 group: tr("suspicious tag combination");
576 fixRemove: "alt_name";
577}
578
579/* #10837 */
580way[destination][!oneway?][junction!=roundabout][highway] {
581 throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
582 suggestAlternative: "destination:forward";
583 suggestAlternative: "destination:backward";
584}
585
586/* #11389, #19010 */
587way[maxspeed:forward][maxspeed:backward][!maxspeed]["maxspeed:forward"=*"maxspeed:backward"] {
588 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
589 suggestAlternative: "maxspeed";
590 group: tr("suspicious tag combination");
591 fixChangeKey: "maxspeed:forward=>maxspeed";
592 fixRemove: "maxspeed:backward";
593}
594way[maxspeed:forward][maxspeed:backward][maxspeed]["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed] {
595 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
596 set AllSameMaxspeed;
597 suggestAlternative: "maxspeed";
598 group: tr("suspicious tag combination");
599 fixRemove: "maxspeed:forward";
600 fixRemove: "maxspeed:backward";
601}
602way[cycleway:left][cycleway:right][!cycleway]["cycleway:left"=*"cycleway:right"] {
603 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
604 suggestAlternative: "cycleway";
605 group: tr("suspicious tag combination");
606 fixChangeKey: "cycleway:left=>cycleway";
607 fixRemove: "cycleway:right";
608}
609way[cycleway:left][cycleway:right][cycleway]["cycleway:left"=*cycleway]["cycleway:right"=*cycleway] {
610 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
611 set AllSameCycleway;
612 suggestAlternative: "cycleway";
613 group: tr("suspicious tag combination");
614 fixRemove: "cycleway:left";
615 fixRemove: "cycleway:right";
616}
617way[sidewalk:left][sidewalk:right][!sidewalk]["sidewalk:left"=*"sidewalk:right"] {
618 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
619 suggestAlternative: "sidewalk";
620 group: tr("suspicious tag combination");
621 fixChangeKey: "sidewalk:left=>sidewalk";
622 fixRemove: "sidewalk:right";
623}
624way[sidewalk:left][sidewalk:right][sidewalk]["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk] {
625 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
626 set AllSameSidewalk;
627 suggestAlternative: "sidewalk";
628 group: tr("suspicious tag combination");
629 fixRemove: "sidewalk:left";
630 fixRemove: "sidewalk:right";
631}
632way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed,
633way["cycleway:left"]["cycleway:right"][cycleway]!.AllSameCycleway,
634way["sidewalk:left"]["sidewalk:right"][sidewalk]!.AllSameSidewalk {
635 throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
636 group: tr("suspicious tag combination");
637}
638way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
639way["maxspeed:backward"][maxspeed][!"maxspeed:forward"],
640way["cycleway:left"][cycleway][!"cycleway:right"],
641way["cycleway:right"][cycleway][!"cycleway:left"],
642way["sidewalk:left"][sidewalk][!"sidewalk:right"],
643way["sidewalk:right"][sidewalk][!"sidewalk:left"] {
644 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
645 group: tr("suspicious tag combination");
646}
647
648/* #11837 */
649way[bridge][layer][layer<0][bridge!=no][location!=underground][indoor!=yes][!tunnel],
650way[tunnel][layer][layer>0][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
651 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
652 group: tr("suspicious tag combination");
653}
654
655/* #12942 */
656relation[oneway][type!=route] {
657 throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
658}
659
660/* #9182 */
661way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
662 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}");
663 group: tr("suspicious tag combination");
664}
665way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
666 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}");
667 group: tr("suspicious tag combination");
668}
669
670/* {0.key} without {1.tag} see #13138, #14468 */
671way[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir]!:closed, /* water=intermittent is deprecated and has an own warning */
672area[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir]:closed {
673 throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
674 group: tr("missing tag");
675}
676
677/* #13680 */
678area[golf=bunker][natural=beach] {
679 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
680 suggestAlternative: "natural=sand";
681 suggestAlternative: "surface=sand";
682 group: tr("suspicious tag combination");
683}
684
685/* #13705 */
686relation[type=multipolygon][building] > way {
687 set part_of_building_MP;
688}
689way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier][place!=plot]!.part_of_building_MP {
690 /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
691 throwOther: tr("possibly missing {0} tag", "{1.key}");
692 group: tr("missing tag");
693}
694
695/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
696way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/] {
697 set MotorwayTrunk;
698}
699way.MotorwayTrunk[lanes][turn:lanes ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
700way.MotorwayTrunk[lanes][change:lanes ][tag(lanes)!=eval(count(split("|", tag("change:lanes"))))],
701way.MotorwayTrunk[lanes][maxspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("maxspeed:lanes"))))],
702way.MotorwayTrunk[lanes][minspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("minspeed:lanes"))))],
703way.MotorwayTrunk[lanes][destination:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:lanes"))))],
704way.MotorwayTrunk[lanes][destination:ref:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:ref:lanes"))))],
705way.MotorwayTrunk[lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
706 throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
707 group: tr("suspicious tag combination");
708}
709
710/* #14125, #14323, #18185 */
711way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][highway!=motorway][junction!=roundabout][lanes>2][mod(tag(lanes),2)=1] {
712 throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
713 group: tr("missing tag");
714 assertNoMatch: "way highway=primary lanes=2";
715 assertNoMatch: "way highway=primary lanes=3 lanes:backward=2";
716 assertNoMatch: "way highway=primary lanes=3 oneway=-1";
717 assertNoMatch: "way highway=primary lanes=4";
718 assertMatch: "way highway=primary lanes=3";
719}
720
721/* #10932, #19609 */
722way[/^.*:lanes$/][!lanes][highway][!source:lanes],
723way[/^.*:lanes:(forward|backward|both_ways)$/][!lanes][highway],
724way[/^.*:lanes:both_ways$/][!lanes:both_ways][highway] {
725 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
726 group: tr("missing tag");
727 assertMatch: "way highway=primary turn:lanes=left|right";
728 assertMatch: "way highway=primary turn:lanes:forward=left|right";
729 assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
730}
731way[/^.*:lanes:forward$/][!lanes:forward][!lanes:backward][highway][mod(tag(lanes),2)=0],
732way[/^.*:lanes:backward$/][!lanes:backward][!lanes:forward][highway][mod(tag(lanes),2)=0] {
733 throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
734 group: tr("missing tag");
735 assertMatch: "way highway=primary turn:lanes:forward=left|right lanes=2";
736 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
737 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes=3";
738}
739
740/* #15774 */
741node[emergency=fire_hydrant][fire_hydrant:count][fire_hydrant:count!=1] {
742 throwOther: tr("{0} together with {1}. Tag each hydrant separately.", "{0.tag}", "{1.tag}");
743}
744
745/* #12502 */
746node[leisure=park][natural=tree] {
747 throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
748 group: tr("suspicious tag combination");
749 fixRemove: "leisure";
750}
751
752/* #17305 */
753area[boundary=administrative][landuse=residential] {
754 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
755 group: tr("suspicious tag combination");
756}
757
758/* #17391 */
759way[highway=pedestrian][width][siunit_length(tag(width))<3] {
760 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
761 suggestAlternative: "highway=footway";
762 group: tr("suspicious tag combination");
763 fixAdd: "highway=footway";
764 assertMatch: "way highway=pedestrian width=0.8";
765 assertMatch: "way highway=pedestrian width=1";
766 assertNoMatch: "way highway=pedestrian width=3";
767 assertNoMatch: "way highway=pedestrian width=5.5";
768}
769
770/* see #17623 */
771way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|busway|bus_guideway|bridleway/][area!=yes] {
772 throwOther: tr("A linear object {0} without {1} has a tag indicating that it is an area.", "{1.tag}", "{3.tag}");
773 group: tr("suspicious tag combination");
774}
775
776/* #17804 */
777area[cemetery=sector][landuse=cemetery] {
778 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
779 group: tr("suspicious tag combination");
780}
781
782/* #17967 */
783*[highway=cycleway][cycleway=track] {
784 throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
785 group: tr("suspicious tag combination");
786 fixRemove: "cycleway";
787}
788
789/* #17973, #18183, #18331, #20318 */
790way[highway=path ][!segregated][foot=designated][bicycle=designated],
791way[highway=footway ][!segregated][bicycle=designated],
792way[highway=cycleway][!segregated][foot=designated] {
793 throwWarning: tr("Combined foot- and cycleway without {0}.", "{1.key}");
794 group: tr("missing tag");
795}
796
797/* #17989 */
798node[emergency_ward_entrance][emergency!=emergency_ward_entrance] {
799 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
800 group: tr("missing tag");
801 fixAdd: "emergency=emergency_ward_entrance";
802}
803
804/* missing or conflicting construction, see #17607 */
805/* {0.key} without {1.key} and {2.key} */
806*[construction:building][!building][!construction],
807*[construction:highway][!highway][!construction],
808*[construction:railway][!railway][!construction],
809*[construction:landuse][!landuse][!construction] {
810 throwWarning: tr("{0} without {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
811 group: tr("missing tag");
812 fixAdd: "{1.key}=construction";
813 fixAdd: "construction={0.value}";
814 assertMatch: "way construction:building=house";
815 assertNoMatch: "way construction:building=house building=house ";
816 assertNoMatch: "way construction:building=house construction=house";
817}
818/* {0.key} and {1.key} without {2.key} */
819*[building=construction]["construction:building"][!construction],
820*[highway=construction]["construction:highway"][!construction],
821*[railway=construction]["construction:railway"][!construction],
822*[landuse=construction]["construction:landuse"][!construction] {
823 throwWarning: tr("{0} together with {1} but without {2}", "{0.key}", "{1.key}", "{2.key}");
824 group: tr("missing tag");
825 fixAdd: "construction={1.value}";
826 assertMatch: "way construction:building=house building=construction";
827 assertNoMatch: "way construction:building=house building=house ";
828 assertNoMatch: "way construction:building=house construction=house";
829}
830/* {0.key} and {1.key} without {2.key} */
831*[building]["construction:building"][!construction][building!=construction],
832*[highway]["construction:highway"][!construction][highway!=construction],
833*[railway]["construction:railway"][!construction][railway!=construction],
834*[landuse]["construction:landuse"][!construction][landuse!=construction] {
835 throwWarning: tr("{0} together with {1} and conflicting values plus no {2}", "{0.key}", "{1.key}", "{2.key}");
836 group: tr("suspicious tag combination");
837 assertMatch: "way construction:building=house building=office";
838 assertNoMatch: "way construction:building=house building=construction";
839 assertNoMatch: "way construction:building=house construction=house";
840}
841
842*["construction:building"][construction][construction:building != *construction],
843*["construction:highway"][construction][construction:highway != *construction],
844*["construction:railway"][construction][construction:railway != *construction],
845*["construction:landuse"][construction][construction:landuse != *construction] {
846 throwWarning: tr("{0} together with {1} and conflicting values", "{0.key}", "{1.key}");
847 group: tr("suspicious tag combination");
848 assertMatch: "way construction:building=house construction=office";
849 assertNoMatch: "way construction:building=house construction=house";
850}
851
852/* #18203, #20960 */
853way[highway][construction][construction!~/^(yes|minor|no)$/][highway!=construction],
854way[railway][construction][construction!~/^(yes|minor|no)$/][railway!=construction],
855area[building][construction][construction!~/^(yes|minor|no)$/][building!=construction],
856area[landuse][construction][construction!~/^(yes|minor|no)$/][landuse!=construction] {
857 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
858 group: tr("suspicious tag combination");
859}
860
861/* #18374, #22295 */
862*[amenity=recycling][collection_times="24/7"][!opening_hours],
863*[amenity=recycling][collection_times ][!opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
864 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
865 group: tr("suspicious tag combination");
866 fixChangeKey: "collection_times => opening_hours";
867 assertMatch: "node amenity=recycling collection_times=\"Mo-Fr 06:00-20:00\"";
868 assertNoMatch: "node amenity=recycling collection_times=\"Mo-Fr 15:00\"";
869 assertNoMatch: "node amenity=recycling collection_times=\"Mo 08:00-11:00\"";
870 assertNoMatch: "node amenity=recycling collection_times=\"Sa[2,4] 8:00-11:00\"";
871}
872
873/* #19018 */
874way[highway][crossing][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/] {
875 throwWarning: tr("{0} together with {1}. Should be used on a minor highway type or a node", "{1.key}", "{0.tag}");
876 group: tr("suspicious tag combination");
877 fixRemove: "crossing";
878 assertMatch: "way highway=trunk crossing=unmarked";
879 assertNoMatch: "way highway=construction construction=footway crossing=unmarked";
880}
881
882/* #19066 */
883*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
884 throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
885 group: tr("missing tag");
886}
887*[source:addr][!/^addr:/] {
888 throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
889 group: tr("missing tag");
890 assertMatch: "node source:addr=postman";
891 assertNoMatch: "node source:addr=postman addr:housenumber=42";
892}
893*[source:maxspeed][!/^maxspeed:?/] {
894 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
895 group: tr("missing tag");
896}
897
898/* #16898, tower vs. communications_tower, wiki suggests 100m as rough guideline, so we warn for < 75m */
899*[man_made=communications_tower][height][siunit_length(tag(height)) < 75] {
900 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
901 suggestAlternative: "man_made=tower + tower:type=communication + height";
902 group: tr("suspicious tag combination");
903 assertMatch: "node man_made=communications_tower height=58";
904 assertMatch: "node man_made=communications_tower height=\"74 m\"";
905 assertMatch: "node man_made=communications_tower height=0.8";
906 assertMatch: "node man_made=communications_tower height=245'";
907 assertMatch: "node man_made=communications_tower height=\"224.22 ft\"";
908 assertMatch: "node man_made=communications_tower height=231'10.22\"";
909 assertNoMatch: "node man_made=communications_tower height=\"75 m\"";
910 assertNoMatch: "node man_made=communications_tower height=75.72";
911 assertNoMatch: "node man_made=communications_tower height=\"328.22 ft\"";
912 assertNoMatch: "node man_made=communications_tower height=4358'8\"";
913 assertNoMatch: "node height=4358'";
914}
915
916/* #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. */
917*[fixme][count(split(" ", tag("fixme"))) == 1][has_tag_key(tag("fixme"))],
918*[FIXME][count(split(" ", tag("FIXME"))) == 1][has_tag_key(tag("FIXME"))] {
919 throwWarning: tr("{0} together with {1}. Is the fixme fixed?", "{0.tag}", "{0.value}");
920 group: tr("suspicious tag combination");
921 assertMatch: "way name=\"Florist Gump\" fixme=name";
922 assertMatch: "way name=\"Florist Gump\" FIXME=name";
923 assertNoMatch: "way fixme=name";
924 assertNoMatch: "way name=\"Florist Gump\"";
925 assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
926}
927
928/* #19094 */
929way[highway][placement=transition][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition],
930way[highway][!placement][/^placement:.*$/][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition] {
931 throwWarning: tr("Use {0} only as value of {1}", "transition", "placement");
932 set PlacementTransitionWarning;
933 fixAdd: "placement=transition";
934 fixRemove: "placement:forward";
935 fixRemove: "placement:backward";
936 fixRemove: "placement:both_ways";
937 assertMatch: "way highway=primary placement=transition placement:both_ways=transition";
938 assertMatch: "way highway=primary placement:backward=transition placement:forward=transition";
939 assertNoMatch: "way highway=primary placement:backward=middle_of:1 placement:forward=transition";
940 assertNoMatch: "way highway=primary placement=middle_of:1 placement:backward=transition placement:forward=transition";
941}
942way[placement][/^placement:.*$/][highway]!.PlacementTransitionWarning,
943way["placement:forward"]["placement:backward"][highway]!.PlacementTransitionWarning,
944way["placement:forward"]["placement:both_ways"][highway]!.PlacementTransitionWarning,
945way["placement:backward"]["placement:both_ways"][highway]!.PlacementTransitionWarning {
946 throwError: tr("{0} together with {1}", "{0.key}", "{1.key}");
947 group: tr("suspicious tag combination");
948 assertMatch: "way highway=primary placement=left_of:2 placement:forward=right_of:1";
949 assertNoMatch: "way highway=primary placement:forward=right_of:1";
950 assertNoMatch: "way highway=primary placement:forward=transition placement:both_ways=transition";
951}
952
953/* #19742 */
954node:righthandtraffic[highway=mini_roundabout][direction=clockwise] {
955 throwWarning: tr("{0} together with {1} at right-hand traffic", "{1.tag}", "{2.tag}");
956 group: tr("suspicious tag combination");
957}
958node!:righthandtraffic[highway=mini_roundabout][direction=anticlockwise] {
959 throwWarning: tr("{0} together with {1} at left-hand traffic", "{1.tag}", "{2.tag}");
960 group: tr("suspicious tag combination");
961}
962
963/* #19603 */
964way[footway][highway][footway=sidewalk ][highway!~/^(path|footway|cycleway|construction|proposed)$/] {
965 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
966 group: tr("suspicious tag combination");
967 suggestAlternative: "sidewalk=left";
968 suggestAlternative: "sidewalk=right";
969 suggestAlternative: "sidewalk=both";
970 suggestAlternative: "sidewalk=separate";
971}
972way[footway][highway][footway!=sidewalk][highway!~/^(path|footway|cycleway|construction|proposed)$/] {
973 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
974 group: tr("suspicious tag combination");
975}
976way[footway][!highway][!/:highway$/],
977way[cycleway][!highway][!/:highway$/] {
978 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
979 group: tr("missing tag");
980 assertNoMatch: "way footway=sidewalk abandoned:highway=unclassified";
981}
982
983/* #17498 */
984way[bicycle][/^cycleway(:|$)/][!/^bicycle:/][bicycle=~/^(no|use_sidepath)$/][/^cycleway(:|$)/!~/^(no|none|separate)$/] {
985 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
986 group: tr("suspicious tag combination");
987 assertMatch: "way bicycle=no cycleway=track";
988 assertMatch: "way bicycle=use_sidepath cycleway=lane";
989 assertMatch: "way bicycle=use_sidepath cycleway:left=lane";
990 assertNoMatch: "way bicycle=use_sidepath cycleway=no";
991 assertNoMatch: "way bicycle=use_sidepath bicycle:backward=yes cycleway:left=lane"; /* instead of :backward, could also be :forward or :conditional */
992 assertNoMatch: "way bicycle=no cycleway:right=no";
993 assertNoMatch: "way bicycle=use_sidepath cycleway:left=none";
994 assertNoMatch: "way highway=cycleway cycleway=separate";
995 assertNoMatch: "way highway=residential bicycle=use_sidepath";
996}
997
998/* #19980 */
999way[highway=living_street][maxspeed][maxspeed=~/mph/][get(split(" ", tag(maxspeed)), 0) > 15],
1000way[highway=living_street][maxspeed][maxspeed!~/mph/][get(split(" ", tag(maxspeed)), 0) > 20] {
1001 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
1002 group: tr("suspicious tag combination");
1003 assertNoMatch: "way highway=living_street";
1004 assertNoMatch: "way highway=living_street maxspeed=20";
1005 assertNoMatch: "way highway=living_street maxspeed=\"15 mph\"";
1006 assertNoMatch: "way highway=living_street maxspeed=walk";
1007 assertMatch: "way highway=living_street maxspeed=30";
1008 assertMatch: "way highway=living_street maxspeed=\"20 mph\"";
1009}
1010
1011/* piste subtags, see #17606 */
1012way[piste:type=nordic][!piste:grooming] {
1013 throwWarning: tr("No grooming defined for {0} skiing, add {1}", "nordic", "piste:grooming=");
1014 group: tr("missing tag");
1015 assertMatch: "way piste:type=nordic";
1016 assertNoMatch: "way piste:type=nordic piste:grooming=classic";
1017}
1018
1019way[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty][count(parent_tags("piste:difficulty")) == 0] {
1020 set missing_parent_piste_difficulty;
1021}
1022way.missing_parent_piste_difficulty:new,
1023way.missing_parent_piste_difficulty:in-downloaded-area!:new {
1024 throwWarning: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1025 group: tr("missing tag");
1026 set missing_piste_difficulty;
1027 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1028}
1029relation[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty] >
1030 way[!piste:difficulty]!.missing_piste_difficulty {
1031 throwWarning: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1032 group: tr("missing tag");
1033 set missing_piste_difficulty_both;
1034 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1035}
1036way[piste:type=nordic][!piste:difficulty]!.missing_piste_difficulty!.missing_piste_difficulty_both {
1037 throwOther: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1038 group: tr("missing tag");
1039 assertMatch: "way piste:type=nordic";
1040 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1041}
1042
1043relation[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty] {
1044 throwOther: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1045 group: tr("missing tag");
1046 assertMatch: "relation piste:type=nordic";
1047 assertNoMatch: "relation piste:type=nordic piste:difficulty=easy";
1048}
1049relation[piste:type=nordic][!piste:grooming]{
1050 throwOther: tr("No grooming defined for {0} skiing, add {1}", "nordic", "piste:grooming=");
1051 group: tr("missing tag");
1052 assertMatch: "relation piste:type=nordic";
1053 assertNoMatch: "relation piste:type=nordic piste:grooming=classic";
1054}
1055
1056/* #21836 */
1057*[voltage:primary][voltage:secondary][transformer=generator][tag("voltage:secondary")<tag("voltage:primary")] {
1058 throwWarning: tr("{0} is lower than {1} on {2}.", "{1.key}", "{0.key}", "{2.tag}");
1059 group: tr("suspicious tag combination");
1060}
1061
1062/* #21286 */
1063area[/^(building|building:part)$/][height][min_height][siunit_length(tag(height)) <= siunit_length(tag(min_height))],
1064area[/^(building|building:part)$/][building:levels][building:min_level][tag("building:levels") <= tag("building:min_level")] {
1065 throwWarning: tr("{0} is lower or equal to {1} on {2}", "{1.key}", "{2.key}", "{0.key}");
1066 group: tr("suspicious tag combination");
1067}
Note: See TracBrowser for help on using the repository browser.