[gdal-dev] GDAL-Java: How to write Flot32, Int16?

Daniele Romagnoli daniele.romagnoli at geo-solutions.it
Wed Nov 4 12:36:10 EST 2009


Hi Ivan,

Try adding this:
byteBuffer.order(ByteOrder.nativeOrder());

after the allocateDirect and before the asFloatBuffer calls.

That is:
-------------------------------
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * xsize);
byteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
-------------------------------

Let me know whether this does work.
Best Regards,
Daniele


On Wed, Nov 4, 2009 at 5:44 PM, Ivan <ivan.lucena at pmldnet.com> wrote:

> Even,
>
> Thanks for you reply.
>
> I wrote this piece of code to demonstrate what is happening:
>
> {{{
> public static void main(String[] args) {
>
>        Dataset dataset = null;
>        Driver driver = null;
>        Band band = null;
>
>        int xsize = 4;
>        int ysize = 4;
>
>        gdal.AllRegister();
>
>        driver = gdal.GetDriverByName("GTIFF");
>        dataset = driver.Create("D:\\temp\\checkit.tif", xsize, ysize, 1,
> gdalconstConstants.GDT_Float32);
>        band = dataset.GetRasterBand(1);
>
>        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * xsize);
>        FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
>
>         for( int i = 0; i < ysize; i++) {
>                for( int j = 0; j < xsize; j++) {
>                        floatBuffer.put(j, (float) (i + j));
>                }
>                band.WriteRaster_Direct(0, i, xsize, 1,
> gdalconstConstants.GDT_Float32, byteBuffer);
>        }
>
>        band.FlushCache();
>        dataset.FlushCache();
>        dataset.delete();
>
>        System.out.println("Done!");
> }
> }}}
>
> And that is the output image dumped in Python:
>
> array([[  0.00000000e+00,   4.60060299e-41,   8.96831017e-44,
>  2.30485571e-41],
>       [  4.60060299e-41,   8.96831017e-44,   2.30485571e-41,
>  4.60074312e-41],
>       [  8.96831017e-44,   2.30485571e-41,   4.60074312e-41,
>  5.74868682e-41],
>       [  2.30485571e-41,   4.60074312e-41,   5.74868682e-41,
>  6.89663052e-41]], dtype=float32))
>
> If I change the code to produce Byte output:
>
> {{{
> public static void main(String[] args) {
>
>        Dataset dataset = null;
>        Driver driver = null;
>        Band band = null;
>
>        int xsize = 4;
>        int ysize = 4;
>
>        gdal.AllRegister();
>
>        driver = gdal.GetDriverByName("GTIFF");
>        dataset = driver.Create("D:\\temp\\checkit2.tif", xsize, ysize, 1,
> gdalconstConstants.GDT_Byte);
>        band = dataset.GetRasterBand(1);
>
>        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(xsize);
>
>        for( int i = 0; i < ysize; i++) {
>                for( int j = 0; j < xsize; j++) {
>                        byteBuffer.put(j, (byte) (i + j));
>                }
>                band.WriteRaster_Direct(0, i, xsize, 1,
> gdalconstConstants.GDT_Byte, byteBuffer);
>        }
>
>        band.FlushCache();
>        dataset.FlushCache();
>        dataset.delete();
>
>        System.out.println("Done!");
> }
> }}}
>
> That is what I got:
>
> array([[0, 1, 2, 3],
>       [1, 2, 3, 4],
>       [2, 3, 4, 5],
>       [3, 4, 5, 6]], dtype=uint8)
>
> That is correct but I need Float32 output on my real application.
>
> Can you see if I am missing something?
>
> When [1] says "It automatically takes care of data type translation if the
> data type" it means exactly like the others GDAL APIs?
>
> My best regards,
>
> Ivan
>
> [1]
> http://gdal.org/java/org/gdal/gdal/Band.html#WriteRaster_Direct%28int,%20int,%20int,%20int,%20int,%20int,%20int,%20java.nio.ByteBuffer,%20int,%20int%29
>
>
> >  -------Original Message-------
> >  From: Even Rouault <even.rouault at mines-paris.org>
> >  Subject: Re: [gdal-dev] GDAL-Java: How to write Flot32, Int16?
> >  Sent: Nov 03 '09 17:18
> >
> >  Selon Ivan <ivan.lucena at pmldnet.com>:
> >
> >  The Java API only uses ByteBuffer. But you can use the asDoubleBuffer(),
> >  asFloatBuffer(), asIntBuffer() or asShortBuffer() methods to create
> views of the
> >  byte buffer as double, float, int or short buffer.
> >
> >  For example :
> >
> >  ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8 * buf_xsize *
> buf_ysize);
> >  band.ReadRaster_Direct(0, 0, xsize, ysize, buf_xsize, buf_ysize,
> >  gdal.GDT_Float64, byteBuffer);
> >  DoubleBuffer doubleBuffer = byteBuffer.asDoubleBuffer();
> >
> >  > Hi,
> >  >
> >  > Does anybody know how to write a FloatBuffer, IntBuffer or ShotBuffer
> using
> >  > the Java API?
> >  >
> >  > Thanks,
> >  >
> >  > Ivan
> >  > _______________________________________________
> >  > gdal-dev mailing list
> >  > gdal-dev at lists.osgeo.org
> >  > http://lists.osgeo.org/mailman/listinfo/gdal-dev
> >  >
> >
> >
> >
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>



-- 
-------------------------------------------------------
Eng. Daniele Romagnoli
Software Engineer

GeoSolutions S.A.S.
Via Carignoni 51
55041 Camaiore (LU)
Italy

phone: +39 0584983027
fax:     +39 0584983027
mob:   +39 328 0559267


http://www.geo-solutions.it

-------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20091104/f7d77a55/attachment-0001.html


More information about the gdal-dev mailing list