Ignore:
Timestamp:
2017-08-13T19:15:28+02:00 (7 years ago)
Author:
donvip
Message:

fix #josm11315 - full multipolygon support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/ComputeBoundsAction.java

    r33493 r33496  
    2626import org.openstreetmap.josm.data.coor.LatLon;
    2727import org.openstreetmap.josm.data.osm.BBox;
     28import org.openstreetmap.josm.data.osm.Node;
    2829import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2930import org.openstreetmap.josm.data.osm.Relation;
    3031import org.openstreetmap.josm.data.osm.RelationMember;
    3132import org.openstreetmap.josm.data.osm.Way;
     33import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
     34import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay;
     35import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData;
    3236import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    3337import org.openstreetmap.josm.plugins.imageryxmlbounds.XmlBoundsConstants;
     
    305309    protected static final boolean isValidOuterMember(RelationMember mb) {
    306310        return (mb.getRole() == null || mb.getRole().isEmpty() || "outer".equals(mb.getRole()))
    307                 && mb.getMember() instanceof Way && ((Way) mb.getMember()).isClosed();
     311                && mb.getMember() instanceof Way;
     312    }
     313
     314    protected static final boolean isValidOuterClosedMember(RelationMember mb) {
     315        return isValidOuterMember(mb) && ((Way) mb.getMember()).isClosed();
    308316    }
    309317
    310318    protected static final String getMultiPolygonBounds(Relation mp) {
    311         List<Way> outerClosedWays = new ArrayList<>();
    312         for (RelationMember mb : mp.getMembers()) {
    313             if (isValidOuterMember(mb)) {
    314                 outerClosedWays.add((Way) mb.getMember());
    315             }
    316         }
    317 
    318         if (outerClosedWays.isEmpty() || (outerClosedWays.size() == 1 && areClosedWayAndBboxEqual(outerClosedWays.get(0), mp.getBBox()))) {
     319        List<PolyData> polygons = new Multipolygon(mp).getOuterPolygons();
     320        if (polygons.isEmpty() || (polygons.size() == 1 && areJoinedWayAndBboxEqual(polygons.get(0), mp.getBBox()))) {
    319321            return getBounds(mp, true);
    320322        } else {
    321323            StringBuilder result = new StringBuilder(getBounds(mp, false));
    322             for (Way way : outerClosedWays) {
    323                 result.append(getClosedWayShape(way));
     324            for (PolyData way : polygons) {
     325                result.append(getJoinedWayShape(way));
    324326            }
    325327            result.append("        </bounds>");
     
    329331
    330332    protected static final boolean areClosedWayAndBboxEqual(Way way, BBox bBox) {
    331         if (way.getNodesCount() == 5) {
     333        return areNodeListAndBboxEqual(way.getNodes(), bBox);
     334    }
     335
     336    protected static final boolean areJoinedWayAndBboxEqual(JoinedWay way, BBox bBox) {
     337        return areNodeListAndBboxEqual(way.getNodes(), bBox);
     338    }
     339
     340    protected static final boolean areNodeListAndBboxEqual(List<Node> nodes, BBox bBox) {
     341        if (nodes.size() == 5) {
    332342            Map<Double, List<Integer>> latMap = new HashMap<>();
    333343            Map<Double, List<Integer>> lonMap = new HashMap<>();
    334344
    335345            for (int i=0; i<4; i++) {
    336                 LatLon c = way.getNode(i).getCoor();
     346                LatLon c = nodes.get(i).getCoor();
    337347                if (i > 1) {
    338                     LatLon b = way.getNode(i-1).getCoor();
     348                    LatLon b = nodes.get(i-1).getCoor();
    339349                    if (b.lat() != c.lat() && b.lon() != c.lon()) {
    340350                        return false;
     
    371381
    372382    protected static final String getClosedWayShape(Way cw) {
     383        return getNodeListShape(cw.getNodes());
     384    }
     385
     386    protected static final String getJoinedWayShape(JoinedWay jw) {
     387        return getNodeListShape(jw.getNodes());
     388    }
     389
     390    protected static final String getNodeListShape(List<Node> nodes) {
    373391        StringBuilder result = new StringBuilder("            <shape>\n");
    374         for (int i=0; i<cw.getNodesCount(); i++) {
     392        int size = nodes.size();
     393        for (int i=0; i<size; i++) {
    375394            if (i%3 == 0) {
    376395                result.append("                ");
    377396            }
    378397            int j = i;
    379             if(j == cw.getNodesCount())
     398            if (j == size)
    380399                j = 0;
     400            LatLon ll = nodes.get(i).getCoor();
    381401            result.append("<point lat='")
    382                   .append(DF.format(cw.getNode(i).getCoor().lat())).append("' lon='")
    383                   .append(DF.format(cw.getNode(i).getCoor().lon())).append("'/>");
    384             if (i%3 == 2 || i == cw.getNodesCount()-1) {
     402                  .append(DF.format(ll.lat())).append("' lon='")
     403                  .append(DF.format(ll.lon())).append("'/>");
     404            if (i%3 == 2 || i == size-1) {
    385405                result.append('\n');
    386406            }
Note: See TracChangeset for help on using the changeset viewer.