/******************************************************************************
* $Id$
*
* Name: GDALtest.java
* Project: GDAL SWIG Interface
* Purpose: Sample Java application showing some basic loading of raster data
* Author: Benjamin Collins, The MITRE Corporation
*
*
* $Log$
* Revision 1.1 2006/02/08 19:39:03 collinsb
* Initial version
*
*
*/
import java.awt.BorderLayout;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BandedSampleModel;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt;
import java.awt.image.DataBufferShort;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.GCP;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.gdalconst.gdalconstConstants;
public class GDALtest extends JFrame implements ActionListener{
BufferedImage image = null;
JLabel canvas = null;
JButton load = null;
static {
System.out.println("GDAL init...");
gdal.AllRegister();
int count = gdal.GetDriverCount();
System.out.println(count + " available Drivers");
for (int i = 0; i < count; i++) {
try {
Driver driver = gdal.GetDriver(i);
System.out.println(" " + driver.getShortName() + " : "
+ driver.getLongName());
} catch (Exception e) {
System.err.println("Error loading driver " + i);
}
}
}
public GDALtest() {
load = new JButton("Load Image");
load.addActionListener(this);
canvas = new JLabel();
canvas.setSize(1024, 768);
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(load, BorderLayout.NORTH);
this.getContentPane().add(canvas, BorderLayout.SOUTH);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setSize(1024, 768);
this.show();
}
public void setImage(BufferedImage image) {
ImageIcon icon = new ImageIcon(image);
if(this.canvas != null) {
canvas.setIcon(icon);
}
}
public BufferedImage openFile(File f) {
Dataset poDataset = null;
try {
poDataset = (Dataset) gdal.Open(f.getAbsolutePath(),
gdalconst.GA_ReadOnly);
if (poDataset == null) {
System.out.println("The image could not be read.");
printLastError();
return null;
}
} catch(Exception e) {
System.err.println("Exception caught.");
System.err.println(e.getMessage());
e.printStackTrace();
return null;
}
double[] adfGeoTransform = new double[6];
System.out.println("Driver: " + poDataset.GetDriver().GetDescription());
System.out.println("Size is: " + poDataset.getRasterXSize() + "x"
+ poDataset.getRasterYSize() + " bands:"
+ poDataset.getRasterCount());
if (poDataset.GetProjectionRef() != null)
System.out.println("Projection is `" + poDataset.GetProjectionRef()
+ "'");
Hashtable dict = poDataset.GetMetadata_Dict("");
Enumeration keys = dict.keys();
System.out.println(dict.size() + " items of metadata found (via Hashtable dict):");
while(keys.hasMoreElements()) {
String key = (String)keys.nextElement();
System.out.println(" :" + key + ":==:" + dict.get(key) + ":");
}
Vector list = poDataset.GetMetadata_List("");
Enumeration enumerate = list.elements();
System.out.println(list.size() + " items of metadata found (via Vector list):");
while(enumerate.hasMoreElements()) {
String s = (String)enumerate.nextElement();
System.out.println(" " + s);
}
Vector GCPs = new Vector();
poDataset.GetGCPs(GCPs);
System.out.println("Got " + GCPs.size() + " GCPs");
Enumeration e = GCPs.elements();
while(e.hasMoreElements()) {
GCP gcp = (GCP)e.nextElement();
System.out.println(" x:" + gcp.getGCPX() +
" y:" + gcp.getGCPY() +
" z:" + gcp.getGCPZ() +
" pixel:" + gcp.getGCPPixel() +
" line:" + gcp.getGCPLine() +
" line:" + gcp.getInfo());
}
poDataset.GetGeoTransform(adfGeoTransform);
{
System.out.println("Origin = (" + adfGeoTransform[0] + ", "
+ adfGeoTransform[3] + ")");
System.out.println("Pixel Size = (" + adfGeoTransform[1] + ", "
+ adfGeoTransform[5] + ")");
}
Band poBand = null;
double[] adfMinMax = new double[2];
Double[] max = new Double[1];
Double[] min = new Double[1];
int bandCount = poDataset.getRasterCount();
ByteBuffer[] bands = new ByteBuffer[bandCount];
int[] banks = new int[bandCount];
int[] offsets = new int[bandCount];
int xsize = 1024;//poDataset.getRasterXSize();
int ysize = 1024;//poDataset.getRasterYSize();
int pixels = xsize * ysize;
int buf_type = 0, buf_size = 0;
for(int band = 0; band < bandCount; band++) {
/* Bands are not 0-base indexed, so we must add 1 */
poBand = poDataset.GetRasterBand(band+1);
buf_type = poBand.getDataType();
buf_size = pixels * gdal.GetDataTypeSize(buf_type) / 8;
System.out.println(" Data Type = "
+ gdal.GetDataTypeName(poBand.getDataType()));
System.out.println(" ColorInterp = "
+ gdal.GetColorInterpretationName(poBand
.GetRasterColorInterpretation()));
System.out.println("Band size is: " + poBand.getXSize() + "x"
+ poBand.getYSize());
poBand.GetMinimum(min);
poBand.GetMaximum(max);
if(min[0] != null || max[0] != null) {
System.out.println(" Min=" + min[0] + " Max="
+ max[0]);
} else {
System.out.println(" No Min/Max values stored in raster.");
}
if (poBand.GetOverviewCount() > 0) {
System.out.println("Band has " + poBand.GetOverviewCount()
+ " overviews.");
}
if (poBand.GetRasterColorTable() != null) {
System.out.println("Band has a color table with "
+ poBand.GetRasterColorTable().GetCount() + " entries.");
for(int i = 0; i < poBand.GetRasterColorTable().GetCount(); i++) {
System.out.println(" " + i + ": " +
poBand.GetRasterColorTable().GetColorEntry(i));
}
}
System.out.println("Allocating ByteBuffer of size: " + buf_size);
ByteBuffer data = ByteBuffer.allocateDirect(buf_size);
data.order(ByteOrder.nativeOrder());
int returnVal = 0;
try {
returnVal = poBand.ReadRaster_Direct(0, 0, poBand.getXSize(),
poBand.getYSize(), xsize, ysize,
buf_type, data);
} catch(Exception ex) {
System.err.println("Could not read raster data.");
System.err.println(ex.getMessage());
ex.printStackTrace();
return null;
}
if(returnVal == gdalconstConstants.CE_None) {
bands[band] = data;
} else {
printLastError();
}
banks[band] = band;
offsets[band] = 0;
}
DataBuffer imgBuffer = null;
SampleModel sampleModel = null;
int data_type = 0, buffer_type = 0;
if(buf_type == gdalconstConstants.GDT_Byte) {
byte[][] bytes = new byte[bandCount][];
for(int i = 0; i < bandCount; i++) {
bytes[i] = new byte[pixels];
bands[i].get(bytes[i]);
}
imgBuffer = new DataBufferByte(bytes, pixels);
buffer_type = DataBuffer.TYPE_BYTE;
sampleModel = new BandedSampleModel(buffer_type,
xsize, ysize, xsize, banks, offsets);
data_type = (poBand.GetRasterColorInterpretation() ==
gdalconstConstants.GCI_PaletteIndex)?
BufferedImage.TYPE_BYTE_INDEXED : BufferedImage.TYPE_BYTE_GRAY;
} else if(buf_type == gdalconstConstants.GDT_Int16) {
short[][] shorts = new short[bandCount][];
for(int i = 0; i < bandCount; i++) {
shorts[i] = new short[pixels];
bands[i].asShortBuffer().get(shorts[i]);
}
imgBuffer = new DataBufferShort(shorts, pixels);
buffer_type = DataBuffer.TYPE_USHORT;
sampleModel = new BandedSampleModel(buffer_type,
xsize, ysize, xsize, banks, offsets);
data_type = BufferedImage.TYPE_USHORT_GRAY;
} else if(buf_type == gdalconstConstants.GDT_Int32) {
int[][] ints = new int[bandCount][];
for(int i = 0; i < bandCount; i++) {
ints[i] = new int[pixels];
bands[i].asIntBuffer().get(ints[i]);
}
imgBuffer = new DataBufferInt(ints, pixels);
buffer_type = DataBuffer.TYPE_INT;
sampleModel = new BandedSampleModel(buffer_type,
xsize, ysize, xsize, banks, offsets);
data_type = BufferedImage.TYPE_CUSTOM;
}
WritableRaster raster = Raster.createWritableRaster(sampleModel, imgBuffer, null);
BufferedImage img = null;
ColorModel cm = null;
if(poBand.GetRasterColorInterpretation() ==
gdalconstConstants.GCI_PaletteIndex) {
data_type = BufferedImage.TYPE_BYTE_INDEXED;
cm = poBand.GetRasterColorTable().getIndexColorModel(
gdal.GetDataTypeSize(buf_type));
img = new BufferedImage(cm, raster, false, null);
} else {
ColorSpace cs = null;
if(bandCount > 2){
cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
cm = new ComponentColorModel(cs, false, false,
ColorModel.OPAQUE, buffer_type);
img = new BufferedImage(cm, raster, true, null);
} else {
img = new BufferedImage(xsize, ysize,
data_type);
img.setData(raster);
}
}
return img;
}
public void printLastError() {
System.out.println("Last error: " + gdal.GetLastErrorMsg());
System.out.println("Last error no: " + gdal.GetLastErrorNo());
System.out.println("Last error type: " + gdal.GetLastErrorType());
}
public void actionPerformed(ActionEvent arg0) {
System.out.println("Loading file chooser...");
JFileChooser chooser = new JFileChooser();
int result = chooser.showOpenDialog(this);
if(result == JFileChooser.APPROVE_OPTION) {
/* open the image! */
BufferedImage tmpImage = openFile(chooser.getSelectedFile());
setImage(tmpImage);
}
}
/**
* @param args
*/
public static void main(String[] args) {
GDALtest test = new GDALtest();
if (args.length >= 1)
{
BufferedImage tmpImage = test.openFile(new File(args[0]));
test.setImage(tmpImage);
}
}
}