/*
* Copyright 2011 by Mark Coletti, Keith Sullivan, Sean Luke, and
* George Mason University Mason University Licensed under the Academic
* Free License version 3.0
*
* See the file "LICENSE" for more information
*
* $Id$
*
*/
package sim.io.geo;
import java.io.IOException;
import java.io.Writer;
import sim.field.geo.GeomGridField;
import sim.field.grid.DoubleGrid2D;
import sim.field.grid.IntGrid2D;
/** Write a GeomGridField to an Arc/Grid formatted output stream.
*
*/
public class ArcInfoASCGridExporter
{
private static final int DEFAULT_NODATA_VALUE = -9999;
/**
* Not intended to be instantiated.
*/
private ArcInfoASCGridExporter() {}
/** Write out the given grid field to output stream
*
* @param gridField containing the data to be written
* @param nodata is the integer value indicating that given cell is null
* @param outputStream is an open, valid output stream
* @throws IOException
*/
public static void write(final GeomGridField gridField, int nodata, Writer outputStream) throws IOException
{
outputStream.write( "ncols " );
outputStream.write( Integer.toString(gridField.getGridWidth()) );
outputStream.write( "\n" );
outputStream.write( "nrows " );
outputStream.write( Integer.toString(gridField.getGridHeight()) );
outputStream.write( "\n" );
outputStream.write( "xllcorner " );
outputStream.write( Double.toString(gridField.getMBR().getMinX()) );
outputStream.write( "\n" );
outputStream.write( "yllcorner " );
outputStream.write( Double.toString(gridField.getMBR().getMinY()) );
outputStream.write( "\n" );
outputStream.write( "cellsize " );
// Yes, I'm presuming that the pixels are exactly square; so I'm
// arbitrarily picking width.
outputStream.write( Double.toString(gridField.getPixelWidth()) );
outputStream.write( "\n" );
outputStream.write( "NODATA_value " );
outputStream.write( Integer.toString(nodata) );
outputStream.write( "\n" );
switch( gridField.getGridDataType() )
{
case INTEGER :
IntGrid2D intGrid = (IntGrid2D) gridField.getGrid();
for (int y = 0; y < intGrid.getHeight(); y++)
{
for (int x = 0; x < intGrid.getWidth(); x++)
{
outputStream.write( Integer.toString(intGrid.get(x, y)) );
outputStream.write( " " );
}
outputStream.write( "\n" );
}
break;
case DOUBLE :
DoubleGrid2D doubleGrid = (DoubleGrid2D) gridField.getGrid();
for (int y = 0; y < doubleGrid.getHeight(); y++)
{
for (int x = 0; x < doubleGrid.getWidth(); x++)
{
outputStream.write( Double.toString(doubleGrid.get(x, y)) );
outputStream.write( " " );
}
outputStream.write( "\n" );
}
break;
}
}
/** Like write() with default NODATA value of -9999.
*
* @param gridField
* @param outputStream
* @throws IOException
*/
public static void write( final GeomGridField gridField, Writer outputStream ) throws IOException
{
write(gridField, DEFAULT_NODATA_VALUE, outputStream );
}
}