Ignore:
Timestamp:
2025-02-25T17:29:20+01:00 (14 months ago)
Author:
stoecker
Message:

fix #24046 - improve speed of multipolygon validator - patch by taylor.smock

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/tools/Geometry.java

    r19272 r19336  
    1818import java.util.LinkedHashSet;
    1919import java.util.List;
     20import java.util.Map;
    2021import java.util.Set;
    2122import java.util.TreeSet;
     
    3334import org.openstreetmap.josm.data.osm.INode;
    3435import org.openstreetmap.josm.data.osm.IPrimitive;
     36import org.openstreetmap.josm.data.osm.IRelation;
    3537import org.openstreetmap.josm.data.osm.IWay;
    3638import org.openstreetmap.josm.data.osm.MultipolygonBuilder;
     
    11921194                    polygonArea = getArea(polygon.getNodes());
    11931195                }
    1194                 Multipolygon mp = new Multipolygon((Relation) p);
     1196                Multipolygon mp = p.getDataSet() != null ? MultipolygonCache.getInstance().get((Relation) p) : new Multipolygon((Relation) p);
    11951197                boolean inside = true;
    11961198                // a (valid) multipolygon is inside the polygon if all outer rings are inside
     
    12211223     */
    12221224    public static List<IPrimitive> filterInsideMultipolygon(Collection<IPrimitive> primitives, Relation multiPolygon) {
     1225        return filterInsideMultipolygon(primitives, multiPolygon, null);
     1226    }
     1227
     1228    /**
     1229     * Find all primitives in the given collection which are inside the given multipolygon. Members of the multipolygon are
     1230     * ignored. Unclosed ways and multipolygon relations with unclosed outer rings are ignored.
     1231     * @param primitives the primitives
     1232     * @param multiPolygon the multipolygon relation
     1233     * @param cache The cache to avoid calculating joined inner/outer ways multiple times (see {@link MultipolygonBuilder#joinWays(Relation)})
     1234     * @return a new list containing the found primitives, empty if multipolygon is invalid or nothing was found.
     1235     * @since xxx
     1236     */
     1237    public static List<IPrimitive> filterInsideMultipolygon(Collection<IPrimitive> primitives, Relation multiPolygon,
     1238                                                            Map<IRelation<?>, Pair<List<JoinedPolygon>, List<JoinedPolygon>>> cache) {
    12231239        List<IPrimitive> res = new ArrayList<>();
    12241240        if (primitives.isEmpty())
     
    12271243        final Pair<List<JoinedPolygon>, List<JoinedPolygon>> outerInner;
    12281244        try {
    1229             outerInner = MultipolygonBuilder.joinWays(multiPolygon);
     1245            outerInner = MultipolygonBuilder.joinWays(cache, multiPolygon);
    12301246        } catch (MultipolygonBuilder.JoinedPolygonCreationException ex) {
    12311247            Logging.trace(ex);
Note: See TracChangeset for help on using the changeset viewer.