Ticket #17475: 17475.patch

File 17475.patch, 3.2 KB (added by GerdP, 5 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                continue;
     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                break;
     417            case "":
     418                if (!isHighway && (!m.getMember().hasTag("addr:street") || !m.getMember().hasTag("addr:housenumber"))) {
     419                    return;
     420                }
     421                break;
     422            default:
     423            }
     424        }
     425        errors.add(TestError.builder(this, Severity.WARNING, OBSOLETE_RELATION)
     426                .message(tr("Relation is obsolete"))
     427                .primitives(r)
     428                .build());
     429    }
     430
     431    /**
     432     * Merge the nodes into one.
     433     * Copied from UtilsPlugin.MergePointsAction
     434     */
     435    @Override
     436    public Command fixError(TestError testError) {
     437        return new DeleteCommand(testError.getPrimitives());
     438    }
     439
     440    @Override
     441    public boolean isFixable(TestError testError) {
     442        if (!(testError.getTester() instanceof Addresses))
     443            return false;
     444        return testError.getCode() == OBSOLETE_RELATION;
     445    }
     446
     447
    392448}