Pregunta

Estoy usando OpenMap y tengo que cargar imágenes de dimensiones muy grandes.
Intenté cargar estas imágenes como una gran trama que falla con una OufOfMemoryException.En el modo de depuración, el constructor de la capa me dice que las dimensiones de la imagen son demasiado grandes.

En una lista de correo de OpenMap encontré MyJAIPlugin, que me permite cargar y mostrar archivos GeoTiff.

¿Cómo puedo mostrar un GeoTiff de 300 MB en OpenMap?

¿Fue útil?

Solución

Tuve casi la misma situación al cargar mapas de alta definición con al menos 690mb.

También utilicé JAIPlugIn de la lista de correo e internamente usan OMScalingRaster que funciona con una BufferedImage. Esto limita el tamaño de su imagen y provoca el mensaje de depuración.

Lo resolví modificando OMScalingRaster. Cambié BufferedImage a TiledImage para manejar imágenes grandes y solucioné los próximos errores. Aquí es importante que cambie el método scaleTo (Projection thisProj), para escalar con JAI.

Ahora puedo cargar el archivo y se representa en el mapa. Pero si se está alejando demasiado, arrojará una OutOfMemoryException porque en mi modificación hago una subimagen de la parte de la imagen que será visible y la doy como BufferedImage al OMRaster.

Aquí está el mod. al final del método 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;
    }
}

Para los otros errores al reemplazar BufferedImage con TiledImage, use los métodos TiledImage equivalentes. Pero para ahorrar memoria, debe usar el constructor TiledImage con el indicador sharedDataBuffer= true.

Por ejemplo, este mod. puedo manejar mapas (690mb comprimidos) con una escala de 1: 50000 y puedo alejarme a 1: 600000 antes de que la capa diga que se quedó sin memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top