/* (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 static org.junit.Assert.assertNotEquals;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
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.data.test.TestData;
import org.geoserver.test.GeoServerSystemTestSupport;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.coverage.grid.io.footprint.FootprintBehavior;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.parameter.DefaultParameterDescriptor;
import org.junit.Test;
import org.opengis.coverage.grid.GridCoverage;
import org.opengis.coverage.grid.GridCoverageReader;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValue;
public class CoverageViewTest extends GeoServerSystemTestSupport {
private static final String RGB_IR_VIEW = "RgbIrView";
protected static QName WATTEMP = new QName(MockData.SF_URI, "watertemp", MockData.SF_PREFIX);
protected static QName IR_RGB= new QName(MockData.SF_URI, "ir-rgb", MockData.SF_PREFIX);
@Override
protected void setUpTestData(SystemTestData testData) throws Exception {
super.setUpTestData(testData);
testData.setUpDefaultRasterLayers();
testData.setUpRasterLayer(WATTEMP, "watertemp.zip", null, null, TestData.class);
testData.setUpRasterLayer(IR_RGB, "ir-rgb.zip", null, null, TestData.class);
}
@Override
protected void onSetUp(SystemTestData testData) throws Exception {
super.onSetUp(testData);
// setup the coverage view
final Catalog cat = getCatalog();
final CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("ir-rgb");
final CoverageView coverageView = buildRgbIRView();
final CatalogBuilder builder = new CatalogBuilder(cat);
builder.setStore(storeInfo);
final CoverageInfo coverageInfo = coverageView.createCoverageInfo(RGB_IR_VIEW, storeInfo,
builder);
coverageInfo.getParameters().put("USE_JAI_IMAGEREAD", "false");
coverageInfo.getDimensions().get(0).setName("Red");
coverageInfo.getDimensions().get(1).setName("Green");
coverageInfo.getDimensions().get(2).setName("Blue");
coverageInfo.getDimensions().get(3).setName("Infrared");
cat.add(coverageInfo);
}
private CoverageView buildRgbIRView() {
final CoverageBand rBand = new CoverageBand(
Arrays.asList(new InputCoverageBand("rgb", "0")), "rband", 0,
CompositionType.BAND_SELECT);
final CoverageBand gBand = new CoverageBand(
Arrays.asList(new InputCoverageBand("rgb", "1")), "gband", 1,
CompositionType.BAND_SELECT);
final CoverageBand bBand = new CoverageBand(
Arrays.asList(new InputCoverageBand("rgb", "2")), "bband", 2,
CompositionType.BAND_SELECT);
final CoverageBand irBand = new CoverageBand(
Collections.singletonList(new InputCoverageBand("ir", "0")), "irband", 3,
CompositionType.BAND_SELECT);
final CoverageView coverageView = new CoverageView(RGB_IR_VIEW,
Arrays.asList(rBand, gBand, bBand, irBand));
return coverageView;
}
@Test
public void testPreserveCoverageBandNames() throws Exception {
final Catalog cat = getCatalog();
final CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("ir-rgb");
final CoverageView coverageView = buildRgbIRView();
final CatalogBuilder builder = new CatalogBuilder(cat);
builder.setStore(storeInfo);
final CoverageInfo coverageInfo = coverageView.createCoverageInfo(RGB_IR_VIEW, storeInfo,
builder);
List<CoverageDimensionInfo> dimensions = coverageInfo.getDimensions();
assertEquals("rband", dimensions.get(0).getName());
assertEquals("gband", dimensions.get(1).getName());
assertEquals("bband", dimensions.get(2).getName());
assertEquals("irband", dimensions.get(3).getName());
}
/**
*/
@Test
public void testCoverageView() throws Exception {
final Catalog cat = getCatalog();
final CoverageStoreInfo storeInfo = cat.getCoverageStoreByName("watertemp");
final InputCoverageBand band = new InputCoverageBand("watertemp", "0");
final CoverageBand outputBand = new CoverageBand(Collections.singletonList(band), "watertemp@0",
0, CompositionType.BAND_SELECT);
final CoverageView coverageView = new CoverageView("waterView",
Collections.singletonList(outputBand));
final CatalogBuilder builder = new CatalogBuilder(cat);
builder.setStore(storeInfo);
final CoverageInfo coverageInfo = coverageView.createCoverageInfo("waterView", storeInfo, builder);
coverageInfo.getParameters().put("USE_JAI_IMAGEREAD","false");
cat.add(coverageInfo);
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, "waterView", bbox, null);
assertEquals(coverage.getNumSampleDimensions(), 1);
((GridCoverage2D) coverage).dispose(true);
final GridCoverageReader reader = resPool.getGridCoverageReader(coverageInfo, null);
reader.dispose();
}
/**
*/
@Test
public void testBands() throws Exception {
// Test input bands
final InputCoverageBand u = new InputCoverageBand("u-component", "0");
final InputCoverageBand v = new InputCoverageBand("u-component", "0");
assertEquals(u,v);
final InputCoverageBand empty = new InputCoverageBand();
v.setCoverageName("v-component");
v.setBand("1");
assertNotEquals(u,v);
assertNotEquals(u,empty);
// Test output bands
final CoverageBand outputBandU = new CoverageBand(Collections.singletonList(u), "u@1", 0,
CompositionType.BAND_SELECT);
final CoverageBand outputBandV = new CoverageBand();
outputBandV.setInputCoverageBands(Collections.singletonList(v));
outputBandV.setDefinition("v@0");
outputBandV.setIndex(1);
outputBandV.setCompositionType(CompositionType.BAND_SELECT);
assertNotEquals(outputBandU, outputBandV);
// Test compositions
CompositionType defaultComposition = CompositionType.getDefault();
assertEquals("Band Selection", defaultComposition.displayValue());
assertEquals("BAND_SELECT", defaultComposition.toValue());
assertEquals(outputBandU.getCompositionType() , defaultComposition);
// Test coverage views
final List<CoverageBand> bands = new ArrayList<CoverageBand>();
bands.add(outputBandU);
bands.add(outputBandV);
final CoverageView coverageView = new CoverageView("wind", bands);
final CoverageView sameViewDifferentName = new CoverageView();
sameViewDifferentName.setName("winds");
sameViewDifferentName.setCoverageBands(bands);
assertNotEquals(coverageView, sameViewDifferentName);
assertEquals(coverageView.getBand(1), outputBandV);
assertEquals(outputBandU, coverageView.getBands("u-component").get(0));
assertEquals(2, coverageView.getSize());
assertEquals(2, coverageView.getCoverageBands().size());
assertEquals("wind", coverageView.getName());
}
@Test
public void testRGBIrToRGB() throws IOException {
Catalog cat = getCatalog();
CoverageInfo coverageInfo = cat.getCoverageByName(RGB_IR_VIEW);
final ResourcePool rp = cat.getResourcePool();
GridCoverageReader reader = rp.getGridCoverageReader(coverageInfo, RGB_IR_VIEW, null);
// no transparency due to footprint
GeneralParameterValue[] params = buildFootprintBandParams(FootprintBehavior.None, new int[] {0, 1, 2});
GridCoverage solidCoverage = reader.read(params);
try {
// System.out.println(solidCoverage);
assertBandNames(solidCoverage, "Red", "Green", "Blue");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
// dynamic tx due to footprint
params = buildFootprintBandParams(FootprintBehavior.Transparent, new int[] {0, 1, 2});
GridCoverage txCoverage = reader.read(params);
try {
// System.out.println(txCoverage);
assertBandNames(txCoverage, "Red", "Green", "Blue", "ALPHA_BAND");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
}
@Test
public void testRGBIrToIr() throws IOException {
Catalog cat = getCatalog();
CoverageInfo coverageInfo = cat.getCoverageByName(RGB_IR_VIEW);
final ResourcePool rp = cat.getResourcePool();
GridCoverageReader reader = rp.getGridCoverageReader(coverageInfo, RGB_IR_VIEW, null);
// get IR, no transparency due to footprint
GeneralParameterValue[] params = buildFootprintBandParams(FootprintBehavior.None, new int[] {3});
GridCoverage solidCoverage = reader.read(RGB_IR_VIEW, params);
try {
// System.out.println(solidCoverage);
assertBandNames(solidCoverage, "Infrared");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
// get IR, dynamic tx due to footprint
params = buildFootprintBandParams(FootprintBehavior.Transparent, new int[] {3});
GridCoverage txCoverage = reader.read(RGB_IR_VIEW, params);
try {
// System.out.println(txCoverage);
assertBandNames(txCoverage, "Infrared", "ALPHA_BAND");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
}
@Test
public void testRGBIrToIrGB() throws IOException {
Catalog cat = getCatalog();
CoverageInfo coverageInfo = cat.getCoverageByName(RGB_IR_VIEW);
final ResourcePool rp = cat.getResourcePool();
GridCoverageReader reader = rp.getGridCoverageReader(coverageInfo, RGB_IR_VIEW, null);
// get IR, no transparency due to footprint
GeneralParameterValue[] params = buildFootprintBandParams(FootprintBehavior.None, new int[] {3, 1, 2});
GridCoverage solidCoverage = reader.read(RGB_IR_VIEW, params);
try {
// System.out.println(solidCoverage);
assertBandNames(solidCoverage, "Infrared", "Green", "Blue");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
// get IR, dynamic tx due to footprint
params = buildFootprintBandParams(FootprintBehavior.Transparent, new int[] {3, 1, 2});
GridCoverage txCoverage = reader.read(RGB_IR_VIEW, params);
try {
// System.out.println(txCoverage);
assertBandNames(txCoverage, "Infrared", "Green", "Blue", "ALPHA_BAND");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
}
@Test
public void testRGBIrToRed() throws IOException {
Catalog cat = getCatalog();
CoverageInfo coverageInfo = cat.getCoverageByName(RGB_IR_VIEW);
final ResourcePool rp = cat.getResourcePool();
GridCoverageReader reader = rp.getGridCoverageReader(coverageInfo, RGB_IR_VIEW, null);
// get IR, no transparency due to footprint
GeneralParameterValue[] params = buildFootprintBandParams(FootprintBehavior.None, new int[] {0});
GridCoverage solidCoverage = reader.read(RGB_IR_VIEW, params);
try {
// System.out.println(solidCoverage);
assertBandNames(solidCoverage, "Red");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
// get IR, dynamic tx due to footprint
params = buildFootprintBandParams(FootprintBehavior.Transparent, new int[] {0});
GridCoverage txCoverage = reader.read(RGB_IR_VIEW, params);
try {
// System.out.println(txCoverage);
assertBandNames(txCoverage, "Red", "ALPHA_BAND");
} finally {
((GridCoverage2D) solidCoverage).dispose(true);
}
}
private void assertBandNames(GridCoverage coverage, String... bandNames) {
assertEquals(bandNames.length, coverage.getNumSampleDimensions());
for (int i = 0; i < bandNames.length; i++) {
String expectedName = bandNames[i];
String actualName = coverage.getSampleDimension(i).getDescription().toString();
assertEquals(expectedName, actualName);
}
}
private GeneralParameterValue[] buildFootprintBandParams(FootprintBehavior footprintBehavior,
int[] bands) {
final List<ParameterValue<?>> parameters = new ArrayList<ParameterValue<?>>();
parameters.add(new DefaultParameterDescriptor<>(
AbstractGridFormat.FOOTPRINT_BEHAVIOR.getName().toString(),
AbstractGridFormat.FOOTPRINT_BEHAVIOR.getValueClass(), null,
footprintBehavior.name()).createValue());
parameters.add(new DefaultParameterDescriptor<>(AbstractGridFormat.BANDS.getName().toString(),
AbstractGridFormat.BANDS.getValueClass(), null, bands).createValue());
return (GeneralParameterValue[]) parameters
.toArray(new GeneralParameterValue[parameters.size()]);
}
}