/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2014, 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.imagemosaic; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.awt.Dimension; import java.awt.Rectangle; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; 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.GridCoverage2DReader; import org.geotools.gce.imagemosaic.granulecollector.DefaultSubmosaicProducerFactory; import org.geotools.geometry.GeneralEnvelope; import org.geotools.referencing.operation.matrix.XAffineTransform; import org.geotools.referencing.operation.transform.AffineTransform2D; import org.geotools.test.TestData; import org.junit.Test; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterValue; import org.opengis.referencing.operation.MathTransform2D; public class RasterLayerResponseTest { private final static double DELTA = 1E-5; @Test public void testHeterogeneous() throws Exception { final URL testMosaic = TestData.url(this, "heterogeneous"); ImageMosaicReader reader = null; try { reader = new ImageMosaicFormat().getReader(testMosaic); final ParameterValue<GridGeometry2D> gg = AbstractGridFormat.READ_GRIDGEOMETRY2D .createValue(); final GeneralEnvelope envelope = reader.getOriginalEnvelope(); final Dimension dim = new Dimension(); dim.setSize(10, 20); final Rectangle rasterArea = ((GridEnvelope2D) reader.getOriginalGridRange()); rasterArea.setSize(dim); final GridEnvelope2D range = new GridEnvelope2D(rasterArea); GridGeometry2D gridGeometryValue = new GridGeometry2D(range, envelope); gg.setValue(gridGeometryValue); final RasterManager manager = reader.getRasterManager(reader.getGridCoverageNames()[0]); final RasterLayerRequest request = new RasterLayerRequest( new GeneralParameterValue[] { gg }, manager); final RasterLayerResponse response = new RasterLayerResponse(request, manager, new DefaultSubmosaicProducerFactory()); final Class<?> c = response.getClass(); // Trigger the grid to world computations Method method = c.getDeclaredMethod("prepareResponse"); method.setAccessible(true); method.invoke(response); Field finalGridToWorldCorner = c.getDeclaredField("finalGridToWorldCorner"); finalGridToWorldCorner.setAccessible(true); MathTransform2D transform = (MathTransform2D) finalGridToWorldCorner.get(response); AffineTransform2D affineTransform = (AffineTransform2D) transform; AffineTransform2D gridToCRS = (AffineTransform2D) gridGeometryValue.getGridToCRS2D(); // heteroegenous mode, the response code should not be picking a target resolution, just // reflect the requested one and let the GranuleDescriptor own overview controller pick // the best one for that granule assertEquals(gridToCRS.getScaleX(), XAffineTransform.getScaleX0(affineTransform), DELTA); assertEquals(Math.abs(gridToCRS.getScaleY()), XAffineTransform.getScaleY0(affineTransform), DELTA); } finally { if (reader != null) { try { reader.dispose(); } catch (Throwable t) { } } } } /** * Test that {@link GridCoverage2DReader#SOURCE_URL_PROPERTY} is correctly set on a coverage created by {@link RasterLayerResponse}. */ @Test public void testSourceUrl() throws Exception { final URL testMosaic = TestData.url(this, "heterogeneous"); ImageMosaicReader reader = null; try { reader = new ImageMosaicFormat().getReader(testMosaic, null); ParameterValue<GridGeometry2D> gg = AbstractGridFormat.READ_GRIDGEOMETRY2D .createValue(); GeneralEnvelope envelope = reader.getOriginalEnvelope(); Dimension dim = new Dimension(); dim.setSize(10, 20); Rectangle rasterArea = ((GridEnvelope2D) reader.getOriginalGridRange()); rasterArea.setSize(dim); GridEnvelope2D range = new GridEnvelope2D(rasterArea); gg.setValue(new GridGeometry2D(range, envelope)); RasterManager manager = reader.getRasterManager(reader.getGridCoverageNames()[0]); RasterLayerRequest request = new RasterLayerRequest(new GeneralParameterValue[] { gg }, manager); RasterLayerResponse response = new RasterLayerResponse(request, manager, new DefaultSubmosaicProducerFactory()); GridCoverage2D coverage = response.createResponse(); URL sourceUrl = (URL) coverage.getProperty(GridCoverage2DReader.SOURCE_URL_PROPERTY); assertNotNull(sourceUrl); assertEquals("file", sourceUrl.getProtocol()); assertTrue(sourceUrl.getPath().endsWith(".tif")); } finally { if (reader != null) { try { reader.dispose(); } catch (Throwable t) { // we tried } } } } }