Ticket #20130: 20130.3.patch
File 20130.3.patch, 10.6 KB (added by , 19 months ago) |
---|
-
resources/data/validator/geometry.mapcss
224 224 throwWarning: tr("Water area inside water area"); 225 225 } 226 226 227 /* #20130 Building crossing landuse (spatial test) */ 228 area[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 227 232 area:completely_downloaded:closed:areaStyle ⧉ area:completely_downloaded:closed:areaStyle { 228 233 throwOther: tr("Overlapping Areas"); 229 234 } -
src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
57 57 * Type of way. Entries have to be declared in alphabetical order, see sort below. 58 58 */ 59 59 private enum WayType { 60 BARRIER, BUILDING, HIGHWAY, RAILWAY, RESIDENTIAL_AREA,WATERWAY, WAY;60 BARRIER, BUILDING, HIGHWAY, RAILWAY, WATERWAY, WAY; 61 61 62 62 static WayType of(Way w) { 63 63 if (w.hasKey(CrossingWays.BARRIER)) … … 68 68 return HIGHWAY; 69 69 else if (isRailway(w)) 70 70 return RAILWAY; 71 else if (isResidentialArea(w))72 return RESIDENTIAL_AREA;73 71 else if (w.hasKey(CrossingWays.WATERWAY)) 74 72 return WATERWAY; 75 73 else … … 107 105 || isRailway(w) 108 106 || isCoastline(w) 109 107 || isBuilding(w) 110 || w.hasKey(BARRIER) 111 || isResidentialArea(w)); 108 || w.hasKey(BARRIER)); 112 109 } 113 110 114 111 @Override … … 119 116 return true; 120 117 if (isBuilding(w1) && isBuilding(w2)) 121 118 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;127 119 if (isWaterArea(w1) && isWaterArea(w2)) 128 120 return true; // handled by mapcss tests 129 121 if (w1.hasKey(RAILWAY) && w2.hasKey(RAILWAY) && (w1.hasTag(RAILWAY, "yard") != w2.hasTag(RAILWAY, "yard") … … 175 167 return new MessageHelper(tr("Crossing building/highway"), 612); 176 168 case RAILWAY: 177 169 return new MessageHelper(tr("Crossing building/railway"), 613); 178 case RESIDENTIAL_AREA:179 return new MessageHelper(tr("Crossing building/residential area"), 614);180 170 case WATERWAY: 181 171 return new MessageHelper(tr("Crossing building/waterway"), 615); 182 172 case WAY: … … 201 191 default: 202 192 return new MessageHelper(tr("Crossing railway/way"), 631); 203 193 } 204 case RESIDENTIAL_AREA:205 return new MessageHelper(tr("Crossing residential area/way"), 641);206 194 case WATERWAY: 207 195 default: 208 196 return new MessageHelper(tr("Crossing waterway/way"), 651); -
src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
218 218 | < SUPERSET_OR_EQUAL: "⊇" > 219 219 | < NOT_SUPERSET_OR_EQUAL: "⊉" > 220 220 | < CROSSING: "⧉" > 221 | < CROSSING_OUTSIDE: "⧉o" > 221 222 | < PERCENT: "%" > 222 223 | < COMMENT_START: "/*" > : COMMENT 223 224 | < UNEXPECTED_CHAR : ~[] > // avoid TokenMgrErrors because they are hard to recover from … … 634 635 <NOT_SUPERSET_OR_EQUAL> { type = Selector.ChildOrParentSelectorType.NOT_SUPERSET_OR_EQUAL; } 635 636 | 636 637 <CROSSING> { type = Selector.ChildOrParentSelectorType.CROSSING; } 638 | 639 <CROSSING_OUTSIDE> { type = Selector.ChildOrParentSelectorType.CROSSING_OUTSIDE; } 637 640 ) 638 641 w() 639 642 | -
src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
124 124 * @see ChildOrParentSelector 125 125 */ 126 126 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, 128 128 } 129 129 130 130 /** … … 333 333 private Area area; 334 334 /** Will contain all way segments, grouped by cells */ 335 335 Map<Point2D, List<WaySegment>> cellSegments; 336 private final boolean markOutsideArea; 336 337 337 private CrossingFinder(Environment e ) {338 private CrossingFinder(Environment e, boolean markOutside) { 338 339 super(e); 339 340 CheckParameterUtil.ensureThat(isArea(e.osm), "Only areas are supported"); 340 341 layer = OsmUtils.getLayer(e.osm); 342 this.markOutsideArea = markOutside; 341 343 } 342 344 343 345 private Area getAreaEastNorth(IPrimitive p, Environment e) { … … 404 406 Pair<PolygonIntersection, Area> is = Geometry.polygonIntersectionResult( 405 407 otherArea, area, Geometry.INTERSECTION_EPS_EAST_NORTH); 406 408 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 } 407 419 addToChildren(e, p); 408 420 // store intersection area to improve highlight and zoom to problem 409 421 if (e.intersections == null) { 410 422 e.intersections = new HashMap<>(); 411 423 } 412 e.intersections.put(p, is.b);424 e.intersections.put(p, hiliteArea); 413 425 } 414 426 } 415 416 427 } 417 428 418 429 private void useFindCrossings(IPrimitive p) { … … 556 567 visitBBox(e, insideOrEqualFinder); 557 568 return ChildOrParentSelectorType.SUPERSET_OR_EQUAL == type ? e.children != null : e.children == null; 558 569 559 } else if (ChildOrParentSelectorType.CROSSING == type ) {570 } else if (ChildOrParentSelectorType.CROSSING == type || ChildOrParentSelectorType.CROSSING_OUTSIDE == type) { 560 571 e.parent = e.osm; 561 572 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); 563 575 visitBBox(e, crossingFinder); 564 576 return e.children != null; 565 577 } -
test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java
125 125 assertTrue(test.isPrimitiveUsable(newUsableWay("railway=rail"))); 126 126 assertTrue(test.isPrimitiveUsable(newUsableWay("natural=water"))); 127 127 assertTrue(test.isPrimitiveUsable(newUsableWay("building=yes"))); 128 assert True(test.isPrimitiveUsable(newUsableWay("landuse=residential")));128 assertFalse(test.isPrimitiveUsable(newUsableWay("landuse=residential"))); 129 129 // createMessage 130 130 testMessage(601, test, "amenity=restaurant", "amenity=restaurant"); 131 131 testMessage(611, test, "building=yes", "amenity=restaurant"); … … 132 132 testMessage(611, test, "building=yes", "natural=water"); 133 133 testMessage(612, test, "building=yes", "highway=road"); 134 134 testMessage(613, test, "building=yes", "railway=rail"); 135 testMessage(614, test, "building=yes", "landuse=residential");136 135 testMessage(615, test, "building=yes", "waterway=river"); 137 136 testMessage(620, test, "highway=road", "highway=road"); 138 137 testMessage(621, test, "highway=road", "amenity=restaurant"); … … 143 142 testMessage(631, test, "railway=rail", "amenity=restaurant"); 144 143 testMessage(631, test, "railway=rail", "natural=water"); 145 144 testMessage(632, test, "railway=rail", "waterway=river"); 146 testMessage(641, test, "landuse=residential", "amenity=restaurant");147 145 testMessage(650, test, "waterway=river", "waterway=river"); 148 146 testMessage(651, test, "waterway=river", "amenity=restaurant"); 149 147 testMessage(603, test, "barrier=hedge", "barrier=yes"); … … 153 151 testMessage(664, test, "barrier=hedge", "waterway=river"); 154 152 testMessage(665, test, "barrier=hedge", "natural=water"); 155 153 156 testIgnore(true, test, "landuse=residential", "natural=water");157 testIgnore(false, test, "landuse=residential", "building=yes");158 159 154 assertFalse(test.isPrimitiveUsable(newUsableWay("amenity=restaurant"))); 160 155 assertFalse(test.isPrimitiveUsable(TestUtils.newWay("barrier=yes"))); // Unusable (0 node) 161 156 assertTrue(test.isPrimitiveUsable(newUsableWay("barrier=yes"))); // Usable (2 nodes)