我正在使用 OpenMap 并且必须加载非常大尺寸的图像。
我试图将这些图像加载为大光栅,但由于 OufOfMemoryException 失败。在调试模式下,图层构造函数告诉我图像尺寸太大。
在 OpenMap 邮件列表中,我找到了 MyJAIPlugin,它允许我加载和显示 GeoTiff 文件。
如何在 OpenMap 中显示 300mb GeoTiff?
我正在使用 OpenMap 并且必须加载非常大尺寸的图像。
我试图将这些图像加载为大光栅,但由于 OufOfMemoryException 失败。在调试模式下,图层构造函数告诉我图像尺寸太大。
在 OpenMap 邮件列表中,我找到了 MyJAIPlugin,它允许我加载和显示 GeoTiff 文件。
如何在 OpenMap 中显示 300mb GeoTiff?
通过加载文件大小至少为 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。