Domanda

Utilizzo OpenMap e devo caricare immagini di dimensioni molto grandi.
Ho provato a caricare queste immagini come un grande raster che fallisce con un'eccezione OufOfMemoryException.In modalità debug, il costruttore del livello mi dice che le dimensioni dell'immagine sono troppo grandi.

In una mailing list di OpenMap ho trovato MyJAIPlugin, che mi permette di caricare e visualizzare i file GeoTiff.

Come posso mostrare un GeoTiff da 300 MB in OpenMap?

È stato utile?

Soluzione

Ho avuto quasi la stessa situazione caricando mappe hd con dimensioni di file di almeno 690 MB.

Ho anche usato JAIPlugIn dalla mailing list e internamente usano OMScalingRaster che funziona con BufferedImage. Ciò limita la dimensione dell'immagine e causa il messaggio di debug.

L'ho risolto modificando OMScalingRaster. Ho cambiato BufferedImage in TiledImage per gestire immagini di grandi dimensioni e correggere gli errori imminenti. Qui è importante modificare il metodo scaleTo (Projection thisProj), per scalare con JAI.

Ora posso caricare il file ed è renderizzato sulla mappa. Ma se stai riducendo troppo lo zoom, verrà generata un'eccezione OutOfMemoryException perché nella mia modifica creo una sottoimmagine della parte dell'immagine che sarà visibile e la do come BufferedImage all'OMRaster.

Ecco il mod. alla fine del metodo 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;
    }
}

Per gli altri errori sostituendo BufferedImage con TiledImage usa i metodi TiledImage equivalenti. Ma per risparmiare memoria dovresti usare il costruttore TiledImage con il flag sharedDataBuffer= true.

Per esempio, questa mod. può gestire mappe (compresse a 690 MB) con un ridimensionamento di 1: 50000 e posso ridurre fino a 1: 600000 prima che il livello dica che la memoria è esaurita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top