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

Even Rouault even.rouault at mines-paris.org
Wed Nov 4 14:24:53 EST 2009


Selon Ivan <ivan.lucena at pmldnet.com>:

I realize I hadn't yet tested with multibyte data types.
I've improved the javadoc of the ReadRaster_Direct and WriteRaster_Direct
methods to mention the byte ordering issue.

> Thanks Daniele. That takes care of the problem.
>
>
> >  -------Original Message-------
> >  From: Daniele Romagnoli <daniele.romagnoli at geo-solutions.it>
> >  Subject: Re: [gdal-dev] GDAL-Java: How to write Flot32, Int16?
> >  Sent: Nov 04 '09 12:36
> >
> >  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 <[LINK:
> >  mailto:ivan.lucena at pmldnet.com] 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] [LINK: http://gdal.org/java/org/gdal/gdal/Band.html]
> >
>
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 <[LINK: mailto:even.rouault at mines-paris.org]
> >  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 <[LINK: mailto:ivan.lucena at pmldnet.com]
> >  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
> >  >  > [LINK: mailto:gdal-dev at lists.osgeo.org] gdal-dev at lists.osgeo.org
> >  >  > [LINK: http://lists.osgeo.org/mailman/listinfo/gdal-dev]
> >  http://lists.osgeo.org/mailman/listinfo/gdal-dev
> >  >  >
> >  >
> >  >
> >  >
> >  _______________________________________________
> >  gdal-dev mailing list
> >  [LINK: mailto:gdal-dev at lists.osgeo.org] gdal-dev at lists.osgeo.org
> >  [LINK: http://lists.osgeo.org/mailman/listinfo/gdal-dev]
> >  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
> >
> >
> >  [LINK: http://www.geo-solutions.it] http://www.geo-solutions.it
> >
> >  -------------------------------------------------------
>




More information about the gdal-dev mailing list