package org.geoserver.wcs2_0.kvp; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertNotNull; import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import java.io.File; import java.util.Arrays; import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; import org.geoserver.wcs2_0.exception.WCS20Exception.WCS20ExceptionCode; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.gce.geotiff.GeoTiffReader; import org.geotools.geometry.Envelope2D; import org.geotools.geometry.GeneralEnvelope; import org.geotools.image.ImageWorker; import org.geotools.util.logging.Logging; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.springframework.mock.web.MockHttpServletResponse; import org.w3c.dom.Document; /** * Testing Scaling Extension KVP * @author Simone Giannecchini, GeoSolutions SAS * */ @RunWith(Parameterized.class) public class ScaleKvpTest extends WCSKVPTestSupport { private Logger LOGGER= Logging.getLogger(ScaleKvpTest.class); private String axisPrefix; private String subsetPrefix; @Parameters public static Collection<Object[]> data() { return Arrays.asList(new Object[][] { {"", ""}, {"http://www.opengis.net/def/axis/OGC/1/", "http://www.opengis.net/def/axis/OGC/0/"} }); } public ScaleKvpTest(String axisPrefix, String subsetPrefix) { this.axisPrefix = axisPrefix; this.subsetPrefix = subsetPrefix; } @Test public void capabilties() throws Exception { final File xml= new File("./src/test/resources/getcapabilities/getCap.xml"); final String request= FileUtils.readFileToString(xml); Document dom = postAsDOM("wcs", request); // print(dom); // check the KVP extension 1.0.1 assertXpathEvaluatesTo("1", "count(//ows:ServiceIdentification[ows:Profile='http://www.opengis.net/spec/WCS_service-extension_range-subsetting/1.0/conf/record-subsetting'])", dom); // proper case enforcing on values dom = getAsDOM("wcs?request=Getcapabilities&service=wCS"); // print(dom); // check that we have the crs extension assertXpathEvaluatesTo("1", "count(//ows:ExceptionReport)", dom); assertXpathEvaluatesTo("1", "count(//ows:ExceptionReport//ows:Exception)", dom); assertXpathEvaluatesTo("1", "count(//ows:ExceptionReport//ows:Exception[@exceptionCode='InvalidParameterValue'])", dom); assertXpathEvaluatesTo("1", "count(//ows:ExceptionReport//ows:Exception[@locator='wCS'])", dom); } @Test public void scaleFactor() throws Exception { // subsample MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEFACTOR=0.5"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one GeoTiffReader readerTarget = new GeoTiffReader(file); GridCoverage2D targetCoverage = null, sourceCoverage=null; try { targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(0)/2, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(1)/2, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // upsample response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEFACTOR=2"); assertEquals("image/tiff", response.getContentType()); tiffContents = getBinary(response); file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one readerTarget = new GeoTiffReader(file); try { targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(0)*2, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(1)*2, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // error 0 response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEFACTOR=0"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidScaleFactor.getExceptionCode(), "0.0"); // error < 0 response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEFACTOR=-12"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidScaleFactor.getExceptionCode(), "-12.0"); } @Test public void scaleAxesByFactor() throws Exception { // subsample MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEAXES=" + axisPrefix + "i(0.5)," + axisPrefix + "j(0.5)"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one GeoTiffReader readerTarget = new GeoTiffReader(file); GridCoverage2D targetCoverage = null, sourceCoverage=null; try { targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(0)/2, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(1)/2, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // upsample response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEAXES=" + axisPrefix + "i(2)," + axisPrefix + "j(2)"); assertEquals("image/tiff", response.getContentType()); tiffContents = getBinary(response); file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one readerTarget = new GeoTiffReader(file); try { targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(0)*2, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(sourceCoverage.getGridGeometry().getGridRange().getSpan(1)*2, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // error 0 response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEAXES=" + axisPrefix + "i(0)," + axisPrefix + "j(0.5)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidScaleFactor.getExceptionCode(), "0.0"); // error < 0 response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEAXES=" + axisPrefix + "i(-1)," + axisPrefix + "j(0.5)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidScaleFactor.getExceptionCode(), "-1.0"); } @Test public void scaleToSize() throws Exception { // check we can read it as a TIFF and it is similar to the original one GeoTiffReader readerTarget = null; GridCoverage2D targetCoverage = null, sourceCoverage=null; try { // source sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D(); // subsample MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff" + "&subset=" + subsetPrefix + "Long(" +sourceEnvelope.x+","+(sourceEnvelope.x+sourceEnvelope.width/2)+")"+ "&subset=" + subsetPrefix + "Lat(" +sourceEnvelope.y+","+(sourceEnvelope.y+sourceEnvelope.height/2)+")" + "&SCALESIZE=" + axisPrefix + "i(50)," + axisPrefix + "j(50)"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); readerTarget = new GeoTiffReader(file); targetCoverage = readerTarget.read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); final GeneralEnvelope finalEnvelope= new GeneralEnvelope( new double[]{sourceEnvelope.x,sourceEnvelope.y}, new double[]{sourceEnvelope.x+sourceEnvelope.width/2,sourceEnvelope.y+sourceEnvelope.height/2}); finalEnvelope.setCoordinateReferenceSystem(sourceCoverage.getCoordinateReferenceSystem()); assertEquals(50, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(50, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); // get extrema assertEquals(29.0,new ImageWorker(targetCoverage.getRenderedImage()).getMaximums()[0]); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } try { // source sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D(); // upsample MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALESIZE=" + axisPrefix + "i(1000)," + axisPrefix + "j(1000)&" + "&subset=" + subsetPrefix + "Long(" +sourceEnvelope.x+","+(sourceEnvelope.x+sourceEnvelope.width/2)+")"+ "&subset=" + subsetPrefix + "Lat(" +sourceEnvelope.y+","+(sourceEnvelope.y+sourceEnvelope.height/2)+")"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one readerTarget = new GeoTiffReader(file); targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); final GeneralEnvelope finalEnvelope= new GeneralEnvelope( new double[]{sourceEnvelope.x,sourceEnvelope.y}, new double[]{sourceEnvelope.x+sourceEnvelope.width*2,sourceEnvelope.y+sourceEnvelope.height*2}); finalEnvelope.setCoordinateReferenceSystem(sourceCoverage.getCoordinateReferenceSystem()); // get extrema assertEquals(29.0,new ImageWorker(targetCoverage.getRenderedImage()).getMaximums()[0]); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // error 0 MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALESIZE=" + axisPrefix + "i(100)," + axisPrefix + "j(0)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "0"); // error < 0 response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALESIZE=" + axisPrefix + "i(-2)," + axisPrefix + "j(100)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "-2"); } @Test public void scaleToExtent() throws Exception { // subsample MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(0,99)," + axisPrefix + "j(0,99)"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one GeoTiffReader readerTarget = new GeoTiffReader(file); GridCoverage2D targetCoverage = null, sourceCoverage=null; try { targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // upsample response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(100,1099)," + axisPrefix + "j(100,1099)"); assertEquals("image/tiff", response.getContentType()); tiffContents = getBinary(response); file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one readerTarget = new GeoTiffReader(file); try { targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); // geotiff encoding looses the min values and pushes to zero assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(0)); assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(1)); assertEquals(999, targetCoverage.getGridGeometry().getGridRange().getHigh(0)); assertEquals(999, targetCoverage.getGridGeometry().getGridRange().getHigh(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // test coverage directly to make sure we respect LLC & URC try { targetCoverage = (GridCoverage2D) executeGetCoverage("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(100,1099)," + axisPrefix + "j(100,1099)"); assertNotNull(targetCoverage); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks // assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); // assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getLow(0)); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getLow(1)); assertEquals(1099, targetCoverage.getGridGeometry().getGridRange().getHigh(0)); assertEquals(1099, targetCoverage.getGridGeometry().getGridRange().getHigh(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // error minx > maxx response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(1000,0)," + axisPrefix + "j(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "0"); // error minx == maxx response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(1000,1000)," + axisPrefix + "j(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "1000"); // error miny > maxy response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "j(1000,0)," + axisPrefix + "i(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "0"); // error miny == maxy response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "j(1000,1000)," + axisPrefix + "i(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "1000"); } @Test public void scaleToExtentWithTrim() throws Exception { GeoTiffReader readerTarget = null; GridCoverage2D targetCoverage = null, sourceCoverage=null; try { // source sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D(); // subsample MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(50,149)," + axisPrefix + "j(50,149)" + "&subset=" + subsetPrefix + "Long(" +sourceEnvelope.x+","+(sourceEnvelope.x+sourceEnvelope.width/2)+")"+ "&subset=" + subsetPrefix + "Lat(" +sourceEnvelope.y+","+(sourceEnvelope.y+sourceEnvelope.height/2)+")"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); readerTarget = new GeoTiffReader(file); targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); final GeneralEnvelope finalEnvelope= new GeneralEnvelope( new double[]{sourceEnvelope.x,sourceEnvelope.y}, new double[]{sourceEnvelope.x+sourceEnvelope.width/2,sourceEnvelope.y+sourceEnvelope.height/2}); finalEnvelope.setCoordinateReferenceSystem(sourceCoverage.getCoordinateReferenceSystem()); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); // get extrema assertEquals(29.0,new ImageWorker(targetCoverage.getRenderedImage()).getMaximums()[0]); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } try { // source sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); final Envelope2D sourceEnvelope = sourceCoverage.getEnvelope2D(); // upsample MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(100,1099)," + axisPrefix + "j(100,1099)" + "&subset=" + subsetPrefix + "Long(" +sourceEnvelope.x+","+(sourceEnvelope.x+sourceEnvelope.width/2)+")"+ "&subset=" + subsetPrefix + "Lat(" +sourceEnvelope.y+","+(sourceEnvelope.y+sourceEnvelope.height/2)+")"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // check we can read it as a TIFF and it is similare to the origina one readerTarget = new GeoTiffReader(file); targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); final GeneralEnvelope finalEnvelope= new GeneralEnvelope( new double[]{sourceEnvelope.x,sourceEnvelope.y}, new double[]{sourceEnvelope.x+sourceEnvelope.width/2,sourceEnvelope.y+sourceEnvelope.height/2}); finalEnvelope.setCoordinateReferenceSystem(sourceCoverage.getCoordinateReferenceSystem()); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); // geotiff encoding looses the min values and pushes to zero assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(0)); assertEquals(0, targetCoverage.getGridGeometry().getGridRange().getLow(1)); assertEquals(999, targetCoverage.getGridGeometry().getGridRange().getHigh(0)); assertEquals(999, targetCoverage.getGridGeometry().getGridRange().getHigh(1)); // get extrema assertEquals(29.0,new ImageWorker(targetCoverage.getRenderedImage()).getMaximums()[0]); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // test coverage directly to make sure we respect LLC & URC try { targetCoverage = (GridCoverage2D) executeGetCoverage("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(100,1099)," + axisPrefix + "j(100,1099)"); assertNotNull(targetCoverage); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks // assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); // assertEnvelopeEquals(sourceCoverage, targetCoverage); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(0)); assertEquals(1000, targetCoverage.getGridGeometry().getGridRange().getSpan(1)); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getLow(0)); assertEquals(100, targetCoverage.getGridGeometry().getGridRange().getLow(1)); assertEquals(1099, targetCoverage.getGridGeometry().getGridRange().getHigh(0)); assertEquals(1099, targetCoverage.getGridGeometry().getGridRange().getHigh(1)); } finally { try{ readerTarget.dispose(); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { LOGGER.log(Level.WARNING,e.getLocalizedMessage(),e); } } // error minx > maxx MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(1000,0)," + axisPrefix + "j(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "0"); // error minx == maxx response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "i(1000,1000)," + axisPrefix + "j(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "1000"); // error miny > maxy response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "j(1000,0)," + axisPrefix + "i(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "0"); // error miny == maxy response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&SCALEEXTENT=" + axisPrefix + "j(1000,1000)," + axisPrefix + "i(0,1000)"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WCS20ExceptionCode.InvalidExtent.getExceptionCode(), "1000"); } }