Hi Norman:
Thanks for the code. We looked at using JAI to write TIFF, but failed to
get it working ("JAI documentation is a bit sparse"). Is the code the
complete way to do that? Are there any problems with it that you know
of? It doesnt appear that youve added the geotiff tags, is that correct?
Any advice you can give us on using or not using JAI?
thanks again!
Norman Barker wrote:
Thanks for the reply, I will top post (apologies) since the file is long.
I wrote some test code before I integrated into my app, and using netcdf-java
and
JAI the following creates a multiband tif file. (there are some redundant
variables in
there, apologies again). JAI documentation is a bit sparse, so hope this helps.
Norman
public static void main(String[] args) {
String testNC = "/temp/test.nc";
String outGTif = "/temp/out.tif";
String gridName = "ta";
try {
NetcdfDataset ncDataset =
NetcdfDataset.openDataset(testNC);
GridDataset gSet = new GridDataset(ncDataset);
GeoGrid grid = gSet.findGridByName(gridName);
GridCoordSys gcs = grid.getCoordinateSystem();
//latlon coord does not need to be scaled
double scaler = (gcs.isLatLon()) ? 1.0 : 1000.0;
CoordinateAxis1D xaxis = (CoordinateAxis1D)
gcs.getXHorizAxis();
CoordinateAxis1D yaxis = (CoordinateAxis1D)
gcs.getYHorizAxis();
double xStart = xaxis.getCoordValue(0) * scaler;
double yStart = yaxis.getCoordValue(0) * scaler;
double xEnd =
xaxis.getCoordValue(grid.getXDimension().getLength()-1) * scaler;
double yEnd =
yaxis.getCoordValue(grid.getYDimension().getLength()-1) * scaler;
double xInc = (xEnd - xStart)/xaxis.getElementSize();
double yInc = (yEnd - yStart)/yaxis.getElementSize();
List list = ncDataset.getCoordinateAxes();
Iterator itr = list.iterator();
while (itr.hasNext()) {
CoordinateAxis1D dim = (CoordinateAxis1D)
itr.next();
String dimName = dim.getName();
if (dimName.equals(IngestFile.DIM_NAME)) {
int nBands = (int) dim.getSize();
if (dim.isUnlimited()) {
// we can't do anything, log
return;
}
int width =
grid.getXDimension().getLength();
int height =
grid.getYDimension().getLength();
ParameterBlockJAI pbjai = new
ParameterBlockJAI("bandmerge");
for (int i = 0; i < nBands; i++)
{
Array arr =
grid.readDataSlice(-1, i, -1, -1);
float[] data = (float[])
arr.getStorage();
DataBufferFloat dbuffer = new
DataBufferFloat(data, width*height);
// create a float data sample
model
SampleModel sampleModel =
RasterFactory.createBandedSampleModel(DataBuffer.TYPE_FLOAT, width, height, 1);
// create a compatible colour
model
ColorModel colorModel =
PlanarImage.createColorModel(sampleModel);
// create a writable raster
Raster raster =
RasterFactory.createWritableRaster(sampleModel, dbuffer, null);
// create a tiled image using
the float sample model
TiledImage tiledImage = new
TiledImage(0, 0, width, height, 0, 0, sampleModel, colorModel);
// set the data of the tiled
image to be the raster
tiledImage.setData(raster);
pbjai.setSource(tiledImage, i);
}
// save the image on a file
PlanarImage result =
JAI.create("bandmerge", pbjai, null);
JAI.create("filestore", result, outGTif,
"TIFF");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
-----Original Message-----
From: Yuan Ho [mailto:yuanho@xxxxxxxxxxxxxxxx]
Sent: Monday, April 18, 2005 5:27 PM
To: Norman Barker
Cc: netcdf-java@xxxxxxxxxxxxxxxx; support-netcdf-java@xxxxxxxxxxxxxxxx
Subject: Re: [Fwd: multi band tiff from netCDF]
John Caron wrote:
can you answer this?
cc to netcdf-java@xxxxxxxxxxxxxxxx and
support-netcdf-java@xxxxxxxxxxxxxxxx
-------- Original Message --------
Subject: multi band tiff from netCDF
Date: Mon, 18 Apr 2005 16:01:21 +0100
From: Norman Barker <nbarker@xxxxxxxxx>
Organization: UCAR/Unidata
To: <netcdf-java@xxxxxxxxxxxxxxxx>
Hi,
I am using the java classes to convert a netcdf file for one time
instance, with 27 levels in Z (atmospheric pressure levels).
I have created a loop with variable i, and attempting to write a band
in the tif file
for each iteration. What seems to happen is the first band gets
written ok, but then after that
the page number gets messed up?
Array data = grid.readDataSlice(0, i, -1, -1);
writer.writeGrid(grid, data, false, xStart, yStart, xInc, yInc, i);
Has anyone got any pseudo code for writing multiband tif files from
netCDF?
Many thanks,
Norman Barker
Norman,
The code was not designed for multiband tiff files. We
originally believed that multipage was better to store multi variables
and/or multi vertical levels.
We just realized that multiband was probably better embraced because of
the existing tiff readers and the concept of tiff community. This will
be my next task to change the
software to use multiband to store tiff files, it will be released
sometime in the Summer.
Yuan