Thanks Daniele. That takes care of the problem.
> -------Original Message------- > From: Daniele Romagnoli <[email protected]> > 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:[email protected]] [email protected]> 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:[email protected]] > [email protected]> > > Subject: Re: [gdal-dev] GDAL-Java: How to write Flot32, Int16? > > Sent: Nov 03 '09 17:18 > > > > Selon Ivan <[LINK: mailto:[email protected]] > [email protected]>: > > > > 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:[email protected]] [email protected] > > > [LINK: http://lists.osgeo.org/mailman/listinfo/gdal-dev] > http://lists.osgeo.org/mailman/listinfo/gdal-dev > > > > > > > > > > _______________________________________________ > gdal-dev mailing list > [LINK: mailto:[email protected]] [email protected] > [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 > > ------------------------------------------------------- _______________________________________________ gdal-dev mailing list [email protected] http://lists.osgeo.org/mailman/listinfo/gdal-dev
