/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.wcs; import static org.geoserver.data.test.MockData.TASMANIA_BM; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.StringReader; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.servlet.ServletResponse; import javax.xml.namespace.QName; import org.apache.commons.io.IOUtils; import org.custommonkey.xmlunit.XMLAssert; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.DimensionPresentation; import org.geoserver.catalog.ResourceInfo; import org.geoserver.config.GeoServer; import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; import org.geoserver.util.EntityResolverProvider; import org.geoserver.wcs.kvp.Wcs10GetCoverageRequestReader; import org.geoserver.wcs.test.WCSTestSupport; import org.geoserver.wcs.xml.v1_0_0.WcsXmlReader; import org.geotools.coverage.grid.GeneralGridEnvelope; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.coverage.processing.operation.MultiplyConst; import org.geotools.data.DataSourceException; import org.geotools.gce.geotiff.GeoTiffFormat; import org.geotools.gce.geotiff.GeoTiffReader; import org.geotools.geometry.GeneralEnvelope; import org.geotools.metadata.iso.spatial.PixelTranslation; import org.geotools.referencing.CRS; import org.geotools.referencing.operation.transform.AffineTransform2D; import org.geotools.wcs.WCSConfiguration; import org.geotools.xml.PreventLocalEntityResolver; import org.junit.Before; import org.junit.Test; import org.opengis.coverage.grid.GridCoverage; import org.opengis.coverage.grid.GridEnvelope; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.datum.PixelInCell; import org.opengis.referencing.operation.MathTransform; import org.springframework.mock.web.MockHttpServletResponse; import org.w3c.dom.Document; import net.opengis.wcs10.GetCoverageType; /** * Tests for GetCoverage operation on WCS. * * @author Simone Giannecchini, GeoSolutions SAS * */ public class GetCoverageTest extends WCSTestSupport { private Wcs10GetCoverageRequestReader kvpreader; private WebCoverageService100 service; private WCSConfiguration configuration; private WcsXmlReader xmlReader; private Catalog catalog; private static final QName MOSAIC = new QName(MockData.SF_URI, "rasterFilter", MockData.SF_PREFIX); private static final QName SPATIO_TEMPORAL = new QName(MockData.SF_URI, "spatio-temporal", MockData.SF_PREFIX); @Before public void setUp() { kvpreader = (Wcs10GetCoverageRequestReader) applicationContext.getBean("wcs100GetCoverageRequestReader"); service = (WebCoverageService100) applicationContext.getBean("wcs100ServiceTarget"); configuration = new WCSConfiguration(); catalog=(Catalog)applicationContext.getBean("catalog"); xmlReader = new WcsXmlReader("GetCoverage", "1.0.0", configuration, EntityResolverProvider.RESOLVE_DISABLED_PROVIDER); } @Override protected void onSetUp(SystemTestData testData) throws Exception { super.onSetUp(testData); testData.addRasterLayer(MOSAIC, "raster-filter-test.zip", null, getCatalog()); testData.addRasterLayer(SPATIO_TEMPORAL, "spatio-temporal.zip", null, null, SystemTestData.class, getCatalog()); testData.addRasterLayer(new QName(MockData.WCS_URI, "category", MockData.WCS_PREFIX), "category.tiff", null, getCatalog()); // enable dimensions on the water temperature layer setupRasterDimension(WATTEMP, ResourceInfo.TIME, DimensionPresentation.LIST, null); setupRasterDimension(WATTEMP, ResourceInfo.ELEVATION, DimensionPresentation.LIST, null); } private Map<String, Object> baseMap() { Map<String, Object> raw = new HashMap<String, Object>(); raw.put("service", "WCS"); raw.put("version", "1.0.0"); raw.put("request", "GetCoverage"); return raw; } @Test public void testDomainSubsetRxRy() throws Exception { // get base coverage final GridCoverage baseCoverage = catalog.getCoverageByName(TASMANIA_BM.getLocalPart()).getGridCoverage(null, null); final AffineTransform2D expectedTx = (AffineTransform2D) baseCoverage.getGridGeometry().getGridToCRS(); final GeneralEnvelope originalEnvelope = (GeneralEnvelope) baseCoverage.getEnvelope(); final GeneralEnvelope newEnvelope=new GeneralEnvelope(originalEnvelope); newEnvelope.setEnvelope( originalEnvelope.getMinimum(0), originalEnvelope.getMaximum(1)-originalEnvelope.getSpan(1)/2, originalEnvelope.getMinimum(0)+originalEnvelope.getSpan(0)/2, originalEnvelope.getMaximum(1) ); final MathTransform cornerWorldToGrid = PixelTranslation.translate(expectedTx,PixelInCell.CELL_CENTER,PixelInCell.CELL_CORNER); final GeneralGridEnvelope expectedGridEnvelope = new GeneralGridEnvelope(CRS.transform(cornerWorldToGrid.inverse(), newEnvelope),PixelInCell.CELL_CORNER,false); final StringBuilder envelopeBuilder= new StringBuilder(); envelopeBuilder.append(newEnvelope.getMinimum(0)).append(","); envelopeBuilder.append(newEnvelope.getMinimum(1)).append(","); envelopeBuilder.append(newEnvelope.getMaximum(0)).append(","); envelopeBuilder.append(newEnvelope.getMaximum(1)); Map<String, Object> raw = baseMap(); final String layerID = getLayerId(TASMANIA_BM); raw.put("sourcecoverage", layerID); raw.put("version", "1.0.0"); raw.put("format", "image/geotiff"); raw.put("BBox", envelopeBuilder.toString()); raw.put("crs", "EPSG:4326"); raw.put("resx", Double.toString(expectedTx.getScaleX())); raw.put("resy", Double.toString(Math.abs(expectedTx.getScaleY()))); final GridCoverage[] coverages = executeGetCoverageKvp(raw); final GridCoverage2D result=(GridCoverage2D) coverages[0]; assertTrue(coverages.length==1); final AffineTransform2D tx = (AffineTransform2D) result.getGridGeometry().getGridToCRS(); assertEquals("resx",expectedTx.getScaleX(),tx.getScaleX(),1E-6); assertEquals("resx",Math.abs(expectedTx.getScaleY()),Math.abs(tx.getScaleY()),1E-6); final GridEnvelope gridEnvelope = result.getGridGeometry().getGridRange(); assertEquals("w",180,gridEnvelope.getSpan(0)); assertEquals("h",180,gridEnvelope.getSpan(1)); assertEquals("grid envelope",expectedGridEnvelope, gridEnvelope); // dispose CoverageCleanerCallback.disposeCoverage(baseCoverage); CoverageCleanerCallback.disposeCoverage(coverages[0]); } @Test public void testDeferredLoading() throws Exception { Map<String, Object> raw = baseMap(); final String getLayerId = getLayerId(SPATIO_TEMPORAL); raw.put("sourcecoverage", getLayerId); raw.put("format", "image/tiff"); raw.put("BBox", "-90,-180,90,180"); raw.put("crs", "EPSG:4326"); raw.put("resx", "0.001"); raw.put("resy", "0.001"); GridCoverage[] coverages = executeGetCoverageKvp(raw); assertEquals(1, coverages.length); assertDeferredLoading(coverages[0].getRenderedImage()); } @Test public void testWorkspaceQualified() throws Exception { String queryString ="&request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff&bbox=146,-45,147,-42"+ "&crs=EPSG:4326&width=150&height=150"; ServletResponse response = getAsServletResponse( "wcs?sourcecoverage="+TASMANIA_BM.getLocalPart()+queryString); assertTrue(response.getContentType().startsWith("image/tiff")); Document dom = getAsDOM( "cdf/wcs?sourcecoverage="+TASMANIA_BM.getLocalPart()+queryString); assertEquals("ServiceExceptionReport", dom.getDocumentElement().getNodeName()); } @Test public void testNonExistentCoverage() throws Exception { String queryString ="&request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff&bbox=146,-45,147,-42"+ "&crs=EPSG:4326&width=150&height=150"; Document dom = getAsDOM( "wcs?sourcecoverage=NotThere" + queryString); // print(dom); XMLAssert.assertXpathEvaluatesTo("InvalidParameterValue", "/ServiceExceptionReport/ServiceException/@code", dom); XMLAssert.assertXpathEvaluatesTo("sourcecoverage", "/ServiceExceptionReport/ServiceException/@locator", dom); } @Test public void testRequestDisabledResource() throws Exception { Catalog catalog = getCatalog(); ResourceInfo tazbm = catalog.getResourceByName(getLayerId(MockData.TASMANIA_BM), ResourceInfo.class); try { tazbm.setEnabled(false); catalog.save(tazbm); String queryString = "&request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff&bbox=146,-45,147,-42" + "&crs=EPSG:4326&width=150&height=150"; Document dom = getAsDOM("wcs?sourcecoverage=" + TASMANIA_BM.getLocalPart() + queryString); // print(dom); assertEquals("ServiceExceptionReport", dom.getDocumentElement().getNodeName()); } finally { tazbm.setEnabled(true); catalog.save(tazbm); } } @Test public void testLayerQualified() throws Exception { String queryString ="&request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff&bbox=146,-45,147,-42"+ "&crs=EPSG:4326&width=150&height=150"; MockHttpServletResponse response = getAsServletResponse( "wcs/BlueMarble/wcs?sourcecoverage=BlueMarble"+queryString); assertTrue(response.getContentType().startsWith("image/tiff")); String disposition = response.getHeader("Content-Disposition"); assertTrue(disposition.endsWith("BlueMarble.tif")); Document dom = getAsDOM( "wcs/DEM/wcs?sourcecoverage=BlueMarble"+queryString); assertEquals("ServiceExceptionReport", dom.getDocumentElement().getNodeName()); } /** * Runs GetCoverage on the specified parameters and returns an array of coverages */ GridCoverage[] executeGetCoverageKvp(Map<String, Object> raw) throws Exception { final GetCoverageType getCoverage = (GetCoverageType) kvpreader.read(kvpreader.createRequest(),parseKvp(raw), raw); return service.getCoverage(getCoverage); } /** * Runs GetCoverage on the specified parameters and returns an array of coverages */ GridCoverage[] executeGetCoverageXml(String request) throws Exception { GetCoverageType getCoverage = (GetCoverageType) xmlReader.read(null, new StringReader( request), null); return service.getCoverage(getCoverage); } @Test public void testInputLimits() throws Exception { try { // ridicolous limit, just one byte setInputLimit(1); String queryString = "&request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff&bbox=146,-45,147,-42" + "&crs=EPSG:4326&width=150&height=150"; Document dom = getAsDOM("wcs/BlueMarble/wcs?sourcecoverage=" + getLayerId(TASMANIA_BM) + queryString); // print(dom); // check it's an error, check we're getting it because of the input limits assertEquals("ServiceExceptionReport", dom.getDocumentElement().getNodeName()); String error = xpath.evaluate( "/ServiceExceptionReport/ServiceException/text()", dom).trim(); assertTrue(error.matches(".*read too much data.*")); } finally { setInputLimit(0); } } @Test public void testOutputLimits() throws Exception { try { // ridicolous limit, just one byte setOutputLimit(1); String queryString = "&request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff&bbox=146,-45,147,-42" + "&crs=EPSG:4326&width=150&height=150"; Document dom = getAsDOM("wcs/BlueMarble/wcs?sourcecoverage=" + getLayerId(TASMANIA_BM) + queryString); // print(dom); // check it's an error, check we're getting it because of the output limits assertEquals("ServiceExceptionReport", dom.getDocumentElement().getNodeName()); String error = xpath.evaluate( "/ServiceExceptionReport/ServiceException/text()", dom).trim(); assertTrue(error.matches(".*generate too much data.*")); } finally { setOutputLimit(0); } } @Test public void testReproject() throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<GetCoverage version=\"1.0.0\" service=\"WCS\" " + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " + "xmlns=\"http://www.opengis.net/wcs\" " + "xmlns:ows=\"http://www.opengis.net/ows/1.1\" " + "xmlns:gml=\"http://www.opengis.net/gml\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\" " + "xsi:schemaLocation=\"http://www.opengis.net/wcs http://schemas.opengis.net/wcs/1.0.0/getCoverage.xsd\">\n" + " <sourceCoverage>" + getLayerId(TASMANIA_BM) + "</sourceCoverage>\n" + " <domainSubset>\n" + " <spatialSubset>\n" + " <gml:Envelope srsName=\"EPSG:4326\">\n" + " <gml:pos>146 -45</gml:pos>\n" + " <gml:pos>147 42</gml:pos>\n" + " </gml:Envelope>\n" + " <gml:Grid dimension=\"2\">\n" + " <gml:limits>\n" + " <gml:GridEnvelope>\n" + " <gml:low>0 0</gml:low>\n" + " <gml:high>150 150</gml:high>\n" + " </gml:GridEnvelope>\n" + " </gml:limits>\n" + " <gml:axisName>x</gml:axisName>\n" + " <gml:axisName>y</gml:axisName>\n" + " </gml:Grid>\n" + " </spatialSubset>\n" + " </domainSubset>\n" + " <output>\n" + " <crs>EPSG:3857</crs>\n" + " <format>image/geotiff</format>\n" + " </output>\n" + "</GetCoverage>"; MockHttpServletResponse response = postAsServletResponse("wcs", xml); assertEquals("image/tiff", response.getContentType()); GeoTiffFormat format = new GeoTiffFormat(); GridCoverage2DReader reader = format.getReader(getBinaryInputStream(response)); assertEquals(CRS.decode("EPSG:3857"), reader.getOriginalEnvelope().getCoordinateReferenceSystem()); } @Test public void testEntityExpansion() throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!DOCTYPE GetCoverage [<!ELEMENT GetCoverage (sourceCoverage) >\n" + " <!ATTLIST GetCoverage\n" + " service CDATA #FIXED \"WCS\"\n" + " version CDATA #FIXED \"1.0.0\"\n" + " xmlns CDATA #FIXED \"http://www.opengis.net/wcs\">\n" + " <!ELEMENT sourceCoverage (#PCDATA) >\n" + " <!ENTITY xxe SYSTEM \"FILE:///file/not/there?.XSD\" >]>\n" + "<GetCoverage version=\"1.0.0\" service=\"WCS\"" + " xmlns=\"http://www.opengis.net/wcs\" >\n" + " <sourceCoverage>&xxe;</sourceCoverage>\n" + "</GetCoverage>"; Document dom = postAsDOM("wcs", xml); String error = xpath.evaluate("//ServiceException", dom); assertTrue(error.contains(PreventLocalEntityResolver.ERROR_MESSAGE_BASE)); xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<!DOCTYPE GetCoverage [<!ELEMENT GetCoverage (sourceCoverage) >\n" + " <!ATTLIST GetCoverage\n" + " service CDATA #FIXED \"WCS\"\n" + " version CDATA #FIXED \"1.0.0\"\n" + " xmlns CDATA #FIXED \"http://www.opengis.net/wcs\">\n" + " <!ELEMENT sourceCoverage (#PCDATA) >\n" + " <!ENTITY xxe SYSTEM \"jar:file:///file/not/there?.XSD\" >]>\n" + "<GetCoverage version=\"1.0.0\" service=\"WCS\"" + " xmlns=\"http://www.opengis.net/wcs\" >\n" + " <sourceCoverage>&xxe;</sourceCoverage>\n" + "</GetCoverage>"; dom = postAsDOM("wcs", xml); error = xpath.evaluate("//ServiceException", dom); assertTrue(error.contains(PreventLocalEntityResolver.ERROR_MESSAGE_BASE)); } @Test public void testRasterFilterGreen() throws Exception { String queryString = "wcs?sourcecoverage=" + getLayerId(MOSAIC) + "&request=getcoverage" + "&service=wcs&version=1.0.0&&format=image/tiff&crs=EPSG:4326" + "&bbox=0,0,1,1&CQL_FILTER=location like 'green%25'&width=150&height=150"; MockHttpServletResponse response = getAsServletResponse(queryString); // make sure we can read the coverage back RenderedImage image = readTiff(response); // check the pixel int[] pixel = new int[3]; image.getData().getPixel(0, 0, pixel); assertEquals(0, pixel[0]); assertEquals(255, pixel[1]); assertEquals(0, pixel[2]); } /** * Parses teh TIFF contained in the response as a {@link RenderedImage} * @param response * * @throws IOException */ RenderedImage readTiff(MockHttpServletResponse response) throws IOException { ImageReader reader = ImageIO.getImageReadersByFormatName("tiff").next(); reader.setInput(ImageIO.createImageInputStream(getBinaryInputStream(response))); return reader.read(0); } @Test public void testTimeFirstPOST() throws Exception { String request = getWaterTempTimeRequest("2008-10-31T00:00:00.000Z"); MockHttpServletResponse response = postAsServletResponse("wcs", request); /* gdallocationinfo NCOM_wattemp_000_20081031T0000000_12.tiff 10 10 Report: Location: (10P,10L) Band 1: Value: 18.2659999176394 */ checkPixelValue(response, 10, 10, 18.2659999176394); } @Test public void testTimeFirstKVP() throws Exception { String queryString ="request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff" + "&bbox=0.237,40.562,14.593,44.558&crs=EPSG:4326&width=25&height=25&time=2008-10-31T00:00:00.000Z" + "&coverage=" + getLayerId(WATTEMP); MockHttpServletResponse response = getAsServletResponse("wcs?" + queryString); checkPixelValue(response, 10, 10, 18.2659999176394); } @Test public void testTimeRangeKVP() throws Exception { setupRasterDimension(TIMERANGES, ResourceInfo.TIME, DimensionPresentation.LIST, null); setupRasterDimension(TIMERANGES, ResourceInfo.ELEVATION, DimensionPresentation.LIST, null); String baseUrl ="wcs?request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff" + "&bbox=0.237,40.562,14.593,44.558&crs=EPSG:4326&width=25&height=25" + "&coverage=" + getLayerId(TIMERANGES); // last range MockHttpServletResponse response = getAsServletResponse(baseUrl + "&TIME=2008-11-05T00:00:00.000Z/2008-11-06T12:00:00.000Z"); assertEquals("image/tiff", response.getContentType()); checkPixelValue(response, 10, 10, 13.337999683572); // middle hole, no data --> we should get back an exception Document dom = getAsDOM(baseUrl + "&TIME=2008-11-04T12:00:00.000Z/2008-11-04T16:00:00.000Z"); // print(dom); XMLAssert.assertXpathEvaluatesTo("1", "count(//ServiceExceptionReport)", dom); // first range response = getAsServletResponse(baseUrl + "&TIME=2008-10-31T12:00:00.000Z/2008-10-31T16:00:00.000Z"); assertEquals("image/tiff", response.getContentType()); checkPixelValue(response, 10, 10, 18.2659999176394); } private void checkPixelValue(MockHttpServletResponse response, int x, int y, double value) throws IOException, FileNotFoundException, DataSourceException { // save File tiffFile = File.createTempFile("wcs", "", new File("target")); try { IOUtils.copy(getBinaryInputStream(response), new FileOutputStream(tiffFile)); // make sure we can read the coverage back GeoTiffReader reader = new GeoTiffReader(tiffFile); GridCoverage2D result = reader.read(null); // check a pixel double[] pixel = new double[1]; result.getRenderedImage().getData().getPixel(x, y, pixel); assertEquals(value, pixel[0], 1e-6); } finally { tiffFile.delete(); } } @Test public void testTimeSecond() throws Exception { String request = getWaterTempTimeRequest("2008-11-01T00:00:00.000Z"); MockHttpServletResponse response = postAsServletResponse("wcs", request); checkPixelValue(response, 10, 10, 18.2849999185419); } @Test public void testTimeKVPNow() throws Exception { String queryString ="request=getcoverage&service=wcs&version=1.0.0&format=image/geotiff" + "&bbox=0.237,40.562,14.593,44.558&crs=EPSG:4326&width=25&height=25&time=now" + "&coverage=" + getLayerId(WATTEMP); MockHttpServletResponse response = getAsServletResponse("wcs?" + queryString); checkPixelValue(response, 10, 10, 18.2849999185419); } @Test public void testElevationFirst() throws Exception { String request = getWaterTempElevationRequest("0.0"); MockHttpServletResponse response = postAsServletResponse("wcs", request); assertEquals("image/tiff", response.getContentType()); // same result as time first checkPixelValue(response, 10, 10, 18.2849999185419); } @Test public void testElevationSecond() throws Exception { String request = getWaterTempElevationRequest("100.0"); MockHttpServletResponse response = postAsServletResponse("wcs", request); assertEquals("image/tiff", response.getContentType()); /* gdallocationinfo NCOM_wattemp_100_20081101T0000000_12.tiff 10 10 Report: Location: (10P,10L) Band 1: Value: 13.337999683572 */ checkPixelValue(response, 10, 10, 13.337999683572); } private String getWaterTempElevationRequest(String elevation) { String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<GetCoverage version=\"1.0.0\" service=\"WCS\"\n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.opengis.net/wcs\"\n" + " xmlns:ows=\"http://www.opengis.net/ows/1.1\" xmlns:gml=\"http://www.opengis.net/gml\"\n" + " xmlns:ogc=\"http://www.opengis.net/ogc\"\n" + " xsi:schemaLocation=\"http://www.opengis.net/wcs http://schemas.opengis.net/wcs/1.0.0/getCoverage.xsd\">\n" + " <sourceCoverage>" + getLayerId(WATTEMP) + "</sourceCoverage>\n" + " <domainSubset>\n" + " <spatialSubset>\n" + " <gml:Envelope srsName=\"EPSG:4326\">\n" + " <gml:pos>0.237 40.562</gml:pos>\n" + " <gml:pos>14.593 44.558</gml:pos>\n" + " </gml:Envelope>\n" + " <gml:Grid dimension=\"2\">\n" + " <gml:limits>\n" + " <gml:GridEnvelope>\n" + " <gml:low>0 0</gml:low>\n" + " <gml:high>25 24</gml:high>\n" + " </gml:GridEnvelope>\n" + " </gml:limits>\n" + " <gml:axisName>x</gml:axisName>\n" + " <gml:axisName>y</gml:axisName>\n" + " </gml:Grid>\n" + " </spatialSubset>\n" + " </domainSubset>\n" + " <rangeSubset>\n" + " <axisSubset name=\"ELEVATION\">\n" + " <singleValue>" + elevation + "</singleValue>\n" + " </axisSubset>\n" + " </rangeSubset>\n" + " <output>\n" + " <crs>EPSG:4326</crs>\n" + " <format>GEOTIFF</format>\n" + " </output>\n" + "</GetCoverage>"; return request; } private String getWaterTempTimeRequest(String date) { String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<GetCoverage version=\"1.0.0\" service=\"WCS\"\n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.opengis.net/wcs\"\n" + " xmlns:ows=\"http://www.opengis.net/ows/1.1\" xmlns:gml=\"http://www.opengis.net/gml\"\n" + " xmlns:ogc=\"http://www.opengis.net/ogc\"\n" + " xsi:schemaLocation=\"http://www.opengis.net/wcs http://schemas.opengis.net/wcs/1.0.0/getCoverage.xsd\">\n" + " <sourceCoverage>" + getLayerId(WATTEMP) + "</sourceCoverage>\n" + " <domainSubset>\n" + " <spatialSubset>\n" + " <gml:Envelope srsName=\"EPSG:4326\">\n" + " <gml:pos>0.237 40.562</gml:pos>\n" + " <gml:pos>14.593 44.558</gml:pos>\n" + " </gml:Envelope>\n" + " <gml:Grid dimension=\"2\">\n" + " <gml:limits>\n" + " <gml:GridEnvelope>\n" + " <gml:low>0 0</gml:low>\n" + " <gml:high>25 25</gml:high>\n" + " </gml:GridEnvelope>\n" + " </gml:limits>\n" + " <gml:axisName>x</gml:axisName>\n" + " <gml:axisName>y</gml:axisName>\n" + " </gml:Grid>\n" + " </spatialSubset>\n" + " <temporalSubset>\n" + " <gml:timePosition>" + date + "</gml:timePosition>\n" + " </temporalSubset>\n" + " </domainSubset>\n" + " <output>\n" + " <crs>EPSG:4326</crs>\n" + " <format>GEOTIFF</format>\n" + " </output>\n" + "</GetCoverage>"; return request; } @Test public void testRasterFilterRed() throws Exception { String queryString = "wcs?sourcecoverage=" + getLayerId(MOSAIC) + "&request=getcoverage" + "&service=wcs&version=1.0.0&format=image/tiff&crs=EPSG:4326" + "&bbox=0,0,1,1&CQL_FILTER=location like 'red%25'&width=150&height=150"; MockHttpServletResponse response = getAsServletResponse(queryString); RenderedImage image = readTiff(response); // check the pixel int[] pixel = new int[3]; image.getData().getPixel(0, 0, pixel); assertEquals(255, pixel[0]); assertEquals(0, pixel[1]); assertEquals(0, pixel[2]); } @Test public void testCategoriesToArray() throws Exception { CoverageInfo myCoverage = getCatalog().getCoverageByName("category"); GridCoverage gridCoverage = myCoverage.getGridCoverage(null, null); MultiplyConst op = new MultiplyConst(); final ParameterValueGroup param = op.getParameters(); param.parameter("Source").setValue(gridCoverage); param.parameter("constants").setValue(new double[] { 0.1 }); boolean exception = false; try { op.doOperation(param, null); } catch (Exception e) { exception = true; } assertFalse(exception); } private void setInputLimit(int kbytes) { GeoServer gs = getGeoServer(); WCSInfo info = gs.getService(WCSInfo.class); info.setMaxInputMemory(kbytes); gs.save(info); } private void setOutputLimit(int kbytes) { GeoServer gs = getGeoServer(); WCSInfo info = gs.getService(WCSInfo.class); info.setMaxOutputMemory(kbytes); gs.save(info); } }