/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2014, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.data.oracle; import static org.junit.Assert.assertArrayEquals; import java.util.List; import org.geotools.data.DataUtilities; import org.geotools.data.Query; import org.geotools.data.store.ContentFeatureCollection; import org.geotools.data.store.ContentFeatureSource; import org.geotools.factory.Hints; import org.geotools.geometry.jts.CircularArc; import org.geotools.geometry.jts.CircularRing; import org.geotools.geometry.jts.CircularString; import org.geotools.geometry.jts.CompoundCurvedGeometry; import org.geotools.geometry.jts.CurvedGeometries; import org.geotools.geometry.jts.SingleCurvedGeometry; import org.geotools.jdbc.JDBCTestSetup; import org.geotools.jdbc.JDBCTestSupport; import org.junit.Test; import org.opengis.feature.simple.SimpleFeature; import org.opengis.filter.FilterFactory; import org.opengis.filter.PropertyIsEqualTo; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.MultiPolygon; import com.vividsolutions.jts.geom.Polygon; public class OracleCurvesOnlineTest extends JDBCTestSupport { @Override protected JDBCTestSetup createTestSetup() { return new OracleCurvesTestSetup(); } @Test public void testSingleArc() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Arc segment"), true); Query q = new Query(tname("curves"), filter); q.getHints().put(Hints.LINEARIZATION_TOLERANCE, 0.1); ContentFeatureCollection fc = fs.getFeatures(q); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof SingleCurvedGeometry); SingleCurvedGeometry<?> curved = (SingleCurvedGeometry<?>) g; double[] cp = curved.getControlPoints(); assertArrayEquals(new double[] { 10, 15, 15, 20, 20, 15 }, cp, 0d); assertEquals(0.1, curved.getTolerance(), 0d); } @Test public void testCircularString() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Arc string"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof SingleCurvedGeometry); SingleCurvedGeometry<?> curved = (SingleCurvedGeometry<?>) g; double[] cp = curved.getControlPoints(); assertArrayEquals(new double[] { 10, 35, 15, 40, 20, 35, 25, 30, 30, 35 }, cp, 0d); } @Test public void testCompoundOpen() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Compound line string"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof CompoundCurvedGeometry<?>); CompoundCurvedGeometry<?> compound = (CompoundCurvedGeometry<?>) g; List<LineString> components = compound.getComponents(); assertEquals(3, components.size()); LineString ls1 = components.get(0); assertEquals(2, ls1.getNumPoints()); assertEquals(new Coordinate(10, 45), ls1.getCoordinateN(0)); assertEquals(new Coordinate(20, 45), ls1.getCoordinateN(1)); CircularString cs = (CircularString) components.get(1); assertArrayEquals(new double[] { 20.0, 45.0, 23.0, 48.0, 20.0, 51.0 }, cs.getControlPoints(), 0d); LineString ls2 = components.get(2); assertEquals(2, ls2.getNumPoints()); assertEquals(new Coordinate(20, 51), ls2.getCoordinateN(0)); assertEquals(new Coordinate(10, 51), ls2.getCoordinateN(1)); } @Test public void testCompoundClosed() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Closed mixed line"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof CompoundCurvedGeometry<?>); CompoundCurvedGeometry<?> compound = (CompoundCurvedGeometry<?>) g; List<LineString> components = compound.getComponents(); assertEquals(2, components.size()); LineString ls = components.get(0); assertEquals(4, ls.getNumPoints()); assertEquals(new Coordinate(10, 78), ls.getCoordinateN(0)); assertEquals(new Coordinate(10, 75), ls.getCoordinateN(1)); assertEquals(new Coordinate(20, 75), ls.getCoordinateN(2)); assertEquals(new Coordinate(20, 78), ls.getCoordinateN(3)); CircularString cs = (CircularString) components.get(1); assertArrayEquals(new double[] { 20, 78, 15, 80, 10, 78 }, cs.getControlPoints(), 0d); } @Test public void testCircle() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Circle"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof Polygon); Polygon p = (Polygon) g; assertEquals(0, p.getNumInteriorRing()); // exterior ring checks assertTrue(p.getExteriorRing() instanceof CircularRing); CircularRing shell = (CircularRing) p.getExteriorRing(); assertTrue(CurvedGeometries.isCircle(shell)); CircularArc arc = shell.getArcN(0); assertEquals(5, arc.getRadius(), 0d); assertEquals(new Coordinate(15, 150), arc.getCenter()); } @Test public void testCompoundPolygon() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Compound polygon"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof Polygon); Polygon p = (Polygon) g; assertEquals(0, p.getNumInteriorRing()); assertTrue(p.getExteriorRing() instanceof CompoundCurvedGeometry<?>); CompoundCurvedGeometry<?> compound = (CompoundCurvedGeometry<?>) p.getExteriorRing(); List<LineString> components = compound.getComponents(); assertEquals(2, components.size()); LineString ls = components.get(0); assertEquals(3, ls.getNumPoints()); assertEquals(new Coordinate(6, 10), ls.getCoordinateN(0)); assertEquals(new Coordinate(10, 1), ls.getCoordinateN(1)); assertEquals(new Coordinate(14, 10), ls.getCoordinateN(2)); CircularString cs = (CircularString) components.get(1); assertArrayEquals(new double[] { 14, 10, 10, 14, 6, 10 }, cs.getControlPoints(), 0d); } @Test public void testCompoundPolygon2() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Compound polygon 2"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof Polygon); Polygon p = (Polygon) g; assertEquals(0, p.getNumInteriorRing()); assertTrue(p.getExteriorRing() instanceof CircularRing); CircularRing shell = (CircularRing) p.getExteriorRing(); assertArrayEquals(new double[] { 15, 145, 20, 150, 15, 155, 10, 150, 15, 145 }, shell.getControlPoints(), 0d); } @Test public void testCompoundPolygonWithHole() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Compound polygon with hole"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof Polygon); Polygon p = (Polygon) g; assertEquals(1, p.getNumInteriorRing()); // exterior ring checks assertTrue(p.getExteriorRing() instanceof CompoundCurvedGeometry<?>); CompoundCurvedGeometry<?> shell = (CompoundCurvedGeometry<?>) p.getExteriorRing(); List<LineString> components = shell.getComponents(); assertEquals(2, components.size()); LineString ls = components.get(0); assertEquals(7, ls.getNumPoints()); // 20,30, 11,30, 7,22, 7,15, 11,10, 21,10, 27,30 assertEquals(new Coordinate(20, 30), ls.getCoordinateN(0)); assertEquals(new Coordinate(11, 30), ls.getCoordinateN(1)); assertEquals(new Coordinate(7, 22), ls.getCoordinateN(2)); assertEquals(new Coordinate(7, 15), ls.getCoordinateN(3)); assertEquals(new Coordinate(11, 10), ls.getCoordinateN(4)); assertEquals(new Coordinate(21, 10), ls.getCoordinateN(5)); assertEquals(new Coordinate(27, 30), ls.getCoordinateN(6)); CircularString cs = (CircularString) components.get(1); assertArrayEquals(new double[] { 27, 30, 25, 27, 20, 30 }, cs.getControlPoints(), 0d); // the inner ring assertTrue(p.getInteriorRingN(0) instanceof CircularRing); CircularRing hole = (CircularRing) p.getInteriorRingN(0); assertTrue(CurvedGeometries.isCircle(hole)); CircularArc arc = hole.getArcN(0); assertEquals(5, arc.getRadius(), 0d); assertEquals(new Coordinate(15, 17), arc.getCenter()); } @Test public void testMultipolygon() throws Exception { ContentFeatureSource fs = dataStore.getFeatureSource(tname("curves")); FilterFactory ff = dataStore.getFilterFactory(); PropertyIsEqualTo filter = ff.equal(ff.property(aname("name")), ff.literal("Multipolygon with curves"), true); ContentFeatureCollection fc = fs.getFeatures(filter); assertEquals(1, fc.size()); SimpleFeature feature = DataUtilities.first(fc); Geometry g = (Geometry) feature.getDefaultGeometry(); assertNotNull(g); assertTrue(g instanceof MultiPolygon); MultiPolygon mp = (MultiPolygon) g; assertEquals(2, mp.getNumGeometries()); Polygon p1 = (Polygon) mp.getGeometryN(0); assertTrue(p1.getExteriorRing() instanceof CompoundCurvedGeometry<?>); assertEquals(2, ((CompoundCurvedGeometry<?>) p1.getExteriorRing()).getComponents().size()); assertEquals(1, p1.getNumInteriorRing()); assertEquals(2, ((CompoundCurvedGeometry<?>) p1.getInteriorRingN(0)).getComponents().size()); Polygon p2 = (Polygon) mp.getGeometryN(1); assertTrue(p2.getExteriorRing() instanceof CompoundCurvedGeometry<?>); assertEquals(2, ((CompoundCurvedGeometry<?>) p2.getExteriorRing()).getComponents().size()); assertEquals(0, p2.getNumInteriorRing()); } }