0

I have a TIFF file and add it to GeoServer. A WMS request is as follows:

http://localhost:8080/geoserver/Qadir/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png8&TRANSPARENT=true&tiled=true&STYLES&LAYERS=Qadir:shomale_qharb3&exceptions=application/vnd.ogc.se_inimage&WIDTH=256&HEIGHT=256&SRS=EPSG:4326&BBOX=38.2763671875,46.494140625,38.29833984375,46.51611328125

The response:

enter image description here

Now I want to simulate this request with Geotools:

Double minX = 46.494140625;
Double maxX = 46.51611328125;
Double minY = 38.2763671875;
Double maxY = 38.29833984375;

GeoTiffReader reader = new GeoTiffReader("C:/layer.tif");
GridCoverage2D coverage = reader.read(null);
Envelope envelope = new Envelope(minX, maxX, minY, maxY);
ReferencedEnvelope bbox = new ReferencedEnvelope(envelope, DefaultGeographicCRS.WGS84);

Rectangle rectangle = new Rectangle();
rectangle.width = 256;
rectangle.height = 256;

AffineTransform worldToScreen = RendererUtilities.worldToScreenTransform(bbox, rectangle);
InterpolationNearest nearest = new InterpolationNearest();
RenderingHints hints = new RenderingHints(JAI.KEY_INTERPOLATION, nearest);

GridCoverageRenderer gcr = new GridCoverageRenderer(coverage.getCoordinateReferenceSystem2D(), bbox, rectangle, worldToScreen, hints);
gcr.setAdvancedProjectionHandlingEnabled(true);
gcr.setWrapEnabled(true);

RasterSymbolizerImpl symbolizer = new RasterSymbolizerImpl();
RenderedImage image = gcr.renderImage(reader, null, symbolizer, nearest, null, 256, 256);

File output = new File("C:/output.png");
ImageIO.write(image, "png", output);

The problem is where there is no data, The Geoserver response as above, but my code just returns the following:

enter image description here

How can I create a 256x256 tile with Geotools?

Note: For the left boundary, no data is on the left of the image.

2
  • Just a guess, I have never run Geotools before: in the gcr.renderimage() call, set the background color to white, or fully transparent instead of null
    – Kasper
    Jan 12 at 13:11
  • @Kasper no change Jan 13 at 9:15

1 Answer 1

1
+100
Double minX = 46.494140625;
Double maxX = 46.51611328125;
Double minY = 38.2763671875;
Double maxY = 38.29833984375;

GeoTiffReader reader = new GeoTiffReader("C:/layer.tif");
GridCoverage2D coverage = reader.read(null);
Envelope envelope = new Envelope(minX, maxX, minY, maxY);
ReferencedEnvelope bbox = new ReferencedEnvelope(envelope, DefaultGeographicCRS.WGS84);

Rectangle rectangle = new Rectangle();
rectangle.width = 256;
rectangle.height = 256;

AffineTransform worldToScreen = RendererUtilities.worldToScreenTransform(bbox, rectangle);
InterpolationNearest nearest = new InterpolationNearest();
RenderingHints hints = new RenderingHints(JAI.KEY_INTERPOLATION, nearest);

GridCoverageRenderer gcr = new GridCoverageRenderer(coverage.getCoordinateReferenceSystem2D(), bbox, rectangle, worldToScreen, hints);
gcr.setAdvancedProjectionHandlingEnabled(true);
gcr.setWrapEnabled(true);

RasterSymbolizerImpl symbolizer = new RasterSymbolizerImpl();
RenderedImage renderedImage = gcr.renderImage(reader, null, symbolizer, nearest, null, 256, 256);

ImageWorker imageWorker = new ImageWorker(renderedImage);
ImageLayout imageLayout = new ImageLayout(0, 0, 256, 256, 0, 0, 256, 256, null, null);
imageWorker.setRenderingHint(JAI.KEY_IMAGE_LAYOUT, imageLayout);
imageWorker.setBackground(null);

RenderedImage[] array = new RenderedImage[]{renderedImage};
imageWorker.mosaic(array, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null);

imageWorker.makeColorTransparent(new Color(255, 255, 255, 0));

File output = new File("C:/output.png");
ImageIO.write(imageWorker.getBufferedImage(), "png", output);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.