package org.geotools.gce.imagemosaic;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageReadParam;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.gce.imagemosaic.Granule.Level;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.operation.transform.AffineTransform2D;
import org.geotools.test.TestData;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValue;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.NoninvertibleTransformException;
/**
* Testing {@link Granule} class.
*
* @author Daniele Romagnoli, GeoSolutions SAS
* @author Stefan Alfons Krueger (alfonx), Wikisquare.de : Support for jar:file:foo.jar/bar.properties URLs
*
*
* @source $URL$
*/
public class GranuleTest extends Assert {
private static final double DELTA = 10E-6;
private static final double DELTASCALE = 10E-2;
private static final CoordinateReferenceSystem CRS = AbstractGridFormat.getDefaultCRS();
private static final ReferencedEnvelope TEST_BBOX = new ReferencedEnvelope(12.139578206197234,15.036279855058655,40.5313698832181,42.5511689138571,CRS);
public GranuleTest() {
}
@Test
public void testGranuleLevels() throws FileNotFoundException, IOException {
//get some test data
final URL testUrl= TestData.url(this, "/overview/0/D220161A.tif");
testUrl.openStream().close();
//Create a Granule
final Granule granule = new Granule(TEST_BBOX,testUrl);
assertNotNull(granule.toString());
//Get a Level
final Level level = granule.getLevel(2);
assertNotNull(level);
final int h = level.getHeight();
final int w = level.getWidth();
assertEquals(47, h);
assertEquals(35, w);
final double scaleX = level.getScaleX();
final double scaleY = level.getScaleY();
assertEquals("ScaleX not equal", scaleX, 4.0d, DELTASCALE);
assertEquals("ScaleY not equal", scaleY, 3.9788d, DELTASCALE);
final Rectangle rect = level.getBounds();
assertEquals(rect.x, 0);
assertEquals(rect.y, 0);
assertEquals(rect.width, 35);
assertEquals(rect.height, 47);
final AffineTransform btlTransform = level.getBaseToLevelTransform();
final double[] baseMatrix = new double[6];
btlTransform.getMatrix(baseMatrix);
assertEquals("m00 not equal", baseMatrix[0], 4.0d, DELTASCALE);
assertEquals("m10 not equal", baseMatrix[1], 0.0d, DELTA);
assertEquals("m01 not equal", baseMatrix[2], 0.0d, DELTA);
assertEquals("m11 not equal", baseMatrix[3], 3.9788d, DELTASCALE);
assertEquals("m02 not equal", baseMatrix[4], 0.0d, DELTA);
assertEquals("m12 not equal", baseMatrix[5], 0.0d, DELTA);
final AffineTransform2D g2wtTransform = level.getGridToWorldTransform();
final double[] g2wMatrix = new double[6];
g2wtTransform.getMatrix(g2wMatrix);
assertEquals("m00 not equal", g2wMatrix[0], 0.08276290425318347d, DELTASCALE);
assertEquals("m10 not equal", g2wMatrix[1], 0.0d, DELTA);
assertEquals("m01 not equal", g2wMatrix[2], 0.0d, DELTA);
assertEquals("m11 not equal", g2wMatrix[3], -0.04297444746040424d, DELTASCALE);
assertEquals("m02 not equal", g2wMatrix[4], 12.139578206197234d, DELTA);
assertEquals("m12 not equal", g2wMatrix[5], 42.5511689138571d, DELTA);
}
@Test
public void testLoadRaster() throws FileNotFoundException, IOException, NoninvertibleTransformException {
//get some test data
final File testMosaic = TestData.file(this, "/rgb");
assertTrue(testMosaic.exists());
final URL testUrl= TestData.url(this, "/rgb/global_mosaic_12.png");
testUrl.openStream().close();
final Granule granule = new Granule(TEST_BBOX,testUrl);
final Level level = granule.getLevel(0);
assertNotNull(level);
final ImageMosaicReader reader = (ImageMosaicReader) new ImageMosaicFormat().getReader(testMosaic);
assertNotNull(reader);
final RasterManager manager = new RasterManager(reader);
// use imageio with defined tiles
final ParameterValue<Boolean> useJai = ImageMosaicFormat.USE_JAI_IMAGEREAD.createValue();
useJai.setValue(false);
final ParameterValue<String> tileSize = ImageMosaicFormat.SUGGESTED_TILE_SIZE.createValue();
tileSize.setValue("10,10");
// Creating a request
final RasterLayerRequest request = new RasterLayerRequest(new GeneralParameterValue[] {useJai ,tileSize},manager);
final ImageReadParam readParameters = new ImageReadParam();
readParameters.setSourceRegion(new Rectangle(0,0,50,50));
final AffineTransform2D gridToWorldTransform = level.getGridToWorldTransform();
final RenderedImage raster = granule.loadRaster(readParameters, 0, TEST_BBOX, gridToWorldTransform.inverse(), request, new Dimension(10,10)).getRaster();
assertEquals(raster.getWidth(), 50);
assertEquals(raster.getHeight(), 50);
AffineTransform translate = new AffineTransform(gridToWorldTransform);
translate.preConcatenate(AffineTransform.getTranslateInstance(2, 2));
final RenderedImage translatedRaster = granule.loadRaster(readParameters, 0, TEST_BBOX, new AffineTransform2D(translate).inverse(), request, new Dimension(10,10)).getRaster();
assertEquals(translatedRaster.getWidth(), 50);
assertEquals(translatedRaster.getHeight(), 50);
}
@Before
public void setUp() throws Exception {
//force initial ImageIO set up and reordering
new ImageMosaicFormatFactory();
}
}