Due to the current gap in continued funding from the U.S. National Science Foundation (NSF), the NSF Unidata Program Center has temporarily paused most operations. See NSF Unidata Pause in Most Operations for details.
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 B6 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
visad
archives: