/** * Construct * * @param clipping * The clipping {@link Polygon} */ public PolygonClipper(final Polygon clipping) { this.jtsClipping = getJts(clipping); }
/** * @param clipping * The {@link MultiPolygon} clipping that {@link MultiPolygon} * @param clipType * The type of clip (union, or, and or xor) * @return The {@link Clip} container, that can return the clipped {@link MultiPolygon} */ public Clip clip(final MultiPolygon clipping, final ClipType clipType) { return new Clip(clipType, this, clipping); }
public Clip(final ClipType clipType, final MultiPolygon subject, final MultiPolygon clipping) { this.clipType = clipType; this.clip = null; this.clipMulti = clip(subject, clipping); }
private List<? extends PolyLine> clip(final Polygon subject, final Polygon clipping) { switch (this.clipType) { case AND: return toPolygons(new PolygonClipper(clipping).and(subject)); case OR: return toPolygons(new PolygonClipper(clipping).union(subject)); case NOT: return toPolygons(new PolygonClipper(clipping).not(subject)); case XOR: return toPolygons(new PolygonClipper(clipping).xor(subject)); default: throw new CoreException("Invalid Clip Type."); } }
public List<? extends PolyLine> xor(final PolyLine subject) { return processResult(getJts(subject).symDifference(this.jtsClipping)); }
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; } }
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 union(final Polygon subject) { return runPolygonClipping(subject, (sub, clipping) -> sub.union(clipping)); }
protected MultiPolygon xor(final MultiPolygon subject) { return runMultiPolygonClipping(subject, (sub, clipping) -> sub.symDifference(clipping)); }
public List<? extends PolyLine> and(final PolyLine subject) { return processResult(getJts(subject).intersection(this.jtsClipping)); }
/** * Clip this feature on a {@link MultiPolygon} * * @param clipping * The {@link MultiPolygon} to clip to * @param clipType * The clip type (AND, OR, XOR or NOT). * @return The clip object containing the clipped features. */ public Clip clip(final MultiPolygon clipping, final ClipType clipType) { return new Clip(clipType, this, clipping); }
protected List<PolyLine> not(final PolyLine subject) { return runPolyLineClipping(subject, (sub, clipping) -> sub.difference(clipping)); }
protected MultiPolygon not(final Polygon subject) { return runPolygonClipping(subject, (sub, clipping) -> sub.difference(clipping)); }
public List<? extends PolyLine> union(final PolyLine subject) { return processResult(getJts(subject).union(this.jtsClipping)); }
/** * Clip this feature on a {@link Polygon} * * @param clipping * The {@link Polygon} to clip to * @param clipType * The clip type (AND, OR, XOR or NOT). * @return The clip object containing the clipped features. */ public Clip clip(final Polygon clipping, final ClipType clipType) { return new Clip(clipType, this, clipping); }
protected List<PolyLine> and(final PolyLine subject) { return runPolyLineClipping(subject, (sub, clipping) -> sub.intersection(clipping)); }
public List<? extends PolyLine> not(final PolyLine subject) { return processResult(getJts(subject).difference(this.jtsClipping)); }