Ticket #22404: 22404.patch

File 22404.patch, 4.3 KB (added by taylor.smock, 3 years ago)

Correct way direction when Area messes it up, fix rendering issue with VectorWay (getType now unconditionally returns WAY, and now implements getDisplayType), improve documentation for implementors of getType.

  • src/org/openstreetmap/josm/data/osm/PrimitiveId.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/org/openstreetmap/josm/data/osm/PrimitiveId.java b/src/org/openstreetmap/josm/data/osm/PrimitiveId.java
    a b  
    1616    long getUniqueId();
    1717
    1818    /**
    19      * Gets the type of object represented by this object.
     19     * Gets the type of object represented by this object. Note that this should
     20     * return the base primitive type ({@link OsmPrimitiveType#NODE},
     21     * {@link OsmPrimitiveType#WAY}, and {@link OsmPrimitiveType#RELATION}).
    2022     *
    2123     * @return the object type
    2224     * @see Node
  • src/org/openstreetmap/josm/data/vector/VectorDataStore.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/org/openstreetmap/josm/data/vector/VectorDataStore.java b/src/org/openstreetmap/josm/data/vector/VectorDataStore.java
    a b  
    267267    private <T extends Tile & VectorTile> VectorRelation areaToRelation(T tile, Layer layer,
    268268      Collection<VectorPrimitive> featureObjects, Area area) {
    269269        VectorRelation vectorRelation = new VectorRelation(layer.getName());
    270         for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, area.getPathIterator(null))) {
     270        PathIterator pathIterator = area.getPathIterator(null);
     271        int windingRule = pathIterator.getWindingRule();
     272        for (VectorPrimitive member : pathIteratorToObjects(tile, layer, featureObjects, pathIterator)) {
    271273            final String role;
    272274            if (member instanceof VectorWay && ((VectorWay) member).isClosed()) {
     275                // Area messes up the winding. See #22404.
     276                if (windingRule == PathIterator.WIND_NON_ZERO) {
     277                    VectorWay vectorWay = (VectorWay) member;
     278                    List<VectorNode> nodes = new ArrayList<>(vectorWay.getNodes());
     279                    Collections.reverse(nodes);
     280                    vectorWay.setNodes(nodes);
     281                }
    273282                role = Geometry.isClockwise(((VectorWay) member).getNodes()) ? "outer" : "inner";
    274283            } else {
    275284                role = "";
     
    374383        } else if (shape instanceof Path2D) {
    375384            primitive = pathToWay(tile, layer, featureObjects, (Path2D) shape).stream().findFirst().orElse(null);
    376385        } else if (shape instanceof Area) {
    377             primitive = areaToRelation(tile, layer, featureObjects, (Area) shape);
    378             primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE);
     386            VectorRelation vectorRelation = areaToRelation(tile, layer, featureObjects, (Area) shape);
     387            if (vectorRelation.getMembersCount() != 1) {
     388                primitive = vectorRelation;
     389                primitive.put(RELATION_TYPE, MULTIPOLYGON_TYPE);
     390            } else {
     391                primitive = vectorRelation.getMember(0).getMember();
     392            }
    379393        } else {
    380394            // We shouldn't hit this, but just in case
    381395            throw new UnsupportedOperationException(Objects.toString(shape));
  • src/org/openstreetmap/josm/data/vector/VectorWay.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/src/org/openstreetmap/josm/data/vector/VectorWay.java b/src/org/openstreetmap/josm/data/vector/VectorWay.java
    a b  
    130130
    131131    @Override
    132132    public OsmPrimitiveType getType() {
     133        return OsmPrimitiveType.WAY;
     134    }
     135
     136    @Override
     137    public OsmPrimitiveType getDisplayType() {
    133138        return this.isClosed() ? OsmPrimitiveType.CLOSEDWAY : OsmPrimitiveType.WAY;
    134139    }
    135140}