/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2014 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.catalog; import static org.junit.Assert.assertEquals; import java.awt.image.ColorModel; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.media.jai.ImageLayout; import javax.xml.namespace.QName; import org.geoserver.catalog.CoverageView.CompositionType; import org.geoserver.catalog.CoverageView.CoverageBand; import org.geoserver.catalog.CoverageView.InputCoverageBand; import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; import org.geoserver.test.GeoServerSystemTestSupport; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.io.AbstractGridFormat; import org.geotools.coverage.grid.io.GranuleStore; import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.coverage.grid.io.StructuredGridCoverage2DReader; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.factory.CommonFactoryFinder; import org.geotools.gce.imagemosaic.catalog.index.Indexer.Coverages.Coverage; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.parameter.DefaultParameterDescriptor; import org.geotools.parameter.Parameter; import org.junit.Assert; import org.junit.Test; import org.opengis.coverage.grid.GridCoverage; import org.opengis.coverage.grid.GridCoverageReader; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory2; import org.opengis.parameter.GeneralParameterValue; /** * Base support class for CoverageViews based on multiple coverages from the same store. * * @author Daniele Romagnoli, GeoSolutions * */ public class CoverageViewReaderTest extends GeoServerSystemTestSupport { public final static FilterFactory2 FF = CommonFactoryFinder.getFilterFactory2(); protected static QName CURRENT = new QName(MockData.SF_URI, "regional_currents", MockData.SF_PREFIX); private CoverageView coverageView = null; private CoverageView multiBandCoverageView = null; @Override protected void setUpTestData(SystemTestData testData) throws Exception { super.setUpTestData(testData); testData.setUpDefaultRasterLayers(); testData.setUpRasterLayer(CURRENT, "currents.zip", null, null, CoverageViewReaderTest.class); } @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); createMultiBandCoverageView(); addMultiBandViewToCatalog(); } private void addViewToCatalog() throws Exception { final Catalog cat = getCatalog(); final CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("regional_currents"); final CatalogBuilder builder = new CatalogBuilder(cat); builder.setStore(storeInfo); final CoverageInfo coverageInfo = coverageView.createCoverageInfo("regional_currents", storeInfo, builder); coverageInfo.getParameters().put("USE_JAI_IMAGEREAD","false"); cat.add(coverageInfo); final LayerInfo layerInfo = builder.buildLayer(coverageInfo); cat.add(layerInfo); } private void addMultiBandViewToCatalog() throws Exception { final Catalog cat = getCatalog(); CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("multiband"); CatalogBuilder builder = new CatalogBuilder(cat); builder.setStore(storeInfo); // Reordered bands coverage CoverageInfo coverageInfo = multiBandCoverageView.createCoverageInfo("multiband_select", storeInfo, builder); coverageInfo.getParameters().put("USE_JAI_IMAGEREAD", "false"); cat.add(coverageInfo); final LayerInfo layerInfoView = builder.buildLayer(coverageInfo); cat.add(layerInfoView); } private void createCoverageView() throws Exception { final InputCoverageBand band_u = new InputCoverageBand("u-component_of_current_surface", "0"); final CoverageBand outputBand_u = new CoverageBand(Collections.singletonList(band_u), "u-component_of_current_surface@0", 0, CompositionType.BAND_SELECT); final InputCoverageBand band_v = new InputCoverageBand("v-component_of_current_surface", "0"); final CoverageBand outputBand_v = new CoverageBand(Collections.singletonList(band_v), "v-component_of_current_surface@0", 1, CompositionType.BAND_SELECT); final List<CoverageBand> coverageBands = new ArrayList<CoverageBand>(2); coverageBands.add(outputBand_u); coverageBands.add(outputBand_v); coverageView = new CoverageView("regional_currents", coverageBands); } private void createMultiBandCoverageView() throws Exception { final InputCoverageBand ib0 = new InputCoverageBand("multiband", "2"); final CoverageBand b0 = new CoverageBand(Collections.singletonList(ib0), "multiband@2", 0, CompositionType.BAND_SELECT); final InputCoverageBand ib1 = new InputCoverageBand("multiband", "1"); final CoverageBand b1 = new CoverageBand(Collections.singletonList(ib1), "multiband@1", 1, CompositionType.BAND_SELECT); final InputCoverageBand ib2 = new InputCoverageBand("multiband", "0"); final CoverageBand b2 = new CoverageBand(Collections.singletonList(ib2), "multiband@0", 2, CompositionType.BAND_SELECT); final InputCoverageBand ib3 = new InputCoverageBand("multiband", "0"); final CoverageBand b3 = new CoverageBand(Collections.singletonList(ib3), "multiband@0", 0, CompositionType.BAND_SELECT); final InputCoverageBand ib4 = new InputCoverageBand("multiband", "1"); final CoverageBand b4 = new CoverageBand(Collections.singletonList(ib4), "multiband@1", 1, CompositionType.BAND_SELECT); final List<CoverageBand> coverageBands = new ArrayList<CoverageBand>(1); coverageBands.add(b0); coverageBands.add(b1); coverageBands.add(b2); coverageBands.add(b3); coverageBands.add(b4); multiBandCoverageView = new CoverageView("multiband_select", coverageBands); } /** */ @Test public void testCoverageView() throws Exception { createCoverageView(); addViewToCatalog(); final Catalog cat = getCatalog(); final CoverageInfo coverageInfo = cat.getCoverageByName("regional_currents"); final MetadataMap metadata = coverageInfo.getMetadata(); final CoverageView metadataCoverageView = (CoverageView) metadata.get(CoverageView.COVERAGE_VIEW); assertEquals(metadataCoverageView, coverageView); final ResourcePool resPool = cat.getResourcePool(); final ReferencedEnvelope bbox = coverageInfo.getLatLonBoundingBox(); final GridCoverage coverage = resPool.getGridCoverage(coverageInfo, "regional_currents", bbox, null); assertEquals(coverage.getNumSampleDimensions(), 2); ((GridCoverage2D) coverage).dispose(true); final GridCoverageReader reader = resPool.getGridCoverageReader(coverageInfo, "regional_currents", null); final GranuleStore granules = (GranuleStore) ((StructuredGridCoverage2DReader) reader).getGranules("regional_currents", true); SimpleFeatureCollection granulesCollection = granules.getGranules(null); assertEquals(1, granulesCollection.size()); final Filter filter = FF.equal(FF.property("location"), FF.literal("sample.grb2"), true); final int removed = granules.removeGranules(filter); assertEquals (1, removed); granulesCollection = granules.getGranules(null); assertEquals(0, granulesCollection.size()); GridCoverage2DReader myReader = (GridCoverage2DReader) reader; ImageLayout layout = myReader.getImageLayout(); SampleModel sampleModel = layout.getSampleModel(null); assertEquals (2, sampleModel.getNumBands()); ColorModel colorModel = layout.getColorModel(null); assertEquals (2, colorModel.getNumComponents()); reader.dispose(); } /** * Test creation of a Coverage from a multi band CoverageView using an * {@link org.geotools.coverage.grid.io.AbstractGridFormat#BANDS} reading parameter */ @Test public void testBandSelectionOnCoverageView() throws Exception { final Catalog cat = getCatalog(); final CoverageInfo coverageInfo = cat.getCoverageByName("multiband_select"); final MetadataMap metadata = coverageInfo.getMetadata(); final ResourcePool resPool = cat.getResourcePool(); final ReferencedEnvelope bbox = coverageInfo.getLatLonBoundingBox(); final GridCoverage coverage = resPool.getGridCoverage(coverageInfo, "multiband_select", bbox, null); RenderedImage srcImage = coverage.getRenderedImage(); assertEquals(coverage.getNumSampleDimensions(), 5); ((GridCoverage2D) coverage).dispose(true); final GridCoverageReader reader = resPool.getGridCoverageReader(coverageInfo, "multiband_select", null); int[] bandIndices = new int[]{2,0,1,0,2,2,2,3}; Parameter<int[]> bandIndicesParam = null; if (bandIndices != null) { bandIndicesParam = (Parameter<int[]>) AbstractGridFormat.BANDS.createValue(); bandIndicesParam.setValue(bandIndices); } GridCoverage2DReader myReader = (GridCoverage2DReader) reader; ImageLayout layout = myReader.getImageLayout(); SampleModel sampleModel = layout.getSampleModel(null); assertEquals (5, sampleModel.getNumBands()); reader.dispose(); List<GeneralParameterValue> paramList = new ArrayList<GeneralParameterValue>(); paramList.addAll(Arrays.asList(bandIndicesParam)); GeneralParameterValue[] readParams = paramList.toArray(new GeneralParameterValue[paramList .size()]); GridCoverage result = reader.read(readParams); assertEquals (8, result.getNumSampleDimensions()); RenderedImage destImage = result.getRenderedImage(); int dWidth = destImage.getWidth(); int dHeight = destImage.getHeight(); int[] destImageRowBand0 = new int[dWidth*dHeight]; int[] destImageRowBand1 = new int[destImageRowBand0.length]; int[] destImageRowBand2 = new int[destImageRowBand0.length]; int[] destImageRowBand3 = new int[destImageRowBand0.length]; destImage.getData().getSamples(0, 0, dWidth, dHeight, 0, destImageRowBand0); destImage.getData().getSamples(0, 0, dWidth, dHeight, 1, destImageRowBand1); destImage.getData().getSamples(0, 0, dWidth, dHeight, 2, destImageRowBand2); destImage.getData().getSamples(0, 0, dWidth, dHeight, 3, destImageRowBand3); int sWidth = srcImage.getWidth(); int sHeight = srcImage.getHeight(); int[] srcImageRowBand0 = new int[sWidth*sHeight]; int[] srcImageRowBand1 = new int[srcImageRowBand0.length]; int[] srcImageRowBand2 = new int[srcImageRowBand0.length]; int[] srcImageRowBand3 = new int[srcImageRowBand0.length]; srcImage.getData().getSamples(0, 0, sWidth, sHeight, 0, srcImageRowBand0); srcImage.getData().getSamples(0, 0, sWidth, sHeight, 1, srcImageRowBand1); srcImage.getData().getSamples(0, 0, sWidth, sHeight, 2, srcImageRowBand2); Assert.assertTrue(Arrays.equals(destImageRowBand0,srcImageRowBand2)); Assert.assertTrue(Arrays.equals(destImageRowBand1,srcImageRowBand0)); Assert.assertTrue(Arrays.equals(destImageRowBand2,srcImageRowBand1)); Assert.assertTrue(Arrays.equals(destImageRowBand3,srcImageRowBand0)); Assert.assertFalse(Arrays.equals(destImageRowBand0,srcImageRowBand0)); } /** * Test creation of a Coverage from a multi band CoverageView which has more bands * compared to the input CoverageView */ @Test public void testOutputWithMoreBandsThanInputCoverageView() throws Exception { final Catalog cat = getCatalog(); final CoverageInfo coverageInfo = cat.getCoverageByName("multiband_select"); final MetadataMap metadata = coverageInfo.getMetadata(); final ResourcePool resPool = cat.getResourcePool(); final ReferencedEnvelope bbox = coverageInfo.getLatLonBoundingBox(); final GridCoverage coverage = resPool.getGridCoverage(coverageInfo, "multiband_select", bbox, null); RenderedImage srcImage = coverage.getRenderedImage(); assertEquals(coverage.getNumSampleDimensions(), 5); ((GridCoverage2D) coverage).dispose(true); final GridCoverageReader reader = resPool.getGridCoverageReader(coverageInfo, "multiband_select", null); int[] bandIndices = new int[] { 2, 0, 1, 0, 2, 2, 2, 3, 4, 0, 1, 0, 4, 2, 3 }; Parameter<int[]> bandIndicesParam = null; if (bandIndices != null) { bandIndicesParam = (Parameter<int[]>) AbstractGridFormat.BANDS.createValue(); bandIndicesParam.setValue(bandIndices); } GridCoverage2DReader myReader = (GridCoverage2DReader) reader; ImageLayout layout = myReader.getImageLayout(); SampleModel sampleModel = layout.getSampleModel(null); assertEquals(5, sampleModel.getNumBands()); reader.dispose(); List<GeneralParameterValue> paramList = new ArrayList<GeneralParameterValue>(); paramList.addAll(Arrays.asList(bandIndicesParam)); GeneralParameterValue[] readParams = paramList .toArray(new GeneralParameterValue[paramList.size()]); GridCoverage result = myReader.read(readParams); assertEquals(15, result.getNumSampleDimensions()); } }