Ticket #23302: validatePoi.patch

File validatePoi.patch, 12.6 KB (added by zyphlar, 21 months ago)
  • src/org/openstreetmap/josm/data/validation/tests/Addresses.java

    diff --git a/src/org/openstreetmap/josm/data/validation/tests/Addresses.java b/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
    index 4f1fc1e50..387dd4601 100644
    a b import java.util.Set;  
    1919import java.util.stream.Collectors;
    2020import java.util.stream.Stream;
    2121
     22import javax.swing.JCheckBox;
     23import javax.swing.JPanel;
     24
    2225import org.openstreetmap.josm.command.Command;
    2326import org.openstreetmap.josm.command.DeleteCommand;
    2427import org.openstreetmap.josm.data.coor.EastNorth;
    import org.openstreetmap.josm.data.osm.Relation;  
    3033import org.openstreetmap.josm.data.osm.RelationMember;
    3134import org.openstreetmap.josm.data.osm.TagMap;
    3235import org.openstreetmap.josm.data.osm.Way;
     36import org.openstreetmap.josm.data.preferences.BooleanProperty;
    3337import org.openstreetmap.josm.data.preferences.DoubleProperty;
     38import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
    3439import org.openstreetmap.josm.data.validation.Severity;
    3540import org.openstreetmap.josm.data.validation.Test;
    3641import org.openstreetmap.josm.data.validation.TestError;
     42import org.openstreetmap.josm.tools.GBC;
    3743import org.openstreetmap.josm.tools.Geometry;
    3844import org.openstreetmap.josm.tools.Logging;
    3945import org.openstreetmap.josm.tools.Pair;
    public class Addresses extends Test {  
    7076    protected static final String ADDR_HOUSE_NAME    = "addr:housename";
    7177    protected static final String ADDR_POSTCODE      = "addr:postcode";
    7278    protected static final String ASSOCIATED_STREET  = "associatedStreet";
     79    protected static final String NAME               = "name";
    7380    // CHECKSTYLE.ON: SingleSpaceSeparator
    7481
     82    private static final BooleanProperty PREF_INCLUDE_BLDG_POI =
     83            new BooleanProperty(ValidatorPrefHelper.PREFIX + "." + OpeningHourTest.class.getSimpleName() + "." + "includebldgpois", false);
     84    /* I18n: Label text for checkbox choosing to validate addresses for all types of objects, not just plain addresses */
     85    private final JCheckBox checkboxIncludeBldgPOI = new JCheckBox(tr("Include POIs like amenities, offices, and buildings in duplicate address detection"));
     86    private boolean includeBldgAndPOI = false;
     87
    7588    private Map<String, Collection<OsmPrimitive>> knownAddresses;
    7689    private Set<String> ignoredAddresses;
    7790
    public class Addresses extends Test {  
    7992     * Constructor
    8093     */
    8194    public Addresses() {
     95        /* I18n: Label text for checkbox choosing to validate addresses */
    8296        super(tr("Addresses"), tr("Checks for errors in addresses and associatedStreet relations."));
     97        includeBldgAndPOI = PREF_INCLUDE_BLDG_POI.get();
    8398    }
    8499
    85100    protected List<Relation> getAndCheckAssociatedStreets(OsmPrimitive p) {
    public class Addresses extends Test {  
    141156     * @param p OsmPrimitive that has an address
    142157     */
    143158    private void collectAddress(OsmPrimitive p) {
    144         if (!isPOI(p)) {
     159        if (includeBldgAndPOI || !isPOI(p)) {
    145160            for (String simplifiedAddress : getSimplifiedAddresses(p)) {
    146161                if (!ignoredAddresses.contains(simplifiedAddress)) {
    147162                    knownAddresses.computeIfAbsent(simplifiedAddress, x -> new ArrayList<>()).add(p);
    public class Addresses extends Test {  
    154169        knownAddresses = new HashMap<>();
    155170        ignoredAddresses = new HashSet<>();
    156171        for (OsmPrimitive p : primitive.getDataSet().allNonDeletedPrimitives()) {
    157             if (p instanceof Node && p.hasKey(ADDR_UNIT, ADDR_FLATS)) {
     172            if ((includeBldgAndPOI || p instanceof Node) && p.hasKey(ADDR_UNIT, ADDR_FLATS)) {
    158173                for (OsmPrimitive r : p.getReferrers()) {
    159174                    if (hasAddress(r)) {
    160175                        // ignore addresses of buildings that are connected to addr:unit nodes
    public class Addresses extends Test {  
    186201        if (knownAddresses == null) {
    187202            initAddressMap(p);
    188203        }
    189         if (!isPOI(p) && hasAddress(p)) {
     204        if ((includeBldgAndPOI || !isPOI(p)) && hasAddress(p)) {
    190205            List<TestError> result = new ArrayList<>();
    191206            for (String simplifiedAddress : getSimplifiedAddresses(p)) {
    192207                if (!ignoredAddresses.contains(simplifiedAddress) && knownAddresses.containsKey(simplifiedAddress)) {
    public class Addresses extends Test {  
    198213                        Severity severityLevel;
    199214                        String city1 = p.get(ADDR_CITY);
    200215                        String city2 = p2.get(ADDR_CITY);
     216                        String name1 = p.get(NAME);
     217                        String name2 = p2.get(NAME);
    201218                        double distance = getDistance(p, p2);
    202219                        if (city1 != null && city2 != null) {
    203220                            if (city1.equals(city2)) {
    public class Addresses extends Test {  
    235252                                }
    236253                            }
    237254                        }
     255                        if (severityLevel == Severity.WARNING && name1 != name2) {
     256                            // since multiple objects can exist at one address, a different name tag isn't very concerning
     257                            severityLevel = Severity.OTHER;
     258                        }
    238259                        result.add(TestError.builder(this, severityLevel, DUPLICATE_HOUSE_NUMBER)
    239260                                .message(tr("Duplicate house numbers"), marktr("''{0}'' ({1}m)"), simplifiedAddress, (int) distance)
    240261                                .primitives(Arrays.asList(p, p2)).build());
    public class Addresses extends Test {  
    522543        return testError.getCode() == OBSOLETE_RELATION;
    523544    }
    524545
     546    @Override
     547    public void addGui(JPanel testPanel) {
     548        super.addGui(testPanel);
     549        checkboxIncludeBldgPOI.setSelected(PREF_INCLUDE_BLDG_POI.get());
     550        testPanel.add(checkboxIncludeBldgPOI, GBC.eol().insets(20, 0, 0, 0));
     551    }
     552
     553    @Override
     554    public boolean ok() {
     555        super.ok();
     556        PREF_INCLUDE_BLDG_POI.put(checkboxIncludeBldgPOI.isSelected());
     557        includeBldgAndPOI = PREF_INCLUDE_BLDG_POI.get();
     558        return false;
     559    }
     560
    525561}