/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2006-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.imagepyramid; import java.awt.Color; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.color.ColorSpace; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.TimeZone; import javax.imageio.ImageIO; import javax.media.jai.PlanarImage; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.FileFilterUtils; 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.data.DataSourceException; import org.geotools.data.DataUtilities; import org.geotools.factory.Hints; import org.geotools.gce.imagemosaic.ImageMosaicFormat; import org.geotools.geometry.GeneralEnvelope; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.parameter.Parameter; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.test.TestData; import org.geotools.util.DateRange; import org.junit.After; import org.junit.Assert; import org.junit.Test; import org.opengis.coverage.grid.GridEnvelope; import org.opengis.geometry.MismatchedDimensionException; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.InvalidParameterValueException; import org.opengis.parameter.ParameterValue; import org.opengis.referencing.NoSuchAuthorityCodeException; /** * Testing {@link ImagePyramidReader}. * * @author Simone Giannecchini * @author Stefan Alfons Krueger (alfonx), Wikisquare.de : Test coverage for pyramids stored in JARs * and referenced by URLs * @since 2.3 * * @source $URL$ */ public class ImagePyramidReaderTest extends ImageLevelsMapperTest { /** * File to be used for testing purposes. */ private final static String TEST_FILE = "pyramid.properties"; // private final static String TEST_JAR_FILE = "pyramid.jar"; /** * Tests automatic building of all the mosaic and pyramid files * * @throws IOException */ @Test public void testAutomaticBuild() throws IOException { final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); File sourceDir = DataUtilities.urlToFile(testFile).getParentFile(); File targetDir = File.createTempFile("pyramid", "tst", TestData.file(this, ".")); targetDir.delete(); targetDir.mkdir(); try { prepareEmptyMosaic(sourceDir, targetDir); // now make sure we can actually rebuild the mosaic final AbstractGridFormat format = new ImagePyramidFormat(); final Hints hints = new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, DefaultGeographicCRS.WGS84); assertTrue(((ImagePyramidFormat) format).accepts(targetDir, hints)); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(targetDir, hints); assertNotNull(reader); } finally { // cleanup FileUtils.deleteQuietly(targetDir); } } /** * Tests automatic building of all the mosaic and pyramid files from a gdal_retile like * directory structure * * @throws IOException */ @Test public void testAutomaticBuildGdalRetile() throws IOException { final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); File sourceDir = DataUtilities.urlToFile(testFile).getParentFile(); File targetDir = File.createTempFile("pyramid", "tst", TestData.file(this, ".")); targetDir.delete(); targetDir.mkdir(); try { prepareEmptyMosaic(sourceDir, targetDir); // move the files so that it looks like a gdal_retile created directory File zeroDir = new File(targetDir, "0"); assertTrue(zeroDir.isDirectory()); FileUtils.copyDirectory(zeroDir, targetDir); FileUtils.deleteDirectory(zeroDir); // now make sure we can actually rebuild the mosaic final AbstractGridFormat format = new ImagePyramidFormat(); final Hints hints = new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, DefaultGeographicCRS.WGS84); assertTrue(((ImagePyramidFormat) format).accepts(targetDir, hints)); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(targetDir, hints); assertNotNull(reader); } finally { // cleanup FileUtils.deleteQuietly(targetDir); } } /** * Copies the mosaic from the source dir to the target dir and removes all metadata files from * it * * @param sourceDir * @param targetDir * @throws IOException */ void prepareEmptyMosaic(File sourceDir, File targetDir) throws IOException { FileUtils.copyDirectory(sourceDir, targetDir); // remove the files we want to recreate File[] dirs = new File[] { targetDir, new File(targetDir, "0"), new File(targetDir, "2"), new File(targetDir, "4"), new File(targetDir, "8") }; FileFilter metadataFilter = FileFilterUtils.prefixFileFilter("pyramid."); for (File dir : dirs) { for (File file : dir.listFiles(metadataFilter)) { file.delete(); } } } @Test public void testDefaultParameterValue() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // // Get the resource. // final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE);// assertNotNull(testFile); // // Get a reader // final AbstractGridFormat format = new ImagePyramidFormat(); assertTrue(format.accepts(testFile)); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(testFile); assertNotNull(reader); // // Show the coverage // final GridCoverage2D coverage = (GridCoverage2D) reader.read(null); assertEquals("pyramid", coverage.getName().toString()); assertNotNull("Null value returned instead of a coverage", coverage); assertTrue("coverage dimensions different from what we expected", coverage .getGridGeometry().getGridRange().getSpan(0) == 250 && coverage.getGridGeometry().getGridRange().getSpan(1) == 250); if (TestData.isInteractiveTest()) coverage.show("testDefaultParameterValue"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); } @Test public void testDefaultParameterValueFile() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // // Get the resource. // final File testFile = TestData.file(this, "goodpyramid/" + TEST_FILE);// assertNotNull(testFile); // // Get a reader // final AbstractGridFormat format = new ImagePyramidFormat(); assertTrue(format.accepts(testFile)); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(testFile); assertNotNull(reader); // // Show the coverage // final GridCoverage2D coverage = (GridCoverage2D) reader.read(null); assertNotNull("Null value returned instead of a coverage", coverage); assertTrue("coverage dimensions different from what we expected", coverage .getGridGeometry().getGridRange().getSpan(0) == 250 && coverage.getGridGeometry().getGridRange().getSpan(1) == 250); if (TestData.isInteractiveTest()) coverage.show("testDefaultParameterValueFile"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); } @Test public void testDefaultParameterValueString() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // // Get the resource. // final String testFile = TestData.file(this, "goodpyramid/" + TEST_FILE).getCanonicalPath();// assertNotNull(testFile); // // Get a reader // final AbstractGridFormat format = new ImagePyramidFormat(); assertTrue(format.accepts(testFile)); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(testFile); assertNotNull(reader); // // Show the coverage // final GridCoverage2D coverage = (GridCoverage2D) reader.read(null); assertNotNull("Null value returned instead of a coverage", coverage); assertTrue("coverage dimensions different from what we expected", coverage .getGridGeometry().getGridRange().getSpan(0) == 250 && coverage.getGridGeometry().getGridRange().getSpan(1) == 250); if (TestData.isInteractiveTest()) coverage.show("testDefaultParameterValueString"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); } @Test public void testForErrors() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // // Get the resource. // final File testFile = TestData.file(this, "goodpyramid/" + TEST_FILE);// assertNotNull(testFile); // // Null argument // ImagePyramidReader reader = null; try { reader = new ImagePyramidReader(null, new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE)); } catch (DataSourceException e) { } assertNull(reader); // // Illegal arguments // try { reader = new ImagePyramidReader(new FileInputStream(testFile), new Hints( Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE)); } catch (DataSourceException e) { } assertNull(reader); try { reader = new ImagePyramidReader(ImageIO.createImageInputStream(testFile), new Hints( Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE)); } catch (DataSourceException e) { } assertNull(reader); // // Unsopported operation reader = new ImagePyramidReader(testFile, new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE)); try { reader.getCurrentSubname(); } catch (UnsupportedOperationException e) { try { String value = reader.getMetadataValue(""); assertNull(value); return; } catch (UnsupportedOperationException e2) { return; } } assertTrue("Some of the unsopported method did not send an exception", false); } @Test public void testComplete() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // // Get the resource. // final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); assertNotNull(testFile); // // Get a reader // final ImagePyramidReader reader = new ImagePyramidReader(testFile, new Hints( Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE)); assertNotNull(reader); // // alpha on output // final ParameterValue<Color> transp = ImageMosaicFormat.INPUT_TRANSPARENT_COLOR .createValue(); transp.setValue(Color.black); // // Show the coverage // GridCoverage2D coverage = (GridCoverage2D) reader .read(new GeneralParameterValue[] { transp }); assertNotNull(coverage); assertTrue("coverage dimensions different from what we expected", coverage .getGridGeometry().getGridRange().getSpan(0) == 250 && coverage.getGridGeometry().getGridRange().getSpan(1) == 250); if (TestData.isInteractiveTest()) coverage.show("testComplete"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); } /** * This is related to http://jira.codehaus.org/browse/GEOS-4081 and happens only if the * requested envelope is overlapping with the pyramid envelope for way less than a pixel * * @throws IOException * @throws MismatchedDimensionException * @throws NoSuchAuthorityCodeException */ @Test public void testRequestOutsideBounds() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // grab the reader final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); assertNotNull(testFile); final ImagePyramidReader reader = new ImagePyramidReader(testFile, new Hints( Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE)); assertNotNull(reader); // prepare a request that crosses the bounds for a really minimal part GeneralEnvelope ge = reader.getOriginalEnvelope(); ReferencedEnvelope requestedEnvelope = new ReferencedEnvelope(ge.getMinimum(0) - 5, ge.getMinimum(0), ge.getMinimum(1), ge.getMaximum(1), ge.getCoordinateReferenceSystem()); final Parameter<GridGeometry2D> readGG = new Parameter<GridGeometry2D>( AbstractGridFormat.READ_GRIDGEOMETRY2D); readGG.setValue(new GridGeometry2D(new GridEnvelope2D(0, 0, 400, 400), requestedEnvelope)); // make sure we get back a null, not an exception assertNull(reader.read(new GeneralParameterValue[] { readGG })); } /** * Testing {@link ImagePyramidReader} by cropping requesting a the best possible dimension. * * <p> * The underlying pyramid i made by 4 levels on the same area, more or less italy, with * resolution decreasing as a power of 2. * * <p> * Size of the original mosaic is 250,250. * * @throws IOException * @throws MismatchedDimensionException * @throws NoSuchAuthorityCodeException */ @Test public void testCropHighestLevel() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // // Get the resource. // final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); // // Get a reader // final AbstractGridFormat format = new ImagePyramidFormat(); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(testFile); assertNotNull(reader); // // crop // final ParameterValue<GridGeometry2D> gg = ImageMosaicFormat.READ_GRIDGEOMETRY2D .createValue(); final GeneralEnvelope oldEnvelop = reader.getOriginalEnvelope(); final GeneralEnvelope cropEnvelope = new GeneralEnvelope(new double[] { oldEnvelop.getLowerCorner().getOrdinate(0), oldEnvelop.getLowerCorner().getOrdinate(1) }, new double[] { oldEnvelop.getLowerCorner().getOrdinate(0) + oldEnvelop.getSpan(0) / 2, oldEnvelop.getLowerCorner().getOrdinate(1) + oldEnvelop.getSpan(1) / 2 }); cropEnvelope.setCoordinateReferenceSystem(DefaultGeographicCRS.WGS84); gg.setValue(new GridGeometry2D(new GridEnvelope2D(new Rectangle(0, 0, 125, 125)), cropEnvelope)); // // Show the coverage // GridCoverage2D coverage = ((GridCoverage2D) reader.read(new GeneralParameterValue[] { gg })); assertNotNull("Null value returned instead of a coverage", coverage); // assertTrue("coverage dimensions different from what we expected", coverage .getGridGeometry().getGridRange().getSpan(0) == 127 && coverage.getGridGeometry().getGridRange().getSpan(1) == 127); if (TestData.isInteractiveTest()) coverage.show("testCropHighestLevel"); else PlanarImage.wrapRenderedImage(coverage.getRenderedImage()).getTiles(); } /** * Testing {@link ImagePyramidReader} by cropping requesting a the second better available * resolution. * * <p> * The underlying pyramid is made by 4 levels on the same area, more or less italy, with * resolution decreasing as a power of 2. * * <p> * Size of the original mosaic is 250,250. * * @throws IOException * @throws MismatchedDimensionException * @throws NoSuchAuthorityCodeException */ @Test public void testCropLevel1() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // // Get the resource. // final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); // // Get a reader // final AbstractGridFormat format = new ImagePyramidFormat(); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(testFile); assertNotNull(reader); // // crop // final ParameterValue<GridGeometry2D> gg = ImageMosaicFormat.READ_GRIDGEOMETRY2D .createValue(); final GeneralEnvelope oldEnvelop = reader.getOriginalEnvelope(); final GeneralEnvelope cropEnvelope = new GeneralEnvelope(new double[] { oldEnvelop.getLowerCorner().getOrdinate(0), oldEnvelop.getLowerCorner().getOrdinate(1) }, new double[] { oldEnvelop.getLowerCorner().getOrdinate(0) + oldEnvelop.getSpan(0) / 2, oldEnvelop.getLowerCorner().getOrdinate(1) + oldEnvelop.getSpan(1) / 2 }); cropEnvelope.setCoordinateReferenceSystem(DefaultGeographicCRS.WGS84); gg.setValue(new GridGeometry2D(new GridEnvelope2D(new Rectangle(0, 0, 125, 125)), cropEnvelope)); // // Show the coverage // GridCoverage2D coverage = ((GridCoverage2D) reader.read(new GeneralParameterValue[] { gg })); assertNotNull("Null value returned instead of a coverage", coverage); if (TestData.isInteractiveTest()) coverage.show("testCropLevel1"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); } /** * Testing {@link ImagePyramidReader} by cropping requesting a the third better avialble * resolution. * * <p> * The underlying pyramid i made by 4 levels on the same area, more or less italy, with * resolution decreasing as a power of 2. * * <p> * Size of the original mosaic is 250,250. * * @throws IOException * @throws MismatchedDimensionException * @throws NoSuchAuthorityCodeException */ @Test public void testCropLevel2() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // ///////////////////////////////////////////////////////////////// // // Get the resource. // // // ///////////////////////////////////////////////////////////////// final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); // // Get a reader // final AbstractGridFormat format = new ImagePyramidFormat(); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(testFile); assertNotNull(reader); // // crop // final ParameterValue<GridGeometry2D> gg = ImageMosaicFormat.READ_GRIDGEOMETRY2D .createValue(); final GeneralEnvelope oldEnvelop = reader.getOriginalEnvelope(); final GeneralEnvelope cropEnvelope = new GeneralEnvelope(new double[] { oldEnvelop.getLowerCorner().getOrdinate(0), oldEnvelop.getLowerCorner().getOrdinate(1) }, new double[] { oldEnvelop.getLowerCorner().getOrdinate(0) + oldEnvelop.getSpan(0) / 2, oldEnvelop.getLowerCorner().getOrdinate(1) + oldEnvelop.getSpan(1) / 2 }); cropEnvelope.setCoordinateReferenceSystem(DefaultGeographicCRS.WGS84); gg.setValue(new GridGeometry2D(new GridEnvelope2D(new Rectangle(0, 0, 62, 62)), cropEnvelope)); // // Show the coverage // GridCoverage2D coverage = ((GridCoverage2D) reader.read(new GeneralParameterValue[] { gg })); assertNotNull("Null value returned instead of a coverage", coverage); if (TestData.isInteractiveTest()) coverage.show("testCropLevel2"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); } /** * Testing {@link ImagePyramidReader} by cropping requesting a the worst availaible resolution. * * <p> * The underlying pyramid i made by 4 levels on the same area, more or less italy, with * resolution decreasing as a power of 2. * * <p> * Size of the original mosaic is 250,250. * * @throws IOException * @throws MismatchedDimensionException * @throws NoSuchAuthorityCodeException */ @Test public void testCropLevel3() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException { // Get the resource. // final URL testFile = TestData.getResource(this, "goodpyramid/" + TEST_FILE); // // Get a reader // final AbstractGridFormat format = new ImagePyramidFormat(); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(testFile); assertNotNull(reader); // // crop // final ParameterValue<GridGeometry2D> gg = ImageMosaicFormat.READ_GRIDGEOMETRY2D .createValue(); final GeneralEnvelope oldEnvelop = reader.getOriginalEnvelope(); final GeneralEnvelope cropEnvelope = new GeneralEnvelope(new double[] { oldEnvelop.getLowerCorner().getOrdinate(0), oldEnvelop.getLowerCorner().getOrdinate(1) }, new double[] { oldEnvelop.getLowerCorner().getOrdinate(0) + oldEnvelop.getSpan(0) / 2, oldEnvelop.getLowerCorner().getOrdinate(1) + oldEnvelop.getSpan(1) / 2 }); cropEnvelope.setCoordinateReferenceSystem(DefaultGeographicCRS.WGS84); gg.setValue(new GridGeometry2D(new GridEnvelope2D(new Rectangle(0, 0, 25, 25)), cropEnvelope)); // // Show the coverage // GridCoverage2D coverage = ((GridCoverage2D) reader.read(new GeneralParameterValue[] { gg })); assertNotNull("Null value returned instead of a coverage", coverage); // assertTrue("coverage dimensions different from what we expected", // coverage.getGridGeometry().getGridRange().getSpan(0) == 15 // && coverage.getGridGeometry().getGridRange().getSpan( // 1) == 15); if (TestData.isInteractiveTest()) coverage.show("testCropLevel3"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); } // private final static String TEST_JAR_FILE = "pyramid.jar"; /** * Tests that we recognize gdal_retile structure * * @throws IOException */ @Test public void badPyramid1() throws IOException { final URL sourceDir = TestData.getResource(this, "badpyramid1"); // now make sure we can actually rebuild the mosaic final AbstractGridFormat format = new ImagePyramidFormat(); final Hints hints = new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, DefaultGeographicCRS.WGS84); assertFalse(((ImagePyramidFormat) format).accepts(sourceDir, hints)); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(sourceDir, hints); assertNull(reader); } /** * Tests that we recognize gdal_retile structure * * @throws IOException */ @Test public void badPyramid2() throws IOException { final URL sourceDir = TestData.getResource(this, "badpyramid2"); // now make sure we can actually rebuild the mosaic final AbstractGridFormat format = new ImagePyramidFormat(); final Hints hints = new Hints(Hints.DEFAULT_COORDINATE_REFERENCE_SYSTEM, DefaultGeographicCRS.WGS84); assertFalse(((ImagePyramidFormat) format).accepts(sourceDir, hints)); final ImagePyramidReader reader = (ImagePyramidReader) format.getReader(sourceDir, hints); assertNull(reader); } @Test public void timePyramid() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException, InvalidParameterValueException, ParseException { // // Get the resource. // final URL testFile = TestData.getResource(this, "timepyramid/timepyramid.properties"); assertNotNull(testFile); // // Get the reader // final ImagePyramidReader reader = new ImagePyramidReader(testFile); assertNotNull(reader); assertEquals("true", reader.getMetadataValue("HAS_TIME_DOMAIN")); final String timeMetadata = reader.getMetadataValue("TIME_DOMAIN"); assertNotNull(timeMetadata); assertEquals(timeMetadata.split(",")[0], reader.getMetadataValue("TIME_DOMAIN_MINIMUM")); assertEquals(timeMetadata.split(",")[timeMetadata.split(",").length - 1], reader.getMetadataValue("TIME_DOMAIN_MAXIMUM")); // // alpha on output // final ParameterValue<Color> transp = ImageMosaicFormat.INPUT_TRANSPARENT_COLOR .createValue(); transp.setValue(Color.black); // // Show the coverage // GridCoverage2D coverage = (GridCoverage2D) reader .read(new GeneralParameterValue[] { transp }); assertNotNull(coverage); assertTrue("coverage dimensions different from what we expected", coverage .getGridGeometry().getGridRange().getSpan(0) == 200 && coverage.getGridGeometry().getGridRange().getSpan(1) == 200); if (TestData.isInteractiveTest()) coverage.show("testComplete"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); // limit yourself to reading just a bit of it final ParameterValue<GridGeometry2D> gg = AbstractGridFormat.READ_GRIDGEOMETRY2D .createValue(); final GeneralEnvelope envelope = reader.getOriginalEnvelope(); final Dimension dim = new Dimension(); dim.setSize(reader.getOriginalGridRange().getSpan(0) / 2.0, reader.getOriginalGridRange() .getSpan(1) / 2.0); final Rectangle rasterArea = ((GridEnvelope2D) reader.getOriginalGridRange()); rasterArea.setSize(dim); final GridEnvelope2D range = new GridEnvelope2D(rasterArea); gg.setValue(new GridGeometry2D(range, envelope)); final SimpleDateFormat formatD = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); formatD.setTimeZone(TimeZone.getTimeZone("GMT")); // use imageio with defined tiles final ParameterValue<Boolean> useJai = AbstractGridFormat.USE_JAI_IMAGEREAD.createValue(); useJai.setValue(false); // specify time final ParameterValue<List> time = ImageMosaicFormat.TIME.createValue(); time.setValue(new ArrayList() { { add(new DateRange(formatD.parse("2004-01-01T00:00:00.000Z"), formatD .parse("2004-07-01T00:00:00.000Z"))); } }); // Testing output coverage for level 0 TestUtils.checkCoverage(reader.getImageMosaicReaderForLevel(0), new GeneralParameterValue[] { gg, useJai, time }, "time test"); } /** * This test is designed to test the retrieval of the TIME domain metadata values through * {@link org.geotools.gce.imagepyramid.ImagePyramidReader#getMetadataValue(String, String)}. * This method is called by GeoServer. */ @Test public void timePyramidForGeoserver() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException, InvalidParameterValueException, ParseException { // // Get the resource. // final URL testFile = TestData.getResource(this, "timepyramid/timepyramid.properties"); assertNotNull(testFile); // // Get the reader // final ImagePyramidReader reader = new ImagePyramidReader(testFile); assertNotNull(reader); String coverageName = reader.getGridCoverageNames()[0]; assertEquals("true", reader.getMetadataValue(coverageName, "HAS_TIME_DOMAIN")); final String timeMetadata = reader.getMetadataValue(coverageName, "TIME_DOMAIN"); assertNotNull(timeMetadata); assertEquals(timeMetadata.split(",")[0], reader.getMetadataValue(coverageName, "TIME_DOMAIN_MINIMUM")); assertEquals(timeMetadata.split(",")[timeMetadata.split(",").length - 1], reader.getMetadataValue(coverageName, "TIME_DOMAIN_MAXIMUM")); // // alpha on output // final ParameterValue<Color> transp = ImageMosaicFormat.INPUT_TRANSPARENT_COLOR .createValue(); transp.setValue(Color.black); // // Show the coverage // GridCoverage2D coverage = (GridCoverage2D) reader .read(new GeneralParameterValue[] { transp }); assertNotNull(coverage); assertTrue("coverage dimensions different from what we expected", coverage .getGridGeometry().getGridRange().getSpan(0) == 200 && coverage.getGridGeometry().getGridRange().getSpan(1) == 200); if (TestData.isInteractiveTest()) coverage.show("testComplete"); else PlanarImage.wrapRenderedImage(((GridCoverage2D) coverage).getRenderedImage()) .getTiles(); // limit yourself to reading just a bit of it final ParameterValue<GridGeometry2D> gg = AbstractGridFormat.READ_GRIDGEOMETRY2D .createValue(); final GeneralEnvelope envelope = reader.getOriginalEnvelope(); final Dimension dim = new Dimension(); dim.setSize(reader.getOriginalGridRange().getSpan(0) / 2.0, reader.getOriginalGridRange() .getSpan(1) / 2.0); final Rectangle rasterArea = ((GridEnvelope2D) reader.getOriginalGridRange()); rasterArea.setSize(dim); final GridEnvelope2D range = new GridEnvelope2D(rasterArea); gg.setValue(new GridGeometry2D(range, envelope)); final SimpleDateFormat formatD = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); formatD.setTimeZone(TimeZone.getTimeZone("GMT")); // use imageio with defined tiles final ParameterValue<Boolean> useJai = AbstractGridFormat.USE_JAI_IMAGEREAD.createValue(); useJai.setValue(false); // specify time final ParameterValue<List> time = ImageMosaicFormat.TIME.createValue(); time.setValue(new ArrayList() { { add(new DateRange(formatD.parse("2004-01-01T00:00:00.000Z"), formatD .parse("2004-07-01T00:00:00.000Z"))); } }); // Testing output coverage for level 0 TestUtils.checkCoverage(reader.getImageMosaicReaderForLevel(0), new GeneralParameterValue[] { gg, useJai, time }, "time test"); } /** * */ @Test public void multicoveragePyramid() throws IOException, MismatchedDimensionException, NoSuchAuthorityCodeException, InvalidParameterValueException, ParseException { // // Get the resource. // final URL testFile = TestData.getResource(this, "multipyramid"); File mosaicFolder = DataUtilities.urlToFile(testFile); assertNotNull(testFile); File[] pyramidLevels = mosaicFolder.listFiles((FileFilter)FileFilterUtils.directoryFileFilter()); for (File pyramidLevel : pyramidLevels) { cleanFiles(pyramidLevel); } cleanFiles(mosaicFolder); // // Get the reader // final ImagePyramidReader reader = new ImagePyramidReader(testFile, new Hints( Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE)); assertNotNull(reader); assertEquals(2, reader.getGridCoverageCount()); String coverageNames[] = reader.getGridCoverageNames(); Arrays.sort(coverageNames); assertEquals("gray", coverageNames[0]); assertEquals("rgb", coverageNames[1]); // // Get the coverage // GridCoverage2D coverage = (GridCoverage2D) reader.read(coverageNames[0], null); assertNotNull(coverage); RenderedImage renderedImage = coverage.getRenderedImage(); int colorSpaceType = renderedImage.getColorModel().getColorSpace().getType(); assertEquals(ColorSpace.TYPE_GRAY, colorSpaceType); GridEnvelope gridEnvelope = coverage.getGridGeometry().getGridRange(); assertEquals(20, gridEnvelope.getSpan(0), DELTA); assertEquals(20, gridEnvelope.getSpan(1), DELTA); coverage = (GridCoverage2D) reader.read(coverageNames[1], null); assertNotNull(coverage); renderedImage = coverage.getRenderedImage(); colorSpaceType = renderedImage.getColorModel().getColorSpace().getType(); assertEquals(ColorSpace.TYPE_RGB, colorSpaceType); } }