Ticket #17010: 17010-v1.patch

File 17010-v1.patch, 6.5 KB (added by GerdP, 6 years ago)
  • src/org/openstreetmap/josm/data/validation/tests/MultipolygonTest.java

     
    5353    public static final int WRONG_MEMBER_ROLE = 1602;
    5454    /** Multipolygon is not closed */
    5555    public static final int NON_CLOSED_WAY = 1603;
    56     /** No outer way for multipolygon */
    57     public static final int MISSING_OUTER_WAY = 1604;
    5856    /** Multipolygon inner way is outside */
    5957    public static final int INNER_WAY_OUTSIDE = 1605;
    6058    /** Intersection between multipolygon ways */
     
    132130    @Override
    133131    public void visit(Relation r) {
    134132        if (r.isMultipolygon() && r.getMembersCount() > 0) {
    135             checkMembersAndRoles(r);
    136             checkOuterWay(r);
    137133            boolean hasRepeatedMembers = checkRepeatedWayMembers(r);
     134            boolean simpleCheck = true;
    138135            // Rest of checks is only for complete multipolygon
    139136            if (!hasRepeatedMembers && !r.hasIncompleteMembers()) {
    140137                Multipolygon polygon = new Multipolygon(r);
    141138                checkStyleConsistency(r, polygon);
    142139                checkGeometryAndRoles(r, polygon);
     140                simpleCheck = false;
    143141            }
     142            checkMembersAndRoles(r, simpleCheck);
    144143        }
    145144    }
    146145
    147146    /**
    148      * Checks that multipolygon has at least an outer way:<ul>
    149      * <li>{@link #MISSING_OUTER_WAY}: No outer way for multipolygon</li>
    150      * </ul>
    151      * @param r relation
    152      */
    153     private void checkOuterWay(Relation r) {
    154         for (RelationMember m : r.getMembers()) {
    155             if (m.isWay() && "outer".equals(m.getRole())) {
    156                 return;
    157             }
    158         }
    159         errors.add(TestError.builder(this, Severity.WARNING, MISSING_OUTER_WAY)
    160                 .message(r.isBoundary() ? tr("No outer way for boundary") : tr("No outer way for multipolygon"))
    161                 .primitives(r)
    162                 .build());
    163     }
    164 
    165     /**
    166147     * Various style-related checks:<ul>
    167148     * <li>{@link #NO_STYLE_POLYGON}: Multipolygon relation should be tagged with area tags and not the outer way</li>
    168149     * <li>{@link #INNER_STYLE_MISMATCH}: With the currently used mappaint style the style for inner way equals the multipolygon style</li>
     
    704685     * <li>{@link #WRONG_MEMBER_TYPE}: Non-Way in multipolygon</li>
    705686     * </ul>
    706687     * @param r relation
     688     * @param simpleCheck if true test also roles of way members
    707689     */
    708     private void checkMembersAndRoles(Relation r) {
     690    private void checkMembersAndRoles(Relation r, boolean simpleCheck) {
    709691        for (RelationMember rm : r.getMembers()) {
    710692            if (rm.isWay()) {
    711                 if (!(rm.hasRole("inner", "outer") || !rm.hasRole())) {
    712                     errors.add(TestError.builder(this, Severity.WARNING, WRONG_MEMBER_ROLE)
     693                if (simpleCheck && (!(rm.hasRole("inner", "outer")) || !rm.hasRole())) {
     694                    errors.add(TestError.builder(this, Severity.ERROR, WRONG_MEMBER_ROLE)
    713695                            .message(tr("No useful role for multipolygon member"))
    714696                            .primitives(Arrays.asList(r, rm.getMember()))
    715697                            .build());
     
    748730        boolean hasDups = false;
    749731        Map<OsmPrimitive, List<RelationMember>> seenMemberPrimitives = new HashMap<>();
    750732        for (RelationMember rm : r.getMembers()) {
     733            if (!rm.isWay())
     734                continue;
    751735            List<RelationMember> list = seenMemberPrimitives.get(rm.getMember());
    752736            if (list == null) {
    753737                list = new ArrayList<>(2);
  • src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java

     
    1818import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1919import org.openstreetmap.josm.data.osm.Relation;
    2020import org.openstreetmap.josm.data.osm.RelationMember;
     21import org.openstreetmap.josm.data.validation.OsmValidator;
    2122import org.openstreetmap.josm.data.validation.Severity;
    2223import org.openstreetmap.josm.data.validation.Test;
    2324import org.openstreetmap.josm.data.validation.TestError;
     25import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    2426import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
    2527import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
    2628import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
     
    6062     * @since 6731
    6163     */
    6264    public static final String ROLE_VERIF_PROBLEM_MSG = tr("Role verification problem");
     65    private boolean ignoreMultiPolygons;
    6366
    6467    /**
    6568     * Constructor
     
    99102    }
    100103
    101104    @Override
     105    public void startTest(ProgressMonitor progressMonitor) {
     106        super.startTest(progressMonitor);
     107
     108        for (Test t : OsmValidator.getEnabledTests(false)) {
     109            if (t instanceof MultipolygonTest) {
     110                ignoreMultiPolygons = true;
     111                break;
     112            }
     113        }
     114    }
     115
     116    @Override
    102117    public void visit(Relation n) {
     118        Map<String, RoleInfo> map = buildRoleInfoMap(n);
     119        if (map.isEmpty()) {
     120            errors.add(TestError.builder(this, Severity.ERROR, RELATION_EMPTY)
     121                    .message(tr("Relation is empty"))
     122                    .primitives(n)
     123                    .build());
     124        }
     125        if (ignoreMultiPolygons && n.isMultipolygon()) {
     126            // see #17010: don't report same problem twice
     127            return;
     128        }
    103129        Map<Role, String> allroles = buildAllRoles(n);
    104130        if (allroles.isEmpty() && n.hasTag("type", "route")
    105131                && n.hasTag("route", "train", "subway", "monorail", "tram", "bus", "trolleybus", "aerialway", "ferry")) {
     
    114140                    .build());
    115141        }
    116142
    117         Map<String, RoleInfo> map = buildRoleInfoMap(n);
    118         if (map.isEmpty()) {
    119             errors.add(TestError.builder(this, Severity.ERROR, RELATION_EMPTY)
    120                     .message(tr("Relation is empty"))
    121                     .primitives(n)
    122                     .build());
    123         } else if (!allroles.isEmpty()) {
     143        if (!map.isEmpty() && !allroles.isEmpty()) {
    124144            checkRoles(n, allroles, map);
    125145        }
    126146    }