/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-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.gce.image; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.logging.Logger; import javax.media.jai.RenderedOp; import junit.framework.TestSuite; import junit.textui.TestRunner; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridEnvelope2D; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.coverage.grid.io.AbstractGridFormat; import org.geotools.coverage.grid.io.OverviewPolicy; import org.geotools.factory.Hints; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.parameter.Parameter; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.test.TestData; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterValue; /** * TestCase subclass for testing readingb capabilities * * @author Simone Giannecchini * @author Alessio Fabiani * @author rgould * @source $URL$ */ public class WorldImageReaderTest extends WorldImageBaseTestCase { private Logger logger = org.geotools.util.logging.Logging.getLogger(WorldImageReaderTest.class .toString()); /** * Constructor for WorldImageReaderTest. * * @param arg0 */ public WorldImageReaderTest(String arg0) { super(arg0); } /* * Can't test this, as these files aren't actually expected to exist. * The constructor tries to create an inputStream and then throws * an exception. Re-enable this if that behaviour changes, or if you * feel like writing a windows-only test. */ // public void testSource() throws Exception { // URL altDrive = new URL("file://E:/somedir/foo.tif"); // WorldImageReader r = new WorldImageReader(altDrive); // File result = (File) r.getSource(); // String s1 = result.getAbsolutePath(); // String s2 = "E:\\somedir\\foo.tif"; // assertTrue(s1.equals(s2)); // // URL networkShare = new URL("file://borkServer/somedir/foo.tif"); // r = new WorldImageReader(networkShare); // result = (File) r.getSource(); // s1 = result.getAbsolutePath(); // s2 = "\\\\borkServer\\somedir\\foo.tif"; // assertTrue(s1.equals(s2)); // } /* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); } public void testRead() throws IOException { // set up Object in; // checking test data directory for all kind of inputs final File test_data_dir = TestData.file(this, null); final String[] fileList = test_data_dir.list(new MyFileFilter()); final int length = fileList.length; for (int i = 0; i < length; i++) { // file in = TestData.file(this, fileList[i]); this.read(in); } // checking a WMS get map // URL url = new URL( // "http://wms.jpl.nasa.gov/wms.cgi?bbox=9,43,12,45&styles=&Format=image/png&request=GetMap&layers=global_mosaic&width=100&height=100&srs=EPSG:4326"); // // checking that we have an internet connection active and that the // // website is up // if (url.openConnection() == null) // return; // this.read(url); } public void testOverviewsNearest() throws IOException { final File file = TestData.file(this, "etopo.tif"); /////////////////////////////////////////////////////////////////////// // // HINTS // /////////////////////////////////////////////////////////////////////// WorldImageReader wiReader = new WorldImageReader(file); // more than native resolution (250 pixel representation for 125 pixels image) assertEquals(0, getChosenOverview(250,wiReader)); // native resolution (125 pixel representation for 125 pixels image) assertEquals(0, getChosenOverview(125,wiReader)); // half of native, the overview is in position 3 (out of order, remember?) assertEquals(3, getChosenOverview(73,wiReader)); // quarter of native, the overview is in position 2 assertEquals(2, getChosenOverview(31,wiReader)); // 1/8 of native, the overview is in position 4 assertEquals(4, getChosenOverview(16,wiReader)); // 1/16 of native, the overview is in position 1 assertEquals(1, getChosenOverview(9,wiReader)); // 1/32 of native, no overview, still 1 assertEquals(1, getChosenOverview(4,wiReader)); // 13 is nearer to 16 and to 9 assertEquals(4, getChosenOverview(13,wiReader)); // 11 is nearer to 9 than to 16 assertEquals(4, getChosenOverview(13,wiReader)); wiReader.dispose(); /////////////////////////////////////////////////////////////////////// // // PARAMETER // /////////////////////////////////////////////////////////////////////// wiReader = new WorldImageReader(file); final ParameterValue policy = (ParameterValue) ((AbstractGridFormat) wiReader .getFormat()).OVERVIEW_POLICY.createValue(); policy.setValue(OverviewPolicy.NEAREST); // more than native resolution (250 pixel representation for 125 pixels image) assertEquals(0, getChosenOverview(250,wiReader,policy)); // native resolution (125 pixel representation for 125 pixels image) assertEquals(0, getChosenOverview(125,wiReader,policy)); // half of native, the overview is in position 3 (out of order, remember?) assertEquals(3, getChosenOverview(73,wiReader,policy)); // quarter of native, the overview is in position 2 assertEquals(2, getChosenOverview(31,wiReader,policy)); // 1/8 of native, the overview is in position 4 assertEquals(4, getChosenOverview(16,wiReader,policy)); // 1/16 of native, the overview is in position 1 assertEquals(1, getChosenOverview(9,wiReader,policy)); // 1/32 of native, no overview, still 1 assertEquals(1, getChosenOverview(4,wiReader,policy)); // 13 is nearer to 16 and to 9 assertEquals(4, getChosenOverview(13,wiReader)); // 11 is nearer to 9 than to 16 assertEquals(4, getChosenOverview(13,wiReader)); wiReader.dispose(); } public void testOverviewsQuality() throws IOException { final File file = TestData.file(this, "etopo.tif"); /////////////////////////////////////////////////////////////////////// // // HINTS // /////////////////////////////////////////////////////////////////////// Hints hints = new Hints(); hints.put(Hints.OVERVIEW_POLICY, OverviewPolicy.QUALITY); WorldImageReader wiReader = new WorldImageReader(file,hints); // between 16 and 9, any value should report the match of 16 assertEquals(4, getChosenOverview(16,wiReader)); assertEquals(4, getChosenOverview(15,wiReader)); assertEquals(4, getChosenOverview(14,wiReader)); assertEquals(4, getChosenOverview(13,wiReader)); assertEquals(4, getChosenOverview(12,wiReader)); assertEquals(4, getChosenOverview(11,wiReader)); assertEquals(4, getChosenOverview(10,wiReader)); /////////////////////////////////////////////////////////////////////// // // PARAMETER // /////////////////////////////////////////////////////////////////////// //parameter ovverrides hints hints.put(Hints.OVERVIEW_POLICY, OverviewPolicy.NEAREST); wiReader = new WorldImageReader(file, hints); final ParameterValue policy = (ParameterValue) ((AbstractGridFormat) wiReader .getFormat()).OVERVIEW_POLICY.createValue(); policy.setValue(OverviewPolicy.QUALITY); // between 16 and 9, any value should report the match of 16 assertEquals(4, getChosenOverview(16,wiReader,policy)); assertEquals(4, getChosenOverview(15,wiReader,policy)); assertEquals(4, getChosenOverview(14,wiReader,policy)); assertEquals(4, getChosenOverview(13,wiReader,policy)); assertEquals(4, getChosenOverview(12,wiReader,policy)); assertEquals(4, getChosenOverview(11,wiReader,policy)); assertEquals(4, getChosenOverview(10,wiReader,policy)); } public void testOverviewsSpeed() throws IOException { final File file = TestData.file(this, "etopo.tif"); /////////////////////////////////////////////////////////////////////// // // HINTS // /////////////////////////////////////////////////////////////////////// Hints hints = new Hints(); hints.put(Hints.OVERVIEW_POLICY, OverviewPolicy.SPEED); WorldImageReader wiReader = new WorldImageReader(file, hints); // between 16 and 9, any value should report the match of 16 assertEquals(1, getChosenOverview(15,wiReader)); assertEquals(1, getChosenOverview(14,wiReader)); assertEquals(1, getChosenOverview(13,wiReader)); assertEquals(1, getChosenOverview(12,wiReader)); assertEquals(1, getChosenOverview(11,wiReader)); assertEquals(1, getChosenOverview(10,wiReader)); /////////////////////////////////////////////////////////////////////// // // PARAMETER // /////////////////////////////////////////////////////////////////////// //parameter overrides hints hints.put(Hints.OVERVIEW_POLICY, OverviewPolicy.NEAREST); wiReader = new WorldImageReader(file, hints); final ParameterValue policy = (ParameterValue) ((AbstractGridFormat) wiReader .getFormat()).OVERVIEW_POLICY.createValue(); policy.setValue(OverviewPolicy.SPEED); // between 16 and 9, any value should report the match of 16 assertEquals(1, getChosenOverview(15,wiReader,policy)); assertEquals(1, getChosenOverview(14,wiReader,policy)); assertEquals(1, getChosenOverview(13,wiReader,policy)); assertEquals(1, getChosenOverview(12,wiReader,policy)); assertEquals(1, getChosenOverview(11,wiReader,policy)); assertEquals(1, getChosenOverview(10,wiReader,policy)); } private int getChosenOverview(final int size, WorldImageReader wiReader) throws IOException { return getChosenOverview(size, wiReader, null); } private int getChosenOverview(final int size, WorldImageReader wiReader, ParameterValue policy) throws IOException { // get the coverage and then the rendered image final Parameter readGG = new Parameter( AbstractGridFormat.READ_GRIDGEOMETRY2D); readGG.setValue(new GridGeometry2D(new GridEnvelope2D( new java.awt.Rectangle(size, (int) (164.0 / 125.0 * size))), new ReferencedEnvelope(118.8, 134.56, 47.819, 63.142, DefaultGeographicCRS.WGS84))); final GridCoverage2D coverage = (GridCoverage2D) wiReader .read(policy != null ? new GeneralParameterValue[] { readGG, policy } : new GeneralParameterValue[] { readGG }); assertNotNull(coverage); assertNotNull((coverage).getRenderedImage()); RenderedOp op = (RenderedOp) coverage.getRenderedImage(); while (!op.getOperationName().equals("ImageRead")) op = (RenderedOp) op.getSources().get(0); Integer choice = (Integer) op.getParameterBlock().getObjectParameter(1); return choice.intValue(); } /** * Read, test and show a coverage from the supplied source. * * @param source * Object * * @throws FileNotFoundException * DOCUMENT ME! * @throws IOException * DOCUMENT ME! * @throws IllegalArgumentException * DOCUMENT ME! */ private void read(Object source) throws FileNotFoundException, IOException, IllegalArgumentException { // can we read it? assertTrue(new WorldImageFormat().accepts(source)); logger.info(((File)source).getAbsolutePath()); // get a reader final WorldImageReader wiReader = new WorldImageReader(source); // get the coverage final GridCoverage2D coverage = (GridCoverage2D) wiReader.read(null); // test the coverage assertNotNull(coverage); assertNotNull((coverage).getRenderedImage()); assertNotNull(coverage.getEnvelope()); // log some information if(TestData.isInteractiveTest()){ logger.info(coverage.getCoordinateReferenceSystem().toWKT()); logger.info(coverage.getEnvelope().toString()); } // show it, but only if tests are interactive if(TestData.isInteractiveTest()) coverage.show(); else coverage.getRenderedImage().getData(); } public static void main(String[] args) { TestRunner.run(WorldImageReaderTest.suite()); } public final static TestSuite suite(){ final TestSuite suite= new TestSuite(); suite.addTest(new WorldImageReaderTest("testOverviewsNearest")); suite.addTest(new WorldImageReaderTest("testOverviewsQuality")); suite.addTest(new WorldImageReaderTest("testOverviewsSpeed")); suite.addTest(new WorldImageReaderTest("testRead")); return suite; } }