package org.geoserver.wcs2_0.kvp; import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import it.geosolutions.imageio.plugins.tiff.BaselineTIFFTagSet; import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageMetadata; import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReader; import it.geosolutions.imageioimpl.plugins.tiff.TIFFImageReaderSpi; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Map; import javax.imageio.IIOException; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.stream.FileImageInputStream; import javax.mail.BodyPart; import javax.mail.Multipart; import net.opengis.wcs20.GetCoverageType; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.geoserver.wcs.WCSInfo; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.factory.Hints; import org.geotools.gce.geotiff.GeoTiffReader; import org.geotools.geometry.GeneralEnvelope; import org.geotools.referencing.CRS; import org.geotools.referencing.CRS.AxisOrder; import org.geotools.referencing.operation.transform.AffineTransform2D; import org.geotools.resources.coverage.CoverageUtilities; import org.junit.Test; import org.vfny.geoserver.wcs.WcsException.WcsExceptionCode; import org.w3c.dom.Document; import org.springframework.mock.web.MockHttpServletResponse; public class GeoTiffKvpTest extends WCSKVPTestSupport { @Test public void extensionGeotiff() throws Exception { // complete GetCoverageType gc = parse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=theCoverage&compression=JPEG&jpeg_quality=75&predictor=None" + "&interleave=pixel&tiling=true&tileheight=256&tilewidth=256"); Map<String, Object> extensions = getExtensionsMap(gc); assertEquals("JPEG", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:compression")); assertEquals("75", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:jpeg_quality")); assertEquals("None", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:predictor")); assertEquals("pixel", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:interleave")); assertEquals("true", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tiling")); assertEquals("256", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tileheight")); assertEquals("256", extensions.get("http://www.opengis.net/wcs/geotiff/1.0:tilewidth")); } @Test public void wrongJPEGQuality() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=JPEG&jpeg_quality=-2&predictor=None" + "&interleave=pixel&tiling=true&tileheight=256&tilewidth=256"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.JpegQualityInvalid.toString(), "-2"); response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=JPEG&jpeg_quality=101&predictor=None" + "&interleave=pixel&tiling=true&tileheight=256&tilewidth=256"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.JpegQualityInvalid.toString(), "101"); response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=JPEG&jpeg_quality=101&predictor=aaa" + "&interleave=pixel&tiling=true&tileheight=256&tilewidth=256"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.JpegQualityInvalid.toString(), "101"); } @Test public void jpeg() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=JPEG&jpeg_quality=75"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); checkJpegTiff(tiffContents); } @Test public void jpegMediaType() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=JPEG&jpeg_quality=75&mediaType=multipart/related"); assertEquals("multipart/related", response.getContentType()); // parse the multipart, check there are two parts Multipart multipart = getMultipart(response); assertEquals(2, multipart.getCount()); BodyPart xmlPart = multipart.getBodyPart(0); assertEquals("application/gml+xml", xmlPart.getHeader("Content-Type")[0]); assertEquals("wcs", xmlPart.getHeader("Content-ID")[0]); Document gml = dom(xmlPart.getInputStream()); // print(gml); // check the gml part refers to the file as its range assertXpathEvaluatesTo("fileReference", "//gml:rangeSet/gml:File/gml:rangeParameters/@xlink:arcrole", gml); assertXpathEvaluatesTo("cid:/coverages/wcs__BlueMarble.tif", "//gml:rangeSet/gml:File/gml:rangeParameters/@xlink:href", gml); assertXpathEvaluatesTo("http://www.opengis.net/spec/GMLCOV_geotiff-coverages/1.0/conf/geotiff-coverage", "//gml:rangeSet/gml:File/gml:rangeParameters/@xlink:role", gml); assertXpathEvaluatesTo("cid:/coverages/wcs__BlueMarble.tif", "//gml:rangeSet/gml:File/gml:fileReference", gml); assertXpathEvaluatesTo("image/tiff", "//gml:rangeSet/gml:File/gml:mimeType", gml); BodyPart coveragePart = multipart.getBodyPart(1); assertEquals("/coverages/wcs__BlueMarble.tif", coveragePart.getHeader("Content-ID")[0]); assertEquals("image/tiff", coveragePart.getContentType()); // make sure we can read the coverage back and perform checks on it byte[] tiffContents = IOUtils.toByteArray(coveragePart.getInputStream()); checkJpegTiff(tiffContents); } private void checkJpegTiff(byte[] tiffContents) throws IOException, FileNotFoundException, IIOException { File file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // TODO: check the tiff structure is the one requested final TIFFImageReader reader = (TIFFImageReader) new TIFFImageReaderSpi().createReaderInstance(); reader.setInput(new FileImageInputStream(file)); // compression final TIFFImageMetadata metadata=(TIFFImageMetadata) reader.getImageMetadata(0); assertNotNull(metadata); IIOMetadataNode root = (IIOMetadataNode)reader.getImageMetadata(0).getAsTree(TIFFImageMetadata.nativeMetadataFormatName); IIOMetadataNode field = getTiffField(root, BaselineTIFFTagSet.TAG_COMPRESSION); assertNotNull(field); assertEquals("JPEG", field.getFirstChild().getFirstChild().getAttributes().item(1).getNodeValue()); assertEquals("7", field.getFirstChild().getFirstChild().getAttributes().item(0).getNodeValue()); IIOMetadataNode node = metadata.getStandardDataNode(); assertNotNull(node); assertEquals("PlanarConfiguration", node.getFirstChild().getNodeName()); assertEquals("PixelInterleaved", node.getFirstChild().getAttributes().item(0).getNodeValue()); // clean up reader.dispose(); } @Test public void interleaving() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&interleave=pixel"); 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); // TODO: check the tiff structure is the one requested final TIFFImageReader reader = (TIFFImageReader) new TIFFImageReaderSpi().createReaderInstance(); reader.setInput(new FileImageInputStream(file)); // compression final TIFFImageMetadata metadata=(TIFFImageMetadata) reader.getImageMetadata(0); assertNotNull(metadata); IIOMetadataNode node = metadata.getStandardDataNode(); assertNotNull(node); assertEquals("PlanarConfiguration", node.getFirstChild().getNodeName()); assertEquals("PixelInterleaved", node.getFirstChild().getAttributes().item(0).getNodeValue()); // clean up reader.dispose(); //unsupported or wrong response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&interleave=band"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.InterleavingNotSupported.toString(), "band"); response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&interleave=asds"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.InterleavingInvalid.toString(), "asds"); } @Test public void deflate() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=DEFLATE"); 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); // TODO: check the tiff structure is the one requested final TIFFImageReader reader = (TIFFImageReader) new TIFFImageReaderSpi().createReaderInstance(); reader.setInput(new FileImageInputStream(file)); // compression final TIFFImageMetadata metadata=(TIFFImageMetadata) reader.getImageMetadata(0); assertNotNull(metadata); IIOMetadataNode root = (IIOMetadataNode)reader.getImageMetadata(0).getAsTree(TIFFImageMetadata.nativeMetadataFormatName); IIOMetadataNode field = getTiffField(root, BaselineTIFFTagSet.TAG_COMPRESSION); assertNotNull(field); assertEquals("Deflate", field.getFirstChild().getFirstChild().getAttributes().item(1).getNodeValue()); assertEquals("32946", field.getFirstChild().getFirstChild().getAttributes().item(0).getNodeValue()); IIOMetadataNode node = metadata.getStandardDataNode(); assertNotNull(node); assertEquals("PlanarConfiguration", node.getFirstChild().getNodeName()); assertEquals("PixelInterleaved", node.getFirstChild().getAttributes().item(0).getNodeValue()); // clean up reader.dispose(); } @Test public void lzw() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=LZW&jpeg_quality=75"); 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); // TODO: check the tiff structure is the one requested final TIFFImageReader reader = (TIFFImageReader) new TIFFImageReaderSpi().createReaderInstance(); reader.setInput(new FileImageInputStream(file)); // compression final TIFFImageMetadata metadata=(TIFFImageMetadata) reader.getImageMetadata(0); assertNotNull(metadata); IIOMetadataNode root = (IIOMetadataNode)reader.getImageMetadata(0).getAsTree(TIFFImageMetadata.nativeMetadataFormatName); IIOMetadataNode field = getTiffField(root, BaselineTIFFTagSet.TAG_COMPRESSION); assertNotNull(field); assertEquals("LZW", field.getFirstChild().getFirstChild().getAttributes().item(1).getNodeValue()); assertEquals("5", field.getFirstChild().getFirstChild().getAttributes().item(0).getNodeValue()); IIOMetadataNode node = metadata.getStandardDataNode(); assertNotNull(node); assertEquals("PlanarConfiguration", node.getFirstChild().getNodeName()); assertEquals("PixelInterleaved", node.getFirstChild().getAttributes().item(0).getNodeValue()); // clean up reader.dispose(); } @Test public void tiling() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&tiling=true&tileheight=256&tilewidth=256"); 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); // TODO: check the tiff structure is the one requested final TIFFImageReader reader = (TIFFImageReader) new TIFFImageReaderSpi().createReaderInstance(); reader.setInput(new FileImageInputStream(file)); // tiling assertTrue(reader.isImageTiled(0)); assertEquals(256, reader.getTileHeight(0)); assertEquals(256, reader.getTileWidth(0)); IIOMetadataNode node =((TIFFImageMetadata) reader.getImageMetadata(0)).getStandardDataNode(); assertNotNull(node); assertEquals("PlanarConfiguration", node.getFirstChild().getNodeName()); assertEquals("PixelInterleaved", node.getFirstChild().getAttributes().item(0).getNodeValue()); // wrong values response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble" + "&interleave=pixel&tiling=true&tileheight=13&tilewidth=256"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.TilingInvalid.toString(), "13"); response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble" + "&interleave=pixel&tiling=true&tileheight=13&tilewidth=11"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.TilingInvalid.toString(), "11"); // default response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&tiling=true"); assertEquals("image/tiff", response.getContentType()); tiffContents = getBinary(response); file = File.createTempFile("bm_gtiff", "bm_gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); // TODO: check the tiff structure is the one requested reader.setInput(new FileImageInputStream(file)); // tiling assertTrue(reader.isImageTiled(0)); assertEquals(368, reader.getTileHeight(0)); assertEquals(368, reader.getTileWidth(0)); node =((TIFFImageMetadata) reader.getImageMetadata(0)).getStandardDataNode(); assertNotNull(node); assertEquals("PlanarConfiguration", node.getFirstChild().getNodeName()); assertEquals("PixelInterleaved", node.getFirstChild().getAttributes().item(0).getNodeValue()); // clean up reader.dispose(); } @Test public void overviewPolicy() throws Exception { // // // Different tests reading data to create a coverage which is half the size of the original one // across X and Y // // MockHttpServletResponse response = null; byte[] tiffContents = null; // Reading native resolution response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&overviewPolicy=IGNORE&scalesize=http://www.opengis.net/def/axis/OGC/1/i(180)," + "http://www.opengis.net/def/axis/OGC/1/j(180)"); assertEquals("image/tiff", response.getContentType()); tiffContents = getBinary(response); File fileNative = File.createTempFile("native", "native.tiff", new File("./target")); FileUtils.writeByteArrayToFile(fileNative, tiffContents); // Reading using overview and TargetSize response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&overviewPolicy=NEAREST&scalesize=http://www.opengis.net/def/axis/OGC/1/i(180)," + "http://www.opengis.net/def/axis/OGC/1/j(180)"); assertEquals("image/tiff", response.getContentType()); tiffContents = getBinary(response); File fileOverviewTS = File.createTempFile("overviewTS", "overviewTS.tiff", new File("./target")); FileUtils.writeByteArrayToFile(fileOverviewTS, tiffContents); // Reading using overview and ScaleFactor response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&overviewPolicy=NEAREST&SCALEFACTOR=0.5"); assertEquals("image/tiff", response.getContentType()); tiffContents = getBinary(response); File fileOverviewSF = File.createTempFile("overviewSF", "overviewSF.tiff", new File("./target")); FileUtils.writeByteArrayToFile(fileOverviewSF, tiffContents); TIFFImageReaderSpi spi = new TIFFImageReaderSpi(); TIFFImageReader readerNative = null; TIFFImageReader readerOverviewTS = null; TIFFImageReader readerOverviewSF = null; FileImageInputStream streamNative = null; FileImageInputStream streamOverviewTS = null; FileImageInputStream streamOverviewSF = null; try { streamNative = new FileImageInputStream(fileNative); readerNative = (TIFFImageReader) spi.createReaderInstance(); readerNative.setInput(streamNative); streamOverviewTS = new FileImageInputStream(fileOverviewTS); readerOverviewTS = (TIFFImageReader) spi.createReaderInstance(); readerOverviewTS.setInput(streamOverviewTS); streamOverviewSF = new FileImageInputStream(fileOverviewSF); readerOverviewSF = (TIFFImageReader) spi.createReaderInstance(); readerOverviewSF.setInput(streamOverviewSF); // Reading back first image related to native request RenderedImage riNative = readerNative.read(0); Raster rasterNative = riNative.getData(); assertEquals(180, rasterNative.getWidth()); assertEquals(180, rasterNative.getHeight()); final int refX = 11; final int refY = 65; final int r1 = rasterNative.getSample(refX, refY, 0); final int g1 = rasterNative.getSample(refX, refY, 1); final int b1 = rasterNative.getSample(refX, refY, 2); // Reading back second image related to request using overviews final RenderedImage riOverviewTS = readerOverviewTS.read(0); final Raster rasterOverviewTS = riOverviewTS.getData(); assertEquals(180, rasterOverviewTS.getWidth()); assertEquals(180, rasterOverviewTS.getHeight()); final int r2 = rasterOverviewTS.getSample(refX, refY, 0); final int g2 = rasterOverviewTS.getSample(refX, refY, 1); final int b2 = rasterOverviewTS.getSample(refX, refY, 2); // Reading back third image related to request using overviews and scale factor final RenderedImage riOverviewSF = readerOverviewSF.read(0); final Raster rasterOverviewSF = riOverviewSF.getData(); assertEquals(180, rasterOverviewSF.getWidth()); assertEquals(180, rasterOverviewSF.getHeight()); final int r3 = rasterOverviewSF.getSample(refX, refY, 0); final int g3 = rasterOverviewSF.getSample(refX, refY, 1); final int b3 = rasterOverviewSF.getSample(refX, refY, 2); // Checking the pixels are different assertTrue(r1 != r2); assertTrue(g1 != g2); assertTrue(b1 != b2); // Checking the pixels from quality overviews using same layout are equals assertEquals(r2, r3); assertEquals(g2, g3); assertEquals(b2, b3); } finally { IOUtils.closeQuietly(streamOverviewTS); IOUtils.closeQuietly(streamOverviewSF); IOUtils.closeQuietly(streamNative); if (readerOverviewTS != null) { try { readerOverviewTS.dispose(); } catch (Throwable t) { // Does nothing } } if (readerOverviewSF != null) { try { readerOverviewSF.dispose(); } catch (Throwable t) { // Does nothing } } if (readerNative != null) { try { readerNative.dispose(); } catch (Throwable t) { // Does nothing } } } } @Test public void wrongCompression() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&compression=aaaG&predictor=None" + "&interleave=pixel&tiling=true&tileheight=256&tilewidth=256"); assertEquals("application/xml", response.getContentType()); checkOws20Exception(response, 404, WcsExceptionCode.CompressionInvalid.toString(), "aaaG"); } @Test public void getFullCoverageKVP() throws Exception { MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1&coverageId=wcs__BlueMarble"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = new File("./target/bm_full.tiff"); FileUtils.writeByteArrayToFile(file, tiffContents); 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.getGridGeometry().getGridRange(), targetCoverage.getGridGeometry().getGridRange()); assertEquals(sourceCoverage.getCoordinateReferenceSystem(), targetCoverage.getCoordinateReferenceSystem()); assertEquals(sourceCoverage.getEnvelope(), targetCoverage.getEnvelope()); } finally { try{ readerTarget.dispose(); } catch (Exception e) { // TODO: handle exception } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { // TODO: handle exception } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { // TODO: handle exception } } } @Test public void getFullCoverageLatLon() throws Exception { // impose latlon retaining final WCSInfo wcsInfo = getWCS(); final boolean oldLatLon=wcsInfo.isLatLon(); wcsInfo.setLatLon(true); getGeoServer().save(wcsInfo); // execute MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1&coverageId=wcs__BlueMarble"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = new File("./target/bm_full.tiff"); FileUtils.writeByteArrayToFile(file, tiffContents); final Hints hints= new Hints(); hints.put(Hints.FORCE_AXIS_ORDER_HONORING, "EPSG"); hints.put(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.FALSE); GeoTiffReader readerTarget = new GeoTiffReader(file,hints); GridCoverage2D targetCoverage = null, sourceCoverage=null; try { targetCoverage = readerTarget.read(null); sourceCoverage=(GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble").getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getGridGeometry().getGridRange(), targetCoverage.getGridGeometry().getGridRange()); assertEquals(CRS.getAxisOrder(targetCoverage.getCoordinateReferenceSystem()),AxisOrder.NORTH_EAST); final GeneralEnvelope transformedEnvelope=CRS.transform((AffineTransform2D)CoverageUtilities.AXES_SWAP,targetCoverage.getEnvelope()); transformedEnvelope.setCoordinateReferenceSystem(sourceCoverage.getCoordinateReferenceSystem()); assertEquals(sourceCoverage.getEnvelope(), transformedEnvelope); } finally { // reinforce old settings wcsInfo.setLatLon(oldLatLon); getGeoServer().save(wcsInfo); try{ readerTarget.dispose(); } catch (Exception e) { // TODO: handle exception } try{ scheduleForCleaning(targetCoverage); } catch (Exception e) { // TODO: handle exception } try{ scheduleForCleaning(sourceCoverage); } catch (Exception e) { // TODO: handle exception } } } @Test public void getFullCoverageLonLat() throws Exception { // impose not using latLon retaining final WCSInfo wcsInfo = getWCS(); final boolean oldLatLon = wcsInfo.isLatLon(); wcsInfo.setLatLon(false); getGeoServer().save(wcsInfo); // execute MockHttpServletResponse response = getAsServletResponse("wcs?request=GetCoverage&service=WCS&version=2.0.1&coverageId=wcs__BlueMarble"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = new File("./target/bm_fullLonLat.tiff"); FileUtils.writeByteArrayToFile(file, tiffContents); final Hints hints = new Hints(); hints.put(Hints.FORCE_AXIS_ORDER_HONORING, "EPSG"); hints.put(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE); GeoTiffReader readerTarget = new GeoTiffReader(file, hints); GridCoverage2D targetCoverage = null, sourceCoverage = null; try { targetCoverage = readerTarget.read(null); sourceCoverage = (GridCoverage2D) this.getCatalog().getCoverageByName("BlueMarble") .getGridCoverageReader(null, null).read(null); // checks assertEquals(sourceCoverage.getGridGeometry().getGridRange(), targetCoverage .getGridGeometry().getGridRange()); assertEquals(CRS.getAxisOrder(targetCoverage.getCoordinateReferenceSystem()), AxisOrder.EAST_NORTH); assertEquals(sourceCoverage.getEnvelope(), targetCoverage.getEnvelope()); } finally { // reinforce old settings wcsInfo.setLatLon(oldLatLon); getGeoServer().save(wcsInfo); try { readerTarget.dispose(); } catch (Exception e) { // TODO: handle exception } try { scheduleForCleaning(targetCoverage); } catch (Exception e) { // TODO: handle exception } try { scheduleForCleaning(sourceCoverage); } catch (Exception e) { // TODO: handle exception } } } }