Как использовать геоинструменты для загрузки файлов TIF и создания изображений с помощью WMS, например GeoServer.JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать геоинструменты для загрузки файлов TIF и создания изображений с помощью WMS, например GeoServer.

Сообщение Anonymous »

Я хочу использовать 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 guid и методы решения подобных проблем (https://gis.stackexchange.com/questions ... -geoserver), но ни один из них не смог полностью решить мою проблему. Спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/784 ... ke-geoserv
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»