/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2004-2008, 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; // J2SE dependencies import java.awt.geom.AffineTransform; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.geotools.referencing.ReferencingFactoryFinder; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.referencing.crs.DefaultProjectedCRS; import org.geotools.referencing.operation.matrix.GeneralMatrix; import org.geotools.referencing.operation.projection.PointOutsideEnvelopeException; import org.geotools.referencing.wkt.Parser; import org.opengis.geometry.BoundingBox; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.MathTransform2D; import org.opengis.referencing.operation.TransformException; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Polygon; /** * Tests the {@link JTS} implementation. * * @since 2.2 * * @source $URL$ * @version $Id$ * @author Jess Eichar * @author Martin Desruisseaux */ public class JTSTest extends TestCase { /** * The tolerance factor. */ private static final double EPS = 0.000001; /** * A CRS for testing purpose. */ static final String UTM_ZONE_10N = "PROJCS[\"NAD_1983_UTM_Zone_10N\",\n" + " GEOGCS[\"GCS_North_American_1983\",\n" + " DATUM[\"D_North_American_1983\",\n" + " TOWGS84[0,0,0,0,0,0,0],\n" + " SPHEROID[\"GRS_1980\",6378137,298.257222101]],\n" + " PRIMEM[\"Greenwich\",0],\n" + " UNIT[\"Degree\",0.017453292519943295]],\n" + " PROJECTION[\"Transverse_Mercator\"],\n" + " PARAMETER[\"False_Easting\",500000],\n" + " PARAMETER[\"False_Northing\",0],\n" + " PARAMETER[\"Central_Meridian\",-123],\n" + " PARAMETER[\"Scale_Factor\",0.9996],\n" + " PARAMETER[\"Latitude_Of_Origin\",0],\n" + " UNIT[\"Meter\",1]]"; /** * A CRS for testing purpose. */ static final String NAD83_BC = "PROJCS[\"NAD83 / BC Albers\",\n" + " GEOGCS[\"NAD83\",DATUM[\"North_American_Datum_1983\",\n" + " SPHEROID[\"GRS 1980\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"7019\"]],\n" + " TOWGS84[0,0,0],AUTHORITY[\"EPSG\",\"6269\"]],\n" + " PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],\n" + " UNIT[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],\n" + " AUTHORITY[\"EPSG\",\"4269\"]],\n" + " PROJECTION[\"Albers_Conic_Equal_Area\"],\n" + " PARAMETER[\"standard_parallel_1\",50],\n" + " PARAMETER[\"standard_parallel_2\",58.5],\n" + " PARAMETER[\"latitude_of_center\",45],\n" + " PARAMETER[\"longitude_of_center\",-126],\n" + " PARAMETER[\"false_easting\",1000000],\n" + " PARAMETER[\"false_northing\",0],\n" + " UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],\n" + " AUTHORITY[\"EPSG\",\"3005\"]]"; /** * Run the suite from the command line. */ public static void main(String[] args) { org.geotools.util.logging.Logging.GEOTOOLS.forceMonolineConsoleOutput(); junit.textui.TestRunner.run(suite()); } /** * Returns the test suite. */ public static Test suite() { return new TestSuite(JTSTest.class); } public void testJTSFactory(){ GeometryFactory gf= JTSFactoryFinder.getGeometryFactory( null ); assertNotNull( gf ); } /** * Tests the transformation of a single coordinate. */ public void testTransformCoordinate() throws FactoryException, TransformException { Coordinate coord = new Coordinate(10, 10); AffineTransform at = AffineTransform.getScaleInstance(0.5, 1); MathTransform2D t = (MathTransform2D) ReferencingFactoryFinder.getMathTransformFactory(null) .createAffineTransform(new GeneralMatrix(at)); coord = JTS.transform(coord, coord, t); assertEquals(new Coordinate(5, 10), coord); coord = JTS.transform(coord, coord, t.inverse()); assertEquals(new Coordinate(10, 10), coord); CoordinateReferenceSystem crs = ReferencingFactoryFinder.getCRSFactory(null).createFromWKT(UTM_ZONE_10N); t = (MathTransform2D) ReferencingFactoryFinder.getCoordinateOperationFactory(null).createOperation( DefaultGeographicCRS.WGS84, crs).getMathTransform(); coord = new Coordinate(-123, 55); coord = JTS.transform(coord, coord, t); coord = JTS.transform(coord, coord, t.inverse()); assertEquals(-123, coord.x, EPS); assertEquals( 55, coord.y, EPS); } /* * Tests the transformation of an envelope. */ public void testTransformEnvelopeMathTransform() throws FactoryException, TransformException { Envelope envelope = new Envelope(0, 10, 0, 10); AffineTransform at = AffineTransform.getScaleInstance(0.5, 1); MathTransform2D t = (MathTransform2D) ReferencingFactoryFinder.getMathTransformFactory(null) .createAffineTransform(new GeneralMatrix(at)); envelope = JTS.transform(envelope, t); assertEquals(new Envelope(0, 5, 0, 10), envelope); envelope = JTS.transform(envelope, t.inverse()); assertEquals(new Envelope(0, 10, 0, 10), envelope); envelope = JTS.transform(envelope, null, t, 10); assertEquals(new Envelope(0, 5, 0, 10), envelope); envelope = JTS.transform(envelope, null, t.inverse(), 10); assertEquals(new Envelope(0, 10, 0, 10), envelope); CoordinateReferenceSystem crs = ReferencingFactoryFinder.getCRSFactory(null).createFromWKT(UTM_ZONE_10N); t = (MathTransform2D) ReferencingFactoryFinder.getCoordinateOperationFactory(null).createOperation( DefaultGeographicCRS.WGS84, crs).getMathTransform(); envelope = new Envelope(-123, -133, 55, 60); envelope = JTS.transform(envelope, t); envelope = JTS.transform(envelope, t.inverse()); /* * Use a large tolerance factory for comparaisons because an accurate transformed envelope * is bigger than the envelope that we get if we transformed only the 4 corners, and the * inverse envelope way expand yet again the envelope for exactly the same reason. */ assertEquals(-133, envelope.getMinX(), 1.5); assertEquals(-123, envelope.getMaxX(), EPS); assertEquals( 55, envelope.getMinY(), 0.5); assertEquals( 60, envelope.getMaxY(), 0.5); } /** * Tests the distance between points function */ public void testOrthodromicDistance() throws Exception { final Parser parser = new Parser(); final DefaultProjectedCRS crs = (DefaultProjectedCRS) parser.parseObject(NAD83_BC); double d = JTS.orthodromicDistance(new Coordinate(1402848.1938534670, 651571.1729878788), new Coordinate(1389481.3104009738, 641990.9430108378), crs); double realValue = 16451.33114; assertEquals(realValue, d, 0.1); } public void testCheckCoordinateRange() throws Exception { DefaultGeographicCRS crs = DefaultGeographicCRS.WGS84; // valid JTS.checkCoordinatesRange(JTS.toGeometry(new Envelope(-10, 10, -10, 10)),crs); // invalid lat try { JTS.checkCoordinatesRange(JTS.toGeometry(new Envelope(-10, 10, -100, 10)), crs); fail("Provided invalid coordinates, yet check did not throw an exception"); } catch(PointOutsideEnvelopeException e) { // fine } // invalid lon try { JTS.checkCoordinatesRange(JTS.toGeometry(new Envelope(-190, 10, -10, 10)), crs); fail("Provided invalid coordinates, yet check did not throw an exception"); } catch(PointOutsideEnvelopeException e) { // fine } } public void testToGeoemtry(){ DefaultGeographicCRS crs = DefaultGeographicCRS.WGS84; // straight up Polygon polygon = JTS.toGeometry(new Envelope(-10, 10, -10, 10) ); assertEquals( 5, polygon.getExteriorRing().getCoordinateSequence().size() ); // bounding box polygon = JTS.toGeometry( (BoundingBox) new ReferencedEnvelope(-10, 10, -10, 10, crs) ); assertEquals( 5, polygon.getExteriorRing().getCoordinateSequence().size() ); } }