1

我正在使用 OpenMap 并且必须加载非常大尺寸的图像。
我试图将这些图像加载为大光栅,但由于 OufOfMemoryException 失败。在调试模式下,图层构造函数告诉我图像尺寸太大。

在 OpenMap 邮件列表中,我找到了 MyJAIPlugin,它允许我加载和显示 GeoTiff 文件。

如何在 OpenMap 中显示 300mb GeoTiff?

4

1 回答 1

2

通过加载文件大小至少为 690mb 的高清地图,我遇到了几乎相同的情况。

我还使用了邮件列表中的 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 构造函数。

对于Exsample这个mod。可以处理缩放比例为 1:50000 的地图(压缩 690mb),我可以在图层说内存不足之前缩小到 1:600000。

于 2011-06-16T12:52:02.773 回答