Ticket #17475: 17475-v2.patch

File 17475-v2.patch, 3.4 KB (added by GerdP, 7 years ago)
  • src/org/openstreetmap/josm/data/validation/tests/Addresses.java

     
    1818import java.util.stream.Collectors;
    1919import java.util.stream.Stream;
    2020
     21import org.openstreetmap.josm.command.Command;
     22import org.openstreetmap.josm.command.DeleteCommand;
    2123import org.openstreetmap.josm.data.coor.EastNorth;
    2224import org.openstreetmap.josm.data.coor.LatLon;
    2325import org.openstreetmap.josm.data.osm.Node;
     
    4648    protected static final int MULTIPLE_STREET_NAMES = 2603;
    4749    protected static final int MULTIPLE_STREET_RELATIONS = 2604;
    4850    protected static final int HOUSE_NUMBER_TOO_FAR = 2605;
     51    protected static final int OBSOLETE_RELATION = 2606;
    4952
    5053    protected static final DoubleProperty MAX_DUPLICATE_DISTANCE = new DoubleProperty("validator.addresses.max_duplicate_distance", 200.0);
    5154    protected static final DoubleProperty MAX_STREET_DISTANCE = new DoubleProperty("validator.addresses.max_street_distance", 200.0);
     
    261264        checkHouseNumbersWithoutStreet(r);
    262265        checkForDuplicate(r);
    263266        if (r.hasTag("type", ASSOCIATED_STREET)) {
     267            checkIfObsolete(r);
    264268            // Used to count occurrences of each house number in order to find duplicates
    265269            Map<String, List<OsmPrimitive>> map = new HashMap<>();
    266270            // Used to detect different street names
     
    389393                .primitives(errorList)
    390394                .build());
    391395    }
     396
     397    /**
     398     * Check if an associatedStreet Relation is obsolete.
     399     * @param r the relation
     400     */
     401    private void checkIfObsolete(Relation r) {
     402        for (RelationMember m : r.getMembers()) {
     403            if (m.getMember().isIncomplete())
     404                return;
     405
     406            boolean isHighway = m.isWay() && m.getMember().hasKey("highway");
     407
     408            switch (m.getRole()) {
     409            case "house":
     410            case "addr:houselink":
     411            case "address":
     412                if (!m.getMember().hasTag("addr:street") || !m.getMember().hasTag("addr:housenumber"))
     413                    return;
     414                break;
     415            case "street":
     416                if (!m.getMember().hasTag("name") && r.hasTag("name"))
     417                    return;
     418                break;
     419            case "":
     420                if (!isHighway && (!m.getMember().hasTag("addr:street") || !m.getMember().hasTag("addr:housenumber")))
     421                    return;
     422                if (isHighway && !m.getMember().hasTag("name") && r.hasTag("name"))
     423                    return;
     424                break;
     425            default:
     426            }
     427        }
     428        errors.add(TestError.builder(this, Severity.WARNING, OBSOLETE_RELATION)
     429                .message(tr("Relation is obsolete"))
     430                .primitives(r)
     431                .build());
     432    }
     433
     434    /**
     435     * Merge the nodes into one.
     436     * Copied from UtilsPlugin.MergePointsAction
     437     */
     438    @Override
     439    public Command fixError(TestError testError) {
     440        return new DeleteCommand(testError.getPrimitives());
     441    }
     442
     443    @Override
     444    public boolean isFixable(TestError testError) {
     445        if (!(testError.getTester() instanceof Addresses))
     446            return false;
     447        return testError.getCode() == OBSOLETE_RELATION;
     448    }
     449
     450
    392451}