package mil.nga.giat.geowave.adapter.raster.adapter.merge;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import mil.nga.giat.geowave.adapter.raster.adapter.MergeableRasterTile;
import mil.nga.giat.geowave.adapter.raster.adapter.RasterDataAdapter;
import mil.nga.giat.geowave.adapter.raster.adapter.RasterTile;
import mil.nga.giat.geowave.core.index.Persistable;
import org.opengis.coverage.grid.GridCoverage;
abstract public class SimpleAbstractMergeStrategy<T extends Persistable> implements
RasterTileMergeStrategy<T>
{
protected SimpleAbstractMergeStrategy() {
super();
}
private static final long serialVersionUID = 8937483748317L;
@Override
public void merge(
final RasterTile<T> thisTile,
final RasterTile<T> nextTile,
final SampleModel sampleModel ) {
// this strategy aims for latest tile
// with data values, but where there
// is no data in the latest and there is data in the earlier tile, it
// fills the data from the earlier tile
if ((nextTile != null) && (nextTile instanceof MergeableRasterTile)) {
final WritableRaster nextRaster = Raster.createWritableRaster(
sampleModel,
nextTile.getDataBuffer(),
null);
final WritableRaster thisRaster = Raster.createWritableRaster(
sampleModel,
thisTile.getDataBuffer(),
null);
mergeRasters(
thisTile,
nextTile,
thisRaster,
nextRaster);
}
}
protected void mergeRasters(
final RasterTile<T> thisTile,
final RasterTile<T> nextTile,
final WritableRaster thisRaster,
final WritableRaster nextRaster ) {
final int maxX = nextRaster.getMinX() + nextRaster.getWidth();
final int maxY = nextRaster.getMinY() + nextRaster.getHeight();
for (int b = 0; b < nextRaster.getNumBands(); b++) {
for (int x = nextRaster.getMinX(); x < maxX; x++) {
for (int y = nextRaster.getMinY(); y < maxY; y++) {
final double thisSample = thisRaster.getSampleDouble(
x,
y,
b);
final double nextSample = nextRaster.getSampleDouble(
x,
y,
b);
thisRaster.setSample(
x,
y,
b,
getSample(
x,
y,
b,
thisSample,
nextSample));
}
}
}
}
abstract protected double getSample(
int x,
int y,
int b,
double thisSample,
double nextSample );
@Override
public boolean equals(
Object obj ) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
return true;
}
@Override
public int hashCode() {
return (int) serialVersionUID;
// this looks correct based on behaviour of equals?!? should return the
// same hash code for all instances
}
@Override
public byte[] toBinary() {
return new byte[] {};
}
@Override
public void fromBinary(
final byte[] bytes ) {}
@Override
public T getMetadata(
final GridCoverage tileGridCoverage,
final RasterDataAdapter dataAdapter ) {
return null;
}
}