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

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

fix #17296 - support variant FIXME too

  • Property svn:eol-style set to native
File size: 37.2 KB
RevLine 
[6548]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
[15268]5way[surface=~/^(unpaved|compacted|gravel|fine_gravel|pebblestone|ground|earth|dirt|grass|sand|mud|ice|salt|snow|woodchips)$/] { /* without grass_paver as it is controversial */
6 set unpaved_surface;
7}
8
[7229]9/* {0.key} without {1.key} (warning level) */
[16233]10way[junction ][!highway][junction!=yes][!area:highway],
[11407]11way[lanes ][!highway][leisure!=track][leisure!=swimming_pool],
[11305]12way[living_street ][!highway],
13way[maintenance ][!highway],
14way[median ][!highway],
15way[motorroad ][!highway],
16node[ntd_id ][!highway],
17way[sac_scale ][!highway],
18way[sidewalk ][!highway],
[13566]19way[step_count ][!highway][man_made!=tower],
[11305]20way[tracktype ][!highway],
[13092]21way[trail_visibility ][!highway], /* #15029 */
[11305]22way[trolley_wire ][!highway],
23way[zip_left ][!highway],
24way[zip_right ][!highway],
25way[detail ][!railway][route!=railway],
26way[eddy_current_brake ][!railway][route!=railway],
[13452]27way[electrified ][!railway][route!=railway][!highway], /* #16007 */
[11305]28way[etcs ][!railway][route!=railway],
29way[gauge ][!railway][route!=railway],
30way[grade_of_track ][!railway][route!=railway],
31way[kursbuchstrecke ][!railway][route!=railway],
32way[lzb ][!railway][route!=railway],
33way[old_railway_operator ][!railway][route!=railway],
34way[operating_procedure ][!railway][route!=railway],
35way[pzb ][!railway][route!=railway],
36way[structure_gauge ][!railway][route!=railway],
37way[tilting_technology ][!railway][route!=railway],
38way[track_class ][!railway][route!=railway],
39way[tracks ][!railway][route!=railway],
40way[traffic_mode ][!railway][route!=railway],
41way[workrules ][!railway][route!=railway],
42way[length_unit ][!waterway],
43way[canal ][!waterway],
44way[have_riverbank ][!waterway],
[6548]45*[border_type ][!boundary],
[8121]46*[piste:difficulty ][!piste:type],
[14799]47*[place ][!name][place!=islet],
[15260]48*[transformer ][!power],
[6548]49*[source:date ][!source],
[16255]50*[source:name ][!name][noname!=yes],
[13032]51*[source:maxspeed:forward ][!maxspeed:forward][!maxspeed],
52*[source:maxspeed:backward ][!maxspeed:backward][!maxspeed],
[6548]53*[source:building ][!building],
[16255]54*[source:ref ][!ref][noref!=yes],
[6548]55*[source:population ][!population],
56*[source:postal_code ][!postal_code],
57*[source:ele ][!ele],
58*[source:ref:INSEE ][!ref:INSEE],
59*[source:lit ][!lit],
60*[source:hgv ][!hgv],
61*[source:highway ][!highway],
62*[source:maxaxleload ][!maxaxleload],
63*[source:surface ][!surface],
64*[source:bridge ][!bridge],
65*[source:old_name ][!old_name],
66*[source:bicycle ][!bicycle],
67*[source:designation ][!designation],
68*[source:height ][!height],
69*[source:lanes ][!lanes],
[6645]70*[source:postcode ][!addr:postcode],
71*[source:housenumber ][!addr:housenumber],
72*[source:addr:postcode ][!addr:postcode],
[16255]73*[source:addr:housenumber ][!addr:housenumber] {
[6548]74 throwWarning: tr("{0} without {1}", "{0.key}", "{1.key}");
[16769]75 set MissingKeyWarning;
[11146]76 group: tr("missing tag");
[6548]77 assertMatch: "way lanes=42";
78 assertNoMatch: "way lanes=42 highway=unclassified";
79 assertMatch: "node source:addr:postcode=postman";
80}
81
[7229]82/* {0.key} without {1.key} (info level) */
[11305]83way[lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1],
84way[lanes:backward][!lanes:forward][oneway!=yes][oneway!=-1],
[7229]85*[leaf_type ][!leaf_cycle],
86*[leaf_cycle][!leaf_type] {
87 throwOther: tr("{0} without {1}", "{0.key}", "{1.key}");
[11146]88 group: tr("missing tag");
[7229]89}
90
[15267]91/* {0.key} without {1.tag}, #17997 */
[15433]92node[railway:switch ][railway!=switch],
[15267]93*[generator:source ][power!=generator],
94*[generator:method ][power!=generator],
95*[generator:type ][power!=generator],
[14593]96node[fire_hydrant:type ][emergency!=fire_hydrant][disused:emergency!=fire_hydrant],
[15260]97node[manhole ][man_made!=manhole],
[11305]98way[fence_type ][barrier!=fence],
[6548]99*[recycling_type ][amenity!=recycling],
[7996]100*[information ][tourism!=information],
[11305]101node[board_type ][information!=board],
[6548]102*[shelter_type ][amenity!=shelter],
[11305]103node[lamp_type ][highway!=street_lamp],
104node[map_type ][information!=map],
[6548]105*[site_type ][historic!=archaeological_site],
[13508]106*[artwork_type ][tourism!=artwork][exhibit!=artwork],
[6548]107*[castle_type ][historic!=castle],
[15624]108*[parking ][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking)$/][parking!=yes][parking!=no],
[11305]109way[cutline ][man_made!=cutline],
[6548]110*[bunker_type ][military!=bunker] {
111 throwWarning: tr("{0} without {1}", "{0.key}", "{1.tag}");
[11146]112 group: tr("missing tag");
[6548]113}
114
[15325]115/* {0.key} without {1.tag} or {2.tag}, #15107 */
116*[iata ][aeroway!=aerodrome][aeroway!=helipad],
117*[icao ][aeroway!=aerodrome][aeroway!=helipad],
[12677]118*[bridge:movable ][bridge!=movable][man_made!=bridge],
[9903]119*[substation ][power!=substation][pipeline!=substation],
[13972]120*[reservoir_type ][landuse!=reservoir][water!=reservoir],
121way[waterway=pressurised ][tunnel!=flooded][man_made!=pipeline] {
[9903]122 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.tag}", "{2.tag}");
[11146]123 group: tr("missing tag");
[9903]124}
125
[15584]126/* {0.tag} without {1.key} (warning level), #18411, #18246 */
127way[railway=construction][!construction],
[15467]128way[highway=construction][!construction],
[15190]129node[traffic_sign=maxspeed][!maxspeed],
[15139]130node[actuator=manual][!handle],
[14593]131node[emergency=fire_hydrant][!fire_hydrant:type],
[14800]132way[ boundary=administrative][!admin_level],
[13084]133relation[boundary=administrative][!admin_level],
[14798]134relation[route=bicycle ][!network][type=route],
135relation[route=hiking ][!network][type=route],
136relation[route=foot ][!network][type=route],
137relation[route=horse ][!network][type=route],
[10320]138relation[route=piste][!piste:type][type=route],
[14798]139relation[route=ski ][!piste:type][type=route],
[7996]140*[tourism=information][!information],
[11153]141*[leisure=pitch][!sport],
[7929]142*[aeroway=terminal][!building],
[15634]143*[office=government][!government],
[7967]144*[power=generator][!generator:source],
[11398]145*[amenity=social_facility][!social_facility],
[16705]146*[amenity=place_of_worship][!religion],
147*[man_made=tower][!tower:type] {
[7923]148 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.key}");
[11146]149 group: tr("missing tag");
[7923]150}
151
[15325]152/* {0.tag} without {1.key} (info level), #15107 */
153*[aeroway=runway ][!ref],
154*[aeroway=runway ][!surface],
[15635]155node[highway=crossing ][!crossing],
[11428]156way[highway=track ][!tracktype],
[9495]157way[power=cable ][!location],
[13814]158node[power=transformer ][!voltage:primary],
159node[power=transformer ][!voltage:secondary],
160node[transformer=distribution ][!voltage:primary][power=pole],
161node[transformer=distribution ][!voltage:secondary][power=pole],
[9500]162way[power=line ][!voltage],
163way[power=minor_line ][!voltage],
164way[power=cable ][!voltage],
165*[power=generator ][!voltage][generator:output:electricity],
166*[power=plant ][!voltage][plant:output:electricity],
167*[power=substation ][!substation],
[12997]168*[power=switch ][!switch],
[9500]169*[power=transformer ][!transformer],
[14799]170*[amenity=bank ][!operator],
171*[amenity=cinema ][!operator],
172*[amenity=fast_food ][!operator],
173*[amenity=fuel ][!operator],
174*[mountain_pass=yes ][!ele],
175*[natural=peak ][!ele],
[15568]176*[natural=water ][!water],
[14818]177*[amenity=place_of_worship ][!denomination],
[8080]178*[amenity=parking ][!parking],
179*[amenity=parking_entrance ][!parking] {
180 throwOther: tr("{0} without {1}", "{0.tag}", "{1.key}");
[11146]181 group: tr("missing tag");
[9500]182 assertMatch: "way power=line";
183 assertNoMatch: "way power=line voltage=1";
[12997]184 assertMatch: "way power=switch";
[9500]185 assertMatch: "way power=substation";
186 assertMatch: "way power=substation transformer=foobar";
187 assertNoMatch: "way power=substation substation=foobar";
188 assertMatch: "way power=generator generator:output:electricity=yes";
189 assertNoMatch: "way power=generator";
190 assertNoMatch: "way power=generator generator:output:electricity=yes voltage=1";
[8080]191}
192
[6548]193/* {0.key} without {1.key} or {2.tag} */
[13026]194way[bridge:structure ][!bridge][man_made!=bridge],
[10068]195*[smoothness ][!highway][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking)$/],
[9003]196*[segregated ][!highway][railway!=crossing] {
[6548]197 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.tag}");
[11146]198 group: tr("missing tag");
[6548]199}
200
[8746]201/* {0.tag} without {1.tag} (info level) see #11600 #11393 #11850 */
[11305]202way[highway=motorway][!oneway][junction!=roundabout],
203way[highway=motorway_link][!oneway][junction!=roundabout] {
[8591]204 throwOther: tr("{0} without {1}", "{0.tag}", "{1.tag}");
[11146]205 group: tr("missing tag");
[8545]206}
207
[13972]208/* {0.tag} without {1.tag} */
209way[usage=penstock][man_made!=pipeline],
210way[usage=penstock][waterway!=pressurised] {
211 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
212 group: tr("missing tag");
213}
214
[8411]215/* {0.tag} without {1.tag} or {2.tag} */
216*[amenity=recycling][recycling_type!=container][recycling_type!=centre] {
217 throwWarning: tr("{0} without {1} or {2}", "{0.tag}", "{1.tag}", "{2.tag}");
[11146]218 group: tr("missing tag");
[8411]219}
220
[8057]221/* {0.key} without {1.key}, {2.tag} or {3.tag} */
[14127]222*[intermittent ][!waterway][natural!~/^(water|spring)$/][landuse!~/^(basin|reservoir)$/][ford!=yes],
223*[boat ][!waterway][natural!=water ][landuse!~/^(basin|reservoir)$/][ford!=yes] {
224 throwWarning: tr("{0} without {1}, {2}, {3} or {4}", "{0.key}", "{1.key}", "{2.tag}", "{3.tag}", "{4.tag}");
[11146]225 group: tr("missing tag");
[7767]226}
227
[14735]228/* {0.key} without {1.key}, {2.key} or {3.key}, #17253 */
[15254]229way[oneway ][!highway][!railway][!aerialway][attraction!=summer_toboggan][aeroway!~/^(runway|taxiway)$/],
[14735]230*[snowplowing][!highway][!amenity][!leisure] {
[6880]231 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.key}");
[11146]232 group: tr("missing tag");
[6880]233}
234
[14735]235/* {0.key} without {1.key}, {2.key} or {3.tag}, #17255 */
236way[incline ][!highway][!railway][aeroway!~/^(runway|taxiway)$/][attraction!=summer_toboggan],
[7250]237*[toll ][!highway][!barrier][route!~/^(ferry|road)$/] {
238 throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.tag}");
[11146]239 group: tr("missing tag");
[7250]240}
241
[15110]242/* {0.tag} together with {1.key}, see #17664, #17707, #16464, #10837, #14034, #9389, #11977, #13156, #16888 */
243*[power=plant][/^generator:/],
244*[power=generator][/^plant:/],
[15075]245*[power=plant][voltage],
246*[power=plant][frequency],
[14042]247*[internet_access=no][internet_access:fee],
[13814]248node[power=transformer][voltage],
249node[transformer=distribution][voltage][power=pole],
[11346]250*[amenity=vending_machine][shop],
[13401]251*[noname?][name],
[14364]252way[oneway=yes][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][oneway:bicycle!=no][oneway:psv!=no],
253way[oneway=yes][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][oneway:bicycle!=no][oneway:psv!=no],
254way[oneway=-1 ][/:backward/][!traffic_sign:backward][bicycle:backward!=use_sidepath][oneway:bicycle!=no][oneway:psv!=no],
255way[oneway=-1 ][/:forward/ ][!traffic_sign:forward ][bicycle:forward!=use_sidepath ][oneway:bicycle!=no][oneway:psv!=no] {
[8077]256 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.key}");
[11146]257 group: tr("suspicious tag combination");
[15110]258 assertMatch: "way power=plant generator:source=wind";
259 assertMatch: "way power=generator plant:source=combustion";
[8077]260}
261
[8044]262/* {0.tag} together with {1.tag} (info level), see #9696 */
[11305]263way[highway=footway][oneway=no] {
[8044]264 throwOther: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[11146]265 group: tr("suspicious tag combination");
[8044]266}
267
[15648]268/* {0.tag} together with {1.tag}, see #18411, #17950, #17330, #17623, #17592, #17594, #17542, #16861, #16147, #10186 */
269*[barrier=kerb][kerb=no],
270way[highway=construction][construction=yes],
271way[railway=construction][construction=yes],
[15595]272*[man_made=bridge][bridge=yes],
273*[man_made=tunnel][tunnel=yes],
[15307]274*[amenity=police][police],
[15286]275node[highway=crossing][crossing=no],
276node[railway=crossing][crossing=no],
[15094]277way[junction=yes][highway],
[15268]278way[tracktype=grade1][surface].unpaved_surface,
[14987]279way[tracktype=grade2][surface][surface=~/^(sand|mud)$/],
[14356]280way[segregated][bicycle=no],
281way[segregated][foot=no],
[14041]282way[man_made=pipeline][tunnel=flooded],
[14943]283way[waterway=canal][tunnel=yes] {
[8117]284 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[11146]285 group: tr("suspicious tag combination");
[8117]286}
287
[14808]288/* {0.tag} together with {1.tag} (error level) */
289relation[type=multipolygon][area=no] {
290 throwError: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
291 group: tr("suspicious tag combination");
292}
293
[15526]294/* {0.key} together with {1.key}, #18267, #17630, #17604 */
295node[marker][cover],
296node[marker][voltage],
297node[marker][pressure],
298node[marker][diameter],
299node[marker][substance],
[15004]300*[building:part][building],
[15256]301*[addr:street][addr:place][outside("CZ,DK")] {
[14998]302 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
[13401]303 group: tr("suspicious tag combination");
304}
305
[15722]306/* {0.tag} together with {1.tag} and {2.key}, #18471 */
307way[highway=~/^(cycleway|footway|path)$/][segregated=no][sidewalk =~/^(left|right|both)$/] {
308 throwWarning: tr("{0} together with {1} and {2}", "{0.tag}", "{1.tag}", "{2.key}");
309 group: tr("suspicious tag combination");
310}
311
[11074]312/* #11127, #13727 */
313way[waterway][bridge=yes][waterway!=weir] {
[8089]314 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
315 suggestAlternative: "bridge=aqueduct";
[11146]316 group: tr("suspicious tag combination");
[8089]317 fixAdd: "bridge=aqueduct";
318}
[11074]319way[waterway=weir][bridge=yes][highway] {
320 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
321 suggestAlternative: "waterway=weir + ford=yes";
322 suggestAlternative: "waterway=dam";
323 suggestAlternative: tr("two objects, one with {0} and one with {1} + {2} + {3}", "{0.tag}", "{2.key}", "{1.tag}", "layer");
[11146]324 group: tr("suspicious tag combination");
[11074]325}
[8089]326
[13787]327/* #16214 */
328relation[type=multipolygon] >[role="inner"] way[area][eval(number_of_tags()) = 1] {
329 throwWarning: tr("{0} on an inner multipolygon ring without further tags", "{0.tag}");
330 fixRemove: "area";
331 set area_yes_autofix;
332 group: tr("suspicious tag combination");
333}
334
[12416]335/* only {0.key}, see #11104 #12422 #14950 */
336*[access][eval(number_of_tags()) = 1],
[13787]337*[area][eval(number_of_tags()) = 1]!.area_yes_autofix,
[8054]338*[name][eval(number_of_tags()) = 1],
[9837]339*[ref][eval(number_of_tags()) = 1],
340*[lit][eval(number_of_tags()) = 1] {
[8054]341 throwWarning: tr("incomplete object: only {0}", "{0.key}");
[11146]342 group: tr("missing tag");
[8054]343}
[13086]344/* only {0.key} and {1.key} */
[8054]345*[name][area][eval(number_of_tags()) = 2],
346*[name][ref][eval(number_of_tags()) = 2] {
347 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
[11146]348 group: tr("missing tag");
[8054]349}
[13086]350/* only {0.tag}, #15269 */
351*[tourism=attraction][eval(number_of_tags()) = 1] {
352 throwWarning: tr("incomplete object: only {0}", "{0.tag}");
353 group: tr("missing tag");
354}
355/* only {0.key} and {1.tag} */
356*[name][tourism=attraction][eval(number_of_tags()) = 2] {
357 throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.tag}");
358 group: tr("missing tag");
359}
[8054]360
[11548]361/* #9811, #11491, #12865, #14310 */
362*[place][place!=farm][/^(addr:housenumber|addr:housename|addr:flats|addr:conscriptionnumber|addr:street|addr:place|addr:city|addr:country|addr:full|addr:hamlet|addr:suburb|addr:subdistrict|addr:district|addr:province|addr:state|addr:interpolation|addr:interpolation|addr:inclusion)$/],
363/* addr:postcode is used together with place in some countries */
[8043]364*[boundary][/^addr:/],
[8730]365*[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
[16255]366 throwWarning: tr("{0} together with {1}", "{0.key}", "addr:*");
[11146]367 group: tr("suspicious tag combination");
[11548]368 assertMatch: "node place=foo addr:housenumber=5";
369 assertMatch: "node place=foo addr:housenumber=5 addr:postcode=12345";
370 assertNoMatch: "node place=foo addr:postcode=12345";
[8043]371}
[8730]372*[!highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
373 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
[11146]374 group: tr("suspicious tag combination");
[8730]375}
376*[!highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
377 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
[11146]378 group: tr("suspicious tag combination");
[8730]379}
380way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
381 throwWarning: tr("{0} together with {1}", "{1.key}", "{2.key}");
[11146]382 group: tr("suspicious tag combination");
[8730]383 fixRemove: "addr:postcode";
384}
385way[highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
386 throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
[11146]387 group: tr("suspicious tag combination");
[8730]388}
[10272]389way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
[11052]390 throwWarning: tr("{0} together with {1}", "{0.key}", "{4.key}");
[8730]391 suggestAlternative: "postal_code";
[11146]392 group: tr("suspicious tag combination");
[8730]393 fixChangeKey: "addr:postcode=>postal_code";
394}
[8043]395
[10350]396/* #9195 */
[11305]397way[highway=footway][cycleway=lane] {
[8042]398 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[8046]399 suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
[11146]400 group: tr("suspicious tag combination");
[8042]401}
402
[6548]403/* {0} on suspicious object */
[15595]404*[tunnel ][!highway][!railway][!waterway][!piste:type][public_transport!=platform][route!=ferry][man_made!=pipeline][man_made!=goods_conveyor][man_made!=wildlife_crossing][man_made!=tunnel],
[14972]405*[bridge ][!highway][!railway][!waterway][!piste:type][public_transport!=platform][route!=ferry][man_made!=pipeline][man_made!=goods_conveyor][man_made!=wildlife_crossing][man_made!=bridge][building!=bridge],
[14975]406*[psv ][!highway][!railway][!waterway][barrier!=bollard][amenity !~ /^parking.*/],
[14915]407*[width ][!highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone][leisure!=track],
[15194]408*[maxspeed][!highway][!railway][traffic_sign !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][traffic_sign:forward !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][traffic_sign:backward !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][type != enforcement][waterway !~ /^(river|canal|lock)$/][!traffic_calming][aerialway!=zip_line] {
[6548]409 throwWarning: tr("{0} on suspicious object", "{0.key}");
[11146]410 group: tr("suspicious tag combination");
[6548]411}
412
[14798]413*[amenity][amenity =~ /^(restaurant|cafe|fast_food|pub|place_of_worship|school|university|hospital|library|theatre|courthouse|bank|cinema|pharmacy|fuel)$/][!name][noname!=yes] {
[11146]414 throwOther: tr("{0} without {1}", "{0.tag}", "{2.key}");
415 group: tr("missing tag");
[6548]416 assertMatch: "node amenity=restaurant";
[7932]417 assertNoMatch: "node amenity=restaurant noname=yes";
[6548]418 assertNoMatch: "node amenity=restaurant name=Foobar";
419}
420
[13645]421/* #10193, #16157 */
[6550]422way[highway][barrier],
[8559]423*[highway][waterway][waterway!=dam][waterway!=weir],
[11429]424way[highway][natural][natural!=ridge],
[14275]425*[landuse][building][landuse!=retail] {
[11146]426 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
427 group: tr("suspicious tag combination");
[13645]428 assertNoMatch: "node highway=street_lamp natural=birds_nest";
[6548]429}
430
[10350]431/* #6932 */
[10798]432*[natural=water][leisure=swimming_pool] {
[6548]433 throwWarning: tr("natural water used for swimming pool");
[11146]434 group: tr("suspicious tag combination");
[7274]435 fixRemove: "natural";
[6548]436}
[6860]437
[16514]438/* #9593, #11183, #12418, #12761, #17254, #19311 */
439*[sport][sport!=skiing][!building][!club][tourism != hotel][highway != raceway][!leisure][natural !~ /^(beach|bare_rock|cliff|peak|water)$/][amenity !~ /^(dojo|pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/][barrier !~ /^(wall|retaining_wall)$/][!"piste:type"][shop!=sports][attraction!=summer_toboggan] {
[6860]440 throwWarning: tr("sport without physical feature");
[11146]441 group: tr("missing tag");
[6860]442 assertMatch: "node sport=tennis";
443 assertNoMatch: "node sport=tennis leisure=pitch";
444 assertNoMatch: "node sport=beachvolleyball natural=beach";
[11159]445 assertNoMatch: "node sport=skiing"; /* skiing has deprecated warning */
[6860]446 assertNoMatch: "node sport=swimming tourism=hotel";
447 assertNoMatch: "node sport=10pin amenity=restaurant";
[7243]448}
449
[13972]450/* {0.key} without {1.key} or {2.key} see #10140 */
451*[building:levels][!building][!building:part],
452way[usage][!railway][!waterway][route!=railway][man_made!=pipeline] {
[7243]453 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
[11146]454 group: tr("missing tag");
[7243]455}
[7488]456
[16713]457/* any other *_name tag (with some exceptions) but not a name , see #10837 #11297 #11539 #16437 #17026 */
458*[/_name$/][!name][!old_name][!loc_name][!reg_name][!uic_name][!artist_name][!lock_name][!"osak:municipality_name"][!"osak:street_name"][noname!=yes] {
[7818]459 throwWarning: tr("alternative name without {0}", "{1.key}");
[11146]460 group: tr("missing tag");
[7818]461}
462
[10350]463/* #10837 */
[9386]464way[destination][!oneway?][junction!=roundabout][highway] {
[7818]465 throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
466 suggestAlternative: "destination:forward";
467 suggestAlternative: "destination:backward";
[8700]468}
469
[16501]470/* #11389, #19010 */
[8700]471way["maxspeed:forward"=*"maxspeed:backward"][!maxspeed] {
472 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
473 suggestAlternative: "maxspeed";
[11146]474 group: tr("suspicious tag combination");
[8700]475 fixChangeKey: "maxspeed:forward=>maxspeed";
476 fixRemove: "maxspeed:backward";
477}
478way["maxspeed:forward"=*maxspeed]["maxspeed:backward"=*maxspeed][maxspeed] {
479 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
480 set AllSameMaxspeed;
481 suggestAlternative: "maxspeed";
[11146]482 group: tr("suspicious tag combination");
[8700]483 fixRemove: "maxspeed:forward";
484 fixRemove: "maxspeed:backward";
485}
[16501]486way["cycleway:left"=*"cycleway:right"][!cycleway] {
487 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
488 suggestAlternative: "cycleway";
489 group: tr("suspicious tag combination");
490 fixChangeKey: "cycleway:left=>cycleway";
491 fixRemove: "cycleway:right";
492}
493way["cycleway:left"=*cycleway]["cycleway:right"=*cycleway][cycleway] {
494 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
495 set AllSameCycleway;
496 suggestAlternative: "cycleway";
497 group: tr("suspicious tag combination");
498 fixRemove: "cycleway:left";
499 fixRemove: "cycleway:right";
500}
501way["sidewalk:left"=*"sidewalk:right"][!sidewalk] {
502 throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
503 suggestAlternative: "sidewalk";
504 group: tr("suspicious tag combination");
505 fixChangeKey: "sidewalk:left=>sidewalk";
506 fixRemove: "sidewalk:right";
507}
508way["sidewalk:left"=*sidewalk]["sidewalk:right"=*sidewalk][sidewalk] {
509 throwWarning: tr("Same value of {0}, {1} and {2}", "{0.key}", "{1.key}", "{2.key}");
510 set AllSameSidewalk;
511 suggestAlternative: "sidewalk";
512 group: tr("suspicious tag combination");
513 fixRemove: "sidewalk:left";
514 fixRemove: "sidewalk:right";
515}
516way["maxspeed:forward"]["maxspeed:backward"][maxspeed]!.AllSameMaxspeed,
517way["cycleway:left"]["cycleway:right"][cycleway]!.AllSameCycleway,
518way["sidewalk:left"]["sidewalk:right"][sidewalk]!.AllSameSidewalk {
[8700]519 throwWarning: tr("{0} and {1} together with {2} and conflicting values", "{0.key}", "{1.key}", "{2.key}");
[11146]520 group: tr("suspicious tag combination");
[8700]521}
522way["maxspeed:forward"][maxspeed][!"maxspeed:backward"],
[16501]523way["maxspeed:backward"][maxspeed][!"maxspeed:forward"],
524way["cycleway:left"][cycleway][!"cycleway:right"],
525way["cycleway:right"][cycleway][!"cycleway:left"],
526way["sidewalk:left"][sidewalk][!"sidewalk:right"],
527way["sidewalk:right"][sidewalk][!"sidewalk:left"] {
[8700]528 throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
[11146]529 group: tr("suspicious tag combination");
[8754]530}
531
[10350]532/* #11837 */
[8754]533way[layer][layer<0][bridge][bridge!=no][location!=underground][indoor!=yes][!tunnel],
534way[layer][layer>0][tunnel][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
[11146]535 throwWarning: tr("{0} together with {1}", "{2.tag}", "{0.tag}");
536 group: tr("suspicious tag combination");
[10350]537}
538
539/* #12942 */
540relation[oneway][type!=route] {
541 throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
[10388]542}
543
544/* #9182 */
[10419]545way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
546 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}");
[11146]547 group: tr("suspicious tag combination");
[10388]548}
[10419]549way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
550 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}");
[11146]551 group: tr("suspicious tag combination");
[10537]552}
553
[13102]554/* #13144, #15536 */
555*[unisex=yes][female=yes][male!=yes][shop=hairdresser],
556*[unisex=yes][male=yes][female!=yes][shop=hairdresser] {
[10537]557 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
[11146]558 group: tr("suspicious tag combination");
[10537]559}
[13102]560*[unisex=yes][female=yes][male=yes][shop=hairdresser] {
[10537]561 throwWarning: tr("{0} together with {1} and {2}. Remove {1} and {2}", "{0.tag}", "{1.tag}", "{2.tag}");
[11146]562 group: tr("suspicious tag combination");
[10537]563 fixRemove: "female";
564 fixRemove: "male";
565}
[13102]566*[female=yes][male=yes][!unisex][shop=hairdresser] {
[10537]567 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
568 suggestAlternative: "unisex=yes";
[11146]569 group: tr("suspicious tag combination");
[10537]570 fixRemove: "female";
571 fixRemove: "male";
572 fixAdd: "unisex=yes";
[10538]573}
574
[14883]575/* {1.key} without {2.tag} see #13138, #14468 */
576way!:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir], /* water=intermittent is deprecated and has an own warning */
577area:closed[water][natural!~/water|bay|strait/][water!=intermittent][amenity!=lavoir] {
[10538]578 throwWarning: tr("{0} without {1}", "{1.key}", "{2.tag}");
[11146]579 group: tr("missing tag");
[10538]580}
[10995]581
[11047]582/* #13680 */
583area[golf=bunker][natural=beach] {
584 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
585 suggestAlternative: "natural=sand";
586 suggestAlternative: "surface=sand";
[11146]587 group: tr("suspicious tag combination");
[11080]588}
589
590/* #13705 */
591relation[type=multipolygon][building] > way {
592 set part_of_building_MP;
593}
594way["addr:housenumber"][!building][!"building:part"][!"demolished:building"][!note][!amenity][!leisure][!landuse][!man_made][!tourism][!barrier]!.part_of_building_MP {
595 /* don't exclude shop because a lot of real missing bulding tag cases have a shop tag. */
[11146]596 throwOther: tr("possibly missing {0} tag", "{1.key}");
597 group: tr("missing tag");
[11371]598}
599
[16769]600/* see #8519, #11529, limited to motorways and trunks to avoid false positives for streets with lanes for non motorized traffic */
601way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][turn:lanes ][tag(lanes)!=eval(count(split("|", tag("turn:lanes"))))],
602way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][change:lanes ][tag(lanes)!=eval(count(split("|", tag("change:lanes"))))],
603way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][maxspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("maxspeed:lanes"))))],
604way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][minspeed:lanes ][tag(lanes)!=eval(count(split("|", tag("minspeed:lanes"))))],
605way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][destination:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:lanes"))))],
606way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][destination:ref:lanes ][tag(lanes)!=eval(count(split("|", tag("destination:ref:lanes"))))],
607way[highway =~ /^(motorway|motorway_link|trunk|trunk_link)$/][lanes][destination:symbol:lanes][tag(lanes)!=eval(count(split("|", tag("destination:symbol:lanes"))))] {
608 throwWarning: tr("Different number of lanes in the keys {0} and {1}", "{1.key}", "{2.key}");
609 group: tr("suspicious tag combination");
610}
611
[15393]612/* #14125, #14323, #18185 */
613way[highway][lanes][!lanes:forward][!lanes:backward][oneway!=yes][oneway!=-1][oneway!=reversible][junction!=roundabout][lanes>2][get(split(".", tag(lanes)/2), 1)=5] {
[11406]614 throwWarning: tr("street with odd number of {0}, but without {1} and {2} or {3}", "{1.key}", "{2.key}", "{3.key}", "{4.key}");
[11371]615 group: tr("missing tag");
616 assertNoMatch: "way highway=primary lanes=2";
617 assertNoMatch: "way highway=primary lanes=3 lanes:backward=2";
618 assertNoMatch: "way highway=primary lanes=3 oneway=-1";
[11406]619 assertNoMatch: "way highway=primary lanes=4";
[11371]620 assertMatch: "way highway=primary lanes=3";
[14593]621}
622
[16769]623/* #10932 */
624way[highway][!lanes][/^.*:lanes$/]!.MissingKeyWarning,
625way[highway][!lanes:forward][/^.*:lanes:forward$/],
626way[highway][!lanes:backward][/^.*:lanes:backward$/],
627way[highway][!lanes:both_ways][/^.*:lanes:both_ways$/] {
628 throwWarning: tr("{0} without {1}", "{2.key}", "{1.key}");
629 group: tr("missing tag");
630 assertMatch: "way highway=primary turn:lanes=left|right";
631 assertNoMatch: "way highway=primary turn:lanes=left|right lanes=2";
632 assertMatch: "way highway=primary turn:lanes:forward=left|right";
633 assertNoMatch: "way highway=primary turn:lanes:forward=left|right lanes:forward=2";
634}
635
[14593]636/* #15774 */
637node[emergency=fire_hydrant][fire_hydrant:count][fire_hydrant:count!=1] {
638 throwOther: tr("{0} together with {1}. Tag each hydrant separately.", "{0.tag}", "{1.tag}");
[14798]639}
[14830]640
641/* #12502 */
642node[leisure=park][natural=tree] {
643 throwWarning: tr("{0} together with {1} on a node. Remove {0}.", "{0.tag}", "{1.tag}");
644 group: tr("suspicious tag combination");
645 fixRemove: "leisure";
[14831]646}
647
648/* #17305 */
649area[boundary=administrative][landuse=residential] {
650 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
651 group: tr("suspicious tag combination");
652}
653
654/* #17391 */
[14910]655way[highway=pedestrian][width][width<3] {
[14831]656 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
657 suggestAlternative: "highway=footway";
658 group: tr("suspicious tag combination");
659 fixAdd: "highway=footway";
660 assertMatch: "way highway=pedestrian width=0.8";
661 assertMatch: "way highway=pedestrian width=1";
[14910]662 assertNoMatch: "way highway=pedestrian width=3";
[14831]663 assertNoMatch: "way highway=pedestrian width=5.5";
[15094]664}
665
666/* see #17623 */
[15131]667way:areaStyle[highway][highway =~ /motorway|trunk|primary|secondary|tertiary|unclassified|residential|service$|living_street|pedestrian|track|path|footway|cycleway|bus_guideway|bridleway/][area!=yes] {
[15094]668 throwOther: tr("A linear object {0} without {1} has a tag indicating that it is an area.", "{1.tag}", "{3.tag}");
669 group: tr("suspicious tag combination");
[15169]670}
671
672/* #17804 */
673area[cemetery=sector][landuse=cemetery] {
674 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
675 group: tr("suspicious tag combination");
[15265]676}
677
678/* #17967 */
679*[highway=cycleway][cycleway=track] {
680 throwWarning: tr("{0} together with {1}. Remove {1}.", "{0.tag}", "{1.tag}");
681 group: tr("suspicious tag combination");
682 fixRemove: "cycleway";
[15268]683}
684
[15524]685/* #17973, #18183, #18331 */
686way[highway=path ][foot][foot!=no ][foot!=use_sidepath ][!segregated][bicycle][bicycle!=no][bicycle!=use_sidepath][bicycle!=dismount]!.unpaved_surface,
687way[highway=footway ][bicycle][bicycle!=no][bicycle!=use_sidepath][!segregated][bicycle!=dismount]!.unpaved_surface,
[15402]688way[highway=cycleway][foot][foot!=no ][foot!=use_sidepath ][!segregated]!.unpaved_surface {
[15403]689 throwWarning: tr("Combined foot- and cycleway without {0}.", "{4.key}");
[15268]690 group: tr("missing tag");
[15311]691}
692
693/* #17989 */
694node[emergency_ward_entrance][emergency!=emergency_ward_entrance] {
695 throwWarning: tr("{0} without {1}", "{0.tag}", "{1.tag}");
696 group: tr("missing tag");
697 fixAdd: "emergency=emergency_ward_entrance";
[15414]698}
699
700/* #18203 */
[15619]701way[construction][construction!=yes][construction!=minor][highway][highway!=construction] {
[15758]702 throwWarning: tr("{0} together with {1}", "{3.tag}", "{0.tag}");
[15414]703 group: tr("suspicious tag combination");
[15648]704}
705
706/* #18374 */
707*[amenity=recycling][collection_times="24/7"][!opening_hours],
708*[amenity=recycling][collection_times ][!opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
709 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
710 group: tr("suspicious tag combination");
711 fixChangeKey: "collection_times => opening_hours";
[15765]712 assertMatch: "node amenity=recycling collection_times=\"Mo-Fr 06:00-20:00\"";
713 assertNoMatch: "node amenity=recycling collection_times=\"Mo-Fr 15:00\"";
714 assertNoMatch: "node amenity=recycling collection_times=\"Mo 08:00-11:00\"";
715 assertNoMatch: "node amenity=recycling collection_times=\"Sa[2,4] 8:00-11:00\"";
[15648]716}
717*[amenity=recycling][collection_times="24/7"][opening_hours],
718*[amenity=recycling][collection_times ][opening_hours][collection_times=~/[a-z]-[A-Z].*[0-9]-[0-9]/] {
719 throwWarning: tr("{0} together with {1}. Probably {2} is meant.", "{1.key}", "{0.tag}", "{2.key}");
720 group: tr("suspicious tag combination");
[16254]721}
722
[16256]723/* #19018 */
724way[highway][crossing][highway =~ /^(motorway|motorway_link|trunk|trunk_link|primary|primary_link|secondary|secondary_link|tertiary|tertiary_link|unclassified|residential|service|living_street)$/] {
725 throwWarning: tr("{0} together with {1}. Should be used on a minor highway type or a node", "{1.key}", "{0.tag}");
726 group: tr("suspicious tag combination");
727 fixRemove: "crossing";
728 assertMatch: "way highway=trunk crossing=unmarked";
729 assertNoMatch: "way highway=construction construction=footway crossing=unmarked";
730}
731
[16254]732/* #19066 */
733*[amenity=recycling][!/^recycling:/][recycling_type!=centre] {
734 throwWarning: tr("{0} without {1}", "{0.tag}", "recycling:*");
735 group: tr("missing tag");
[16255]736}
737*[source:addr][!/^addr:/] {
738 throwWarning: tr("{0} without {1}", "{0.key}", "addr:*");
739 group: tr("missing tag");
[16258]740 assertMatch: "node source:addr=postman";
741 assertNoMatch: "node source:addr=postman addr:housenumber=42";
[16255]742}
743*[source:maxspeed][!/^maxspeed:?/] {
744 throwWarning: tr("{0} without {1} or {2}", "{0.key}", "maxspeed", "maxspeed:*");
745 group: tr("missing tag");
[16705]746}
747
748/* #16898, tower vs. communications_tower, wiki suggests 100m as rough guideline, so we warn for < 75m */
749*[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' */
750 throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
751 suggestAlternative: "man_made=tower + tower:type=communication + height";
752 group: tr("suspicious tag combination");
753 assertMatch: "node man_made=communications_tower height=58";
754 assertMatch: "node man_made=communications_tower height=\"74 m\"";
755 assertMatch: "node man_made=communications_tower height=0.8";
756 assertMatch: "node man_made=communications_tower height=245'";
757 assertMatch: "node man_made=communications_tower height=\"224.22 ft\"";
758 assertMatch: "node man_made=communications_tower height=231'10.22\"";
759 assertNoMatch: "node man_made=communications_tower height=\"75 m\"";
760 assertNoMatch: "node man_made=communications_tower height=75.72";
761 assertNoMatch: "node man_made=communications_tower height=\"328.22 ft\"";
762 assertNoMatch: "node man_made=communications_tower height=4358'8\"";
763 assertNoMatch: "node height=4358'";
[16769]764}
[16775]765
766/* #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. */
[16777]767*[fixme][count(split(" ", tag("fixme"))) == 1][tag(tag("fixme")) != "none"],
768*[FIXME][count(split(" ", tag("FIXME"))) == 1][tag(tag("FIXME")) != "none"] {
[16775]769 throwWarning: tr("{0} together with {1}. Is the fixme fixed?", "{0.tag}", "{0.value}");
770 group: tr("suspicious tag combination");
771 assertMatch: "way name=\"Florist Gump\" fixme=name";
[16777]772 assertMatch: "way name=\"Florist Gump\" FIXME=name";
[16775]773 assertNoMatch: "way fixme=name";
774 assertNoMatch: "way name=\"Florist Gump\"";
775 assertNoMatch: "way name=\"Florist Gump\" fixme=\"the name might have changed\"";
776}
Note: See TracBrowser for help on using the repository browser.