Changeset 16406 in josm
Legend:
- Unmodified
- Added
- Removed
-
trunk/nodist/data/multipolygon.osm
r15244 r16406 3754 3754 <member type='way' ref='-41419' role='outer' /> 3755 3755 <member type='way' ref='-41421' role='outer' /> 3756 <tag k='josm_error_codes' v='1606,1610,1617' /> 3756 3757 <tag k='name' v='old style' /> 3757 3758 <tag k='type' v='multipolygon' /> … … 3784 3785 <member type='way' ref='-41585' role='inner' /> 3785 3786 <member type='way' ref='-41809' role='outer' /> 3787 <tag k='josm_error_codes' v='1610' /> 3786 3788 <tag k='name' v='Example 1 (02)' /> 3787 3789 <tag k='type' v='multipolygon' /> … … 3800 3802 <member type='way' ref='-41667' role='outer' /> 3801 3803 <member type='way' ref='-41727' role='inner' /> 3804 <tag k='josm_error_codes' v='1610' /> 3802 3805 <tag k='name' v='Example 3 (02)' /> 3803 3806 <tag k='type' v='multipolygon' /> … … 3848 3851 <member type='way' ref='-41575' role='inner' /> 3849 3852 <member type='way' ref='-41545' role='outer' /> 3853 <tag k='josm_error_codes' v='1610' /> 3850 3854 <tag k='name' v='Example 2 (04)' /> 3851 3855 <tag k='type' v='multipolygon' /> … … 3857 3861 <member type='way' ref='-41761' role='inner' /> 3858 3862 <member type='way' ref='-41655' role='outer' /> 3863 <tag k='josm_error_codes' v='1610' /> 3859 3864 <tag k='name' v='Example 5 (02)' /> 3860 3865 <tag k='type' v='multipolygon' /> … … 3864 3869 <member type='way' ref='-41473' role='inner' /> 3865 3870 <member type='way' ref='-41671' role='outer' /> 3871 <tag k='josm_error_codes' v='1610' /> 3866 3872 <tag k='name' v='Example 2 (02)' /> 3867 3873 <tag k='type' v='multipolygon' /> … … 3902 3908 <member type='way' ref='-41567' role='inner' /> 3903 3909 <member type='way' ref='-41495' role='inner' /> 3910 <tag k='josm_error_codes' v='1610' /> 3904 3911 <tag k='name' v='Example 6 (02)' /> 3905 3912 <tag k='type' v='multipolygon' /> … … 3913 3920 <member type='way' ref='-41659' role='outer' /> 3914 3921 <member type='way' ref='-41651' role='outer' /> 3915 <tag k='josm_error_codes' v='1606,1617' /> 3922 <tag k='josm_error_codes' v='1606,1610,1617' /> 3916 3923 <tag k='name' v='07/04 - Mixed Geometry' /> 3917 3924 <tag k='type' v='multipolygon' /> … … 3979 3986 <member type='way' ref='-41845' role='outer' /> 3980 3987 <member type='way' ref='-41769' role='inner' /> 3988 <tag k='josm_error_codes' v='1610' /> 3981 3989 <tag k='name' v='Example 7 (04) Inner' /> 3982 3990 <tag k='type' v='multipolygon' /> … … 3993 4001 <member type='way' ref='-41741' role='inner' /> 3994 4002 <member type='way' ref='-41447' role='outer' /> 4003 <tag k='josm_error_codes' v='1610' /> 3995 4004 <tag k='name' v='Example 1 (04)' /> 3996 4005 <tag k='type' v='multipolygon' /> … … 4002 4011 <member type='way' ref='-41753' role='outer' /> 4003 4012 <member type='way' ref='-41521' role='outer' /> 4013 <tag k='josm_error_codes' v='1610' /> 4004 4014 <tag k='name' v='Example 5 (04)' /> 4005 4015 <tag k='type' v='multipolygon' /> … … 4021 4031 <member type='way' ref='-41737' role='' /> 4022 4032 <member type='relation' ref='-42089' role='' /> 4023 <tag k='josm_error_codes' v='1601,1602' /> 4033 <tag k='josm_error_codes' v='1601,1602,1610' /> 4024 4034 <tag k='name' v='06/05 - wrong roles' /> 4025 4035 <tag k='type' v='multipolygon' /> … … 4050 4060 <member type='way' ref='-41787' role='outer' /> 4051 4061 <member type='way' ref='-41839' role='outer' /> 4062 <tag k='josm_error_codes' v='1610' /> 4052 4063 <tag k='name' v='Example 6 (04) Inner' /> 4053 4064 <tag k='type' v='multipolygon' /> … … 4064 4075 <member type='way' ref='-41653' role='inner' /> 4065 4076 <member type='way' ref='-41833' role='outer' /> 4077 <tag k='josm_error_codes' v='1610' /> 4066 4078 <tag k='name' v='Example 8 (04) Inner' /> 4067 4079 <tag k='type' v='multipolygon' /> … … 4088 4100 <member type='way' ref='-41543' role='outer' /> 4089 4101 <member type='way' ref='-41477' role='outer' /> 4102 <tag k='josm_error_codes' v='1610' /> 4090 4103 <tag k='name' v='Example 6 (04)' /> 4091 4104 <tag k='type' v='multipolygon' /> … … 4095 4108 <member type='way' ref='-41687' role='outer' /> 4096 4109 <member type='way' ref='-41769' role='outer' /> 4110 <tag k='josm_error_codes' v='1610' /> 4097 4111 <tag k='name' v='Example 7 (04)' /> 4098 4112 <tag k='type' v='multipolygon' /> … … 4101 4115 <member type='way' ref='-41819' role='outer' /> 4102 4116 <member type='way' ref='-41439' role='outer' /> 4117 <tag k='josm_error_codes' v='1610' /> 4103 4118 <tag k='name' v='Example 4 (02)' /> 4104 4119 <tag k='type' v='multipolygon' /> … … 4133 4148 <member type='way' ref='-41801' role='inner' /> 4134 4149 <member type='way' ref='-41437' role='outer' /> 4150 <tag k='josm_error_codes' v='1610' /> 4135 4151 <tag k='name' v='Example 7 (02)' /> 4136 4152 <tag k='type' v='multipolygon' /> … … 4143 4159 <member type='way' ref='-41777' role='outer' /> 4144 4160 <tag k='comment' v='For this test the display style depends on the order of ways and is unpredictable' /> 4145 <tag k='josm_error_codes' v='16 07' />4161 <tag k='josm_error_codes' v='1610' /> 4146 4162 <tag k='name' v='06/04 - Mismatching way styles' /> 4147 4163 <tag k='type' v='multipolygon' /> … … 4160 4176 <member type='way' ref='-41711' role='outer' /> 4161 4177 <member type='way' ref='-41765' role='outer' /> 4178 <tag k='josm_error_codes' v='1610' /> 4162 4179 <tag k='name' v='Example 5 (04) inner' /> 4163 4180 <tag k='type' v='multipolygon' /> … … 4182 4199 <member type='way' ref='-41493' role='outer' /> 4183 4200 <member type='way' ref='-41457' role='outer' /> 4201 <tag k='josm_error_codes' v='1610' /> 4184 4202 <tag k='name' v='Example 4 (04)' /> 4185 4203 <tag k='type' v='multipolygon' /> … … 4205 4223 <member type='way' ref='-41505' role='outer' /> 4206 4224 <member type='way' ref='-41459' role='outer' /> 4225 <tag k='josm_error_codes' v='1610' /> 4207 4226 <tag k='name' v='Example 8 (02)' /> 4208 4227 <tag k='type' v='multipolygon' /> … … 4229 4248 <member type='way' ref='-41515' role='outer' /> 4230 4249 <member type='way' ref='-41657' role='outer' /> 4250 <tag k='josm_error_codes' v='1610' /> 4231 4251 <tag k='name' v='Example 3 (04)' /> 4232 4252 <tag k='type' v='multipolygon' /> … … 4244 4264 <member type='way' ref='-41597' role='outer' /> 4245 4265 <member type='way' ref='-41653' role='outer' /> 4266 <tag k='josm_error_codes' v='1610' /> 4246 4267 <tag k='name' v='Example 8 (04)' /> 4247 4268 <tag k='type' v='multipolygon' /> -
trunk/src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java
r16333 r16406 121 121 /** 122 122 * Various style-related checks:<ul> 123 * <li>{@link #NO_STYLE}: No area style for multipolygon</li> 123 124 * <li>{@link #INNER_STYLE_MISMATCH}: With the currently used mappaint style the style for inner way equals the multipolygon style</li> 124 * <li>{@link #OUTER_STYLE_MISMATCH}: Style for outer way mismatches</li>125 * <li>{@link #OUTER_STYLE_MISMATCH}: With the currently used mappaint style the style for outer way mismatches the area style</li> 125 126 * <li>{@link #OUTER_STYLE}: Area style on outer way</li> 126 127 * </ul> … … 129 130 */ 130 131 private void checkStyleConsistency(Relation r, Multipolygon polygon) { 131 ElemStyles styles = MapPaintStyles.getStyles(); 132 if (styles != null && !r.isBoundary()) { 132 if (MapPaintStyles.getStyles() != null && !r.isBoundary()) { 133 133 AreaElement area = ElemStyles.getAreaElemStyle(r, false); 134 boolean areaStyle = area != null;135 // If area style was not found for relation then use style of ways136 134 if (area == null) { 137 for (Way w : polygon.getOuterWays()) { 138 area = ElemStyles.getAreaElemStyle(w, true); 139 if (area != null) { 140 break; 141 } 142 } 143 if (area == null) { 144 errors.add(TestError.builder(this, Severity.OTHER, NO_STYLE) 145 .message(tr("No area style for multipolygon")) 146 .primitives(r) 147 .build()); 148 } 149 } 150 151 if (area != null) { 135 errors.add(TestError.builder(this, Severity.OTHER, NO_STYLE) 136 .message(tr("No area style for multipolygon")) 137 .primitives(r) 138 .build()); 139 } else { 152 140 for (Way wInner : polygon.getInnerWays()) { 153 if (area.equals(ElemStyles.getAreaElemStyle(wInner, false))) { 141 if (wInner.isClosed() && area.equals(ElemStyles.getAreaElemStyle(wInner, false))) { 154 142 errors.add(TestError.builder(this, Severity.OTHER, INNER_STYLE_MISMATCH) 155 143 .message(tr("With the currently used mappaint style the style for inner way equals the multipolygon style")) … … 160 148 } 161 149 for (Way wOuter : polygon.getOuterWays()) { 150 if (!wOuter.isArea()) 151 continue; 162 152 AreaElement areaOuter = ElemStyles.getAreaElemStyle(wOuter, false); 163 153 if (areaOuter != null) { 164 154 if (!area.equals(areaOuter)) { 165 String message = !areaStyle ? tr("Style for outer way mismatches")166 : tr("With the currently used mappaint style the style for outer way mismatches the area style");167 155 errors.add(TestError.builder(this, Severity.OTHER, OUTER_STYLE_MISMATCH) 168 .message( message)156 .message(tr("With the currently used mappaint style the style for outer way mismatches the area style")) 169 157 .primitives(Arrays.asList(r, wOuter)) 170 158 .highlight(wOuter) 171 159 .build()); 172 } else if (areaStyle){ /* style on outer way of multipolygon, but equal to polygon */160 } else { /* style on outer way of multipolygon, but equal to polygon */ 173 161 errors.add(TestError.builder(this, Severity.WARNING, OUTER_STYLE) 174 162 .message(tr("Area style on outer way")) -
trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
r16332 r16406 39 39 import org.openstreetmap.josm.data.osm.AbstractPrimitive; 40 40 import org.openstreetmap.josm.data.osm.OsmPrimitive; 41 import org.openstreetmap.josm.data.osm.OsmUtils; 42 import org.openstreetmap.josm.data.osm.Relation; 41 43 import org.openstreetmap.josm.data.osm.Tag; 42 44 import org.openstreetmap.josm.data.osm.TagMap; … … 189 191 protected static final int UNUSUAL_UNICODE_CHAR_VALUE = 1216; 190 192 protected static final int INVALID_PRESETS_TYPE = 1217; 193 protected static final int MULTIPOLYGON_NO_AREA = 1218; 194 protected static final int MULTIPOLYGON_INCOMPLETE = 1219; 195 protected static final int MULTIPOLYGON_MAYBE_NO_AREA = 1220; 191 196 // CHECKSTYLE.ON: SingleSpaceSeparator 192 197 … … 623 628 } 624 629 630 if (p instanceof Relation && p.hasTag("type", "multipolygon")) { 631 checkMultipolygonTags(p); 632 } 633 625 634 if (checkPresetsTypes) { 626 635 TagMap tags = p.getKeys(); … … 658 667 } 659 668 } 669 } 670 671 private static final Collection<String> NO_AREA_KEYS = Arrays.asList("name", "area", "ref", "access", "operator"); 672 673 private void checkMultipolygonTags(OsmPrimitive p) { 674 if (p.isAnnotated() || hasAcceptedPrimaryTagForMultipolygon(p)) 675 return; 676 if (p.keySet().stream().anyMatch(k -> k.matches("^(abandoned|construction|demolished|disused|planned|razed|removed|was).*"))) 677 return; 678 679 TestError.Builder builder = null; 680 if (p.hasKey("surface")) { 681 // accept often used tag surface=* as area tag 682 builder = TestError.builder(this, Severity.OTHER, MULTIPOLYGON_INCOMPLETE) 683 .message(tr("Multipolygon tags"), marktr("only {0} tag"), "surface"); 684 } else { 685 Map<String, String> filteredTags = p.getInterestingTags(); 686 filteredTags.remove("type"); 687 NO_AREA_KEYS.forEach(filteredTags::remove); 688 filteredTags.keySet().removeIf(key -> !key.matches("[a-z0-9:_]+")); 689 690 if (filteredTags.isEmpty()) { 691 builder = TestError.builder(this, Severity.ERROR, MULTIPOLYGON_NO_AREA) 692 .message(tr("Multipolygon tags"), marktr("tag describing the area is missing"), new Object()); 693 694 } 695 } 696 if (builder == null) { 697 // multipolygon has either no area tag or a rarely used one 698 builder = TestError.builder(this, Severity.WARNING, MULTIPOLYGON_MAYBE_NO_AREA) 699 .message(tr("Multipolygon tags"), marktr("tag describing the area might be missing"), new Object()); 700 } 701 errors.add(builder.primitives(p).build()); 702 } 703 704 /** 705 * Check if a multipolygon has a main tag that describes the type of area. Accepts also some deprecated tags and typos. 706 * @param p the multipolygon 707 * @return true if the multipolygon has a main tag that (likely) describes the type of area. 708 */ 709 private static boolean hasAcceptedPrimaryTagForMultipolygon(OsmPrimitive p) { 710 if (p.hasKey("landuse", "amenity", "building", "building:part", "area:highway", "shop", "place", "boundary", 711 "landform", "piste:type", "sport", "golf", "landcover", "aeroway", "office", "healthcare", "craft", "room") 712 || p.hasTagDifferent("natural", "tree", "peek", "saddle", "tree_row") 713 || p.hasTagDifferent("man_made", "survey_point", "mast", "flagpole", "manhole", "watertap") 714 || p.hasTagDifferent("highway", "crossing", "bus_stop", "turning_circle", "street_lamp", 715 "traffic_signals", "stop", "milestone", "mini_roundabout", "motorway_junction", "passing_place", 716 "speed_camera", "traffic_mirror", "trailhead", "turning_circle", "turning_loop", "toll_gantry") 717 || p.hasTagDifferent("tourism", "attraction", "artwork") 718 || p.hasTagDifferent("leisure", "picnic_table", "slipway", "firepit") 719 || p.hasTagDifferent("historic", "wayside_cross", "milestone")) 720 return true; 721 if (p.hasTag("barrier", "hedge", "retaining_wall") 722 || p.hasTag("public_transport", "platform", "station") 723 || p.hasTag("railway", "platform") 724 || p.hasTag("waterway", "riverbank", "dam", "rapids", "dock", "boatyard", "fuel") 725 || p.hasTag("indoor", "corridor", "room", "area") 726 || p.hasTag("power", "substation", "generator", "plant", "switchgear", "converter", "sub_station") 727 || p.hasTag("seamark:type", "harbour", "fairway", "anchorage", "landmark", "berth", "harbour_basin", 728 "separation_zone") 729 || (p.get("seamark:type") != null && p.get("seamark:type").matches(".*\\_(area|zone)$"))) 730 return true; 731 return p.hasTag("harbour", OsmUtils.TRUE_VALUE) 732 || p.hasTag("flood_prone", OsmUtils.TRUE_VALUE) 733 || p.hasTag("bridge", OsmUtils.TRUE_VALUE) 734 || p.hasTag("ruins", OsmUtils.TRUE_VALUE) 735 || p.hasTag("junction", OsmUtils.TRUE_VALUE); 660 736 } 661 737
Note:
See TracChangeset
for help on using the changeset viewer.