1

私は OpenMap を使用しており、非常に大きな寸法の画像をロードする必要があります。
これらの画像を大きなラスターとして読み込もうとしましたが、OufOfMemoryException で失敗しました。デバッグ モードで、レイヤー コンストラクターから、画像のサイズが大きすぎると通知されます。

OpenMap メーリング リストで、GeoTiff ファイルを読み込んで表示できる MyJAIPlugin を見つけました。

OpenMap で 300MB の GeoTiff を表示するにはどうすればよいですか?

4

1 に答える 1

2

少なくとも690MBのファイルサイズでHDマップをロードすることで、ほぼ同じ状況になりました。

また、メーリング リストの 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 メソッドを使用します。ただし、メモリを節約するには、sharedDataBuffer フラグ = true で TiledImage コンストラクターを使用する必要があります。

たとえば、この mod を使用します。1:50000 のスケーリングでマップ (圧縮された 690mb) を処理でき、レイヤーがメモリ不足であると言う前に 1:600000 にズームアウトできます。

于 2011-06-16T12:52:02.773 に答える