Ticket #20130: 20130.3.patch

File 20130.3.patch, 10.6 KB (added by GerdP, 19 months ago)

updated patch

  • resources/data/validator/geometry.mapcss

     
    224224  throwWarning: tr("Water area inside water area");
    225225}
    226226
     227/* #20130 Building crossing landuse (spatial test) */
     228area[building][building!~/no|entrance/] ⧉o area:closed:areaStyle[landuse=~ /^(commercial|farmyard|garages|industrial|retail|residential)$/][landuse] {
     229  throwWarning: tr("Crossing building/{0} area", "{3.tag}");
     230}
     231
    227232area:completely_downloaded:closed:areaStyle ⧉ area:completely_downloaded:closed:areaStyle {
    228233  throwOther: tr("Overlapping Areas");
    229234}
  • src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java

     
    5757     * Type of way. Entries have to be declared in alphabetical order, see sort below.
    5858     */
    5959    private enum WayType {
    60         BARRIER, BUILDING, HIGHWAY, RAILWAY, RESIDENTIAL_AREA, WATERWAY, WAY;
     60        BARRIER, BUILDING, HIGHWAY, RAILWAY, WATERWAY, WAY;
    6161
    6262        static WayType of(Way w) {
    6363            if (w.hasKey(CrossingWays.BARRIER))
     
    6868                return HIGHWAY;
    6969            else if (isRailway(w))
    7070                return RAILWAY;
    71             else if (isResidentialArea(w))
    72                 return RESIDENTIAL_AREA;
    7371            else if (w.hasKey(CrossingWays.WATERWAY))
    7472                return WATERWAY;
    7573            else
     
    107105                    || isRailway(w)
    108106                    || isCoastline(w)
    109107                    || isBuilding(w)
    110                     || w.hasKey(BARRIER)
    111                     || isResidentialArea(w));
     108                    || w.hasKey(BARRIER));
    112109        }
    113110
    114111        @Override
     
    119116                return true;
    120117            if (isBuilding(w1) && isBuilding(w2))
    121118                return true; // handled by mapcss tests
    122             if (((isResidentialArea(w1) || w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) || isWaterArea(w1))
    123                     && isResidentialArea(w2))
    124                     || ((isResidentialArea(w2) || w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY) || isWaterArea(w2))
    125                             && isResidentialArea(w1)))
    126                 return true;
    127119            if (isWaterArea(w1) && isWaterArea(w2))
    128120                return true; // handled by mapcss tests
    129121            if (w1.hasKey(RAILWAY) && w2.hasKey(RAILWAY) && (w1.hasTag(RAILWAY, "yard") != w2.hasTag(RAILWAY, "yard")
     
    175167                        return new MessageHelper(tr("Crossing building/highway"), 612);
    176168                    case RAILWAY:
    177169                        return new MessageHelper(tr("Crossing building/railway"), 613);
    178                     case RESIDENTIAL_AREA:
    179                         return new MessageHelper(tr("Crossing building/residential area"), 614);
    180170                    case WATERWAY:
    181171                        return new MessageHelper(tr("Crossing building/waterway"), 615);
    182172                    case WAY:
     
    201191                    default:
    202192                        return new MessageHelper(tr("Crossing railway/way"), 631);
    203193                    }
    204                 case RESIDENTIAL_AREA:
    205                     return new MessageHelper(tr("Crossing residential area/way"), 641);
    206194                case WATERWAY:
    207195                default:
    208196                    return new MessageHelper(tr("Crossing waterway/way"), 651);
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj

     
    218218|   < SUPERSET_OR_EQUAL: "⊇" >
    219219|   < NOT_SUPERSET_OR_EQUAL: "⊉" >
    220220|   < CROSSING: "⧉" >
     221|   < CROSSING_OUTSIDE: "⧉o" >
    221222|   < PERCENT: "%" >
    222223|   < COMMENT_START: "/*" > : COMMENT
    223224|   < UNEXPECTED_CHAR : ~[] > // avoid TokenMgrErrors because they are hard to recover from
     
    634635                <NOT_SUPERSET_OR_EQUAL> { type = Selector.ChildOrParentSelectorType.NOT_SUPERSET_OR_EQUAL; }
    635636            |
    636637                <CROSSING> { type = Selector.ChildOrParentSelectorType.CROSSING; }
     638            |
     639                <CROSSING_OUTSIDE> { type = Selector.ChildOrParentSelectorType.CROSSING_OUTSIDE; }
    637640            )
    638641            w()
    639642        |
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

     
    124124     * @see ChildOrParentSelector
    125125     */
    126126    enum ChildOrParentSelectorType {
    127         CHILD, PARENT, SUBSET_OR_EQUAL, NOT_SUBSET_OR_EQUAL, SUPERSET_OR_EQUAL, NOT_SUPERSET_OR_EQUAL, CROSSING, SIBLING,
     127        CHILD, PARENT, SUBSET_OR_EQUAL, NOT_SUBSET_OR_EQUAL, SUPERSET_OR_EQUAL, NOT_SUPERSET_OR_EQUAL, CROSSING, SIBLING, CROSSING_OUTSIDE,
    128128    }
    129129
    130130    /**
     
    333333            private Area area;
    334334            /** Will contain all way segments, grouped by cells */
    335335            Map<Point2D, List<WaySegment>> cellSegments;
     336            private final boolean markOutsideArea;
    336337
    337             private CrossingFinder(Environment e) {
     338            private CrossingFinder(Environment e, boolean markOutside) {
    338339                super(e);
    339340                CheckParameterUtil.ensureThat(isArea(e.osm), "Only areas are supported");
    340341                layer = OsmUtils.getLayer(e.osm);
     342                this.markOutsideArea = markOutside;
    341343            }
    342344
    343345            private Area getAreaEastNorth(IPrimitive p, Environment e) {
     
    404406                    Pair<PolygonIntersection, Area> is = Geometry.polygonIntersectionResult(
    405407                            otherArea, area, Geometry.INTERSECTION_EPS_EAST_NORTH);
    406408                    if (Geometry.PolygonIntersection.CROSSING == is.a) {
     409                        final Area hiliteArea;
     410                        if (markOutsideArea) {
     411                            hiliteArea = new Area(otherArea);
     412                            hiliteArea.subtract(area);
     413                            if (hiliteArea.isEmpty()) {
     414                                return; // can happen with multipolygon if only a node is shared
     415                            }
     416                        } else {
     417                            hiliteArea = is.b;
     418                        }
    407419                        addToChildren(e, p);
    408420                        // store intersection area to improve highlight and zoom to problem
    409421                        if (e.intersections == null) {
    410422                            e.intersections = new HashMap<>();
    411423                        }
    412                         e.intersections.put(p, is.b);
     424                        e.intersections.put(p, hiliteArea);
    413425                    }
    414426                }
    415 
    416427            }
    417428
    418429            private void useFindCrossings(IPrimitive p) {
     
    556567                visitBBox(e, insideOrEqualFinder);
    557568                return ChildOrParentSelectorType.SUPERSET_OR_EQUAL == type ? e.children != null : e.children == null;
    558569
    559             } else if (ChildOrParentSelectorType.CROSSING == type) {
     570            } else if (ChildOrParentSelectorType.CROSSING == type || ChildOrParentSelectorType.CROSSING_OUTSIDE == type) {
    560571                e.parent = e.osm;
    561572                if (e.osm.getDataSet() != null && isArea(e.osm)) {
    562                     final CrossingFinder crossingFinder = new CrossingFinder(e);
     573                    boolean markOutside = ChildOrParentSelectorType.CROSSING_OUTSIDE == type;
     574                    final CrossingFinder crossingFinder = new CrossingFinder(e, markOutside);
    563575                    visitBBox(e, crossingFinder);
    564576                    return e.children != null;
    565577                }
  • test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java

     
    125125        assertTrue(test.isPrimitiveUsable(newUsableWay("railway=rail")));
    126126        assertTrue(test.isPrimitiveUsable(newUsableWay("natural=water")));
    127127        assertTrue(test.isPrimitiveUsable(newUsableWay("building=yes")));
    128         assertTrue(test.isPrimitiveUsable(newUsableWay("landuse=residential")));
     128        assertFalse(test.isPrimitiveUsable(newUsableWay("landuse=residential")));
    129129        // createMessage
    130130        testMessage(601, test, "amenity=restaurant", "amenity=restaurant");
    131131        testMessage(611, test, "building=yes", "amenity=restaurant");
     
    132132        testMessage(611, test, "building=yes", "natural=water");
    133133        testMessage(612, test, "building=yes", "highway=road");
    134134        testMessage(613, test, "building=yes", "railway=rail");
    135         testMessage(614, test, "building=yes", "landuse=residential");
    136135        testMessage(615, test, "building=yes", "waterway=river");
    137136        testMessage(620, test, "highway=road", "highway=road");
    138137        testMessage(621, test, "highway=road", "amenity=restaurant");
     
    143142        testMessage(631, test, "railway=rail", "amenity=restaurant");
    144143        testMessage(631, test, "railway=rail", "natural=water");
    145144        testMessage(632, test, "railway=rail", "waterway=river");
    146         testMessage(641, test, "landuse=residential", "amenity=restaurant");
    147145        testMessage(650, test, "waterway=river", "waterway=river");
    148146        testMessage(651, test, "waterway=river", "amenity=restaurant");
    149147        testMessage(603, test, "barrier=hedge", "barrier=yes");
     
    153151        testMessage(664, test, "barrier=hedge", "waterway=river");
    154152        testMessage(665, test, "barrier=hedge", "natural=water");
    155153
    156         testIgnore(true, test, "landuse=residential", "natural=water");
    157         testIgnore(false, test, "landuse=residential", "building=yes");
    158 
    159154        assertFalse(test.isPrimitiveUsable(newUsableWay("amenity=restaurant")));
    160155        assertFalse(test.isPrimitiveUsable(TestUtils.newWay("barrier=yes"))); // Unusable (0 node)
    161156        assertTrue(test.isPrimitiveUsable(newUsableWay("barrier=yes"))); // Usable (2 nodes)