public void write(OutputStream stream) throws IOException { if (sourceFile != null) { FileUtils.copyFile(sourceFile, stream); } else { CoordinateReferenceSystem crs = coverage.getCoordinateReferenceSystem(); boolean unreferenced = crs == null || crs instanceof EngineeringCRS; RenderedImage ri = coverage.getRenderedImage(); int tileWidth, tileHeight; if (imageIoWriteParams.getTilingMode() == GeoToolsWriteParams.MODE_EXPLICIT) { tileHeight = imageIoWriteParams.getTileHeight(); } else { tileWidth = ri.getTileWidth(); tileHeight = ri.getTileHeight();
/** * The BandMerge operation takes indexed images and expands them, however in the context of * coverage view band merging we don't normally want that, e.g., raster mask bands are * represented as indexed but we really want to keep them in their binary, single band form. To * do so, the IndexColorModel is replaced by a ComponentColorModel * * @param coverage * @return */ private GridCoverage2D prepareForBandMerge(GridCoverage2D coverage) { RenderedImage ri = coverage.getRenderedImage(); SampleModel sampleModel = ri.getSampleModel(); if (sampleModel.getNumBands() == 1 && ri.getColorModel() instanceof IndexColorModel) { ImageWorker worker = new ImageWorker(ri); worker.removeIndexColorModel(); RenderedImage formatted = worker.getRenderedImage(); return new GridCoverageFactory() .create( coverage.getName(), formatted, coverage.getGridGeometry(), coverage.getSampleDimensions(), new GridCoverage[] {coverage}, coverage.getProperties()); } return coverage; }
throws ServiceException, IOException { PrintStream ps = new PrintStream(output); ps.println("Grid bounds: " + coverage.getEnvelope()); ps.println("Grid CRS: " + coverage.getCoordinateReferenceSystem()); ps.println("Grid range: " + coverage.getGridGeometry().getGridRange()); ps.println("Grid to world: " + coverage.getGridGeometry().getGridToCRS()); ps.println("Contents:"); RenderedImage ri = coverage.getRenderedImage(); Raster raster = ri.getData(); for (int band = 0; band < raster.getNumBands(); band++) { ps.println("Band " + band + ":"); coverage.dispose(false);
public static GridCoverage2D wrapCoverage( GridCoverage2D coverage, GridCoverage2D sourceCoverage, GridSampleDimension[] wrappedDimensions, Map properties, boolean forceWrapping) { if (coverage instanceof GridCoverageWrapper || forceWrapping) { return new GridCoverageWrapper( coverage.getName().toString(), coverage, wrappedDimensions == null ? coverage.getSampleDimensions() : wrappedDimensions, properties == null ? sourceCoverage.getProperties() : properties); } return coverage; }
/** Returns the original source file, is present in the metadata, and if the coverage */ private File getSourceFile(GridCoverage2D coverage) { final Object fileSource = coverage.getProperty(AbstractGridCoverage2DReader.FILE_SOURCE_PROPERTY); if (fileSource != null && fileSource instanceof String) { File file = new File((String) fileSource); if (file.exists()) { GeoTiffReader reader = null; try { reader = new GeoTiffReader(file); GeneralEnvelope originalEnvelope = reader.getOriginalEnvelope(); Envelope envelope = coverage.getEnvelope(); if (originalEnvelope.equals(envelope, 1e-9, false)) { GridCoverage2D test = reader.read(null); ImageUtilities.disposeImage(test.getRenderedImage()); return file; } } catch (Exception e) { // ok, not a geotiff! } finally { if (reader != null) { reader.dispose(); } } } } return null; }
private GeoTiffWriteParams buildWriteParams(GridCoverage2D coverage) { final RenderedImage renderedImage = coverage.getRenderedImage(); int tileWidth = renderedImage.getTileWidth(); int tileHeight = renderedImage.getTileHeight(); // avoid tiles bigger than the image final GridEnvelope gr = coverage.getGridGeometry().getGridRange(); if (gr.getSpan(0) < tileWidth) { tileWidth = gr.getSpan(0); } if (gr.getSpan(1) < tileHeight) { tileHeight = gr.getSpan(1); } GeoTiffWriteParams writeParams = new GeoTiffWriteParams(); writeParams.setTilingMode(GeoToolsWriteParams.MODE_EXPLICIT); writeParams.setTiling(tileWidth, tileHeight); return writeParams; }
@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); }
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); GeoTiffReader readerTarget = new GeoTiffReader(file); GridCoverage2D targetCoverage = null; try { targetCoverage = readerTarget.read(null); final CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:3857", true); Assert.assertTrue( CRS.equalsIgnoreMetadata( targetCoverage.getCoordinateReferenceSystem(), targetCRS)); final GridEnvelope gridRange = targetCoverage.getGridGeometry().getGridRange(); new GeneralEnvelope( new double[] {1.6308305401213994E7, -5388389.272818998}, new double[] {1.636396514661063E7, -5311971.846945147}); expectedEnvelope.setCoordinateReferenceSystem(targetCRS); expectedEnvelope, scale, (GeneralEnvelope) targetCoverage.getEnvelope(), scale); assertEquals(gridRange.getSpan(0), 120); assertEquals(gridRange.getSpan(1), 120); readerTarget.dispose(); } catch (Exception e) {
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); GeneralEnvelope expectedEnvelope = sourceReader.getOriginalEnvelope(); assertEnvelopeEquals( expectedEnvelope, 1.0, (GeneralEnvelope) targetCoverage.getEnvelope(), 1.0); assertTrue( CRS.equalsIgnoreMetadata( targetCoverage.getCoordinateReferenceSystem(), expectedEnvelope.getCoordinateReferenceSystem())); final GridEnvelope gridRange = targetCoverage.getGridGeometry().getGridRange(); GridEnvelope expectedGridRange = sourceReader.getOriginalGridRange(); assertEquals(gridRange.getSpan(0), expectedGridRange.getSpan(0)); assertEquals(gridRange.getSpan(1), expectedGridRange.getSpan(1)); targetCoverage.getRenderedImage().getData().getPixel(1, 24, pixel); assertEquals(expectedValue, pixel[0], 1e-6); } finally { readerTarget.dispose(); scheduleForCleaning(targetCoverage);
@Override public GridCoverage2D read(GeneralParameterValue[] parameters) throws IOException { GridCoverage2D originalCoverage = super.read(parameters); RenderedImage source = new ImageWorker(originalCoverage.getRenderedImage()) .format(DataBuffer.TYPE_USHORT) .getRenderedImage(); TiledImage shortImage = new TiledImage( source.getMinX(), source.getMinY(), source.getWidth(), source.getHeight(), source.getTileGridXOffset(), source.getTileGridYOffset(), source.getSampleModel(), null); shortImage.set(source); // force color model to be null, this also occurs in real cases GridCoverage2D coverage = CoverageFactoryFinder.getGridCoverageFactory(null) .create( originalCoverage.getName(), shortImage, originalCoverage.getEnvelope2D()); return coverage; } };
final RenderedImage raster = gc2d.getRenderedImage(); size = raster.getWidth() * raster.getHeight(); mt2D = gc2d.getGridGeometry().getGridToCRS2D(PixelOrientation.UPPER_LEFT); final XRectangle2D rasterBounds_ = new XRectangle2D( raster.getMinX() + 0.5, raster.getMinY() + 0.5, raster.getWidth() - 1, bounds = new ReferencedEnvelope( CRS.transform(mt2D, rasterBounds_, null), gc2d.getCoordinateReferenceSystem2D()); } catch (Exception e) { final IOException ioe = new IOException(); numBands = gc2d.getNumSampleDimensions(); final CoordinateReferenceSystem coverageCRS = gc2d.getCoordinateReferenceSystem2D();
final CoordinateReferenceSystem sourceCRS = sourceCoverage.getCoordinateReferenceSystem(); if (targetCRS == null) { final GridGeometry2D sourceGG = sourceCoverage.getGridGeometry(); final MathTransform gridToCRS; switch (envelope.getDimension()) { final GridGeometry2D sourceGG = sourceCoverage.getGridGeometry(); final CoordinateReferenceSystem compatibleSourceCRS = compatibleSourceCRS( sourceCoverage.getCoordinateReferenceSystem2D(), sourceCRS, targetCRS); PlanarImage sourceImage = PlanarImage.wrapRenderedImage(sourceCoverage.getRenderedImage()); assert sourceCoverage.getCoordinateReferenceSystem() == sourceCRS : sourceCoverage; Map sourceProps = sourceCoverage.getProperties(); sourceProps = sourceProps != null ? new HashMap<>(sourceProps) : new HashMap<>(); Object roiProp = sourceProps.get("GC_ROI"); sourceEnvelope = sourceCoverage.getEnvelope(); // Don't force this one to 2D. targetEnvelope = CRS.transform(operation, sourceEnvelope); targetEnvelope.setCoordinateReferenceSystem(targetCRS); || (allSteps instanceof AffineTransform && XAffineTransform.isIdentity((AffineTransform) allSteps, EPS))) { sourceImage = PlanarImage.wrapRenderedImage(sourceCoverage.getRenderedImage()); w.setImage(sourceImage); if (targetBB.equals(sourceBB)) {
requestedGridGeometry = (GridGeometry2D) value.getValue(); ReferencedEnvelope requestedEnvelope = ReferencedEnvelope.reference(requestedGridGeometry.getEnvelope()); ReferencedEnvelope dataEnvelope = ReferencedEnvelope.reference(handler.getOriginalEnvelope()); if (CRS.equalsIgnoreMetadata(requestedEnvelope, dataEnvelope)) { if (!requestedEnvelope.intersects((BoundingBox) dataEnvelope)) { return null; GridEnvelope2D range = requestedGridGeometry.getGridRange2D(); GridEnvelope2D expandedRange = new GridEnvelope2D( (int) range.getHeight() + HETEROGENEOUS_RASTER_GUTTER * 2); GridGeometry2D expandedGG = new GridGeometry2D( expandedRange, requestedGridGeometry.getGridToCRS(), GridCoverage2D reference = inputCoverages.values().stream().filter(c -> c != null).findFirst().get(); RenderedImage ri = reference.getRenderedImage(); width = ri.getWidth(); height = ri.getHeight(); + coverageName + ", result has envelope " + coverage.getEnvelope2D());
@Test public void testMultiPixelPackedRender() throws Exception { GridCoverage2D coverage = multiPixelPacked.read(null); RenderedImage image = coverage.getRenderedImage(); ReferencedEnvelope mapExtent = ReferencedEnvelope.reference(coverage.getEnvelope2D()); Rectangle screenSize = new Rectangle( image.getMinX(), image.getMinY(), image.getWidth(), image.getHeight()); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer( coverage.getCoordinateReferenceSystem(), mapExtent, screenSize, w2s); ImageAssert.assertEquals(reference, rendered, 0); coverage.dispose(true);
@Test public void testZoomlevel3() throws IOException { MBTilesReader reader = new MBTilesReader(getClass().getResource("world_lakes.mbtiles"), null); GeneralParameterValue[] parameters = new GeneralParameterValue[1]; GridGeometry2D gg = new GridGeometry2D( new GridEnvelope2D(new Rectangle(500, 500)), new ReferencedEnvelope(0, 90.0, -85.0, 0, MBTilesReader.WGS_84)); parameters[0] = new Parameter<GridGeometry2D>(AbstractGridFormat.READ_GRIDGEOMETRY2D, gg); GridCoverage2D gc = reader.read(parameters); RenderedImage img = gc.getRenderedImage(); assertEquals(0, gc.getEnvelope().getMinimum(0), 0.01); assertEquals(-20037508.34, gc.getEnvelope().getMinimum(1), 0.01); assertEquals(15028131.25, gc.getEnvelope().getMaximum(0), 0.01); assertEquals(0, gc.getEnvelope().getMaximum(1), 0.01); assertEquals(768, img.getWidth()); assertEquals(1024, img.getHeight()); }
(AffineTransform) ((GridGeometry2D) gc.getGridGeometry()).getGridToCRS2D(); final double dx = XAffineTransform.getScaleX0(gridToWorld); final double dy = XAffineTransform.getScaleY0(gridToWorld); final RenderedImage image = gc.getRenderedImage(); int Nx = image.getWidth(); int Ny = image.getHeight(); final double _Nx; final double _Ny; final Envelope oldEnv = gc.getEnvelope2D(); final double W = oldEnv.getSpan(0); final double H = oldEnv.getSpan(1); new GeneralGridEnvelope(new int[] {0, 0}, new int[] {Nx, Ny}); final GridGeometry2D newGridGeometry = new GridGeometry2D(newGridrange, new GeneralEnvelope(gc.getEnvelope())); (ParameterValueGroup) processor.getOperation("Resample").getParameters().clone(); param.parameter("source").setValue(gc); param.parameter("CoordinateReferenceSystem").setValue(gc.getCoordinateReferenceSystem2D()); param.parameter("GridGeometry").setValue(newGridGeometry); param.parameter("InterpolationType")
private void assertOriginPixelColor(MockHttpServletResponse response, int[] expected) throws DataSourceException, IOException { assertEquals("image/tiff", response.getContentType()); byte[] bytes = response.getContentAsByteArray(); GeoTiffReader reader = new GeoTiffReader(new ByteArrayInputStream(bytes)); GridCoverage2D coverage = reader.read(null); Raster raster = coverage.getRenderedImage().getData(); int[] pixel = new int[3]; raster.getPixel(0, 0, pixel); assertThat(pixel, equalTo(expected)); } }
GeneralEnvelope envelope = reader.getOriginalEnvelope(); GeneralEnvelope wgs84envelope = CoverageStoreUtils.getWGS84LonLatEnvelope(envelope); final String nativeCrsName = CRS.lookupIdentifier(crs, false); writer.write( "<envelope crs=\"" new GridGeometry2D(reader.getOriginalGridRange(), subEnvelope)); GridCoverage2D gc = (GridCoverage2D) final GridGeometry geometry = gc.getGridGeometry(); final int dimensions = geometry.getGridRange().getDimension(); String lower = ""; String upper = ""; for (int i = 0; i < dimensions; i++) { lower = lower + geometry.getGridRange().getLow(i) + " "; upper = upper + geometry.getGridRange().getHigh(i) + " "; final GridSampleDimension[] sd = gc.getSampleDimensions(); for (int i = 0; i < sd.length; i++) { writer.write("<CoverageDimension>\n");
final ParameterValueGroup readParams = format.getReadParameters(); final Map parameters = CoverageUtils.getParametersKVP(readParams); final int minX = originalRange.getLow(0); final int minY = originalRange.getLow(1); final int width = originalRange.getSpan(0); final int height = originalRange.getSpan(1); final int maxX = minX + (width <= 5 ? width : 5); CRS.transform(gridToWorldCorner, new GeneralEnvelope(testRange.getBounds())); testEnvelope.setCoordinateReferenceSystem(reader.getCoordinateReferenceSystem()); new GridGeometry2D(testRange, testEnvelope)); sampleDimensions = gc.getSampleDimensions(); gc.dispose(true); if (gc.getRenderedImage() instanceof PlanarImage) { ImageUtilities.disposePlanarImageChain((PlanarImage) gc.getRenderedImage());
coverage.getGridGeometry().getGridRange2D(), coverage.getRenderedImage().getSampleModel()); if (actual > limit) { throw new WcsException(