6 | | {{{#!diff |
7 | | Index: src/org/openstreetmap/josm/data/vector/VectorDataStore.java |
8 | | =================================================================== |
9 | | diff --git a/src/org/openstreetmap/josm/data/vector/VectorDataStore.java b/src/org/openstreetmap/josm/data/vector/VectorDataStore.java |
10 | | --- a/src/org/openstreetmap/josm/data/vector/VectorDataStore.java (revision 18564) |
11 | | +++ b/src/org/openstreetmap/josm/data/vector/VectorDataStore.java (date 1664394677575) |
12 | | @@ -267,9 +267,18 @@ |
13 | | private <T extends Tile & VectorTile> VectorRelation areaToRelation(T tile, Layer layer, |
14 | | Collection<VectorPrimitive> featureObjects, Area area) { |
15 | | VectorRelation vectorRelation = new VectorRelation(layer.getName()); |
16 | | - for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, area.getPathIterator(null))) { |
17 | | + PathIterator pathIterator = area.getPathIterator(null); |
18 | | + int windingRule = pathIterator.getWindingRule(); |
19 | | + for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, pathIterator)) { |
20 | | final String role; |
21 | | if (member instanceof VectorWay && ((VectorWay) member).isClosed()) { |
22 | | + // Area messes up the winding. See #22404. |
23 | | + if (windingRule == PathIterator.WIND_NON_ZERO) { |
24 | | + VectorWay vectorWay = (VectorWay) member; |
25 | | + List<VectorNode> nodes = new ArrayList<>(vectorWay.getNodes()); |
26 | | + Collections.reverse(nodes); |
27 | | + vectorWay.setNodes(nodes); |
28 | | + } |
29 | | role = Geometry.isClockwise(((VectorWay) member).getNodes()) ? "outer" : "inner"; |
30 | | } else { |
31 | | role = ""; |
32 | | @@ -374,8 +383,13 @@ |
33 | | } else if (shape instanceof Path2D) { |
34 | | primitive = pathToWay(tile, layer, featureObjects, (Path2D) shape).stream().findFirst().orElse(null); |
35 | | } else if (shape instanceof Area) { |
36 | | - primitive = areaToRelation(tile, layer, featureObjects, (Area) shape); |
37 | | - primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE); |
38 | | + VectorRelation vectorRelation = areaToRelation(tile, layer, featureObjects, (Area) shape); |
39 | | + if (vectorRelation.getMembersCount() != 1) { |
40 | | + primitive = vectorRelation; |
41 | | + primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE); |
42 | | + } else { |
43 | | + primitive = vectorRelation.getMember(0).getMember(); |
44 | | + } |
45 | | } else { |
46 | | // We shouldn't hit this, but just in case |
47 | | throw new UnsupportedOperationException(Objects.toString(shape)); |
48 | | }}} |
| 6 | ~~I'm going to look into why the style sheet isn't being converted into a roughly equivalent mapcss style sheet.~~ |