/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2015, 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.gml3;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertThat;
import java.util.List;
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.CurvePolygon;
import org.geotools.geometry.jts.CurvedGeometries;
import org.geotools.geometry.jts.CurvedGeometryFactory;
import org.geotools.geometry.jts.MultiCurve;
import org.geotools.xml.Configuration;
import org.geotools.xml.Parser;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.LineString;
public class GML3CurveParsingTest extends GML3TestSupport {
protected static final double TOLERANCE = 1e-9;
protected Configuration gml;
protected void setUp() throws Exception {
GMLConfiguration configuration = new GMLConfiguration(true);
configuration.setGeometryFactory(new CurvedGeometryFactory(TOLERANCE));
this.gml = configuration;
}
public void testSingleArc() throws Exception {
Parser p = new Parser(gml);
Object arc = p.parse(GML3CurveParsingTest.class.getResourceAsStream("v3_2/singleArc.xml"));
assertThat(arc, instanceOf(CircularString.class));
CircularString cs = (CircularString) arc;
assertArrayEquals(new double[] { 10, 15, 15, 20, 20, 15 }, cs.getControlPoints(), 0d);
assertEquals(TOLERANCE, cs.getTolerance());
}
public void testArcString() throws Exception {
Parser p = new Parser(gml);
Object arc = p.parse(GML3CurveParsingTest.class.getResourceAsStream("v3_2/arcString.xml"));
assertThat(arc, instanceOf(CircularString.class));
CircularString cs = (CircularString) arc;
assertArrayEquals(new double[] { 10, 35, 15, 40, 20, 35, 25, 30, 30, 35 },
cs.getControlPoints(), 0d);
assertEquals(TOLERANCE, cs.getTolerance());
}
public void testCompoundOpen() throws Exception {
Parser p = new Parser(gml);
Object g = p.parse(GML3CurveParsingTest.class.getResourceAsStream("v3_2/compoundOpen.xml"));
assertThat(g, instanceOf(CompoundCurvedGeometry.class));
CompoundCurvedGeometry<?> compound = (CompoundCurvedGeometry<?>) g;
assertEquals(TOLERANCE, compound.getTolerance());
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));
}
public void testCompoundClosed() throws Exception {
Parser p = new Parser(gml);
Object g = p.parse(GML3CurveParsingTest.class
.getResourceAsStream("v3_2/compoundClosed.xml"));
assertThat(g, instanceOf(CompoundCurvedGeometry.class));
CompoundCurvedGeometry<?> compound = (CompoundCurvedGeometry<?>) g;
assertEquals(TOLERANCE, compound.getTolerance());
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);
}
public void testCirclePolygon() throws Exception {
Parser p = new Parser(gml);
Object g = p
.parse(GML3CurveParsingTest.class.getResourceAsStream("v3_2/circlePolygon.xml"));
assertThat(g, instanceOf(CurvePolygon.class));
CurvePolygon cp = (CurvePolygon) g;
assertEquals(TOLERANCE, cp.getTolerance());
assertEquals(0, cp.getNumInteriorRing());
// exterior ring checks
assertTrue(cp.getExteriorRing() instanceof CircularRing);
CircularRing shell = (CircularRing) cp.getExteriorRing();
assertTrue(CurvedGeometries.isCircle(shell));
CircularArc arc = shell.getArcN(0);
assertEquals(5, arc.getRadius(), 0d);
assertEquals(new Coordinate(15, 150), arc.getCenter());
}
public void testCompoundPolygon() throws Exception {
Parser p = new Parser(gml);
Object g = p.parse(GML3CurveParsingTest.class
.getResourceAsStream("v3_2/compoundPolygon.xml"));
assertThat(g, instanceOf(CurvePolygon.class));
CurvePolygon cp = (CurvePolygon) g;
assertEquals(TOLERANCE, cp.getTolerance());
assertEquals(0, cp.getNumInteriorRing());
assertTrue(cp.getExteriorRing() instanceof CompoundCurvedGeometry<?>);
CompoundCurvedGeometry<?> compound = (CompoundCurvedGeometry<?>) cp.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);
}
public void testCompoundPolygonWithHole() throws Exception {
Parser p = new Parser(gml);
Object g = p.parse(GML3CurveParsingTest.class
.getResourceAsStream("v3_2/compoundPolygonWithHole.xml"));
assertThat(g, instanceOf(CurvePolygon.class));
CurvePolygon cp = (CurvePolygon) g;
assertEquals(TOLERANCE, cp.getTolerance());
assertEquals(1, cp.getNumInteriorRing());
// exterior ring checks
assertTrue(cp.getExteriorRing() instanceof CompoundCurvedGeometry<?>);
CompoundCurvedGeometry<?> shell = (CompoundCurvedGeometry<?>) cp.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(cp.getInteriorRingN(0) instanceof CircularRing);
CircularRing hole = (CircularRing) cp.getInteriorRingN(0);
assertTrue(CurvedGeometries.isCircle(hole));
CircularArc arc = hole.getArcN(0);
assertEquals(5, arc.getRadius(), 0d);
assertEquals(new Coordinate(15, 17), arc.getCenter());
}
public void testMultiSurface() throws Exception {
Parser p = new Parser(gml);
Object g = p
.parse(GML3CurveParsingTest.class.getResourceAsStream("v3_2/multiSurface2.xml"));
assertThat(g, instanceOf(org.geotools.geometry.jts.MultiSurface.class));
org.geotools.geometry.jts.MultiSurface mp = (org.geotools.geometry.jts.MultiSurface) g;
assertEquals(TOLERANCE, mp.getTolerance());
assertEquals(2, mp.getNumGeometries());
CurvePolygon p1 = (CurvePolygon) 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());
CurvePolygon p2 = (CurvePolygon) mp.getGeometryN(1);
assertTrue(p2.getExteriorRing() instanceof CompoundCurvedGeometry<?>);
assertEquals(2, ((CompoundCurvedGeometry<?>) p2.getExteriorRing()).getComponents().size());
assertEquals(0, p2.getNumInteriorRing());
}
public void testMultiCurve() throws Exception {
Parser p = new Parser(gml);
Object g = p.parse(GML3CurveParsingTest.class.getResourceAsStream("v3_2/multiCurve.xml"));
assertThat(g, instanceOf(MultiCurve.class));
MultiCurve mc = (MultiCurve) g;
assertEquals(TOLERANCE, mc.getTolerance());
LineString ls = (LineString) mc.getGeometryN(0);
assertEquals(2, ls.getNumPoints());
assertEquals(new Coordinate(0, 0), ls.getCoordinateN(0));
assertEquals(new Coordinate(5, 5), ls.getCoordinateN(1));
CircularString cs = (CircularString) mc.getGeometryN(1);
assertArrayEquals(new double[] { 4, 0, 4, 4, 8, 4 }, cs.getControlPoints(), 0d);
}
}