package org.geotools.geometry.jts; import static org.junit.Assert.*; import org.geotools.referencing.CRS; import org.geotools.referencing.crs.DefaultEngineeringCRS; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.junit.Test; import org.opengis.geometry.MismatchedReferenceSystemException; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.Coordinate; /** * Test for ReferencedEnvelope3D * * @author Niels Charlier * @source $URL$ */ public class ReferencedEnvelope3DTest { @Test public void testEverything() { ReferencedEnvelope3D everything = ReferencedEnvelope3D.EVERYTHING; ReferencedEnvelope3D world = new ReferencedEnvelope3D( ReferencedEnvelope3D.EVERYTHING ); assertEquals(world.getDimension(), 3); assertSame( everything, ReferencedEnvelope3D.EVERYTHING ); assertNotSame( everything, world ); assertEquals( everything, world ); assertEquals( world, everything ); assertFalse( "This is not an empty 3d envelope", everything.isEmpty() ); assertTrue( "This is a null 3d envelope", everything.isNull() ); Coordinate center = everything.centre(); assertNotNull( center ); double volume = everything.getVolume(); assertTrue( "volume="+volume, Double.isInfinite( volume ) ); volume = world.getVolume(); assertTrue( "volume="+volume, Double.isInfinite( volume ) ); double area = everything.getArea(); assertTrue( "area="+area, Double.isInfinite( area ) ); area = world.getArea(); assertTrue( "area="+area, Double.isInfinite( area ) ); try { everything.setBounds( new ReferencedEnvelope3D() ); fail("Expected IllegalStateException"); } catch( IllegalStateException expected ){ // ignore } everything.setToNull(); everything.translate(1.0, 1.0, 1.0); assertEquals( everything, world ); assertEquals( world, everything ); assertEquals( world.getMaximum(0), everything.getMaximum(0),0.0); assertEquals( world.getMaximum(1), everything.getMaximum(1),0.0); assertEquals( world.getMaximum(2), everything.getMaximum(2),0.0); assertEquals( world.getMinimum(0), everything.getMinimum(0),0.0); assertEquals( world.getMinimum(1), everything.getMinimum(1),0.0); assertEquals( world.getMinimum(2), everything.getMinimum(2),0.0); assertEquals( world.getMedian(0), everything.getMedian(0),0.0); assertEquals( world.getMedian(1), everything.getMedian(1),0.0); assertEquals( world.getMedian(2), everything.getMedian(2),0.0); } @Test public void intersection() throws Exception { ReferencedEnvelope3D australia = new ReferencedEnvelope3D( DefaultGeographicCRS.WGS84_3D ); australia.include( 40, 110, 0); australia.include( 10, 150, 10); ReferencedEnvelope3D newZealand = new ReferencedEnvelope3D( DefaultEngineeringCRS.CARTESIAN_3D ); newZealand.include( 50, 165, 0); newZealand.include( 33, 180, 5); try { australia.intersection(newZealand); fail( "Expected a mismatch of CoordinateReferenceSystem"); } catch (MismatchedReferenceSystemException t){ // expected } } @Test public void include() throws Exception { ReferencedEnvelope3D australia = new ReferencedEnvelope3D( DefaultGeographicCRS.WGS84_3D ); australia.include( 40, 110, 0); australia.include( 10, 150, 10); ReferencedEnvelope3D newZealand = new ReferencedEnvelope3D( DefaultEngineeringCRS.CARTESIAN_3D ); newZealand.include( 50, 165, 0); newZealand.include( 33, 180, 5); try { australia.expandToInclude( newZealand); fail( "Expected a mismatch of CoordinateReferenceSystem"); } catch (MismatchedReferenceSystemException t){ // expected } try { australia.include( newZealand); fail( "Expected a mismatch of CoordinateReferenceSystem"); } catch (MismatchedReferenceSystemException t){ // expected } } @Test public void empty() { // ensure empty can grab a default CRS when starting from nothing ReferencedEnvelope3D bbox = new ReferencedEnvelope3D(); // this is empty assertNull(bbox.getCoordinateReferenceSystem()); ReferencedEnvelope3D australia = new ReferencedEnvelope3D(DefaultGeographicCRS.WGS84_3D); australia.include(40, 110, 0); australia.include(10, 150, 10); bbox.include(australia); assertEquals( australia.getCoordinateReferenceSystem(), bbox.getCoordinateReferenceSystem() ); assertEquals(0, bbox.getMinZ(), 0d); assertEquals(10, bbox.getMaxZ(), 0d); } @Test public void testTransformToWGS84() throws Exception { String wkt = "GEOGCS[\"GDA94\"," + " DATUM[\"Geocentric Datum of Australia 1994\"," + " SPHEROID[\"GRS 1980\", 6378137.0, 298.257222101, AUTHORITY[\"EPSG\",\"7019\"]]," + " TOWGS84[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], " + " AUTHORITY[\"EPSG\",\"6283\"]], " + " PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]]," + " UNIT[\"degree\", 0.017453292519943295], " + " AXIS[\"Geodetic longitude\", EAST], " + " AXIS[\"Geodetic latitude\", NORTH], " + " AXIS[\"Ellipsoidal height\", UP], " + " AUTHORITY[\"EPSG\",\"4939\"]]"; CoordinateReferenceSystem gda94 = CRS.parseWKT(wkt); ReferencedEnvelope bounds = new ReferencedEnvelope3D(130.875825803896, 130.898939990319, -16.4491956225999, -16.4338185791628, 0.0, 0.0, gda94 ); ReferencedEnvelope worldBounds3D = bounds.transform( DefaultGeographicCRS.WGS84_3D, true ); assertEquals( DefaultGeographicCRS.WGS84_3D, worldBounds3D.getCoordinateReferenceSystem() ); ReferencedEnvelope worldBounds2D = bounds.transform( DefaultGeographicCRS.WGS84, true ); assertEquals( DefaultGeographicCRS.WGS84, worldBounds2D.getCoordinateReferenceSystem() ); } @Test public void testDistanceWhenMinZOfThisIsGreaterThanMaxZOfOther() { CoordinateReferenceSystem crs = DefaultEngineeringCRS.CARTESIAN_3D; ReferencedEnvelope3D a = new ReferencedEnvelope3D( 2.0, 3.0, 2.0, 3.0, 2.0, 3.0, crs ); ReferencedEnvelope3D b = new ReferencedEnvelope3D( 0.0, 1.0, 0.0, 1.0, 0.0, 0.5, crs ); assertEquals(Math.sqrt(1*1+1*1+1.5*1.5), a.distance(b), 0.00001); } }