I having been using visad to produce png images. My current approach is this:
1 given a map projection P and a pair of lat,lons (representing the corners of some region of interest), produce a rectangle,
call in W, where W's dimensions are in km.
2 set W as the defaultMapArea of P. This results in W mapping to the visad 'box', which is in the visad coordinate space, and
extends from -1 to 1 in x and y. This is an affine transform, call it A1.
3 For some given scale S of pixels per km, create an offscreen DisplayImpl of size W.width * S, W.height * S. thus we have a
buffered image B of this size.
4 Adjust the projection matrix such that the visad box maps exactly to B, so e.g. -1,-1 -> 0, B.height. Call this
affineTransform A2.
5 Add some lat,lon data, say a bathy dataset, and let visad produce B
6 Given B, I then cut it up into non-overlapping tiles of say 256 pixels square. This last step is not a visad operation, just
a BufferedImage.subImage op.
I need transparent images, so I have altered VisadCanvasJ2D to build buffered images of type INT_RGBA (which I suspect costs me
4 bytes per pixel)
I am running into memory issues. Looking at VisadCanvasJ2D, there are 3 bufferedimages in memory at once when deriving the
'captured' image: images[0], aux_image and captureImage. The memory requirement for the app is thus:
W.width * S * W.height * S * 4 * 3
which for a 750km square W and S = 8 is 432MB.
As W gets larger, or we want larger S ( more 'zoomed in' levels ), my app is
dying.
So my question (finally) is can I organize the app in any other way? Can I just build B so that it is the same size as a tile.
If I then change A1 over and over, aligning A1 to map to each tile, am I paying the cost of re-transforming all the input data
every time? I guess so. Or can I just change A2, saving on data transformations? Is it a requirement that B is the 'full
size' image or can B just be the size of a tile??
Or I could just add more RAM and not try to solve this issue at all...
Any help appreciated
Stuart