Я хочу использовать geotools для написания кода для реализации загрузки файлов tif с геосервера для реализации сервисов wms. После загрузки geotools я выполнил вывод wms, но мой код столкнулся с двумя проблемами: первая проблема заключается в том, что если система пространственной привязки файла tif не равна 3857 или 4326, сгенерированная комбинация срезов будет смещена; вторая проблема заключается в том, что если система пространственной привязки файла tif не равна 3857 или 4326. После сужения диапазона некоторые изображения за пределами tif будут черными, а не прозрачными, как я ожидал.
Мой основной код заключается в следующем:
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 для написания кода для реализации загрузки файлов tif с геосервера для реализации сервисов wms. После загрузки geotools я выполнил вывод wms, но мой код столкнулся с двумя проблемами: первая проблема заключается в том, что если система пространственной привязки файла tif не равна 3857 или 4326, сгенерированная комбинация срезов будет смещена; вторая проблема заключается в том, что если система пространственной привязки файла tif не равна 3857 или 4326. После сужения диапазона некоторые изображения за пределами tif будут черными, а не прозрачными, как я ожидал. Мой основной код заключается в следующем: [code] 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);
return imageWorker.getBufferedImage(); } [/code] При рисовании кода есть две проблемы: 1. Весь диапазон изображений будет заполнен белым, а мне нужна прозрачность (в соответствии с геосервером). Содержит белую заливку Наложение небольшого размера 2,256*256 приведет к смещению. Смещение 256*256
Я пробовал методы с помощью geotools guid и методы решения подобных проблем (https://gis.stackexchange.com/questions/449100/create-a-256x256px-tile-with-geotools-like-geoserver), но ни один из них не смог полностью решить мою проблему. Спасибо за помощь.
Я пытаюсь использовать листовку в вершине. Карта отлично работает с базовыми мастерами Google Satellite и OpenStreetMap. Но когда я пытаюсь добавить свой слой WMS из моего геосервера, он не отражается на карте. Как я заметил, он не принимает слой,...