Changeset 17400 in josm for trunk/src


Ignore:
Timestamp:
2020-12-10T17:38:18+01:00 (3 years ago)
Author:
GerdP
Message:

fix #20121: Confusing handling of water objects in CrossingWays

  • report all self crossing ways with the same message
  • ignore corssing water areas because they are reported by mapcss geometry tests
  • don't ignore crossing between water areas and highway, railway, barrier, or building
  • remove redundant and missleading checks in CrossingWays.Ways.ignoreWaySegmentCombination()
  • add unit test for coverage and test of these changes
  • fix @since
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java

    r17393 r17400  
    114114        boolean ignoreWaySegmentCombination(Way w1, Way w2) {
    115115            if (w1 == w2)
    116                 return false;
    117             if (areLayerOrLevelDifferent(w1, w2)) {
    118116                return true;
    119             }
     117            if (areLayerOrLevelDifferent(w1, w2))
     118                return true;
    120119            if (isBuilding(w1) && isBuilding(w2))
    121                 return true;
    122             if (w1.hasKey(HIGHWAY) && w2.hasKey(HIGHWAY) && !Objects.equals(w1.get("level"), w2.get("level"))) {
    123                 return true;
    124             }
     120                return true; // handled by mapcss tests
    125121            if (((isResidentialArea(w1) || w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w2))
    126122             || ((isResidentialArea(w2) || w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w1)))
    127123                return true;
    128             if (isSubwayOrTramOrRazed(w2)) {
    129                 return true;
    130             }
     124            if (isWaterArea(w1) && isWaterArea(w2))
     125                return true; // handled by mapcss tests
    131126            if (w1.hasKey(RAILWAY) && w2.hasKey(RAILWAY) && w1.hasTag(RAILWAY, "yard") != w2.hasTag(RAILWAY, "yard")) {
    132127                return true; // see #20089
    133128            }
    134             if (isCoastline(w1) != isCoastline(w2)) {
    135                 return true;
    136             }
    137             if ((w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w2.hasTag(WATERWAY, "riverbank"))
    138              || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w1.hasTag(WATERWAY, "riverbank"))) {
    139                 return true;
    140             }
    141             return isProposedOrAbandoned(w2);
     129            return (w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w2.hasTag(WATERWAY, "riverbank"))
     130                    || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w1.hasTag(WATERWAY, "riverbank"));
    142131        }
    143132
     
    274263
    275264    /**
    276      * Self crossing ways test (for all the rest)
     265     * Self crossing ways test (for all ways)
    277266     */
    278267    public static class SelfCrossing extends CrossingWays {
    279268
    280269        protected static final int CROSSING_SELF = 604;
    281 
    282         CrossingWays.Ways normalTest = new Ways();
    283         CrossingWays.Boundaries boundariesTest = new Boundaries();
    284270
    285271        /**
     
    291277
    292278        @Override
    293         public boolean isPrimitiveUsable(OsmPrimitive p) {
    294             return super.isPrimitiveUsable(p) && !(normalTest.isPrimitiveUsable(p)
    295                     || boundariesTest.isPrimitiveUsable(p));
    296         }
    297 
    298         @Override
    299279        boolean ignoreWaySegmentCombination(Way w1, Way w2) {
    300             return w1 != w2; // should not happen
     280            return false; // we should not get here
    301281        }
    302282    }
     
    332312    }
    333313
     314    static boolean isWaterArea(OsmPrimitive w) {
     315        return w.hasTag("natural", "water") || w.hasTag(LANDUSE, "reservoir");
     316    }
     317
    334318    static boolean isHighway(OsmPrimitive w) {
    335319        return w.hasTagDifferent(HIGHWAY, "rest_area", "services", "bus_stop", "platform");
     
    358342    @Override
    359343    public void visit(Way w) {
    360         if (this instanceof SelfCrossing) {
     344        boolean findSelfCrossingOnly = this instanceof SelfCrossing;
     345        if (findSelfCrossingOnly) {
    361346            // free memory, we are not interested in previous ways
    362347            cellSegments.clear();
     
    378363                    List<WaySegment> highlight;
    379364
    380                     if (!es1.intersects(es2) || ignoreWaySegmentCombination(es1.way, es2.way)) {
     365                    if (!es1.intersects(es2)
     366                            || (!findSelfCrossingOnly && ignoreWaySegmentCombination(es1.way, es2.way))) {
    381367                        continue;
    382368                    }
     
    475461     * @return {@code true} if one or more segments of the way are crossing
    476462     * @see SelfIntersectingWay
    477      * @since xxx
     463     * @since 17393
    478464     */
    479465    public static boolean isSelfCrossing(Way way) {
Note: See TracChangeset for help on using the changeset viewer.