package nl.ipo.cds.etl.filtering; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Collections; import java.util.List; import nl.ipo.cds.etl.Feature; import nl.ipo.cds.etl.FeatureOutputStream; import nl.ipo.cds.etl.PersistableFeature; import nl.ipo.cds.etl.theme.protectedSite.ProtectedSite; import org.deegree.geometry.Geometry; import org.deegree.geometry.io.WKTReader; import org.deegree.geometry.io.WKTWriter; import org.deegree.geometry.points.Points; import org.deegree.geometry.primitive.Point; import org.deegree.geometry.primitive.Polygon; import org.junit.Before; import org.junit.Test; import com.vividsolutions.jts.io.ParseException; public class FeatureClipperTest { private WKTReader reader; private Geometry clipGeometry; private OutputStream outputStream; private ErrorOutputStream errorStream; private FeatureClipper clipper; @Before public void createClipper () throws ParseException { reader = new WKTReader (null); clipGeometry = reader.read ("POLYGON((217884.772263 508606.939961,224821.693383 509793.518573,230206.934779 507602.911904,235774.726731 490260.609103,217976.047541 486427.047432,210035.098364 498566.659392,217884.772263 508606.939961))"); outputStream = new OutputStream (); errorStream = new ErrorOutputStream (); clipper = new FeatureClipper (clipGeometry, ProtectedSite.class); } @Test public void testClipFeatures () throws ParseException { final ProtectedSite feature = createFeature ("POLYGON((208939.795029 490351.884381,238330.434512 488526.378823,231758.614504 473922.334360,206931.738915 480402.879090,208939.795029 490351.884381))"); clipper.processFeature (feature, outputStream, errorStream); assertEquals (1, outputStream.getFeatures ().size ()); assertNotNull (outputStream.getFeatures ().get (0)); assertTrue (((ProtectedSite)outputStream.getFeatures ().get (0)).getGeometry () instanceof Polygon); final Polygon geom = (Polygon)((ProtectedSite)outputStream.getFeatures ().get (0)).getGeometry (); System.out.println (WKTWriter.write (geom)); assertEquals (4, geom.getExteriorRingCoordinates ().size ()); } @Test public void testContainedFeatures () throws ParseException { final ProtectedSite feature = createFeature ("POLYGON((216606.918373 502400.221064,224274.041716 503221.698565,224821.693383 495919.676333,216880.744206 495737.125777,216606.918373 502400.221064))"); final Geometry originalGeometry = feature.getGeometry (); clipper.processFeature (feature, outputStream, errorStream); assertEquals (1, outputStream.getFeatures ().size ()); assertNotNull (outputStream.getFeatures ().get (0)); assertTrue (((ProtectedSite)outputStream.getFeatures ().get (0)).getGeometry () instanceof Polygon); final Polygon geom = (Polygon)((ProtectedSite)outputStream.getFeatures ().get (0)).getGeometry (); System.out.println (WKTWriter.write (geom)); assertEquals (5, geom.getExteriorRingCoordinates ().size ()); final Points originalPoints = ((Polygon)originalGeometry).getExteriorRingCoordinates (); final Points resultPoints = geom.getExteriorRingCoordinates (); assertEquals (originalPoints.size (), resultPoints.size ()); assertTrue (originalPoints.size () > 0); for (int i = 0; i < originalPoints.size (); ++i) { final Point a = originalPoints.get (i); final Point b = resultPoints.get (i); assertEquals (a.get1 (), b.get1 (), .00001); assertEquals (a.get2 (), b.get2 (), .00001); } } @Test public void testFilterFeatures () throws ParseException { final ProtectedSite feature = createFeature ("POLYGON((207114.289471 510706.271352,216972.019484 508241.838849,210947.851143 500392.164950,203828.379467 506781.434403,207114.289471 510706.271352))"); clipper.processFeature (feature, outputStream, errorStream); assertEquals (0, outputStream.getFeatures ().size ()); } private ProtectedSite createFeature (final String wktGeometry) throws ParseException { final Geometry geometry = reader.read (wktGeometry); final ProtectedSite feature = new ProtectedSite (); feature.setGeometry (geometry); return feature; } private static class OutputStream implements FeatureOutputStream<PersistableFeature> { private List<PersistableFeature> features = new ArrayList<PersistableFeature> (); @Override public void writeFeature (final PersistableFeature feature) { features.add (feature); } public List<PersistableFeature> getFeatures () { return Collections.unmodifiableList (features); } } private static class ErrorOutputStream implements FeatureOutputStream<Feature> { private List<Feature> features = new ArrayList<Feature> (); @Override public void writeFeature (final Feature feature) { features.add (feature); } @SuppressWarnings("unused") public List<Feature> getFeatures () { return Collections.unmodifiableList (features); } } }