/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2013, Geomatys * * 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.geotoolkit.processing.coverage.pgpyramid; import java.awt.Dimension; import java.awt.Point; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferFloat; import java.awt.image.RenderedImage; import java.awt.image.WritableRaster; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.media.jai.RasterFactory; import org.apache.sis.geometry.GeneralDirectPosition; import org.apache.sis.geometry.GeneralEnvelope; import org.geotoolkit.storage.coverage.GridMosaic; import org.geotoolkit.storage.coverage.GridMosaicCoverage2D; import org.geotoolkit.coverage.GridSampleDimension; import org.geotoolkit.storage.coverage.Pyramid; import org.geotoolkit.storage.coverage.PyramidalCoverageReference; import org.geotoolkit.coverage.grid.GridCoverage2D; import org.geotoolkit.coverage.memory.MPCoverageStore; import org.geotoolkit.storage.coverage.DefaultCoverageReference; import org.geotoolkit.util.NamesExt; import org.geotoolkit.image.interpolation.InterpolationCase; import org.geotoolkit.process.ProcessDescriptor; import org.geotoolkit.process.ProcessFinder; import org.apache.sis.referencing.CommonCRS; import org.geotoolkit.image.BufferedImages; import org.junit.Test; import org.opengis.util.GenericName; import org.opengis.geometry.Envelope; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * * @author Johann Sorel (Geomatys) */ public class PyramidTest extends org.geotoolkit.test.TestBase { /** * Just test there is no error on this simple case. * @throws Exception */ @Test public void testPyramid() throws Exception{ final CoordinateReferenceSystem crs = CommonCRS.WGS84.normalizedGeographic(); final int tileSize = 256; final GeneralDirectPosition upperLeft = new GeneralDirectPosition(crs); upperLeft.setCoordinate(-180,90); final MPCoverageStore store = new MPCoverageStore(); final GenericName name = NamesExt.create(null, "test"); final PyramidalCoverageReference pcr = (PyramidalCoverageReference) store.create(name); final List<GridSampleDimension> dims = new ArrayList<GridSampleDimension>(); final GridSampleDimension dim1 = new GridSampleDimension("sampleDesc1"); final GridSampleDimension dim2 = new GridSampleDimension("sampleDesc2"); dims.add(dim1); dims.add(dim2); pcr.setSampleDimensions(dims); final Pyramid pyramid = pcr.createPyramid(crs); final GridMosaic mosaic = pcr.createMosaic(pyramid.getId(), new Dimension(2, 1), new Dimension(tileSize, tileSize), upperLeft, 1); final RenderedImage tile1 = createImage(2, tileSize, tileSize); pcr.writeTile(pyramid.getId(), mosaic.getId(), 0, 0, tile1); final RenderedImage tile2 = createImage(2, tileSize, tileSize); pcr.writeTile(pyramid.getId(), mosaic.getId(), 1, 0, tile2); final GridCoverage2D coverage = GridMosaicCoverage2D.create(pcr, mosaic); final double[] scales = new double[]{360.0/256.0}; final GeneralEnvelope env = new GeneralEnvelope(crs); env.setRange(0, -180, +180); env.setRange(1, -90, +90); final Map<Envelope, double[]> res = new HashMap<>(); res.put(env, scales); final ProcessDescriptor desc = ProcessFinder.getProcessDescriptor("coverage", "coveragepyramid"); final ParameterValueGroup input = desc.getInputDescriptor().createValue(); input.parameter("coverageref").setValue(new DefaultCoverageReference(coverage, name)); input.parameter("in_coverage_store").setValue(store); input.parameter("tile_size").setValue(new Dimension(tileSize, tileSize)); input.parameter("interpolation_type").setValue(InterpolationCase.NEIGHBOR); input.parameter("pyramid_name").setValue(name.tip().toString()); input.parameter("resolution_per_envelope").setValue(res); final org.geotoolkit.process.Process p = desc.createProcess(input); p.call(); } public static RenderedImage createImage(int nbband, int width, int height){ final float[] data = new float[nbband*width*height]; final int[] bankIndices = new int[nbband]; final int[] bandOffsets = new int[nbband]; for(int i=0;i<nbband;i++){ bandOffsets[i] = i*width*height; } final DataBuffer dataBuffer = new DataBufferFloat(data, data.length); final int scanlinestride = width; final WritableRaster raster = RasterFactory.createBandedRaster(dataBuffer, width, height, scanlinestride, bankIndices, bandOffsets, new Point(0,0)); final ColorModel cm = BufferedImages.createGrayScaleColorModel(DataBuffer.TYPE_FLOAT, nbband,0, -10, +10); final RenderedImage image = new BufferedImage(cm, raster, false, null); return image; } }