/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2014 - 2016, 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.geometry.jts; import static org.junit.Assert.*; import org.junit.Test; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.MultiLineString; import com.vividsolutions.jts.geom.MultiPoint; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.io.WKTReader; /** * * * @source $URL$ */ public class WKTReader2Test { @Test public void verifyWKT() throws Exception { String WKT = "LINESTRING (60 380, 60 20, 200 400, 280 20, 360 400, 420 20, 500 400, 580 20, 620 400)"; WKTReader reader = new WKTReader2(); Geometry geometry = reader.read(WKT); assertNotNull(geometry); assertTrue(geometry instanceof LineString); } @Test public void multiPoint() throws Exception { String WKT = "MULTIPOINT (111 -47, 110 -46.5)"; WKTReader reader = new WKTReader2(); Geometry geometry = reader.read(WKT); assertNotNull(geometry); assertTrue(geometry instanceof MultiPoint); MultiPoint mp = (MultiPoint) geometry; assertEquals(2, mp.getNumGeometries()); assertEquals(new Coordinate(111, -47), mp.getGeometryN(0).getCoordinate()); assertEquals(new Coordinate(110, -46.5), mp.getGeometryN(1).getCoordinate()); } @Test public void multiPointWithInnerParens() throws Exception { String WKT = "MULTIPOINT ((111 -47), (110 -46.5))"; WKTReader reader = new WKTReader2(); Geometry geometry = reader.read(WKT); assertNotNull(geometry); assertTrue(geometry instanceof MultiPoint); MultiPoint mp = (MultiPoint) geometry; assertEquals(2, mp.getNumGeometries()); assertEquals(new Coordinate(111, -47), mp.getGeometryN(0).getCoordinate()); assertEquals(new Coordinate(110, -46.5), mp.getGeometryN(1).getCoordinate()); } /** * Draw a circle between the start and end point; or each group of three their after. * @throws Exception */ @Test public void circularString() throws Exception { String WKT = "CIRCULARSTRING(220268.439465645 150415.359530563, 220227.333322076 150505.561285879, 220227.353105332 150406.434743975)"; WKTReader2 reader = new WKTReader2(0.2); Geometry geometry = reader.read(WKT); assertNotNull("parsed circularstring", geometry); assertTrue(geometry instanceof CircularString); CircularString cs1 = (CircularString) geometry; // System.out.println(cs1.toText()); assertEquals("segmentized as expected", 86, cs1.getNumPoints()); WKT = "CIRCULARSTRING(143.62025166838282 -30.037497356076827, 142.92857147299705 -32.75101196874403, 145.96132309891922 -34.985671061528784, 149.57565307617188 -33.41153335571289, 149.41972407584802 -29.824672680573517, 146.1209416055467 -30.19711586270431, 143.62025166838282 -30.037497356076827)"; geometry = reader.read(WKT); assertNotNull("parsed circularstring ring",geometry); Coordinate[] array = geometry.getCoordinates(); assertEquals( "forms a ring", array[0], array[ array.length-1]); WKT = "CIRCULARSTRING(143.62025166838282 -30.037497356076827, 142.92857147299705 -32.75101196874403, 143.62025166838282 -30.037497356076827)"; geometry = reader.read(WKT); assertNotNull("parsed perfect circle",geometry); assertEquals(11, geometry.getNumPoints()); WKT = "CIRCULARSTRING EMPTY"; geometry = reader.read(WKT); assertNotNull(geometry); assertTrue( geometry.isEmpty() ); } @Test public void compoundCurve() throws Exception { String WKT = "COMPOUNDCURVE((153.72942375 -27.21757040, 152.29285719 -29.23940482, 154.74034096 -30.51635287),CIRCULARSTRING(154.74034096 -30.51635287, 154.74034096 -30.51635287, 152.39926953 -32.16574411, 155.11278414 -34.08116619, 151.86720784 -35.62414508))"; WKTReader reader = new WKTReader2(); Geometry geometry = reader.read(WKT); assertNotNull(geometry); WKT = "COMPOUNDCURVE((153.72942375 -27.21757040, 152.29285719 -29.23940482, 154.74034096 -30.51635287))"; geometry = reader.read(WKT); assertNotNull(geometry); WKT = "COMPOUNDCURVE(CIRCULARSTRING(154.74034096 -30.51635287, 154.74034096 -30.51635287, 152.39926953 -32.16574411, 155.11278414 -34.08116619, 151.86720784 -35.62414508))"; geometry = reader.read(WKT); assertNotNull(geometry); WKT = "COMPOUNDCURVE EMPTY"; geometry = reader.read(WKT); assertNotNull(geometry); assertTrue( geometry.isEmpty() ); } @Test public void curvePolygon() throws Exception { // perfect circle! WKTReader reader = new WKTReader2(); String WKT; Polygon polygon; Geometry geometry; WKT = "CURVEPOLYGON(CIRCULARSTRING(143.62025166838282 -30.037497356076827, 142.92857147299705 -32.75101196874403, 143.62025166838282 -30.037497356076827))"; geometry = reader.read(WKT); assertNotNull("read curvepolygon", geometry); assertTrue( geometry instanceof Polygon ); polygon = (Polygon) geometry; assertTrue(polygon.getExteriorRing() instanceof CircularRing); assertTrue( "ring", polygon.getExteriorRing().isClosed() ); assertEquals("segmented ring", 51, polygon.getExteriorRing().getNumPoints()); assertEquals( "no holes", 0, polygon.getNumInteriorRing() ); WKT = "CURVEPOLYGON((144.84399355252685 -31.26123924022086, 144.20551952601693 -32.27215644886158, 145.55230712890625 -33.49203872680664, 147.97080993652344 -32.03618621826172, 146.38697244992585 -31.47406391572417, 144.84399355252685 -31.26123924022086))"; polygon = (Polygon) reader.read( WKT ); assertTrue( "ring", polygon.getExteriorRing().isClosed() ); assertEquals( "no holes", 0, polygon.getNumInteriorRing() ); WKT = "CURVEPOLYGON("+ "CIRCULARSTRING(143.62025166838282 -30.037497356076827, 142.92857147299705 -32.75101196874403, 145.96132309891922 -34.985671061528784, 149.57565307617188 -33.41153335571289, 149.41972407584802 -29.824672680573517, 146.1209416055467 -30.19711586270431, 143.62025166838282 -30.037497356076827),"+ "(144.84399355252685 -31.26123924022086, 144.20551952601693 -32.27215644886158, 145.55230712890625 -33.49203872680664, 147.97080993652344 -32.03618621826172, 146.38697244992585 -31.47406391572417, 144.84399355252685 -31.26123924022086))"; polygon = (Polygon) reader.read( WKT ); assertTrue( "ring", polygon.getExteriorRing().isClosed() ); assertTrue(polygon.getExteriorRing() instanceof CircularRing); assertEquals("one holes", 1, polygon.getNumInteriorRing()); assertFalse(polygon.getInteriorRingN(0) instanceof CircularRing); WKT = "CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) )"; polygon = (Polygon) reader.read(WKT); assertTrue("ring", polygon.getExteriorRing().isClosed()); assertTrue(polygon.getExteriorRing() instanceof CompoundRing); assertEquals("one holes", 1, polygon.getNumInteriorRing()); assertTrue(polygon.getInteriorRingN(0) instanceof CircularRing); } @Test public void testParseMulticurve() throws Exception { WKTReader reader = new WKTReader2(); String WKT = "MULTICURVE EMPTY"; MultiLineString ml = (MultiLineString) reader.read(WKT); assertTrue(ml.isEmpty()); WKT = "MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4))"; ml = (MultiLineString) reader.read(WKT); assertEquals(2, ml.getNumGeometries()); assertTrue(ml.getGeometryN(0).getClass() == LineString.class); assertTrue(ml.getGeometryN(1) instanceof CircularString); WKT = "MULTICURVE((100 100, 120 120), COMPOUNDCURVE(CIRCULARSTRING(0 0, 2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)))"; ml = (MultiLineString) reader.read(WKT); assertEquals(2, ml.getNumGeometries()); assertTrue(ml.getGeometryN(0).getClass() == LineString.class); assertTrue(ml.getGeometryN(1) instanceof CompoundRing); } @Test public void testCaseInsensitive() throws Exception { WKTReader reader = new WKTReader2(); assertNotNull( reader.read("POINT(1 2)") ); assertNotNull( reader.read("Point(1 2)") ); assertNotNull( reader.read("LINESTRING(0 2, 2 0, 8 6)") ); assertNotNull( reader.read("LineString(0 2, 2 0, 8 6)") ); } @Test public void testMultiSurfaceStraightPolygon() throws Exception { String wkt = "MULTISURFACE (((0 0, 1 0, 1 4, 0 0)), CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (0 2, 7 5, 2 10), (2 10, 0 2)), COMPOUNDCURVE (CIRCULARSTRING (3 9, 6 5, 3 2), (3 2, 3 9))))"; Geometry geometry = new WKTReader2().read(wkt); // System.out.println(geometry); MultiSurface ms = (MultiSurface) geometry; assertEquals(2, ms.getNumGeometries()); assertFalse(ms.getGeometryN(0) instanceof CurvePolygon); assertTrue(ms.getGeometryN(1) instanceof CurvePolygon); } @Test public void testMultiSurfaceStraightPolygon2() throws Exception { String wkt = "MULTISURFACE (CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (0 2, 7 5, 2 10), (2 10, 0 2)), COMPOUNDCURVE (CIRCULARSTRING (3 9, 6 5, 3 2), (3 2, 3 9))), ((0 0, 1 0, 1 4, 0 0)))"; Geometry geometry = new WKTReader2().read(wkt); // System.out.println(geometry); MultiSurface ms = (MultiSurface) geometry; assertEquals(2, ms.getNumGeometries()); assertTrue(ms.getGeometryN(0) instanceof CurvePolygon); assertFalse(ms.getGeometryN(1) instanceof CurvePolygon); } @Test public void testMultiSurfaceEmpty() throws Exception { String wkt = "MULTISURFACE (EMPTY, CURVEPOLYGON (COMPOUNDCURVE (CIRCULARSTRING (0 2, 7 5, 2 10), (2 10, 0 2)), COMPOUNDCURVE (CIRCULARSTRING (3 9, 6 5, 3 2), (3 2, 3 9))), ((0 0, 1 0, 1 4, 0 0)))"; Geometry geometry = new WKTReader2().read(wkt); // System.out.println(geometry); MultiSurface ms = (MultiSurface) geometry; assertEquals(3, ms.getNumGeometries()); assertFalse(ms.getGeometryN(0) instanceof CurvePolygon); assertTrue(ms.getGeometryN(1) instanceof CurvePolygon); assertFalse(ms.getGeometryN(2) instanceof CurvePolygon); } }