private List<? extends PolyLine> clip(final PolyLine subject, final MultiPolygon clipping) { switch (this.clipType) { case AND: return new MultiPolygonClipper(clipping).and(subject); case OR: return new MultiPolygonClipper(clipping).union(subject); case NOT: return new MultiPolygonClipper(clipping).not(subject); case XOR: return new MultiPolygonClipper(clipping).xor(subject); default: throw new CoreException("Invalid Clip Type."); } }
private List<PolyLine> runPolyLineClipping(final PolyLine subject, final BiFunction<Geometry, Geometry, Geometry> application) { final List<PolyLine> result = new ArrayList<>(); for (final com.vividsolutions.jts.geom.Polygon jtsClipping : this.jtsClippings) { result.addAll(processPolyLine( application.apply(PolygonClipper.getJts(subject), jtsClipping))); } return result; } }
protected MultiPolygon xor(final MultiPolygon subject) { return runMultiPolygonClipping(subject, (sub, clipping) -> sub.symDifference(clipping)); }
protected List<PolyLine> not(final PolyLine subject) { return runPolyLineClipping(subject, (sub, clipping) -> sub.difference(clipping)); }
protected MultiPolygon union(final Polygon subject) { return runPolygonClipping(subject, (sub, clipping) -> sub.union(clipping)); }
private MultiPolygon runPolygonClipping(final Polygon subject, final BiFunction<Geometry, Geometry, Geometry> application) { MultiPolygon result = new MultiPolygon(new MultiMap<>()); for (final com.vividsolutions.jts.geom.Polygon jtsClipping : this.jtsClippings) { result = result.merge(processMultiPolygon( application.apply(PolygonClipper.getJts(subject), jtsClipping))); } return result; }
protected List<PolyLine> union(final PolyLine subject) { return runPolyLineClipping(subject, (sub, clipping) -> sub.union(clipping)); }
protected MultiPolygon and(final Polygon subject) { return runPolygonClipping(subject, (sub, clipping) -> sub.intersection(clipping)); }
private MultiPolygon runMultiPolygonClipping(final MultiPolygon subject, final BiFunction<Geometry, Geometry, Geometry> application) { MultiPolygon result = new MultiPolygon(new MultiMap<>()); final Set<com.vividsolutions.jts.geom.Polygon> jtsSubjects = new JtsMultiPolygonConverter() .convert(subject); for (final com.vividsolutions.jts.geom.Polygon jtsClipping : this.jtsClippings) { for (final com.vividsolutions.jts.geom.Polygon jtsSubject : jtsSubjects) { result = result .merge(processMultiPolygon(application.apply(jtsSubject, jtsClipping))); } } return result; }
private MultiPolygon clip(final MultiPolygon subject, final MultiPolygon clipping) { switch (this.clipType) { case AND: return new MultiPolygonClipper(clipping).and(subject); case OR: return new MultiPolygonClipper(clipping).union(subject); case NOT: return new MultiPolygonClipper(clipping).not(subject); case XOR: return new MultiPolygonClipper(clipping).xor(subject); default: throw new CoreException("Invalid Clip Type."); } }
protected List<PolyLine> and(final PolyLine subject) { return runPolyLineClipping(subject, (sub, clipping) -> sub.intersection(clipping)); }
protected MultiPolygon and(final MultiPolygon subject) { return runMultiPolygonClipping(subject, (sub, clipping) -> sub.intersection(clipping)); }
protected MultiPolygon not(final Polygon subject) { return runPolygonClipping(subject, (sub, clipping) -> sub.difference(clipping)); }
private MultiPolygon processMultiPolygon(final Geometry intersections) { MultiPolygon result = new MultiPolygon(new MultiMap<>()); if (intersections instanceof GeometryCollection) { final GeometryCollection collection = (GeometryCollection) intersections; final int numGeometries = collection.getNumGeometries(); for (int n = 0; n < numGeometries; n++) { final Geometry geometry = collection.getGeometryN(n); result = result.merge(processMultiPolygon(geometry)); } } else if (intersections instanceof com.vividsolutions.jts.geom.Polygon) { final Set<com.vividsolutions.jts.geom.Polygon> set = new HashSet<>(); set.add((com.vividsolutions.jts.geom.Polygon) intersections); result = result.merge(new JtsMultiPolygonConverter().backwardConvert(set)); } return result; }
private List<PolyLine> processPolyLine(final Geometry intersections) { final List<PolyLine> result = new ArrayList<>(); if (intersections instanceof GeometryCollection) { final GeometryCollection collection = (GeometryCollection) intersections; final int numGeometries = collection.getNumGeometries(); for (int n = 0; n < numGeometries; n++) { final Geometry geometry = collection.getGeometryN(n); result.addAll(processPolyLine(geometry)); } } else if (intersections instanceof LineString) { result.add(new JtsPolyLineConverter().backwardConvert((LineString) intersections)); } return result; }
private MultiPolygon clip(final Polygon subject, final MultiPolygon clipping) { switch (this.clipType) { case AND: return new MultiPolygonClipper(clipping).and(subject); case OR: return new MultiPolygonClipper(clipping).union(subject); case NOT: return new MultiPolygonClipper(clipping).not(subject); case XOR: return new MultiPolygonClipper(clipping).xor(subject); default: throw new CoreException("Invalid Clip Type."); } }
protected List<PolyLine> xor(final PolyLine subject) { return runPolyLineClipping(subject, (sub, clipping) -> sub.symDifference(clipping)); }
protected MultiPolygon not(final MultiPolygon subject) { return runMultiPolygonClipping(subject, (sub, clipping) -> sub.difference(clipping)); }
protected MultiPolygon xor(final Polygon subject) { return runPolygonClipping(subject, (sub, clipping) -> sub.symDifference(clipping)); }
protected MultiPolygon union(final MultiPolygon subject) { return runMultiPolygonClipping(subject, (sub, clipping) -> sub.union(clipping)); }