Ticket #9819: 9819_highwayCrossingWaterwayOnly.patch

File 9819_highwayCrossingWaterwayOnly.patch, 3.3 KB (added by reichg, 5 years ago)

This covers the original issue with highways crossing waterways which have a layer tag but not a bridge/tunnel tag.

  • src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java

     
    114114        boolean ignoreWaySegmentCombination(Way w1, Way w2) {
    115115            if (w1 == w2)
    116116                return true;
    117             if (areLayerOrLevelDifferent(w1, w2))
    118                 return true;
    119117            if (isBuilding(w1) && isBuilding(w2))
    120118                return true; // handled by mapcss tests
    121119            if (((isResidentialArea(w1) || w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) || isWaterArea(w1))
     
    378376                        highlight.add(es1);
    379377                        highlight.add(es2);
    380378
    381                         final MessageHelper message = createMessage(es1.getWay(), es2.getWay());
    382                         errors.add(TestError.builder(this, Severity.WARNING, message.code)
    383                                 .message(message.message)
    384                                 .primitives(prims)
    385                                 .highlightWaySegments(highlight)
    386                                 .build());
    387                         seenWays.put(prims, highlight);
     379                        if (InvalidHighwayCrossingWaterwayTags(es1, es2))
     380                        {
     381                            errors.add(TestError.builder(this, Severity.WARNING, 652)
     382                                    .message("Highway crossing waterway probably needs bridge=* or tunnel=* tag.")
     383                                    .primitives(prims)
     384                                    .highlightWaySegments(highlight)
     385                                    .build());
     386                        }
     387
     388                        if (!areLayerOrLevelDifferent(es1.getWay(), es2.getWay()))
     389                        {
     390                            final MessageHelper message = createMessage(es1.getWay(), es2.getWay());
     391                            errors.add(TestError.builder(this, Severity.WARNING, message.code)
     392                                    .message(message.message)
     393                                    .primitives(prims)
     394                                    .highlightWaySegments(highlight)
     395                                    .build());
     396                            seenWays.put(prims, highlight);
     397
     398                        }
    388399                    } else {
    389400                        highlight.add(es1);
    390401                        highlight.add(es2);
     
    395406        }
    396407    }
    397408
     409    private boolean InvalidHighwayCrossingWaterwayTags(WaySegment way1, WaySegment way2) {
     410        return (way1.getWay().hasKey(HIGHWAY) && way1.getWay().hasKey("layer")
     411                && !way1.getWay().hasKey("tunnel") && !way1.getWay().hasKey("bridge") && way2.getWay().hasKey(WATERWAY))
     412                || (way2.getWay().hasKey(HIGHWAY) && way2.getWay().hasKey("layer")
     413                && !way2.getWay().hasKey("tunnel") && !way2.getWay().hasKey("bridge") && way1.getWay().hasKey(WATERWAY));
     414
     415
     416    }
     417
    398418    private static boolean areLayerOrLevelDifferent(Way w1, Way w2) {
    399419        return !Objects.equals(OsmUtils.getLayer(w1), OsmUtils.getLayer(w2))
    400420            || !Objects.equals(w1.get("level"), w2.get("level"));