/* * Geotoolkit.org - 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.merge; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import org.apache.sis.geometry.GeneralEnvelope; import org.geotoolkit.coverage.grid.GridCoverage2D; import org.geotoolkit.coverage.grid.GridCoverageBuilder; import org.geotoolkit.process.ProcessDescriptor; import org.geotoolkit.process.ProcessFinder; import org.geotoolkit.process.Process; import org.geotoolkit.process.ProcessException; import org.apache.sis.referencing.CommonCRS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.junit.Test; import org.opengis.coverage.Coverage; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.util.FactoryException; /** * * @author Johann Sorel (Geomatys) */ public class MergeTest extends org.geotoolkit.test.TestBase { private static final double DELTA = 0.000001; @Test public void mergeTest() throws NoSuchAuthorityCodeException, FactoryException, ProcessException{ //first image, CRS:84, 3 bytes, 4x scale final BufferedImage inputImage1 = new BufferedImage(1440, 720, BufferedImage.TYPE_3BYTE_BGR); final Graphics2D g = inputImage1.createGraphics(); g.setColor(Color.RED); g.fillRect(0, 0, 1440, 720); g.setColor(Color.GREEN); g.fillRect(720, 0, 720, 720); final GridCoverageBuilder gcb1 = new GridCoverageBuilder(); gcb1.setRenderedImage(inputImage1); gcb1.setCoordinateReferenceSystem(CommonCRS.WGS84.normalizedGeographic()); gcb1.setEnvelope(-180,-90,+180,+90); final GridCoverage2D inCoverage1 = (GridCoverage2D) gcb1.build(); //second image, EPSG:4326, 1 float, 2x scale final float[][] data = new float[720][360]; for(int x=0;x<360;x++){ for(int y=0;y<720;y++){ data[y][x] = x+y; } } final GridCoverageBuilder gcb2 = new GridCoverageBuilder(); gcb2.setRenderedImage(data); gcb2.setCoordinateReferenceSystem(CommonCRS.WGS84.geographic()); gcb2.setEnvelope(-90,-180,+90,+180); final GridCoverage2D inCoverage2 = (GridCoverage2D) gcb2.build(); //call the merge process final ProcessDescriptor desc = ProcessFinder.getProcessDescriptor("coverage", "merge"); assertNotNull(desc); final GeneralEnvelope penv = new GeneralEnvelope(CommonCRS.WGS84.normalizedGeographic()); penv.setRange(0, -45, 45); penv.setRange(1, -45, 45); final ParameterValueGroup params = desc.getInputDescriptor().createValue(); params.parameter("coverages").setValue(new Coverage[]{inCoverage1,inCoverage2}); params.parameter("envelope").setValue(penv); params.parameter("resolution").setValue(1); final Process process = desc.createProcess(params); final ParameterValueGroup result = process.call(); //check result coverage final GridCoverage2D outCoverage = (GridCoverage2D) result.parameter("result").getValue(); assertEquals(CommonCRS.WGS84.normalizedGeographic(), outCoverage.getCoordinateReferenceSystem()); assertEquals(penv.getMinimum(0), outCoverage.getEnvelope().getMinimum(0), DELTA); assertEquals(penv.getMinimum(1), outCoverage.getEnvelope().getMinimum(1), DELTA); assertEquals(penv.getMaximum(0), outCoverage.getEnvelope().getMaximum(0), DELTA); assertEquals(penv.getMaximum(1), outCoverage.getEnvelope().getMaximum(1), DELTA); final RenderedImage outImage = outCoverage.getRenderedImage(); final SampleModel outSampleModel = outImage.getSampleModel(); assertEquals(90, outImage.getWidth()); assertEquals(90, outImage.getHeight()); assertEquals(4, outSampleModel.getNumBands()); assertEquals(DataBuffer.TYPE_FLOAT, outSampleModel.getDataType()); //check values final Raster outRaster = outImage.getData(); final float[] sample = new float[4]; for(int y=0;y<90;y++){ for(int x=0;x<90;x++){ outRaster.getPixel(x, y, sample); //TODO check pixels } } } }