package org.ianturton.cookbook.filters;
import java.io.File;
import java.io.IOException;
import javax.measure.unit.Unit;
import javax.media.jai.Histogram;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.coverage.grid.io.AbstractGridCoverage2DReader;
import org.geotools.coverage.grid.io.AbstractGridFormat;
import org.geotools.coverage.grid.io.GridFormatFinder;
import org.geotools.coverage.processing.OperationJAI;
import org.geotools.coverageio.gdal.aig.AIGReader;
import org.geotools.data.DataSourceException;
import org.opengis.coverage.grid.GridEnvelope;
import org.opengis.geometry.Envelope;
import org.opengis.parameter.ParameterValueGroup;
/**
* find all the cells in a grid coverage that are a set value. based on
* http://stackoverflow
* .com/questions/27761590/geotools-total-area-where-gridcoverage-has-value-x
*
* @author ian.turton
*
*/
public class QueryGrid {
public static void main(String[] args) {
// load a file
// File raster = new File("../../data/TQ19.asc");
File raster = new File("../../data/nzdem/nzdem500/hdr.adf");
AbstractGridFormat format = GridFormatFinder.findFormat(raster);
AbstractGridCoverage2DReader reader = null;
try {
reader = format.getReader(raster);
} catch (Exception e) {
System.err.println("Failed to find a reader for " + raster);
e.printStackTrace();
// return;
}
try {
reader = new AIGReader(raster);
} catch (DataSourceException e) {
e.printStackTrace();
}
GridCoverage2D cov;
try {
cov = reader.read(null);
} catch (IOException giveUp) {
throw new RuntimeException(giveUp);
}
QueryGrid queryGrid = new QueryGrid();
queryGrid.selectCells(cov, 135);
queryGrid.selectCells(cov, 0);
queryGrid.selectCells(cov, 134);
}
private double selectCells(GridCoverage2D cov, int value) {
GridGeometry2D geom = cov.getGridGeometry();
// cov.show();
final OperationJAI op = new OperationJAI("Histogram");
ParameterValueGroup params = op.getParameters();
GridCoverage2D coverage;
params.parameter("Source").setValue(cov);
coverage = (GridCoverage2D) op.doOperation(params, null);
javax.media.jai.Histogram hist = (Histogram) coverage
.getProperty("histogram");
int total = hist.getSubTotal(0, value, value);
double area = calcAreaOfCell(geom);
Unit<?> unit = cov.getCoordinateReferenceSystem().getCoordinateSystem()
.getAxis(0).getUnit();
System.out.println("which gives " + (area * total) + " " + unit
+ "^2 area with value " + value);
return area * total;
}
private double calcAreaOfCell(GridGeometry2D geom) {
GridEnvelope gridRange = geom.getGridRange();
int width = gridRange.getHigh(0) - gridRange.getLow(0) + 1; // allow for the
int height = gridRange.getHigh(1) - gridRange.getLow(1) + 1;// 0th row/col
Envelope envelope = geom.getEnvelope();
double dWidth = envelope.getMaximum(0) - envelope.getMinimum(0);
double dHeight = envelope.getMaximum(1) - envelope.getMinimum(1);
double cellWidth = dWidth / width;
double cellHeight = dHeight / height;
return cellWidth * cellHeight;
}
}