Hi Michael,

Thanks for your answer. I have tried the first method and made the sample
model 1000 x 1000. But I still get the same out-of-bounds exception.

I further simplified the program to just deal with 100 x 100 size array and
image and still get the same exception
(java.lang.ArrayIndexOutOfBoundsException: 100)

For reference, the code is:

        int[][] data = new int[100][100];

        ColorModel colorModel = new ComponentColorModel(
                ColorSpace.getInstance(ColorSpace.CS_GRAY), false, false,
                ColorModel.TRANSLUCENT, DataBuffer.TYPE_INT);
        SampleModel model = new BandedSampleModel(DataBuffer.TYPE_INT, 100,
100, 1);
        DataBuffer buffer = new DataBufferInt(data, data.length);
        WritableRaster raster = Raster.createWritableRaster(model, buffer,
null);
        BufferedImage img = new BufferedImage(colorModel, raster, false,
null);
        GridCoverageFactory factory =
CoverageFactoryFinder.getGridCoverageFactory(null);
        Envelope2D envelope = new
Envelope2D(CRS.getProjectedCRS(DefaultGeographicCRS.WGS84), 0, 0, 100, 100);
        GridCoverage2D cov = factory.create("Coverage", img, envelope);

        File outputFile = new File("D:\\Output.tif");
        GeoTiffFormat format = new GeoTiffFormat();
        GeoTiffWriter writer = (GeoTiffWriter)format.getWriter(outputFile);
        writer.write(cov, null);

Do you see any problem with this code?
Out of interest, I made the array 2000 x 2000 while keeping the rest the
same, and still get an out-of-bounds exception at 2000.

Many thanks,
Jan

On Sun, Dec 6, 2009 at 8:45 AM, Michael Bedward
<[email protected]>wrote:

> Hi Jan,
>
> It looks like a mix up between your data array size and your image size.
>
> BufferedImages only have a single image tile so when you create your
> sample model like this...
>
> >         SampleModel model = new
> >         BandedSampleModel(DataBuffer.TYPE_INT, 100, 100, 1);
>
> And use that to create your image...
>
> >         BufferedImage img = new BufferedImage(colorModel, raster, false,
> null);
>
> You are making a 100 x 100 image.
>
> The problem is that you used your data array size to create the data
> buffer and raster...
>
> Then you use your 1000 x 1000 data matrix to create a data buffer and
> raster
>
> >         DataBuffer buffer = new DataBufferInt(data, data.length);
> >         WritableRaster raster = Raster.createWritableRaster(model,
> buffer, null);
>
> So when you try to use the image by writing our the coverage to a
> GeoTiff, you get the array out of bounds message.
>
> To fix the problem you can either make your sample model 1000 x 1000
> or use a different kind of image that supports multiple image tiles.
> The former is easier, the latter can make your app less of a memory
> hog depending on how you use the data.
>
> Hope this helps - get back to us if you need more info.
>
> Michael
>
------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing. 
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to