/****************************************************************************** * $Id: GDALTestIO.java f070adf64950cae1c6cc86b104ba835c29df06b1 2016-08-28 06:06:11Z Kurt Schwehr $ * * Name: GDALTestIO.java * Project: GDAL Java Interface * Purpose: A sample app to test ReadRaster_Direct / WriteRaster_Direct * Author: Even Rouault, * * Adapted from a sample by Ivan Lucena * ****************************************************************************** * Copyright (c) 2009, Even Rouault * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import org.gdal.gdal.gdal; import org.gdal.gdal.Band; import org.gdal.gdal.Dataset; import org.gdal.gdal.Driver; import org.gdal.gdalconst.gdalconst; public class GDALTestIO implements Runnable { String filename; int nbIters; static final int METHOD_DBB = 1; static final int METHOD_JAVA_ARRAYS = 2; static int method; static volatile boolean bWait = true; static volatile int nReady = 0; static Object waiter = new Object(); static Object notifier = new Object(); public GDALTestIO(String filename, int nbIters) { this.filename = filename; this.nbIters = nbIters; } public void run() { Dataset dataset = null; Driver driver = null; Band band = null; int xsize = 4000; int ysize = 400; synchronized(notifier) { nReady ++; notifier.notify(); } synchronized(waiter) { while( bWait ) { try { waiter.wait(); } catch(InterruptedException ie) { } } } driver = gdal.GetDriverByName("GTiff"); ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * xsize); byteBuffer.order(ByteOrder.nativeOrder()); FloatBuffer floatBuffer = byteBuffer.asFloatBuffer(); int[] intArray = new int[xsize]; float[] floatArray = new float[xsize]; dataset = driver.Create(filename, xsize, ysize, 1, gdalconst.GDT_Float32); band = dataset.GetRasterBand(1); for(int iter = 0; iter < nbIters; iter++) { if (method == METHOD_DBB) { 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, gdalconst.GDT_Float32, byteBuffer); } } else { for( int i = 0; i < ysize; i++) { for( int j = 0; j < xsize; j++) { floatArray[j] = (float) (i + j); } band.WriteRaster(0, i, xsize, 1, floatArray); } } } dataset.delete(); /* Open the file to check the values */ dataset = gdal.Open(filename); band = dataset.GetRasterBand(1); for(int iter = 0; iter < nbIters; iter++) { if (method == METHOD_DBB) { for( int i = 0; i < ysize; i++) { band.ReadRaster_Direct(0, i, xsize, 1, xsize, 1, gdalconst.GDT_Int32, byteBuffer); for( int j = 0; j < xsize; j++) { int val = byteBuffer.getInt(j*4); if (val != (i + j)) throw new RuntimeException("Bad value for (" + j + "," + i + ") : " + val); } } } else { for( int i = 0; i < ysize; i++) { band.ReadRaster(0, i, xsize, 1, intArray); for( int j = 0; j < xsize; j++) { int val = intArray[j]; if (val != (i + j)) throw new RuntimeException("Bad value for (" + j + "," + i + ") : " + val); } } } } dataset.delete(); /* Free the memory occupied by the /vsimem file */ gdal.Unlink(filename); } public static void main(String[] args) throws InterruptedException { gdal.AllRegister(); int nbIters = 50; method = METHOD_JAVA_ARRAYS; if (args.length >= 1 && args[0].equalsIgnoreCase("-dbb")) method = METHOD_DBB; Thread t1 = new Thread(new GDALTestIO("/vsimem/test1.tif", nbIters)); Thread t2 = new Thread(new GDALTestIO("/vsimem/test2.tif", nbIters)); t1.start(); t2.start(); synchronized(notifier) { while( nReady != 2 ) { try { notifier.wait(); } catch(InterruptedException ie) { } } } synchronized(waiter) { bWait = false; waiter.notifyAll(); } t1.join(); t2.join(); System.out.println("Success !"); } }