Изображения большого размера приводят к исключению OufOfMemoryException - PullRequest
1 голос
/ 16 июня 2011

Я использую OpenMap и мне нужно загружать изображения очень больших размеров.
Я пытался загрузить эти изображения как большой растр, который завершается с ошибкой OufOfMemoryException.В режиме отладки конструктор слоя сообщает мне, что размеры изображения слишком велики.

В списке рассылки OpenMap я обнаружил MyJAIPlugin, который позволяет мне загружать и отображать файлы GeoTiff.

Как можноЯ показываю 300 Мб GeoTiff в OpenMap?

1 Ответ

2 голосов
/ 16 июня 2011

У меня была почти такая же ситуация при загрузке hd-карт размером не менее 690 МБ.

Я также использовал JAIPlugIn из списка рассылки, и внутри они используют OMScalingRaster, который работает с BufferedImage. Это ограничивает размер вашего изображения и вызывает сообщение об отладке.

Я решил это, изменив OMScalingRaster. Я изменил BufferedImage на TiledImage для обработки больших изображений и исправил будущие ошибки. Здесь важно изменить метод scaleTo (Projection thisProj) для масштабирования с помощью JAI.

Теперь я могу загрузить файл, и он отображается на карте. Но если вы уменьшаете масштаб слишком сильно, он выдаст исключение OutOfMemoryException, потому что в моей модификации я создаю подизображение части изображения, которое будет видимым, и передаю его как BufferedImage OMRaster.

Вот мод. в конце метода scaleTo:

            // Now we can grab the bit we want out of the source
            // and
            // scale it to fit the intersection.

            // Calc width adjustment
            float widthAdj = (float) ((double) iRect.width
                    / (double) clipRect.width);
            // Calc height adjustment
            float heightAdj = (float) ((double) iRect.height
                    / (double) clipRect.height);

            // Create the transform
            // JAI-Version
            ParameterBlock pb = new ParameterBlock();
            pb.addSource(sourceImage.getSubImage(clipRect.x,
                    clipRect.y,
                    clipRect.width,
                    clipRect.height).getAsBufferedImage());
            pb.add(widthAdj);          // The xScale
            pb.add(heightAdj);          // The yScale
            pb.add(0.0F);           // The x translation
            pb.add(0.0F);           // The y translation
            RenderedOp newImage = JAI.create("scale",pb, null);

            bitmap = newImage.getAsBufferedImage();


            point1.setLocation(iRect.x, iRect.y);
            // setVisible(currentVisibility);
        }
    } else {
        bitmap = null;
    }
}

Для других ошибок, заменив BufferedImage на TiledImage, используйте эквивалентные TiledImage-методы. Но для экономии памяти вы должны использовать конструктор TiledImage с флагом sharedDataBuffer = true.

Например, этот мод. может обрабатывать карты (сжатые 690 МБ) с масштабированием 1: 50000, и я могу уменьшить масштаб до 1: 600000, пока слой не скажет, что ему не хватает памяти.

...