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

Last change on this file was 19468, checked in by stoecker, 3 days ago

add missing bracket, see #24456

  • Property svn:eol-style set to native
File size: 59.0 KB
Line 
1/* Rules partially derived from Taginfo statistics - see ticket #5017
2 * Taginfo query: select keypairs.key1, keypairs.key2, keypairs.count_all, keys.count_all, cast(keypairs.count_all as real)/keys.count_all as from_fraction_all from keys, keypairs where key1='waterway' and keys.key=keypairs.key2 and (key1<>'highway' or keypairs.count_all>12000) and (key1<>'railway' or keypairs.count_all>3000) and (key1<>'waterway' or keypairs.count_all>800) and key2 not like '%:%' and from_fraction_all>0.97 and 1 union select keypairs.key2, keypairs.key1, keypairs.count_all, keys.count_all, cast(keypairs.count_all as real)/keys.count_all as from_fraction_all from keys, keypairs where key2='waterway' and keys.key=keypairs.key1 and (key2<>'highway' or keypairs.count_all>12000) and (key2<>'railway' or keypairs.count_all>3000) and (key2<>'waterway' or keypairs.count_all>800) and key1 not like '%:%' and from_fraction_all>0.97 and 1 order by keypairs.count_all desc limit 1000;
3 */
4
5way[surface=~/^(unpaved|compacted|gravel|fine_gravel|pebblestone|ground|earth|dirt|grass|sand|mud|ice|salt|snow|woodchips)$/] { /* without grass_paver as it is controversial */
6 set unpaved_surface;
7}
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],
309relation[power=circuit][wires],
310relation[power=line_section][wires],
311*[amenity=vending_machine][shop],
312*[noname?][name],
313*[noref?][ref],
314*[nohousenumber?][addr:housenumber],
315*[actuator][handle][actuator !~ /(^|;)manual(;|$)/],
316*[mechanical_driver][handle][mechanical_driver !~ /(^|;)manual(;|$)/],
317way[oneway? ][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/],
318way[oneway? ][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/],
319way[oneway=-1][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/],
320way[oneway=-1][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][/^oneway:(bicycle|bus|mofa|moped|psv)$/!~/^no$/][!/^oneway:(.+:)?conditional$/] {
321 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
322 group: tr("suspicious tag combination");
323 assertMatch: "way power=plant generator:source=wind";
324 assertMatch: "way power=generator plant:source=combustion";
325 assertMatch: "way oneway=yes bicycle:backward=destination";
326 assertNoMatch: "way oneway=-1 bicycle:forward=destination oneway:bicycle=no";
327 assertNoMatch: "way oneway=yes bicycle:backward=destination oneway:bicycle=no";
328 assertNoMatch: "way oneway=yes bicycle:backward:conditional=\"yes @ (Mo-Fr)\" oneway:bicycle:conditional=\"no @ (Mo-Fr)\"";
329}
330
331/* {0.tag} together with {1.tag} (info level), see #9696 */
332way[highway=footway][oneway=no] {
333 throwOther: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
334 group: tr("suspicious tag combination");
335}
336
337/* {0.tag} together with {1.tag}, see #18411, #17950, #17330, #17623, #17592, #17594, #17542, #16861, #16147, #10186, #18815, #20960 */
338*[barrier=kerb][kerb=no],
339way[highway=construction][construction][construction=~/^(yes|minor|no)$/],
340way[railway=construction][construction][construction=~/^(yes|minor|no)$/],
341area[building=construction][construction][construction=~/^(yes|minor|no)$/],
342area[landuse=construction][construction][construction=~/^(yes|minor|no)$/],
343*[man_made=bridge][bridge=yes],
344*[man_made=tunnel][tunnel=yes],
345*[amenity=police][police],
346node[highway=crossing][crossing=no],
347node[railway=crossing][crossing=no],
348way[junction=yes][highway],
349way[tracktype=grade1][surface].unpaved_surface,
350way[tracktype=grade2][surface][surface=~/^(sand|mud|earth|dirt|grass|ice|salt|snow|woodchips)$/],
351way[tracktype=grade4][surface].fully_paved_surface,
352way[tracktype=grade5][surface].fully_paved_surface,
353way[segregated][bicycle=no],
354way[segregated][foot=no],
355way[man_made=pipeline][tunnel=flooded] {
356 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
357 group: tr("suspicious tag combination");
358}
359
360/* {0.tag} together with {1.tag} (error level) */
361relation[type=multipolygon][area=no] {
362 throwError: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
363 group: tr("suspicious tag combination");
364}
365
366/* {0.key} together with {1.key}, #18267, #17630, #17604, #21836 */
367node[transformer][voltage],
368node[marker][cover],
369node[marker][voltage],
370node[marker][pressure],
371node[marker][diameter],
372node[marker][substance],
373*[building:part][building],
374*[addr:street][addr:place][outside("CZ,DK")] {
375 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
376 group: tr("suspicious tag combination");
377}
378
379/* {0.tag} together with {1.tag} and {2.key}, #18471 */
380way[highway=~/^(cycleway|footway|path)$/][segregated=no][sidewalk =~/^(left|right|both)$/] {
381 throwWarning: tr("{0} together with {1} and {2}", "{0.tag}", "{1.tag}", "{2.key}");
382 group: tr("suspicious tag combination");
383}
384
385/* {0.key} together with {1.tag} and {2.key}, #19747 */
386way[railway][electrified=no][frequency],
387way[railway][electrified=no][voltage] {
388 throwWarning: tr("{0} together with {1} and {2}", "{0.key}", "{1.tag}", "{2.key}");
389 group: tr("suspicious tag combination");
390}
391
392/* #11127, #13727 */
393way[waterway][bridge=yes][waterway!=weir] {
394 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
395 suggestAlternative: "bridge=aqueduct";
396 group: tr("suspicious tag combination");
397 fixAdd: "bridge=aqueduct";
398}
399way[waterway=weir][bridge=yes][highway] {
400 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
401 suggestAlternative: "waterway=weir + ford=yes";
402 suggestAlternative: "waterway=dam";
403 suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
404 group: tr("suspicious tag combination");
405}
406
407/* #16214 */
408relation[type=multipolygon] >[role="inner"] way[area][eval(number_of_tags()) = 1] {
409 throwWarning: tr("{0} on an inner multipolygon ring without further tags", "{0.tag}");
410 fixRemove: "area";
411 set area_yes_autofix;
412 group: tr("suspicious tag combination");
413}
414
415/* only {0.key}, #11104, #12422, #14950, #19572, #20902 */
416/* relations excluded as there is a test for missing type=* plus several other test depending on the type exist */
417node[access][eval(number_of_tags()) = 1],
418way[access][eval(number_of_tags()) = 1],
419node[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
420way[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
421node[lanes][eval(number_of_tags()) = 1],
422way[lanes][eval(number_of_tags()) = 1],
423node[layer][eval(number_of_tags()) = 1],
424way[layer][eval(number_of_tags()) = 1],
425way[level][eval(number_of_tags()) = 1], /* nodes might be valid, e.g. start and end nodes of steps */
426node[lit][eval(number_of_tags()) = 1],
427way[lit][eval(number_of_tags()) = 1],
428node[name][eval(number_of_tags()) = 1],
429way[name][eval(number_of_tags()) = 1],
430node[ref][eval(number_of_tags()) = 1],
431way[ref][eval(number_of_tags()) = 1],
432node[surface][eval(number_of_tags()) = 1],
433way[surface][eval(number_of_tags()) = 1] {
434 throwWarning: tr("incomplete object: only {0}", "{0.key}");
435 set only_one_tag;
436 group: tr("missing tag");
437}
438/* only {0.key} and {1.key} */
439node[name][area][eval(number_of_tags()) = 2],
440way[name][area][eval(number_of_tags()) = 2],
441node[name][ref][eval(number_of_tags()) = 2],
442way[name][ref][eval(number_of_tags()) = 2] {
443 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
444 group: tr("missing tag");
445}
446/* only {0.tag}, #15269 */
447node[tourism=attraction][eval(number_of_tags()) = 1],
448way[tourism=attraction][eval(number_of_tags()) = 1] {
449 throwWarning: tr("incomplete object: only {0}", "{0.tag}");
450 group: tr("missing tag");
451}
452/* only {0.key} and {1.tag} */
453node[name][tourism=attraction][eval(number_of_tags()) = 2],
454way[name][tourism=attraction][eval(number_of_tags()) = 2] {
455 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
456 group: tr("missing tag");
457}
458
459/* #9811, #11491, #12865, #14310 */
460*[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)$/],
461/* addr:postcode is used together with place in some countries */
462*[boundary][/^addr:/],
463*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
464 throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
465 group: tr("suspicious tag combination");
466 assertMatch: "node place=foo addr:housenumber=5";
467 assertMatch: "node place=foo addr:housenumber=5 addr:postcode=12345";
468 assertNoMatch: "node place=foo addr:postcode=12345";
469}
470*[postal_code]["addr:postcode"][!highway][postal_code=*"addr:postcode"] {
471 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
472 group: tr("suspicious tag combination");
473}
474*[postal_code]["addr:postcode"][!highway][postal_code!=*"addr:postcode"] {
475 throwWarning: tr("{0} together with {1} and conflicting values", "{0.key}", "{1.key}");
476 group: tr("suspicious tag combination");
477}
478way[postal_code]["addr:postcode"][highway][postal_code=*"addr:postcode"] {
479 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
480 group: tr("suspicious tag combination");
481 fixRemove: "addr:postcode";
482}
483way[postal_code]["addr:postcode"][highway][postal_code!=*"addr:postcode"] {
484 throwWarning: tr("{0} together with {1} and conflicting values", "{0.key}", "{1.key}");
485 group: tr("suspicious tag combination");
486}
487way[highway]["addr:postcode"][highway!=services][highway!=rest_area][!postal_code] {
488 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
489 suggestAlternative: "postal_code";
490 group: tr("suspicious tag combination");
491 fixChangeKey: "addr:postcode=>postal_code";
492}
493
494/* #9195 */
495way[highway=footway][cycleway=lane] {
496 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
497 suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
498 group: tr("suspicious tag combination");
499}
500
501/* {0} on suspicious object, #17255, #19650, #19572, #17253, #19821, #15667, #19930, #20435, #20471, #18815 */
502way[oneway ][!highway][!area:highway][!railway][!aerialway][attraction!=summer_toboggan][aeroway!~/^(runway|taxiway)$/][leisure!=track][waterway !~ /^(canal|fairway|lock|river|tidal_channel)$/],
503node[lanes ][!barrier][!ford][highway!=mini_roundabout][!junction][leisure!~/^(bowling_alley|slipway|swimming_pool|track)$/][!traffic_calming]!.only_one_tag,
504way[lanes ][!barrier][!ford][!highway ][!area:highway][!junction][leisure!~/^(bowling_alley|slipway|swimming_pool|track)$/][!traffic_calming]!.only_one_tag,
505*[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,
506*[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],
507*[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.*/],
508*[width ][!highway][!area:highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone][leisure!=track],
509*[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],
510way[incline][!highway][!area:highway][!railway][aeroway!~/^(runway|taxiway)$/][attraction!=summer_toboggan][leisure!=slipway] {
511 throwWarning: tr("{0} on suspicious object", "{0.key}");
512 group: tr("suspicious tag combination");
513}
514
515/* #15667, #19930 */
516way[waterway][oneway][waterway =~ /^(canal|fairway|lock|river|tidal_channel)$/] {
517 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}");
518 group: tr("suspicious tag combination");
519}
520
521*[amenity][!name][amenity =~ /^(restaurant|cafe|fast_food|pub|place_of_worship|school|university|hospital|library|theatre|courthouse|bank|cinema|pharmacy|fuel)$/][noname!=yes] {
522 throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
523 group: tr("missing tag");
524 assertMatch: "node amenity=restaurant";
525 assertNoMatch: "node amenity=restaurant noname=yes";
526 assertNoMatch: "node amenity=restaurant name=Foobar";
527}
528
529/* #10193, #16157 */
530way[highway][barrier],
531*[highway][waterway][waterway!=dam][waterway!=weir],
532way[highway][natural][natural!=ridge],
533*[landuse][building][landuse!=retail] {
534 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
535 group: tr("suspicious tag combination");
536 assertNoMatch: "node highway=street_lamp natural=birds_nest";
537}
538
539/* #6932 */
540*[natural=water][leisure=swimming_pool] {
541 throwWarning: tr("natural water used for swimming pool");
542 group: tr("suspicious tag combination");
543 fixRemove: "natural";
544}
545
546/* #9593, #11183, #12418, #12761, #17254, #19311,#23604 */
547*[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] {
548 throwWarning: tr("sport without physical feature");
549 group: tr("missing tag");
550 assertMatch: "node sport=tennis";
551 assertNoMatch: "node sport=tennis leisure=pitch";
552 assertNoMatch: "node sport=beachvolleyball natural=beach";
553 assertNoMatch: "node sport=skiing"; /* skiing has deprecated warning */
554 assertNoMatch: "node sport=swimming tourism=hotel";
555 assertNoMatch: "node sport=10pin amenity=restaurant";
556 assertNoMatch: "node sport=boxing building:part=yes";
557}
558
559/* {0.key} without {1.key} or {2.key} see #10140 */
560*[building:levels][!building][!building:part],
561way[usage][!railway][!waterway][route!=railway][man_made!=pipeline][!aerialway] {
562 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
563 group: tr("missing tag");
564}
565
566/* any other *_name tag (with some exceptions) but not a name , see #10837 #11297 #11539 #16437 #17026 #22033 */
567*[/_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] {
568 throwWarning: tr("alternative name without {0}", "{1.key}");
569 group: tr("missing tag");
570 assertMatch: "way alt_name=Foo";
571 assertNoMatch: "way alt_name=Foo name=Bar";
572}
573
574/* #19604 */
575way[name][alt_name][name=*alt_name] {
576 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
577 group: tr("suspicious tag combination");
578 fixRemove: "alt_name";
579}
580
581/* #10837 */
582way[destination][!oneway?][junction!=roundabout][highway] {
583 throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
584 suggestAlternative: "destination:forward";
585 suggestAlternative: "destination:backward";
586}
587
588/* #11389, #19010 */
589way[maxspeed:forward][maxspeed:backward][!maxspeed]["maxspeed:forward"=*"maxspeed:backward"] {
590 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
591 suggestAlternative: "maxspeed";
592 group: tr("suspicious tag combination");
593 fixChangeKey: "maxspeed:forward=>maxspeed";
594 fixRemove: "maxspeed:backward";
595}
596way[maxspeed:forward][maxspeed:backward][maxspeed]["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed] {
597 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
598 set AllSameMaxspeed;
599 suggestAlternative: "maxspeed";
600 group: tr("suspicious tag combination");
601 fixRemove: "maxspeed:forward";
602 fixRemove: "maxspeed:backward";
603}
604way[cycleway:left][cycleway:right][!cycleway]["cycleway:left"=*"cycleway:right"] {
605 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
606 suggestAlternative: "cycleway";
607 group: tr("suspicious tag combination");
608 fixChangeKey: "cycleway:left=>cycleway";
609 fixRemove: "cycleway:right";
610}
611way[cycleway:left][cycleway:right][cycleway]["cycleway:left"=*cycleway]["cycleway:right"=*cycleway] {
612 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
613 set AllSameCycleway;
614 suggestAlternative: "cycleway";
615 group: tr("suspicious tag combination");
616 fixRemove: "cycleway:left";
617 fixRemove: "cycleway:right";
618}
619way[sidewalk:left][sidewalk:right][!sidewalk]["sidewalk:left"=*"sidewalk:right"] {
620 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
621 suggestAlternative: "sidewalk";
622 group: tr("suspicious tag combination");
623 fixChangeKey: "sidewalk:left=>sidewalk";
624 fixRemove: "sidewalk:right";
625}
626way[sidewalk:left][sidewalk:right][sidewalk]["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk] {
627 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
628 set AllSameSidewalk;
629 suggestAlternative: "sidewalk";
630 group: tr("suspicious tag combination");
631 fixRemove: "sidewalk:left";
632 fixRemove: "sidewalk:right";
633}
634way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed,
635way["cycleway:left"]["cycleway:right"][cycleway]!.AllSameCycleway,
636way["sidewalk:left"]["sidewalk:right"][sidewalk]!.AllSameSidewalk {
637 throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
638 group: tr("suspicious tag combination");
639}
640way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
641way["maxspeed:backward"][maxspeed][!"maxspeed:forward"],
642way["cycleway:left"][cycleway][!"cycleway:right"],
643way["cycleway:right"][cycleway][!"cycleway:left"],
644way["sidewalk:left"][sidewalk][!"sidewalk:right"],
645way["sidewalk:right"][sidewalk][!"sidewalk:left"] {
646 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
647 group: tr("suspicious tag combination");
648}
649
650/* #11837 */
651way[bridge][layer][layer<0][bridge!=no][location!=underground][indoor!=yes][!tunnel],
652way[tunnel][layer][layer>0][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
653 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
654 group: tr("suspicious tag combination");
655}
656
657/* #12942 */
658relation[oneway][type!=route] {
659 throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
660}
661
662/* #9182 */
663way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
664 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}");
665 group: tr("suspicious tag combination");
666}
667way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
668 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}");
669 group: tr("suspicious tag combination");
670}
671
672/* {0.key} without {1.tag} see #13138, #14468 */
673way[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir]!:closed, /* water=intermittent is deprecated and has an own warning */
674area[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir]:closed {
675 throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
676 group: tr("missing tag");
677}
678
679/* #13680 */
680area[golf=bunker][natural=beach] {
681 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
682 suggestAlternative: "natural=sand";
683 suggestAlternative: "surface=sand";
684 group: tr("suspicious tag combination");
685}
686
687/* #13705 */
688relation[type=multipolygon][building] > way {
689 set part_of_building_MP;
690}
691way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier][place!=plot]!.part_of_building_MP {
692 /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
693 throwOther: tr("possibly missing {0} tag", "{1.key}");
694 group: tr("missing tag");
695}
696
697/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
698way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/] {
699 set MotorwayTrunk;
700}
701way.MotorwayTrunk[lanes][turn:lanes ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
702way.MotorwayTrunk[lanes][change:lanes ][tag(lanes)!=eval(count(split("|", tag("change:lanes"))))],
703way.MotorwayTrunk[lanes][maxspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("maxspeed:lanes"))))],
704way.MotorwayTrunk[lanes][minspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("minspeed:lanes"))))],
705way.MotorwayTrunk[lanes][destination:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:lanes"))))],
706way.MotorwayTrunk[lanes][destination:ref:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:ref:lanes"))))],
707way.MotorwayTrunk[lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
708 throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
709 group: tr("suspicious tag combination");
710}
711
712/* #14125, #14323, #18185 */
713way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][highway!=motorway][junction!=roundabout][lanes>2][mod(tag(lanes),2)=1] {
714 throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
715 group: tr("missing tag");
716 assertNoMatch: "way highway=primary lanes=2";
717 assertNoMatch: "way highway=primary lanes=3 lanes:backward=2";
718 assertNoMatch: "way highway=primary lanes=3 oneway=-1";
719 assertNoMatch: "way highway=primary lanes=4";
720 assertMatch: "way highway=primary lanes=3";
721}
722
723/* #10932, #19609 */
724way[/^.*:lanes$/][!lanes][highway][!source:lanes],
725way[/^.*:lanes:(forward|backward|both_ways)$/][!lanes][highway],
726way[/^.*:lanes:both_ways$/][!lanes:both_ways][highway] {
727 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
728 group: tr("missing tag");
729 assertMatch: "way highway=primary turn:lanes=left|right";
730 assertMatch: "way highway=primary turn:lanes:forward=left|right";
731 assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
732}
733way[/^.*:lanes:forward$/][!lanes:forward][!lanes:backward][highway][mod(tag(lanes),2)=0],
734way[/^.*:lanes:backward$/][!lanes:backward][!lanes:forward][highway][mod(tag(lanes),2)=0] {
735 throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
736 group: tr("missing tag");
737 assertMatch: "way highway=primary turn:lanes:forward=left|right lanes=2";
738 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
739 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes=3";
740}
741
742/* #15774 */
743node[emergency=fire_hydrant][fire_hydrant:count][fire_hydrant:count!=1] {
744 throwOther: tr("{0} together with {1}. Tag each hydrant separately.", "{0.tag}", "{1.tag}");
745}
746
747/* #12502 */
748node[leisure=park][natural=tree] {
749 throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
750 group: tr("suspicious tag combination");
751 fixRemove: "leisure";
752}
753
754/* #17305 */
755area[boundary=administrative][landuse=residential] {
756 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
757 group: tr("suspicious tag combination");
758}
759
760/* #17391 */
761way[highway=pedestrian][width][siunit_length(tag(width))<3] {
762 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
763 suggestAlternative: "highway=footway";
764 group: tr("suspicious tag combination");
765 fixAdd: "highway=footway";
766 assertMatch: "way highway=pedestrian width=0.8";
767 assertMatch: "way highway=pedestrian width=1";
768 assertNoMatch: "way highway=pedestrian width=3";
769 assertNoMatch: "way highway=pedestrian width=5.5";
770}
771
772/* see #17623 */
773way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|busway|bus_guideway|bridleway/][area!=yes] {
774 throwOther: tr("A linear object {0} without {1} has a tag indicating that it is an area.", "{1.tag}", "{3.tag}");
775 group: tr("suspicious tag combination");
776}
777
778/* #17804 */
779area[cemetery=sector][landuse=cemetery] {
780 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
781 group: tr("suspicious tag combination");
782}
783
784/* #17967 */
785*[highway=cycleway][cycleway=track] {
786 throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
787 group: tr("suspicious tag combination");
788 fixRemove: "cycleway";
789}
790
791/* #17973, #18183, #18331, #20318 */
792way[highway=path ][!segregated][foot=designated][bicycle=designated],
793way[highway=footway ][!segregated][bicycle=designated],
794way[highway=cycleway][!segregated][foot=designated] {
795 throwWarning: tr("Combined foot- and cycleway without {0}.", "{1.key}");
796 group: tr("missing tag");
797}
798
799/* #17989 */
800node[emergency_ward_entrance][emergency!=emergency_ward_entrance] {
801 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
802 group: tr("missing tag");
803 fixAdd: "emergency=emergency_ward_entrance";
804}
805
806/* missing or conflicting construction, see #17607 */
807/* {0.key} without {1.key} and {2.key} */
808*[construction:building][!building][!construction],
809*[construction:highway][!highway][!construction],
810*[construction:railway][!railway][!construction],
811*[construction:landuse][!landuse][!construction] {
812 throwWarning: tr("{0} without {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
813 group: tr("missing tag");
814 fixAdd: "{1.key}=construction";
815 fixAdd: "construction={0.value}";
816 assertMatch: "way construction:building=house";
817 assertNoMatch: "way construction:building=house building=house ";
818 assertNoMatch: "way construction:building=house construction=house";
819}
820/* {0.key} and {1.key} without {2.key} */
821*[building=construction]["construction:building"][!construction],
822*[highway=construction]["construction:highway"][!construction],
823*[railway=construction]["construction:railway"][!construction],
824*[landuse=construction]["construction:landuse"][!construction] {
825 throwWarning: tr("{0} together with {1} but without {2}", "{0.key}", "{1.key}", "{2.key}");
826 group: tr("missing tag");
827 fixAdd: "construction={1.value}";
828 assertMatch: "way construction:building=house building=construction";
829 assertNoMatch: "way construction:building=house building=house ";
830 assertNoMatch: "way construction:building=house construction=house";
831}
832/* {0.key} and {1.key} without {2.key} */
833*[building]["construction:building"][!construction][building!=construction],
834*[highway]["construction:highway"][!construction][highway!=construction],
835*[railway]["construction:railway"][!construction][railway!=construction],
836*[landuse]["construction:landuse"][!construction][landuse!=construction] {
837 throwWarning: tr("{0} together with {1} and conflicting values plus no {2}", "{0.key}", "{1.key}", "{2.key}");
838 group: tr("suspicious tag combination");
839 assertMatch: "way construction:building=house building=office";
840 assertNoMatch: "way construction:building=house building=construction";
841 assertNoMatch: "way construction:building=house construction=house";
842}
843
844*["construction:building"][construction][construction:building != *construction],
845*["construction:highway"][construction][construction:highway != *construction],
846*["construction:railway"][construction][construction:railway != *construction],
847*["construction:landuse"][construction][construction:landuse != *construction] {
848 throwWarning: tr("{0} together with {1} and conflicting values", "{0.key}", "{1.key}");
849 group: tr("suspicious tag combination");
850 assertMatch: "way construction:building=house construction=office";
851 assertNoMatch: "way construction:building=house construction=house";
852}
853
854/* #18203, #20960 */
855way[highway][construction][construction!~/^(yes|minor|no)$/][highway!=construction],
856way[railway][construction][construction!~/^(yes|minor|no)$/][railway!=construction],
857area[building][construction][construction!~/^(yes|minor|no)$/][building!=construction],
858area[landuse][construction][construction!~/^(yes|minor|no)$/][landuse!=construction] {
859 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
860 group: tr("suspicious tag combination");
861}
862
863/* #18374, #22295 */
864*[amenity=recycling][collection_times="24/7"][!opening_hours],
865*[amenity=recycling][collection_times ][!opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
866 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
867 group: tr("suspicious tag combination");
868 fixChangeKey: "collection_times => opening_hours";
869 assertMatch: "node amenity=recycling collection_times=\"Mo-Fr 06:00-20:00\"";
870 assertNoMatch: "node amenity=recycling collection_times=\"Mo-Fr 15:00\"";
871 assertNoMatch: "node amenity=recycling collection_times=\"Mo 08:00-11:00\"";
872 assertNoMatch: "node amenity=recycling collection_times=\"Sa[2,4] 8:00-11:00\"";
873}
874
875/* #19018 */
876way[highway][crossing][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/] {
877 throwWarning: tr("{0} together with {1}. Should be used on a minor highway type or a node", "{1.key}", "{0.tag}");
878 group: tr("suspicious tag combination");
879 fixRemove: "crossing";
880 assertMatch: "way highway=trunk crossing=unmarked";
881 assertNoMatch: "way highway=construction construction=footway crossing=unmarked";
882}
883
884/* #19066 */
885*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
886 throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
887 group: tr("missing tag");
888}
889*[source:addr][!/^addr:/] {
890 throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
891 group: tr("missing tag");
892 assertMatch: "node source:addr=postman";
893 assertNoMatch: "node source:addr=postman addr:housenumber=42";
894}
895*[source:maxspeed][!/^maxspeed:?/] {
896 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
897 group: tr("missing tag");
898}
899
900/* #16898, tower vs. communications_tower, wiki suggests 100m as rough guideline, so we warn for < 75m */
901*[man_made=communications_tower][height][siunit_length(tag(height)) < 75] {
902 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
903 suggestAlternative: "man_made=tower + tower:type=communication + height";
904 group: tr("suspicious tag combination");
905 assertMatch: "node man_made=communications_tower height=58";
906 assertMatch: "node man_made=communications_tower height=\"74 m\"";
907 assertMatch: "node man_made=communications_tower height=0.8";
908 assertMatch: "node man_made=communications_tower height=245'";
909 assertMatch: "node man_made=communications_tower height=\"224.22 ft\"";
910 assertMatch: "node man_made=communications_tower height=231'10.22\"";
911 assertNoMatch: "node man_made=communications_tower height=\"75 m\"";
912 assertNoMatch: "node man_made=communications_tower height=75.72";
913 assertNoMatch: "node man_made=communications_tower height=\"328.22 ft\"";
914 assertNoMatch: "node man_made=communications_tower height=4358'8\"";
915 assertNoMatch: "node height=4358'";
916}
917
918/* #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. */
919*[fixme][count(split(" ", tag("fixme"))) == 1][has_tag_key(tag("fixme"))],
920*[FIXME][count(split(" ", tag("FIXME"))) == 1][has_tag_key(tag("FIXME"))] {
921 throwWarning: tr("{0} together with {1}. Is the fixme fixed?", "{0.tag}", "{0.value}");
922 group: tr("suspicious tag combination");
923 assertMatch: "way name=\"Florist Gump\" fixme=name";
924 assertMatch: "way name=\"Florist Gump\" FIXME=name";
925 assertNoMatch: "way fixme=name";
926 assertNoMatch: "way name=\"Florist Gump\"";
927 assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
928}
929
930/* #19094 */
931way[highway][placement=transition][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition],
932way[highway][!placement][/^placement:.*$/][join_list("", uniq_list(tag_regex("^placement:.*$")))==transition] {
933 throwWarning: tr("Use {0} only as value of {1}", "transition", "placement");
934 set PlacementTransitionWarning;
935 fixAdd: "placement=transition";
936 fixRemove: "placement:forward";
937 fixRemove: "placement:backward";
938 fixRemove: "placement:both_ways";
939 assertMatch: "way highway=primary placement=transition placement:both_ways=transition";
940 assertMatch: "way highway=primary placement:backward=transition placement:forward=transition";
941 assertNoMatch: "way highway=primary placement:backward=middle_of:1 placement:forward=transition";
942 assertNoMatch: "way highway=primary placement=middle_of:1 placement:backward=transition placement:forward=transition";
943}
944way[placement][/^placement:.*$/][highway]!.PlacementTransitionWarning,
945way["placement:forward"]["placement:backward"][highway]!.PlacementTransitionWarning,
946way["placement:forward"]["placement:both_ways"][highway]!.PlacementTransitionWarning,
947way["placement:backward"]["placement:both_ways"][highway]!.PlacementTransitionWarning {
948 throwError: tr("{0} together with {1}", "{0.key}", "{1.key}");
949 group: tr("suspicious tag combination");
950 assertMatch: "way highway=primary placement=left_of:2 placement:forward=right_of:1";
951 assertNoMatch: "way highway=primary placement:forward=right_of:1";
952 assertNoMatch: "way highway=primary placement:forward=transition placement:both_ways=transition";
953}
954
955/* #19742 */
956node:righthandtraffic[highway=mini_roundabout][direction=clockwise] {
957 throwWarning: tr("{0} together with {1} at right-hand traffic", "{1.tag}", "{2.tag}");
958 group: tr("suspicious tag combination");
959}
960node!:righthandtraffic[highway=mini_roundabout][direction=anticlockwise] {
961 throwWarning: tr("{0} together with {1} at left-hand traffic", "{1.tag}", "{2.tag}");
962 group: tr("suspicious tag combination");
963}
964
965/* #19603 */
966way[footway][highway][footway=sidewalk ][highway!~/^(path|footway|cycleway|construction|proposed)$/] {
967 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
968 group: tr("suspicious tag combination");
969 suggestAlternative: "sidewalk=left";
970 suggestAlternative: "sidewalk=right";
971 suggestAlternative: "sidewalk=both";
972 suggestAlternative: "sidewalk=separate";
973}
974way[footway][highway][footway!=sidewalk][highway!~/^(path|footway|cycleway|construction|proposed)$/] {
975 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
976 group: tr("suspicious tag combination");
977}
978way[footway][!highway][!/:highway$/],
979way[cycleway][!highway][!/:highway$/] {
980 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
981 group: tr("missing tag");
982 assertNoMatch: "way footway=sidewalk abandoned:highway=unclassified";
983}
984
985/* #17498 */
986way[bicycle][/^cycleway(:|$)/][!/^bicycle:/][bicycle=~/^(no|use_sidepath)$/][/^cycleway(:|$)/!~/^(no|none|separate)$/] {
987 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
988 group: tr("suspicious tag combination");
989 assertMatch: "way bicycle=no cycleway=track";
990 assertMatch: "way bicycle=use_sidepath cycleway=lane";
991 assertMatch: "way bicycle=use_sidepath cycleway:left=lane";
992 assertNoMatch: "way bicycle=use_sidepath cycleway=no";
993 assertNoMatch: "way bicycle=use_sidepath bicycle:backward=yes cycleway:left=lane"; /* instead of :backward, could also be :forward or :conditional */
994 assertNoMatch: "way bicycle=no cycleway:right=no";
995 assertNoMatch: "way bicycle=use_sidepath cycleway:left=none";
996 assertNoMatch: "way highway=cycleway cycleway=separate";
997 assertNoMatch: "way highway=residential bicycle=use_sidepath";
998}
999
1000/* #19980 */
1001way[highway=living_street][maxspeed][maxspeed=~/mph/][get(split(" ", tag(maxspeed)), 0) > 15],
1002way[highway=living_street][maxspeed][maxspeed!~/mph/][get(split(" ", tag(maxspeed)), 0) > 20][outside("AT,CL,DK,IL,UZ")],
1003way[highway=living_street][maxspeed][maxspeed!~/mph/][get(split(" ", tag(maxspeed)), 0) > 30][inside("AT,CL,DK,IL,UZ")] { /*Austria, Chile, Denmark, Israel, Uzbekistan*/
1004 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
1005 group: tr("suspicious tag combination");
1006 assertNoMatch: "way highway=living_street";
1007 assertNoMatch: "way highway=living_street maxspeed=20";
1008 assertNoMatch: "way highway=living_street maxspeed=\"15 mph\"";
1009 assertNoMatch: "way highway=living_street maxspeed=walk";
1010 assertMatch: "way highway=living_street maxspeed=50";
1011 assertMatch: "way highway=living_street maxspeed=\"20 mph\"";
1012}
1013
1014/* piste subtags, see #17606 */
1015way[piste:type=nordic][!piste:grooming] {
1016 throwWarning: tr("No grooming defined for {0} skiing, add {1}", "nordic", "piste:grooming=");
1017 group: tr("missing tag");
1018 assertMatch: "way piste:type=nordic";
1019 assertNoMatch: "way piste:type=nordic piste:grooming=classic";
1020}
1021
1022way[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty][count(parent_tags("piste:difficulty")) == 0] {
1023 set missing_parent_piste_difficulty;
1024}
1025way.missing_parent_piste_difficulty:new,
1026way.missing_parent_piste_difficulty:in-downloaded-area!:new {
1027 throwWarning: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1028 group: tr("missing tag");
1029 set missing_piste_difficulty;
1030 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1031}
1032relation[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty] >
1033 way[!piste:difficulty]!.missing_piste_difficulty {
1034 throwWarning: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1035 group: tr("missing tag");
1036 set missing_piste_difficulty_both;
1037 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1038}
1039way[piste:type=nordic][!piste:difficulty]!.missing_piste_difficulty!.missing_piste_difficulty_both {
1040 throwOther: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1041 group: tr("missing tag");
1042 assertMatch: "way piste:type=nordic";
1043 assertNoMatch: "way piste:type=nordic piste:difficulty=easy";
1044}
1045
1046relation[piste:type =~ /^downhill|nordic|skitour$/][!piste:difficulty] {
1047 throwOther: tr("No difficulty defined for skiing, add {0}", "piste:difficulty=");
1048 group: tr("missing tag");
1049 assertMatch: "relation piste:type=nordic";
1050 assertNoMatch: "relation piste:type=nordic piste:difficulty=easy";
1051}
1052relation[piste:type=nordic][!piste:grooming]{
1053 throwOther: tr("No grooming defined for {0} skiing, add {1}", "nordic", "piste:grooming=");
1054 group: tr("missing tag");
1055 assertMatch: "relation piste:type=nordic";
1056 assertNoMatch: "relation piste:type=nordic piste:grooming=classic";
1057}
1058
1059/* #21836 */
1060*[voltage:primary][voltage:secondary][transformer=generator][tag("voltage:secondary")<tag("voltage:primary")] {
1061 throwWarning: tr("{0} is lower than {1} on {2}.", "{1.key}", "{0.key}", "{2.tag}");
1062 group: tr("suspicious tag combination");
1063}
1064
1065/* #21286 */
1066area[/^(building|building:part)$/][height][min_height][siunit_length(tag(height)) <= siunit_length(tag(min_height))],
1067area[/^(building|building:part)$/][building:levels][building:min_level][tag("building:levels") <= tag("building:min_level")] {
1068 throwWarning: tr("{0} is lower or equal to {1} on {2}", "{1.key}", "{2.key}", "{0.key}");
1069 group: tr("suspicious tag combination");
1070}
1071
1072/* #23932 */
1073way[cycleway:right][cycleway:right!=lane][cycleway:right!=separate][/^cycleway(:right|:both|):buffer/],
1074way[cycleway:left][cycleway:left!=lane][cycleway:left!=separate][/^cycleway(:left|:both|):buffer/],
1075way[cycleway:both][cycleway:both!=lane][cycleway:both!=separate][/^cycleway(:right|:left|:both|):buffer/],
1076way[cycleway][cycleway!=lane][cycleway!=separate][/^cycleway(:right|:left|:both|):buffer/] {
1077 throwWarning: tr("{0} together with {1}", "{0.tag}", "{3.tag}");
1078 group: tr("suspicious tag combination");
1079 assertMatch: "way cycleway:left=shared_lane cycleway:buffer=no";
1080 assertMatch: "way cycleway:both=track cycleway:left:buffer=yes";
1081 assertMatch: "way cycleway=shared_busway cycleway:buffer=no";
1082 assertNoMatch: "way cycleway:right=lane cycleway:right:buffer=no";
1083 assertNoMatch: "way cycleway:right=separate cycleway:right:buffer=yes";
1084 assertNoMatch: "way cycleway:left=lane cycleway:left:buffer=yes";
1085 assertNoMatch: "way cycleway:both=lane cycleway:both:buffer=no";
1086 assertNoMatch: "way cycleway:both=lane cycleway:left:buffer=yes";
1087 assertNoMatch: "way cycleway:both=lane cycleway:buffer=no";
1088 assertNoMatch: "way cycleway=lane cycleway:buffer=yes";
1089 assertNoMatch: "way cycleway=lane cycleway:right:buffer=no";
1090 assertNoMatch: "way cycleway=lane cycleway:both:buffer=no";
1091}
1092
1093way[cycleway:right=separate][/^cycleway(:right|:both):./],
1094way[cycleway:left=separate][/^cycleway(:left|:both):./],
1095way[cycleway:both=separate][/^cycleway(:right|:left|:both):./],
1096way[cycleway=separate][/^cycleway(:right|:left|:both):./] {
1097 throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
1098 group: tr("suspicious tag combination");
1099 assertMatch: "way cycleway:right=separate cycleway:right:surface=asphalt";
1100 assertMatch: "way cycleway:right=separate cycleway:both:buffer=yes";
1101 assertMatch: "way cycleway:left=separate cycleway:left:surface=asphalt";
1102 assertMatch: "way cycleway:left=separate cycleway:both:buffer=yes";
1103 assertMatch: "way cycleway:both=separate cycleway:right:surface=asphalt";
1104 assertMatch: "way cycleway:both=separate cycleway:left:surface=asphalt";
1105 assertMatch: "way cycleway:both=separate cycleway:both:buffer=yes";
1106 assertMatch: "way cycleway=separate cycleway:right:surface=asphalt";
1107 assertMatch: "way cycleway=separate cycleway:left:surface=asphalt";
1108 assertMatch: "way cycleway=separate cycleway:both:buffer=yes";
1109 assertNoMatch: "way cycleway:right=separate cycleway:left:surface=asphalt";
1110 assertNoMatch: "way cycleway:left=separate cycleway:right:buffer=yes";
1111 assertNoMatch: "way cycleway:both=separate";
1112 assertNoMatch: "way cycleway=separate";
1113}
1114
1115way[/^cycleway:right:/][!cycleway:right][!cycleway:both][!cycleway],
1116way[/^cycleway:left:/][!cycleway:left][!cycleway:both][!cycleway],
1117way[/^cycleway:both:/][!cycleway:both][!cycleway][!cycleway:left][!cycleway:right],
1118way[/^cycleway(?!:right|:left|:both|:lanes):/][!cycleway][!cycleway:both][!cycleway:left][!cycleway:right][segregated!=yes] {
1119 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
1120 group: tr("missing tag");
1121 suggestAlternative: "{0.tag} + {1.key}=*";
1122 assertMatch: "way cycleway:right=lane cycleway:left:buffer=yes";
1123 assertMatch: "way cycleway:right:buffer=yes";
1124 assertMatch: "way cycleway:right:surface=asphalt";
1125 assertMatch: "way cycleway:left=lane cycleway:right:buffer=no";
1126 assertMatch: "way cycleway:left:buffer=yes";
1127 assertMatch: "way cycleway:left:surface=asphalt";
1128 assertMatch: "way cycleway:both:buffer=yes";
1129 assertMatch: "way cycleway:both:surface=asphalt";
1130 assertMatch: "way cycleway:buffer=no";
1131 assertNoMatch: "way cycleway:right=lane cycleway:right:buffer=yes";
1132 assertNoMatch: "way cycleway:left=lane cycleway:left:buffer=yes";
1133 assertNoMatch: "way cycleway:both=lane cycleway:both:buffer=yes";
1134 assertNoMatch: "way cycleway=lane cycleway:buffer=yes";
1135 assertNoMatch: "way cycleway:left=lane cycleway:right=lane cycleway:both:buffer=yes";
1136 assertNoMatch: "way cycleway:left=lane cycleway:right=lane cycleway:buffer=no";
1137 assertNoMatch: "way cycleway=lane cycleway:surface=asphalt";
1138 assertNoMatch: "way cycleway:both=lane cycleway:both:surface=asphalt";
1139 assertNoMatch: "way highway=path segregated=yes cycleway:surface=needles footway:surface=paving_stones";
1140 assertNoMatch: "way highway=primary oneway=yes bicycle:lanes=no|designated|yes cycleway:lanes=|lane|no";
1141}
1142
1143/* Prevent redundancy between relation and members, see #24456, #24457 */
1144relation[power=circuit] > way[power=line][frequency],
1145relation[power=circuit] > way[power=minor_line][frequency],
1146relation[power=circuit] > way[power=cable][frequency] {
1147 throwWarning: tr("Frequency tag should be on the circuit relation only, not on the power segment");
1148 group: tr("redundant tagging");
1149}
1150relation[power=circuit] > relation[power=line_section][frequency] {
1151 throwWarning: tr("Frequency tag should be on the circuit relation only, not on the power section");
1152 group: tr("redundant tagging");
1153}
1154
1155/* Invalid topology with power circuit relation, see #24456 */
1156relation[power=circuit][topology][topology!~/^(linear|branched)$/] {
1157 throwError: tr("power=circuit relations should have a topology tag with value linear or branched");
1158 assertMatch: "relation type=power power=circuit topology=branch";
1159 assertNoMatch: "relation type=power power=circuit topology=branched";
1160}
Note: See TracBrowser for help on using the repository browser.