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

Last change on this file since 18971 was 18920, checked in by taylor.smock, 2 years ago

Fix #23067: Don't warn on unisex, female, and male tag combinations for shop=hairdresser

male=* and female=* is more verbose than unisex=* and also more precise.
From the osmwiki:Key:unisex wiki page:

unisex=yes always means a gender-neutral facility. Gender segregated facilities
(e.g. toilets) should be tagged female=yes + male=yes. Usage of the unisex=yes
tag for gender segregated features contradicts with the general meaning of the
term "unisex".

  • 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 */
545*[sport][sport!=skiing][!building][!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}
555
556/* {0.key} without {1.key} or {2.key} see #10140 */
557*[building:levels][!building][!building:part],
558way[usage][!railway][!waterway][route!=railway][man_made!=pipeline] {
559 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
560 group: tr("missing tag");
561}
562
563/* any other *_name tag (with some exceptions) but not a name , see #10837 #11297 #11539 #16437 #17026 #22033 */
564*[/_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] {
565 throwWarning: tr("alternative name without {0}", "{1.key}");
566 group: tr("missing tag");
567 assertMatch: "way alt_name=Foo";
568 assertNoMatch: "way alt_name=Foo name=Bar";
569}
570
571/* #19604 */
572way[name][alt_name][name=*alt_name] {
573 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
574 group: tr("suspicious tag combination");
575 fixRemove: "alt_name";
576}
577
578/* #10837 */
579way[destination][!oneway?][junction!=roundabout][highway] {
580 throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
581 suggestAlternative: "destination:forward";
582 suggestAlternative: "destination:backward";
583}
584
585/* #11389, #19010 */
586way[maxspeed:forward][maxspeed:backward][!maxspeed]["maxspeed:forward"=*"maxspeed:backward"] {
587 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
588 suggestAlternative: "maxspeed";
589 group: tr("suspicious tag combination");
590 fixChangeKey: "maxspeed:forward=>maxspeed";
591 fixRemove: "maxspeed:backward";
592}
593way[maxspeed:forward][maxspeed:backward][maxspeed]["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed] {
594 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
595 set AllSameMaxspeed;
596 suggestAlternative: "maxspeed";
597 group: tr("suspicious tag combination");
598 fixRemove: "maxspeed:forward";
599 fixRemove: "maxspeed:backward";
600}
601way[cycleway:left][cycleway:right][!cycleway]["cycleway:left"=*"cycleway:right"] {
602 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
603 suggestAlternative: "cycleway";
604 group: tr("suspicious tag combination");
605 fixChangeKey: "cycleway:left=>cycleway";
606 fixRemove: "cycleway:right";
607}
608way[cycleway:left][cycleway:right][cycleway]["cycleway:left"=*cycleway]["cycleway:right"=*cycleway] {
609 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
610 set AllSameCycleway;
611 suggestAlternative: "cycleway";
612 group: tr("suspicious tag combination");
613 fixRemove: "cycleway:left";
614 fixRemove: "cycleway:right";
615}
616way[sidewalk:left][sidewalk:right][!sidewalk]["sidewalk:left"=*"sidewalk:right"] {
617 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
618 suggestAlternative: "sidewalk";
619 group: tr("suspicious tag combination");
620 fixChangeKey: "sidewalk:left=>sidewalk";
621 fixRemove: "sidewalk:right";
622}
623way[sidewalk:left][sidewalk:right][sidewalk]["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk] {
624 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
625 set AllSameSidewalk;
626 suggestAlternative: "sidewalk";
627 group: tr("suspicious tag combination");
628 fixRemove: "sidewalk:left";
629 fixRemove: "sidewalk:right";
630}
631way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed,
632way["cycleway:left"]["cycleway:right"][cycleway]!.AllSameCycleway,
633way["sidewalk:left"]["sidewalk:right"][sidewalk]!.AllSameSidewalk {
634 throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
635 group: tr("suspicious tag combination");
636}
637way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
638way["maxspeed:backward"][maxspeed][!"maxspeed:forward"],
639way["cycleway:left"][cycleway][!"cycleway:right"],
640way["cycleway:right"][cycleway][!"cycleway:left"],
641way["sidewalk:left"][sidewalk][!"sidewalk:right"],
642way["sidewalk:right"][sidewalk][!"sidewalk:left"] {
643 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
644 group: tr("suspicious tag combination");
645}
646
647/* #11837 */
648way[bridge][layer][layer<0][bridge!=no][location!=underground][indoor!=yes][!tunnel],
649way[tunnel][layer][layer>0][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
650 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
651 group: tr("suspicious tag combination");
652}
653
654/* #12942 */
655relation[oneway][type!=route] {
656 throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
657}
658
659/* #9182 */
660way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
661 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}");
662 group: tr("suspicious tag combination");
663}
664way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
665 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}");
666 group: tr("suspicious tag combination");
667}
668
669/* {0.key} without {1.tag} see #13138, #14468 */
670way[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir]!:closed, /* water=intermittent is deprecated and has an own warning */
671area[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir]:closed {
672 throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
673 group: tr("missing tag");
674}
675
676/* #13680 */
677area[golf=bunker][natural=beach] {
678 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
679 suggestAlternative: "natural=sand";
680 suggestAlternative: "surface=sand";
681 group: tr("suspicious tag combination");
682}
683
684/* #13705 */
685relation[type=multipolygon][building] > way {
686 set part_of_building_MP;
687}
688way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier][place!=plot]!.part_of_building_MP {
689 /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
690 throwOther: tr("possibly missing {0} tag", "{1.key}");
691 group: tr("missing tag");
692}
693
694/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
695way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/] {
696 set MotorwayTrunk;
697}
698way.MotorwayTrunk[lanes][turn:lanes ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
699way.MotorwayTrunk[lanes][change:lanes ][tag(lanes)!=eval(count(split("|", tag("change:lanes"))))],
700way.MotorwayTrunk[lanes][maxspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("maxspeed:lanes"))))],
701way.MotorwayTrunk[lanes][minspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("minspeed:lanes"))))],
702way.MotorwayTrunk[lanes][destination:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:lanes"))))],
703way.MotorwayTrunk[lanes][destination:ref:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:ref:lanes"))))],
704way.MotorwayTrunk[lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
705 throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
706 group: tr("suspicious tag combination");
707}
708
709/* #14125, #14323, #18185 */
710way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][highway!=motorway][junction!=roundabout][lanes>2][mod(tag(lanes),2)=1] {
711 throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
712 group: tr("missing tag");
713 assertNoMatch: "way highway=primary lanes=2";
714 assertNoMatch: "way highway=primary lanes=3 lanes:backward=2";
715 assertNoMatch: "way highway=primary lanes=3 oneway=-1";
716 assertNoMatch: "way highway=primary lanes=4";
717 assertMatch: "way highway=primary lanes=3";
718}
719
720/* #10932, #19609 */
721way[/^.*:lanes$/][!lanes][highway][!source:lanes],
722way[/^.*:lanes:(forward|backward|both_ways)$/][!lanes][highway],
723way[/^.*:lanes:both_ways$/][!lanes:both_ways][highway] {
724 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
725 group: tr("missing tag");
726 assertMatch: "way highway=primary turn:lanes=left|right";
727 assertMatch: "way highway=primary turn:lanes:forward=left|right";
728 assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
729}
730way[/^.*:lanes:forward$/][!lanes:forward][!lanes:backward][highway][mod(tag(lanes),2)=0],
731way[/^.*:lanes:backward$/][!lanes:backward][!lanes:forward][highway][mod(tag(lanes),2)=0] {
732 throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
733 group: tr("missing tag");
734 assertMatch: "way highway=primary turn:lanes:forward=left|right lanes=2";
735 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
736 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes=3";
737}
738
739/* #15774 */
740node[emergency=fire_hydrant][fire_hydrant:count][fire_hydrant:count!=1] {
741 throwOther: tr("{0} together with {1}. Tag each hydrant separately.", "{0.tag}", "{1.tag}");
742}
743
744/* #12502 */
745node[leisure=park][natural=tree] {
746 throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
747 group: tr("suspicious tag combination");
748 fixRemove: "leisure";
749}
750
751/* #17305 */
752area[boundary=administrative][landuse=residential] {
753 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
754 group: tr("suspicious tag combination");
755}
756
757/* #17391 */
758way[highway=pedestrian][width][width<3] {
759 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
760 suggestAlternative: "highway=footway";
761 group: tr("suspicious tag combination");
762 fixAdd: "highway=footway";
763 assertMatch: "way highway=pedestrian width=0.8";
764 assertMatch: "way highway=pedestrian width=1";
765 assertNoMatch: "way highway=pedestrian width=3";
766 assertNoMatch: "way highway=pedestrian width=5.5";
767}
768
769/* see #17623 */
770way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|busway|bus_guideway|bridleway/][area!=yes] {
771 throwOther: tr("A linear object {0} without {1} has a tag indicating that it is an area.", "{1.tag}", "{3.tag}");
772 group: tr("suspicious tag combination");
773}
774
775/* #17804 */
776area[cemetery=sector][landuse=cemetery] {
777 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
778 group: tr("suspicious tag combination");
779}
780
781/* #17967 */
782*[highway=cycleway][cycleway=track] {
783 throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
784 group: tr("suspicious tag combination");
785 fixRemove: "cycleway";
786}
787
788/* #17973, #18183, #18331, #20318 */
789way[highway=path ][!segregated][foot=designated][bicycle=designated],
790way[highway=footway ][!segregated][bicycle=designated],
791way[highway=cycleway][!segregated][foot=designated] {
792 throwWarning: tr("Combined foot- and cycleway without {0}.", "{1.key}");
793 group: tr("missing tag");
794}
795
796/* #17989 */
797node[emergency_ward_entrance][emergency!=emergency_ward_entrance] {
798 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
799 group: tr("missing tag");
800 fixAdd: "emergency=emergency_ward_entrance";
801}
802
803/* missing or conflicting construction, see #17607 */
804/* {0.key} without {1.key} and {2.key} */
805*[construction:building][!building][!construction],
806*[construction:highway][!highway][!construction],
807*[construction:railway][!railway][!construction],
808*[construction:landuse][!landuse][!construction] {
809 throwWarning: tr("{0} without {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
810 group: tr("missing tag");
811 fixAdd: "{1.key}=construction";
812 fixAdd: "construction={0.value}";
813 assertMatch: "way construction:building=house";
814 assertNoMatch: "way construction:building=house building=house ";
815 assertNoMatch: "way construction:building=house construction=house";
816}
817/* {0.key} and {1.key} without {2.key} */
818*[building=construction]["construction:building"][!construction],
819*[highway=construction]["construction:highway"][!construction],
820*[railway=construction]["construction:railway"][!construction],
821*[landuse=construction]["construction:landuse"][!construction] {
822 throwWarning: tr("{0} together with {1} but without {2}", "{0.key}", "{1.key}", "{2.key}");
823 group: tr("missing tag");
824 fixAdd: "construction={1.value}";
825 assertMatch: "way construction:building=house building=construction";
826 assertNoMatch: "way construction:building=house building=house ";
827 assertNoMatch: "way construction:building=house construction=house";
828}
829/* {0.key} and {1.key} without {2.key} */
830*[building]["construction:building"][!construction][building!=construction],
831*[highway]["construction:highway"][!construction][highway!=construction],
832*[railway]["construction:railway"][!construction][railway!=construction],
833*[landuse]["construction:landuse"][!construction][landuse!=construction] {
834 throwWarning: tr("{0} together with {1} and conflicting values plus no {2}", "{0.key}", "{1.key}", "{2.key}");
835 group: tr("suspicious tag combination");
836 assertMatch: "way construction:building=house building=office";
837 assertNoMatch: "way construction:building=house building=construction";
838 assertNoMatch: "way construction:building=house construction=house";
839}
840
841*["construction:building"][construction][construction:building != *construction],
842*["construction:highway"][construction][construction:highway != *construction],
843*["construction:railway"][construction][construction:railway != *construction],
844*["construction:landuse"][construction][construction:landuse != *construction] {
845 throwWarning: tr("{0} together with {1} and conflicting values", "{0.key}", "{1.key}");
846 group: tr("suspicious tag combination");
847 assertMatch: "way construction:building=house construction=office";
848 assertNoMatch: "way construction:building=house construction=house";
849}
850
851/* #18203, #20960 */
852way[highway][construction][construction!~/^(yes|minor|no)$/][highway!=construction],
853way[railway][construction][construction!~/^(yes|minor|no)$/][railway!=construction],
854area[building][construction][construction!~/^(yes|minor|no)$/][building!=construction],
855area[landuse][construction][construction!~/^(yes|minor|no)$/][landuse!=construction] {
856 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
857 group: tr("suspicious tag combination");
858}
859
860/* #18374, #22295 */
861*[amenity=recycling][collection_times="24/7"][!opening_hours],
862*[amenity=recycling][collection_times ][!opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
863 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
864 group: tr("suspicious tag combination");
865 fixChangeKey: "collection_times => opening_hours";
866 assertMatch: "node amenity=recycling collection_times=\"Mo-Fr 06:00-20:00\"";
867 assertNoMatch: "node amenity=recycling collection_times=\"Mo-Fr 15:00\"";
868 assertNoMatch: "node amenity=recycling collection_times=\"Mo 08:00-11:00\"";
869 assertNoMatch: "node amenity=recycling collection_times=\"Sa[2,4] 8:00-11:00\"";
870}
871
872/* #19018 */
873way[highway][crossing][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/] {
874 throwWarning: tr("{0} together with {1}. Should be used on a minor highway type or a node", "{1.key}", "{0.tag}");
875 group: tr("suspicious tag combination");
876 fixRemove: "crossing";
877 assertMatch: "way highway=trunk crossing=unmarked";
878 assertNoMatch: "way highway=construction construction=footway crossing=unmarked";
879}
880
881/* #19066 */
882*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
883 throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
884 group: tr("missing tag");
885}
886*[source:addr][!/^addr:/] {
887 throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
888 group: tr("missing tag");
889 assertMatch: "node source:addr=postman";
890 assertNoMatch: "node source:addr=postman addr:housenumber=42";
891}
892*[source:maxspeed][!/^maxspeed:?/] {
893 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
894 group: tr("missing tag");
895}
896
897/* #16898, tower vs. communications_tower, wiki suggests 100m as rough guideline, so we warn for < 75m */
898*[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' */
899 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
900 suggestAlternative: "man_made=tower + tower:type=communication + height";
901 group: tr("suspicious tag combination");
902 assertMatch: "node man_made=communications_tower height=58";
903 assertMatch: "node man_made=communications_tower height=\"74 m\"";
904 assertMatch: "node man_made=communications_tower height=0.8";
905 assertMatch: "node man_made=communications_tower height=245'";
906 assertMatch: "node man_made=communications_tower height=\"224.22 ft\"";
907 assertMatch: "node man_made=communications_tower height=231'10.22\"";
908 assertNoMatch: "node man_made=communications_tower height=\"75 m\"";
909 assertNoMatch: "node man_made=communications_tower height=75.72";
910 assertNoMatch: "node man_made=communications_tower height=\"328.22 ft\"";
911 assertNoMatch: "node man_made=communications_tower height=4358'8\"";
912 assertNoMatch: "node height=4358'";
913}
914
915/* #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. */
916*[fixme][count(split(" ", tag("fixme"))) == 1][has_tag_key(tag("fixme"))],
917*[FIXME][count(split(" ", tag("FIXME"))) == 1][has_tag_key(tag("FIXME"))] {
918 throwWarning: tr("{0} together with {1}. Is the fixme fixed?", "{0.tag}", "{0.value}");
919 group: tr("suspicious tag combination");
920 assertMatch: "way name=\"Florist Gump\" fixme=name";
921 assertMatch: "way name=\"Florist Gump\" FIXME=name";
922 assertNoMatch: "way fixme=name";
923 assertNoMatch: "way name=\"Florist Gump\"";
924 assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
925}
926
927/* #19094 */
928way[highway][placement=transition][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition],
929way[highway][!placement][/^placement:.*$/][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition] {
930 throwWarning: tr("Use {0} only as value of {1}", "transition", "placement");
931 set PlacementTransitionWarning;
932 fixAdd: "placement=transition";
933 fixRemove: "placement:forward";
934 fixRemove: "placement:backward";
935 fixRemove: "placement:both_ways";
936 assertMatch: "way highway=primary placement=transition placement:both_ways=transition";
937 assertMatch: "way highway=primary placement:backward=transition placement:forward=transition";
938 assertNoMatch: "way highway=primary placement:backward=middle_of:1 placement:forward=transition";
939 assertNoMatch: "way highway=primary placement=middle_of:1 placement:backward=transition placement:forward=transition";
940}
941way[placement][/^placement:.*$/][highway]!.PlacementTransitionWarning,
942way["placement:forward"]["placement:backward"][highway]!.PlacementTransitionWarning,
943way["placement:forward"]["placement:both_ways"][highway]!.PlacementTransitionWarning,
944way["placement:backward"]["placement:both_ways"][highway]!.PlacementTransitionWarning {
945 throwError: tr("{0} together with {1}", "{0.key}", "{1.key}");
946 group: tr("suspicious tag combination");
947 assertMatch: "way highway=primary placement=left_of:2 placement:forward=right_of:1";
948 assertNoMatch: "way highway=primary placement:forward=right_of:1";
949 assertNoMatch: "way highway=primary placement:forward=transition placement:both_ways=transition";
950}
951
952/* #19742 */
953node:righthandtraffic[highway=mini_roundabout][direction=clockwise] {
954 throwWarning: tr("{0} together with {1} at right-hand traffic", "{1.tag}", "{2.tag}");
955 group: tr("suspicious tag combination");
956}
957node!:righthandtraffic[highway=mini_roundabout][direction=anticlockwise] {
958 throwWarning: tr("{0} together with {1} at left-hand traffic", "{1.tag}", "{2.tag}");
959 group: tr("suspicious tag combination");
960}
961
962/* #19603 */
963way[footway][highway][footway=sidewalk ][highway!~/^(path|footway|cycleway|construction|proposed)$/] {
964 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
965 group: tr("suspicious tag combination");
966 suggestAlternative: "sidewalk=left";
967 suggestAlternative: "sidewalk=right";
968 suggestAlternative: "sidewalk=both";
969 suggestAlternative: "sidewalk=separate";
970}
971way[footway][highway][footway!=sidewalk][highway!~/^(path|footway|cycleway|construction|proposed)$/] {
972 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
973 group: tr("suspicious tag combination");
974}
975way[footway][!highway][!/:highway$/],
976way[cycleway][!highway][!/:highway$/] {
977 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
978 group: tr("missing tag");
979 assertNoMatch: "way footway=sidewalk abandoned:highway=unclassified";
980}
981
982/* #17498 */
983way[bicycle][/^cycleway(:|$)/][!/^bicycle:/][bicycle=~/^(no|use_sidepath)$/][/^cycleway(:|$)/!~/^(no|none|separate)$/] {
984 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
985 group: tr("suspicious tag combination");
986 assertMatch: "way bicycle=no cycleway=track";
987 assertMatch: "way bicycle=use_sidepath cycleway=lane";
988 assertMatch: "way bicycle=use_sidepath cycleway:left=lane";
989 assertNoMatch: "way bicycle=use_sidepath cycleway=no";
990 assertNoMatch: "way bicycle=use_sidepath bicycle:backward=yes cycleway:left=lane"; /* instead of :backward, could also be :forward or :conditional */
991 assertNoMatch: "way bicycle=no cycleway:right=no";
992 assertNoMatch: "way bicycle=use_sidepath cycleway:left=none";
993 assertNoMatch: "way highway=cycleway cycleway=separate";
994 assertNoMatch: "way highway=residential bicycle=use_sidepath";
995}
996
997/* #19980 */
998way[highway=living_street][maxspeed][maxspeed=~/mph/][get(split(" ", tag(maxspeed)), 0) > 15],
999way[highway=living_street][maxspeed][maxspeed!~/mph/][get(split(" ", tag(maxspeed)), 0) > 20] {
1000 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
1001 group: tr("suspicious tag combination");
1002 assertNoMatch: "way highway=living_street";
1003 assertNoMatch: "way highway=living_street maxspeed=20";
1004 assertNoMatch: "way highway=living_street maxspeed=\"15 mph\"";
1005 assertNoMatch: "way highway=living_street maxspeed=walk";
1006 assertMatch: "way highway=living_street maxspeed=30";
1007 assertMatch: "way highway=living_street maxspeed=\"20 mph\"";
1008}
1009
1010/* piste subtags, see #17606 */
1011way[piste:type=nordic][!piste:grooming] {
1012 throwWarning: tr("No grooming defined for {0} skiing, add {1}", "nordic", "piste:grooming=");
1013 group: tr("missing tag");
1014 assertMatch: "way piste:type=nordic";
1015 assertNoMatch: "way piste:type=nordic piste:grooming=classic";
1016}
1017
1018way[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty][count(parent_tags("piste:difficulty")) == 0] {
1019 set missing_parent_piste_difficulty;
1020}
1021way.missing_parent_piste_difficulty:new,
1022way.missing_parent_piste_difficulty:in-downloaded-area!:new {
1023 throwWarning: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1024 group: tr("missing tag");
1025 set missing_piste_difficulty;
1026 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1027}
1028relation[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty] >
1029 way[!piste:difficulty]!.missing_piste_difficulty {
1030 throwWarning: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1031 group: tr("missing tag");
1032 set missing_piste_difficulty_both;
1033 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1034}
1035way[piste:type=nordic][!piste:difficulty]!.missing_piste_difficulty!.missing_piste_difficulty_both {
1036 throwOther: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1037 group: tr("missing tag");
1038 assertMatch: "way piste:type=nordic";
1039 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1040}
1041
1042relation[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty] {
1043 throwOther: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1044 group: tr("missing tag");
1045 assertMatch: "relation piste:type=nordic";
1046 assertNoMatch: "relation piste:type=nordic piste:difficulty=easy";
1047}
1048relation[piste:type=nordic][!piste:grooming]{
1049 throwOther: tr("No grooming defined for {0} skiing, add {1}", "nordic", "piste:grooming=");
1050 group: tr("missing tag");
1051 assertMatch: "relation piste:type=nordic";
1052 assertNoMatch: "relation piste:type=nordic piste:grooming=classic";
1053}
1054
1055/* #21836 */
1056*[voltage:primary][voltage:secondary][transformer=generator][tag("voltage:secondary")<tag("voltage:primary")] {
1057 throwWarning: tr("{0} is lower than {1} on {2}.", "{1.key}", "{0.key}", "{2.tag}");
1058 group: tr("suspicious tag combination");
1059}
1060
1061/* #21286 */
1062area[/^(building|building:part)$/][height =~ /^[0-9]+(\.[0-9]+)?( m)?$/][min_height =~ /^[0-9]+(\.[0-9]+)?( m)?$/][get(split(" ", tag(height)), 0) <= get(split(" ", tag(min_height)), 0)],
1063area[/^(building|building:part)$/][building:levels][building:min_level][tag("building:levels") <= tag("building:min_level")] {
1064 throwWarning: tr("{0} is lower or equal to {1} on {2}", "{1.key}", "{2.key}", "{0.key}");
1065 group: tr("suspicious tag combination");
1066}
1067
Note: See TracBrowser for help on using the repository browser.