package org.geoserver.wcs2_0; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.xml.namespace.QName; import org.geoserver.catalog.CoverageInfo; import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.wcs.WCSInfo; import org.geoserver.wcs2_0.kvp.WCS20GetCoverageRequestReader; import org.geoserver.wcs2_0.response.MIMETypeMapper; import org.geoserver.wcs2_0.util.EnvelopeAxesLabelsMapper; import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.referencing.operation.transform.AffineTransform2D; import org.junit.Before; import org.junit.Test; import org.opengis.coverage.grid.GridEnvelope; import org.opengis.geometry.Envelope; import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.MathTransform; import net.opengis.wcs20.GetCoverageType; import net.opengis.wcs20.ScalingType; /** * Testing WCS 2.0 Core {@link GetCoverage} * * @author Simone Giannecchini, GeoSolutions SAS * @author Emanuele Tajariol, GeoSolutions SAS * */ public class GetCoverageTest extends WCSTestSupport { private static final QName RAIN = new QName(MockData.SF_URI, "rain", MockData.SF_PREFIX); private GridCoverage2DReader coverageReader; private AffineTransform2D originalMathTransform; @Override protected void onSetUp(SystemTestData testData) throws Exception { testData.addRasterLayer(RAIN, "rain.zip", "asc", getCatalog()); } @Before public void getRainReader() throws IOException { // get the original transform CoverageInfo ci = getCatalog().getCoverageByName(getLayerId(RAIN)); coverageReader = (GridCoverage2DReader) ci.getGridCoverageReader(null, null); originalMathTransform = (AffineTransform2D) coverageReader.getOriginalGridToWorld(PixelInCell.CELL_CORNER); } @Test public void testAllowSubsamplingOnScaleFactor() throws Exception { // setup a request Map<String, String> raw = setupGetCoverageRain(); raw.put("scalefactor", "0.5"); assertScalingByHalf(raw); } @Test public void testAllowSubsamplingOnScaleExtent() throws Exception { GridEnvelope range = coverageReader.getOriginalGridRange(); int width = range.getSpan(0); int height = range.getSpan(1); // setup a request Map<String, String> raw = setupGetCoverageRain(); raw.put("scaleextent", "i(0," + (width / 2) + "),j(0," + (height / 2) + ")"); assertScalingByHalf(raw); } private void assertScalingByHalf(Map<String, String> raw) throws Exception { Map kvp = parseKvp(raw); WCS20GetCoverageRequestReader reader = new WCS20GetCoverageRequestReader(); GetCoverageType getCoverageRequest = (GetCoverageType) reader.read(reader.createRequest(), kvp, raw); // setup a getcoverage object we can observe WCSInfo service = getGeoServer().getService(WCSInfo.class); EnvelopeAxesLabelsMapper axesMapper = GeoServerExtensions.bean(EnvelopeAxesLabelsMapper.class); MIMETypeMapper mimeMapper = GeoServerExtensions.bean(MIMETypeMapper.class); GetCoverage getCoverage = new GetCoverage(service, getCatalog(), axesMapper, mimeMapper) { @Override MathTransform getMathTransform(GridCoverage2DReader reader, Envelope subset, GridCoverageRequest request, PixelInCell pixelInCell, ScalingType scaling) throws IOException { MathTransform mt = super.getMathTransform(reader, subset, request, pixelInCell, scaling); // check we are giving the reader the expected scaling factor AffineTransform2D actual = (AffineTransform2D) mt; assertEquals(0.5, originalMathTransform.getScaleX() / actual.getScaleX(), 1e-6); assertEquals(0.5, originalMathTransform.getScaleY() / actual.getScaleY(), 1e-6); return mt; } }; getCoverage.run(getCoverageRequest); } private Map<String, String> setupGetCoverageRain() { Map<String, String> raw = new HashMap<>(); raw.put("service", "WCS"); raw.put("request", "GetCoverage"); raw.put("version", "2.0.1"); raw.put("coverageId", "sf__rain"); raw.put("format", "image/tiff"); return raw; } }