private void initReaderFromFile(Hints inHints) throws IOException { if (!this.dataDirectory.isDirectory()) { throw new IOException(this.dataDirectory + " is not a directory"); } File dataFile = null; for (String filename : this.dataDirectory.list()) { if (isDataFile(filename)) { dataFile = new File(this.dataDirectory, filename); break; } } if (dataFile == null) { throw new IOException("No data file found"); } File clazzFile = new File(dataDirectory, "clazz"); if (clazzFile.exists()) { clazz = new String(Files.readAllBytes(clazzFile.toPath())).trim(); } final GeoTiffReader geotiffReader = new GeoTiffReader(dataFile, hints); this.crs = geotiffReader.getCoordinateReferenceSystem(); this.originalGridRange = geotiffReader.getOriginalGridRange(); this.originalEnvelope = geotiffReader.getOriginalEnvelope(); }
@Test public void testOutsideDefinitionArea() throws Exception { // setup a request that is outside of the coverage CoordinateReferenceSystem crs = CRS.decode("EPSG:3031", true); ReferencedEnvelope mapExtent = new ReferencedEnvelope(-1250000, 0, -13750000, -12500000, crs); // System.out.println(mapExtent.transform(DefaultGeographicCRS.WGS84, true)); GridCoverageReaderHelper helper = new GridCoverageReaderHelper( reader, new Rectangle(400, 200), mapExtent, Interpolation.getInstance(Interpolation.INTERP_NEAREST)); // read, nothing should come out ProjectionHandler handler = ProjectionHandlerFinder.getHandler( mapExtent, reader.getCoordinateReferenceSystem(), true); List<GridCoverage2D> coverages = helper.readCoverages(null, handler); assertTrue(coverages.isEmpty()); }
mapExtent.transform(reader.getCoordinateReferenceSystem(), true); assertFalse(helper.isAccurateResolutionComputationSafe(readExtent)); ProjectionHandlerFinder.getHandler( new ReferencedEnvelope(DefaultGeographicCRS.WGS84), reader.getCoordinateReferenceSystem(), false); List<GridCoverage2D> coverages =
@Test public void testUTM() throws Exception { // setup a request large enough to cause severe reprojection deformation CoordinateReferenceSystem crs = CRS.decode("EPSG:32632", true); ReferencedEnvelope mapExtent = new ReferencedEnvelope(-1.5e7, 1.5e7, 0, 1e6, crs); // System.out.println(mapExtent.transform(DefaultGeographicCRS.WGS84, true)); GridCoverageReaderHelper helper = new GridCoverageReaderHelper( reader, new Rectangle(400, 200), mapExtent, Interpolation.getInstance(Interpolation.INTERP_NEAREST)); // read single coverage with no projection handling, we should get the full requested area GridCoverage2D coverage = helper.readCoverage(null); Envelope2D envelope = coverage.getEnvelope2D(); // System.out.println(envelope); assertTrue(envelope.getMinX() < -100); assertTrue(envelope.getMaxX() > 100); // now read via the projection handlers ProjectionHandler handler = ProjectionHandlerFinder.getHandler( mapExtent, reader.getCoordinateReferenceSystem(), true); List<GridCoverage2D> coverages = helper.readCoverages(null, handler); // System.out.println(coverages); assertEquals(1, coverages.size()); envelope = coverages.get(0).getEnvelope2D(); // west/east limited to 45 degrees from the central meridian, plus reading gutter assertEquals(-36, envelope.getMinX(), EPS); assertEquals(54, envelope.getMaxX(), EPS); }
@Test public void testConic() throws Exception { // setup a request large enough to cause severe reprojection deformation CoordinateReferenceSystem crs = CRS.decode("EPSG:32632", true); ReferencedEnvelope mapExtent = new ReferencedEnvelope(-1.5e7, 1.5e7, 0, 1e6, crs); // System.out.println(mapExtent.transform(DefaultGeographicCRS.WGS84, true)); GridCoverageReaderHelper helper = new GridCoverageReaderHelper( reader, new Rectangle(400, 200), mapExtent, Interpolation.getInstance(Interpolation.INTERP_NEAREST)); // read single coverage with no projection handling, we should get the full requested area GridCoverage2D coverage = helper.readCoverage(null); Envelope2D envelope = coverage.getEnvelope2D(); // System.out.println(envelope); assertTrue(envelope.getMinX() < -100); assertTrue(envelope.getMaxX() > 100); // now read via the projection handlers ProjectionHandler handler = ProjectionHandlerFinder.getHandler( mapExtent, reader.getCoordinateReferenceSystem(), true); List<GridCoverage2D> coverages = helper.readCoverages(null, handler); // System.out.println(coverages); assertEquals(1, coverages.size()); envelope = coverages.get(0).getEnvelope2D(); // west/east limited to 45 degrees from the central meridian assertEquals(-36, envelope.getMinX(), EPS); assertEquals(54, envelope.getMaxX(), EPS); }
@Test public void testGeographicLarge() throws Exception { ReferencedEnvelope mapExtent = new ReferencedEnvelope(-360, 360, -90, 90, DefaultGeographicCRS.WGS84); GridCoverageReaderHelper helper = new GridCoverageReaderHelper( reader, new Rectangle(720, 180), mapExtent, Interpolation.getInstance(Interpolation.INTERP_NEAREST)); // read single coverage with no projection handling GridCoverage2D coverage = helper.readCoverage(null); Envelope2D envelope = coverage.getEnvelope2D(); assertEquals(-180, envelope.getMinX(), EPS); assertEquals(180, envelope.getMaxX(), EPS); assertEquals(-90, envelope.getMinY(), EPS); assertEquals(90, envelope.getMaxY(), EPS); // try multiple coverage with projection handling, should not make a difference // since we are already reading everything in a single shot, just in need of coverage // replication // (which has to be performed after the eventual reprojection, so not here in the reader) ProjectionHandler handler = ProjectionHandlerFinder.getHandler( mapExtent, reader.getCoordinateReferenceSystem(), true); List<GridCoverage2D> coverages = helper.readCoverages(null, handler); // System.out.println(coverages); assertEquals(1, coverages.size()); assertEquals(envelope, coverages.get(0).getEnvelope2D()); }
mapExtent, reader.getCoordinateReferenceSystem(), true); List<GridCoverage2D> coverages = helper.readCoverages(null, handler);
@Test public void testScaleByFactorXML() throws Exception { final File xml = new File("./src/test/resources/requestGetCoverageScaleByFactor.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); 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 the tiff structure is the one requested final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(900, reader.getOriginalGridRange().getSpan(0)); assertEquals(900, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertNotNull(coverage); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); } }
@Test public void testScaleToExtentXML() throws Exception { final File xml = new File("./src/test/resources/requestGetCoverageScaleToExtent.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); 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 the tiff structure is the one requested final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(200, reader.getOriginalGridRange().getSpan(0)); assertEquals(300, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertNotNull(coverage); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); }
@Test public void testScaleAxesByFactorXML() throws Exception { final File xml = new File("./src/test/resources/requestGetCoverageScaleAxesByFactor.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); 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 the tiff structure is the one requested final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(1260, reader.getOriginalGridRange().getSpan(0)); assertEquals(1260, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertNotNull(coverage); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); }
@Test public void testScaleToSizeXML() throws Exception { final File xml = new File("./src/test/resources/requestGetCoverageScaleToSize.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); 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 the tiff structure is the one requested final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(1000, reader.getOriginalGridRange().getSpan(0)); assertEquals(1000, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertNotNull(coverage); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); }
@Test public void mixed() throws Exception { final File xml = new File( "./src/test/resources/rangesubset/requestGetCoverageRangeSubsettingInterval2.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); 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); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(360, reader.getOriginalGridRange().getSpan(0)); assertEquals(360, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(5, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("BlueMarble") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void testBasic() throws Exception { final File xml = new File("./src/test/resources/rangesubset/requestGetCoverageRangeSubsetting.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); 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); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(360, reader.getOriginalGridRange().getSpan(0)); assertEquals(360, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(1, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("BlueMarble") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void test9to4() throws Exception { final File xml = new File( "./src/test/resources/rangesubset/requestGetCoverageRangeSubsetting9to4.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("gtiff", "gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:32611", true))); assertEquals(68, reader.getOriginalGridRange().getSpan(0)); assertEquals(56, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(4, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("multiband") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void test9to3() throws Exception { final File xml = new File( "./src/test/resources/rangesubset/requestGetCoverageRangeSubsetting9to3.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("gtiff", "gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:32611", true))); assertEquals(68, reader.getOriginalGridRange().getSpan(0)); assertEquals(56, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(3, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("multiband") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void test9to7() throws Exception { final File xml = new File( "./src/test/resources/rangesubset/requestGetCoverageRangeSubsetting9to7.xml"); final String request = FileUtils.readFileToString(xml); MockHttpServletResponse response = postAsServletResponse("wcs", request); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("gtiff", "gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:32611", true))); assertEquals(68, reader.getOriginalGridRange().getSpan(0)); assertEquals(56, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(7, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("multiband") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void test9to3() throws Exception { MockHttpServletResponse response = getAsServletResponse( "wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__multiband&&Format=image/tiff&RANGESUBSET=Band1,Band6,Band7"); assertEquals("image/tiff", response.getContentType()); byte[] tiffContents = getBinary(response); File file = File.createTempFile("gtiff", "gtiff.tiff", new File("./target")); FileUtils.writeByteArrayToFile(file, tiffContents); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:32611", true))); assertEquals(68, reader.getOriginalGridRange().getSpan(0)); assertEquals(56, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(3, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("multiband") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void mixed() throws Exception { MockHttpServletResponse response = getAsServletResponse( "wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&RANGESUBSET=RED_BAND:BLUE_BAND,RED_BAND,GREEN_BAND"); 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); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(360, reader.getOriginalGridRange().getSpan(0)); assertEquals(360, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(5, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("BlueMarble") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void testBasic() throws Exception { MockHttpServletResponse response = getAsServletResponse( "wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&RANGESUBSET=RED_BAND"); 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); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(360, reader.getOriginalGridRange().getSpan(0)); assertEquals(360, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(1, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("BlueMarble") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }
@Test public void testRange() throws Exception { MockHttpServletResponse response = getAsServletResponse( "wcs?request=GetCoverage&service=WCS&version=2.0.1" + "&coverageId=wcs__BlueMarble&&Format=image/tiff&RANGESUBSET=RED_BAND:BLUE_BAND"); 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); final GeoTiffReader reader = new GeoTiffReader(file); assertTrue( CRS.equalsIgnoreMetadata( reader.getCoordinateReferenceSystem(), CRS.decode("EPSG:4326", true))); assertEquals(360, reader.getOriginalGridRange().getSpan(0)); assertEquals(360, reader.getOriginalGridRange().getSpan(1)); final GridCoverage2D coverage = reader.read(null); assertEquals(3, coverage.getSampleDimensions().length); GridCoverage2D sourceCoverage = (GridCoverage2D) this.getCatalog() .getCoverageByName("BlueMarble") .getGridCoverageReader(null, null) .read(null); assertEnvelopeEquals(sourceCoverage, coverage); reader.dispose(); scheduleForCleaning(coverage); scheduleForCleaning(sourceCoverage); }