package org.geotools.renderer.lite; import static java.awt.RenderingHints.KEY_ANTIALIASING; import static java.awt.RenderingHints.VALUE_ANTIALIAS_ON; import static org.junit.Assert.assertEquals; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import junit.framework.TestCase; import org.geotools.data.DataUtilities; import org.geotools.data.FeatureSource; import org.geotools.data.property.PropertyDataStore; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.factory.GeoTools; import org.geotools.geometry.jts.JTS; import org.geotools.geometry.jts.JTSFactoryFinder; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.image.test.ImageAssert; import org.geotools.map.DefaultMapContext; import org.geotools.map.FeatureLayer; import org.geotools.map.MapContent; import org.geotools.referencing.CRS; import org.geotools.referencing.CRS.AxisOrder; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.styling.Style; import org.geotools.test.TestData; import org.junit.Ignore; import org.junit.Test; import org.opengis.referencing.crs.CoordinateReferenceSystem; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; /** * Test streaming renderer handling of 3D data (that must be transformed via WGS84). * * @source $URL$ */ public class GeographicTransformPointTest extends TestCase { private static final long TIME = 4000; SimpleFeatureSource point_test; SimpleFeatureSource point_test_strict; SimpleFeatureSource point_test_2d; @Override protected void setUp() throws Exception { System.setProperty( GeoTools.FORCE_LONGITUDE_FIRST_AXIS_ORDER, "true" ); CRS.reset("all"); // setup data File property = new File(TestData.getResource(this, "point_test.properties").toURI()); PropertyDataStore ds = new PropertyDataStore(property.getParentFile()); point_test = ds.getFeatureSource("point_test"); assertNotNull( "point_test data available", point_test ); point_test_strict = ds.getFeatureSource("point_test_strict"); assertNotNull( "point_test_strict data available", point_test_strict ); point_test_2d = ds.getFeatureSource("point_test_2d"); assertNotNull( "point_test_2d data available", point_test_2d ); } File file(String name) { return new File("src/test/resources/org/geotools/renderer/lite/test-data/line/" + name + ".png"); } @Test public void testBounds() throws Exception { ReferencedEnvelope bounds2d = point_test_2d.getBounds(); ReferencedEnvelope bounds3d = point_test.getBounds(); double aspect2d = bounds2d.getWidth() / bounds2d.getHeight(); double aspect3d = bounds3d.getWidth() / bounds3d.getHeight(); assertEquals( aspect2d, aspect3d, 0.0005 ); ReferencedEnvelope bbox2d = JTS.toGeographic( bounds2d ); ReferencedEnvelope bbox3d = JTS.toGeographic( bounds3d ); aspect2d = bbox2d.getWidth() / bbox2d.getHeight(); aspect3d = bbox3d.getWidth() / bbox3d.getHeight(); assertEquals( aspect2d, aspect3d, 0.000005 ); } @Test public void testToGeographicGeometry() throws Exception { // This time we are in north / east order CoordinateReferenceSystem gda94 = CRS.decode("EPSG:4939", true); GeometryFactory gf = new GeometryFactory(); Point point = gf.createPoint( new Coordinate( 130.882672103999, -16.4463909341494, 97.009018073082)); Point world = (Point) JTS.toGeographic( point, gda94 ); assertEquals( point.getX(), world.getX(), 0.00000005 ); assertEquals( point.getY(), world.getY(), 0.00000005 ); } @Test public void testGDA94Points() throws Exception { Style style = RendererBaseTest.loadStyle(this, "markCircle.sld"); BufferedImage reference = toImage( point_test_2d, style ); BufferedImage actual = null; if( CRS.getAxisOrder( point_test_strict.getSchema().getCoordinateReferenceSystem() ) == AxisOrder.NORTH_EAST ){ actual = toImage( point_test_strict, style ); } if( CRS.getAxisOrder( point_test.getSchema().getCoordinateReferenceSystem() ) == AxisOrder.EAST_NORTH ){ actual = toImage( point_test, style ); } ImageAssert.assertEquals( reference, actual, 10 ); } private BufferedImage toImage(SimpleFeatureSource featuerSource, Style style) throws Exception { String typeName = featuerSource.getSchema().getTypeName(); MapContent content = new MapContent(); ReferencedEnvelope dataBounds = featuerSource.getBounds(); assertNotNull( typeName+" bounds",dataBounds); assertFalse( typeName+" bounds empty",dataBounds.isEmpty() ); assertFalse( typeName+" bounds null",dataBounds.isNull() ); ReferencedEnvelope bounds = JTS.toGeographic(dataBounds); assertNotNull(typeName + " world", bounds); assertTrue( typeName + " world WGS84", CRS.equalsIgnoreMetadata(DefaultGeographicCRS.WGS84, bounds.getCoordinateReferenceSystem())); assertFalse(typeName + " world empty", bounds.isEmpty()); assertFalse(typeName + " world null", bounds.isNull()); ReferencedEnvelope reference = JTS.toGeographic( point_test_2d.getBounds() ); assertNotNull( "reference point_test_2d bounds", reference ); assertTrue( "reference point_test_2d bounds available", !reference.isEmpty() && !reference.isNull() ); assertTrue( "bounds WGS84", CRS.equalsIgnoreMetadata(DefaultGeographicCRS.WGS84,reference.getCoordinateReferenceSystem())); content.getViewport().setBounds(reference); assertEquals( "map viewport set", reference, content.getViewport().getBounds() ); assertTrue( "map viewport WGS84", CRS.equalsIgnoreMetadata(DefaultGeographicCRS.WGS84,content.getCoordinateReferenceSystem()) ); content.addLayer( new FeatureLayer( featuerSource, style )); StreamingRenderer renderer = new StreamingRenderer(); renderer.setMapContent(content); renderer.setJava2DHints(new RenderingHints(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON)); BufferedImage image = RendererBaseTest.showRender( typeName, renderer, TIME, bounds); assertNotNull( image ); return image; } }