package nl.ipo.cds.validation;
import java.util.List;
import org.deegree.geometry.Geometry;
import org.deegree.geometry.primitive.Curve;
import org.deegree.geometry.primitive.Point;
import org.deegree.geometry.primitive.Ring;
import org.deegree.geometry.primitive.patches.PolygonPatch;
import org.deegree.geometry.validation.GeometryValidationEventHandler;
import org.deegree.geometry.validation.GeometryValidator;
public class GeometryValidationResult {
public final Geometry geometry;
public final GeometryValidator validator;
private GeometryValidationStatus curvePointDuplication = new GeometryValidationStatus ();
private GeometryValidationStatus curveDiscontinuity = new GeometryValidationStatus ();
private GeometryValidationStatus curveSelfIntersection = new GeometryValidationStatus ();
private GeometryValidationStatus ringNotClosed = new GeometryValidationStatus ();
private GeometryValidationStatus ringSelfIntersection = new GeometryValidationStatus ();
private GeometryValidationStatus exteriorRingCW = new GeometryValidationStatus ();
private GeometryValidationStatus interiorRingCCW = new GeometryValidationStatus ();
private GeometryValidationStatus interiorRingsTouch = new GeometryValidationStatus ();
private GeometryValidationStatus interiorRingsIntersect = new GeometryValidationStatus ();
private GeometryValidationStatus interiorRingsWithin = new GeometryValidationStatus ();
private GeometryValidationStatus interiorRingTouchesExterior = new GeometryValidationStatus ();
private GeometryValidationStatus interiorRingIntersectsExterior = new GeometryValidationStatus ();
private GeometryValidationStatus interiorRingOutsideExterior = new GeometryValidationStatus ();
public GeometryValidationResult (final Geometry geometry) {
validator = new GeometryValidator (new GeometryValidationEventHandler () {
@Override
public boolean ringSelfIntersection(Ring ring, Point location,
List<Object> affectedGeometryParticles) {
ringSelfIntersection = new GeometryValidationStatus (location);
return false;
}
@Override
public boolean ringNotClosed(Ring ring,
List<Object> affectedGeometryParticles) {
ringNotClosed = new GeometryValidationStatus (ring.getEndPoint());
return false;
}
@Override
public boolean interiorRingsWithin(PolygonPatch patch, int ring1Idx,
int ring2Idx, List<Object> affectedGeometryParticles) {
interiorRingsWithin = new GeometryValidationStatus (patch.getInteriorRings().get(ring2Idx).getCentroid());
return false;
}
@Override
public boolean interiorRingsTouch(PolygonPatch patch, int ring1Idx,
int ring2Idx, Point location, List<Object> affectedGeometryParticles) {
interiorRingsTouch = new GeometryValidationStatus (location);
return false;
}
@Override
public boolean interiorRingsIntersect(PolygonPatch patch, int ring1Idx,
int ring2Idx, Point location, List<Object> affectedGeometryParticles) {
interiorRingsIntersect = new GeometryValidationStatus (location);
return false;
}
@Override
public boolean interiorRingTouchesExterior(PolygonPatch patch, int ringIdx,
Point location, List<Object> affectedGeometryParticles) {
interiorRingTouchesExterior = new GeometryValidationStatus (location);
return false;
}
@Override
public boolean interiorRingOutsideExterior(PolygonPatch patch, int ringIdx,
List<Object> affectedGeometryParticles) {
interiorRingOutsideExterior = new GeometryValidationStatus (patch.getInteriorRings().get(ringIdx).getCentroid());
return false;
}
@Override
public boolean interiorRingIntersectsExterior(PolygonPatch patch,
int ringIdx, Point location, List<Object> affectedGeometryParticles) {
interiorRingIntersectsExterior = new GeometryValidationStatus (location);
return false;
}
@Override
public boolean interiorRingCCW(PolygonPatch patch, int ringIdx,
List<Object> affectedGeometryParticles) {
interiorRingCCW = new GeometryValidationStatus (patch.getInteriorRings().get(ringIdx).getCentroid());
return false;
}
@Override
public boolean exteriorRingCW(PolygonPatch patch,
List<Object> affectedGeometryParticles) {
exteriorRingCW = new GeometryValidationStatus (patch.getExteriorRing ().getCentroid ());
return false;
}
@Override
public boolean curveSelfIntersection(Curve curve, Point location,
List<Object> affectedGeometryParticles) {
curveSelfIntersection = new GeometryValidationStatus (location);
return false;
}
@Override
public boolean curvePointDuplication(Curve curve, Point point,
List<Object> affectedGeometryParticles) {
curvePointDuplication = new GeometryValidationStatus (point);
return false;
}
@Override
public boolean curveDiscontinuity(Curve curve, int segmentIdx,
List<Object> affectedGeometryParticles) {
curveDiscontinuity = new GeometryValidationStatus (curve.getCurveSegments().get(segmentIdx).getStartPoint());
return false;
}
});
if (geometry != null) {
validator.validateGeometry (geometry);
}
this.geometry = geometry;
}
public GeometryValidationStatus curvePointDuplication () {
return curvePointDuplication;
}
public GeometryValidationStatus curveDiscontinuity () {
return curveDiscontinuity;
}
public GeometryValidationStatus curveSelfIntersection () {
return curveSelfIntersection;
}
public GeometryValidationStatus ringNotClosed () {
return ringNotClosed;
}
public GeometryValidationStatus ringSelfIntersection () {
return ringSelfIntersection;
}
public GeometryValidationStatus exteriorRingCW () {
return exteriorRingCW;
}
public GeometryValidationStatus interiorRingCCW () {
return interiorRingCCW;
}
public GeometryValidationStatus interiorRingsTouch () {
return interiorRingsTouch;
}
public GeometryValidationStatus interiorRingsIntersect () {
return interiorRingsIntersect;
}
public GeometryValidationStatus interiorRingsWithin () {
return interiorRingsWithin;
}
public GeometryValidationStatus interiorRingTouchesExterior () {
return interiorRingTouchesExterior;
}
public GeometryValidationStatus interiorRingIntersectsExterior () {
return interiorRingIntersectsExterior;
}
public GeometryValidationStatus interiorRingOutsideExterior () {
return interiorRingOutsideExterior;
}
}