Мой основной код заключается в следующем:
Код: Выделить всё
public BufferedImage getBufferedImage() {
File geoTifFile = new File("D:\\test.tif");
GeoTiffReader reader = new GeoTiffReader(geoTifFile);
GridCoverage2D coverage = reader.read(null);
// Convert coordinate points, get envelope
CoordinateReferenceSystem targetCRS = coverage.getCoordinateReferenceSystem();
ProjCoordinate[] sourceCoords = new ProjCoordinate[]{
new ProjCoordinate(x1, y1),
new ProjCoordinate(x2, y1),
new ProjCoordinate(x2, y2),
new ProjCoordinate(x1, y2)
};
ProjCoordinate[] targetCoords = new ProjCoordinate[4];
CRSFactory crsFactory = new CRSFactory();
String crs = "EPSG:" + new ArrayList(targetCRS.getIdentifiers()).get(0).getCode();
CoordinateTransformFactory ctf = new CoordinateTransformFactory();
CoordinateTransform transform = ctf.createTransform(crsFactory.createFromName("EPSG:3857"), crsFactory.createFromName(crs));
for (int j = 0; j < 4; j++) {
targetCoords[j] = new ProjCoordinate();
ProjCoordinate src = new ProjCoordinate(sourceCoords[j].x, sourceCoords[j].y);
transform.transform(src, targetCoords[j]);
}
double xMin = targetCoords[0].x;
double yMin = targetCoords[0].y;
double xMax = targetCoords[2].x;
double yMax = targetCoords[2].y;
Envelope guassEnvelope = new Envelope(xMin, xMax, yMin, yMax);
ReferencedEnvelope cropEnvelope = new ReferencedEnvelope(guassEnvelope.getMinX(), guassEnvelope.getMaxX(),
guassEnvelope.getMinY(), guassEnvelope.getMaxY(), targetCRS);
Rectangle rectangle = new Rectangle();
rectangle.width = width;
rectangle.height = height;
AffineTransform worldToScreen = RendererUtilities.worldToScreenTransform(cropEnvelope, rectangle);
InterpolationNearest nearest = new InterpolationNearest();
RenderingHints hints = new RenderingHints(JAI.KEY_INTERPOLATION, nearest);
GridCoverageRenderer gcr = new GridCoverageRenderer(coverage.getCoordinateReferenceSystem2D(), cropEnvelope, rectangle, worldToScreen, hints);
gcr.setAdvancedProjectionHandlingEnabled(true);
gcr.setWrapEnabled(true);
RasterSymbolizerImpl symbolizer = new RasterSymbolizerImpl();
RenderedImage renderedImage = gcr.renderImage(reader, null, symbolizer, nearest, null, width, height);
if (renderedImage == null) {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = image.createGraphics();
graphics.setColor(new Color(0, 0, 0, 0));
graphics.fillRect(0, 0, width, height);
graphics.dispose();
return image;
}
ImageWorker imageWorker = new ImageWorker(renderedImage);
ImageLayout imageLayout = new ImageLayout(0, 0, width, height, 0,
0, width, height, 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));
return imageWorker.getBufferedImage();
}
1. Весь диапазон изображений будет заполнен белым, а мне нужна прозрачность (в соответствии с геосервером).
Содержит белую заливку
Наложение небольшого размера 2,256*256 приведет к смещению.
Смещение 256*256
Я пробовал методы с помощью geotools guid и методы решения подобных проблем (https://gis.stackexchange.com/questions ... -geoserver), но ни один из них не смог полностью решить мою проблему. Спасибо за помощь.
Подробнее здесь: https://stackoverflow.com/questions/784 ... ke-geoserv