Question

J'utilise OpenMap et je dois charger des images très grandes.
J'ai essayé de charger ces images comme un grand raster qui échoue avec une oufofMemoryException. En mode de débogage, le constructeur de couche me dit que les dimensions de l'image sont trop grandes.

Dans une liste de diffusion OpenMap, j'ai trouvé le myjaiplugin, qui me permet de charger et d'afficher des fichiers Geotiff.

Comment puis-je montrer un Geotiff de 300 Mo dans OpenMap?

Était-ce utile?

La solution

J'avais une situation presque même en chargeant des cartes HD avec au moins 690 Mo de taille de fichiers.

J'ai également utilisé le jaiplugin à partir de la liste de diffusion et de l'internale qu'ils utilisent l'omsccalingraster witch fonctionne avec une tampon. Ceux-ci limitent la taille de votre image et provoque le message de débogage.

Je l'ai résolu en modifiant l'OmscalingRaster. J'ai changé le tampon de tampon en un tiledimage pour gérer les grandes images et corriger les erreurs à venir. Ici, il est important que vous changeliez la méthode de Scaleto (projection thisproj), pour évoluer avec Jai.

Maintenant, je peux charger le fichier et il est rendu sur la carte. Mais si vous zoomez trop, cela lancera une exception OutofMemory car dans ma modification, je fais un sous-image de la partie de l'image qui sera visible et le donnera comme tampon de tampon à l'Omraster.

Voici le mod. À la fin de la méthode 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;
    }
}

Pour les autres erreurs en remplaçant BufferedImage par Tiledimage, utilisez les méthodes Tiledimage équivalents. Mais pour enregistrer la mémoire, vous devez utiliser le constructeur Tiledimage avec le Flag SharedDatabuffer = true.

Pour exsample ce mod. Peut gérer les cartes (compressé 690 Mo) avec une échelle de 1: 50000 et je peux zoomer vers 1: 600000 avant que le calque ne soit à court de mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top