org.geotools.gce.grassraster.GrassCoverageReader Maven / Gradle / Ivy
/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2006-2015, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.gce.grassraster;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.imageio.ImageReadParam;
import javax.media.jai.BorderExtenderConstant;
import javax.media.jai.Interpolation;
import javax.media.jai.RenderedOp;
import org.geotools.coverage.Category;
import org.geotools.coverage.CoverageFactoryFinder;
import org.geotools.coverage.GridSampleDimension;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridCoverageFactory;
import org.geotools.coverage.grid.GridEnvelope2D;
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.GridCoverage2DReader;
import org.geotools.gce.grassraster.core.GrassBinaryRasterReadHandler;
import org.geotools.gce.grassraster.core.color.JGrassColorTable;
import org.geotools.gce.grassraster.format.GrassCoverageFormat;
import org.geotools.gce.grassraster.metadata.GrassBinaryImageMetadata;
import org.geotools.gce.grassraster.spi.GrassBinaryImageReaderSpi;
import org.geotools.geometry.Envelope2D;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.image.ImageWorker;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.referencing.operation.builder.GridToEnvelopeMapper;
import org.geotools.util.factory.GeoTools;
import org.opengis.coverage.grid.Format;
import org.opengis.geometry.DirectPosition;
import org.opengis.geometry.Envelope;
import org.opengis.parameter.GeneralParameterValue;
import org.opengis.parameter.ParameterValue;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.datum.PixelInCell;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.util.ProgressListener;
/**
* Coverage Reader class for reading GRASS raster maps.
*
* The class reads a GRASS raster map from a GRASS workspace (see package documentation for
* further info). The reading is really done via Imageio extended classes.
*
* @author Andrea Antonello (www.hydrologis.com)
* @since 3.0
* @see GrassBinaryImageReader
* @see GrassBinaryRasterReadHandler
*/
public class GrassCoverageReader extends AbstractGridCoverage2DReader
implements GridCoverage2DReader {
private GrassBinaryImageReader imageReader = null;
private String name;
private PixelInCell cellAnchor = PixelInCell.CELL_CENTER;
private boolean useSubSamplingAsRequestedColsRows = false;
private boolean castDoubleToFloating = false;
private ProgressListener monitor = new DummyProgressListener();
private JGrassMapEnvironment jgMapEnvironment;
private double[] range;
private String colorRulesString;
private String categoriesString;
private Interpolation interpolation;
/**
* Sets the input source to use to the given {@link File file object}.
*
*
The input source must be set before any of the query or read methods are used.
*
* @param input the {@link File} to use for future decoding.
*/
public GrassCoverageReader(Object input) {
if (input instanceof File) {
File file = (File) input;
imageReader = new GrassBinaryImageReader(new GrassBinaryImageReaderSpi());
imageReader.setInput(input);
jgMapEnvironment = new JGrassMapEnvironment(file);
name = file.getName();
try {
crs = jgMapEnvironment.getCoordinateReferenceSystem();
JGrassRegion fileRegion = jgMapEnvironment.getFileRegion();
org.locationtech.jts.geom.Envelope env = fileRegion.getEnvelope();
originalEnvelope =
new GeneralEnvelope(
new ReferencedEnvelope(
env.getMinX(),
env.getMaxX(),
env.getMinY(),
env.getMaxY(),
crs));
originalGridRange =
new GridEnvelope2D(0, 0, fileRegion.getCols(), fileRegion.getRows());
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
throw new IllegalArgumentException("Illegal input argument!");
}
}
/**
* Constructor for the {@link GrassCoverageReader}.
*
* @param cellAnchor the object defining whether to assume the pixel value to be read in the
* grid's cell corner or center.
* @param interpolation the type of interpolation to be used in the case some scaling or padding
* has to be done.
* @param useSubSamplingAsColsRows a flag that gives the possibility to bypass the imageio
* subsampling mechanism. With GRASS maps this is often more performant in some boundary
* situations. In the case this flag is set to true, the subsampling values will be handled
* as the requested columns and rows.
* @param castDoubleToFloating a flag that gives the possibility to force the reading of a map
* as a floating point map. This is necessary right now because of a imageio bug:
* https://jai-imageio-core.dev.java.net /issues/show_bug.cgi?id=180.
* @param monitor a {@link IHMProgressMonitor monitor} for logging purposes. This can be null,
* in which case a dummy one will be used.
*/
public void setParams(
PixelInCell cellAnchor,
Interpolation interpolation,
boolean useSubSamplingAsColsRows,
boolean castDoubleToFloating,
ProgressListener monitor) {
this.useSubSamplingAsRequestedColsRows = useSubSamplingAsColsRows;
this.castDoubleToFloating = castDoubleToFloating;
if (monitor != null) this.monitor = monitor;
if (cellAnchor != null) this.cellAnchor = cellAnchor;
if (interpolation != null) this.interpolation = interpolation;
}
/**
* Performs the reading of the coverage.
*
*
This method read the grass file with a special image I/O class. If the image support the
* tiling read the data with a special operation which are written for this case. The step are:
*
set the region in the world
* set the region to read in the JAI coordinate
* read the data directly with driver or, if isTiling is true, with the operation.
* verify if the image cover whole the region, if not fill the rows and columns with padding
* (with the Border operation)
* scale the image to return an image with the number of columns and rows equal to the
* requestedRegion
* set the coverage (with the transformation from the JAI coordinate to the real world
* coordinate.
*
*
*
* @param region the {@link JGrassRegion region}to read. If null, the map is read in its
* original boundary and resolution.
* @return the {@link GridCoverage2D read coverage}.
*/
public GridCoverage2D readRaster(JGrassRegion region) throws IOException {
/*
* retrieve original map region and crs
*/
HashMap metaDataTable =
((GrassBinaryImageMetadata) imageReader.getImageMetadata(0)).toHashMap();
double fileNorth = Double.parseDouble(metaDataTable.get(GrassBinaryImageMetadata.NORTH));
double fileSouth = Double.parseDouble(metaDataTable.get(GrassBinaryImageMetadata.SOUTH));
double fileEast = Double.parseDouble(metaDataTable.get(GrassBinaryImageMetadata.EAST));
double fileWest = Double.parseDouble(metaDataTable.get(GrassBinaryImageMetadata.WEST));
int fileRows = Integer.parseInt(metaDataTable.get(GrassBinaryImageMetadata.NROWS));
int fileCols = Integer.parseInt(metaDataTable.get(GrassBinaryImageMetadata.NCOLS));
CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
try {
crs = CRS.parseWKT(metaDataTable.get(GrassBinaryImageMetadata.CRS));
} catch (FactoryException e) {
throw new IOException(e.getLocalizedMessage());
}
// where to put the region to read and if use subSampling
ImageReadParam imageReadParam = new ImageReadParam();
/*
* the envelope that was requested, i.e. what has to be given back in
* terms of bounds and resolution.
*/
Envelope requestedRegionEnvelope = null;
/*
* the read region, i.e. the requested region without the parts east and
* south of the file region. (since they would produce negative origin)
*/
Rectangle sourceRegion = null;
int requestedRows = 0;
int requestedCols = 0;
double requestedWest = -1;
double requestedEast = -1;
double requestedSouth = -1;
double requestedNorth = -1;
double requestedXres = -1;
double requestedYres = -1;
int subSamplingX = 1;
int subSamplingY = 1;
// These variable are difference,in N-E coordinate, between the
// requested region and the
// image region.
double xDeltaW = 0;
double xDeltaE = 0;
double yDeltaN = 0;
double yDeltaS = 0;
// this is a difference used to compute the exact region in the world in
// order to transform
// the SR.
double tmpDxW = 0.0;
double tmpDyS = 0.0;
double tmpDyN = 0.0;
double tmpDxE = 0.0;
int xPaddingSx = 0;
int yPaddingTop = 0;
if (region != null) {
/*
* the user requested a particular read region. and that is exactly
* the region we have to give back.
*/
requestedRows = region.getRows();
requestedCols = region.getCols();
requestedWest = region.getWest();
requestedEast = region.getEast();
requestedSouth = region.getSouth();
requestedNorth = region.getNorth();
requestedXres = region.getWEResolution();
requestedYres = region.getNSResolution();
/*
* define the raster space region
*/
double scaleX = fileCols / (fileEast - fileWest);
double scaleY = fileRows / (fileNorth - fileSouth);
double EPS = 1E-7;
// awt space seen in the world view (north is ymax)
int xmin = (int) Math.floor((requestedWest - fileWest) * scaleX + EPS);
int xmax = (int) Math.ceil((requestedEast - fileWest) * scaleX - EPS);
int ymin = (int) Math.floor((fileNorth - requestedNorth) * scaleY + EPS);
int ymax = (int) Math.ceil((fileNorth - requestedSouth) * scaleY - EPS);
/*
* clip away region that is west and south of the image bounds. This
* is important because the imageio source region can't be < 0.
* Later the clipped parts will be resolved by translation of the
* image.
*/
if (xmin < 0) {
xPaddingSx = xmin;
xmin = 0;
}
if (ymin < 0) {
yPaddingTop = ymin;
ymin = 0;
}
/*
* the pixel space region that will be extracted. Since the origin
* is always 0,0, we can continue to see this in world view.
*/
sourceRegion = new Rectangle(xmin, ymin, (xmax - xmin), ymax - ymin);
requestedRegionEnvelope =
new Envelope2D(
crs,
requestedWest,
requestedSouth,
requestedEast - requestedWest,
requestedNorth - requestedSouth);
/*
* the real world deltas
*/
xDeltaW = requestedWest - fileWest;
yDeltaS = requestedSouth - fileSouth;
xDeltaE = requestedEast - fileEast;
yDeltaN = requestedNorth - fileNorth;
// yDelta = requestedNorth - north;
/*
* the real world envelope covering the read map part.
*/
tmpDxW = xDeltaW > 0.0 ? 0.0 : xDeltaW;
tmpDyS = yDeltaS > 0.0 ? 0.0 : yDeltaS;
tmpDyN = yDeltaN < 0.0 ? 0.0 : yDeltaN;
tmpDxE = xDeltaE < 0.0 ? 0.0 : xDeltaE;
// set the region to the requestedRegion, this value is passed to
// the coverage to
// transform the JAI space into the real space.
/*
* define the subsampling values. This done starting from the
* original's image resolution.
*/
if (!useSubSamplingAsRequestedColsRows) {
/*
* in this case we respect the original subsampling contract.
*/
JGrassRegion tmpRegion = new JGrassRegion(region);
tmpRegion.setWEResolution((fileEast - fileWest) / (double) fileCols);
tmpRegion.setNSResolution((fileNorth - fileSouth) / (double) fileRows);
subSamplingX =
(int) Math.floor((double) tmpRegion.getCols() / (double) requestedCols);
subSamplingY =
(int) Math.floor((double) tmpRegion.getRows() / (double) requestedRows);
if (subSamplingX == 0) subSamplingX = 1;
if (subSamplingY == 0) subSamplingY = 1;
if (subSamplingX != subSamplingY) {
if (subSamplingX < subSamplingY) {
subSamplingY = subSamplingX;
} else {
subSamplingX = subSamplingY;
}
}
} else {
/*
* in this case the subsampling values are interpreted as
* columns and row numbers to be used to calculate the
* resolution from the given boundaries.
*/
double sourceCols =
(requestedEast - requestedWest)
/ (1 + (xPaddingSx / (xmax - xmin)))
/ requestedXres;
double sourceRows =
(requestedNorth - requestedSouth)
/ (1 + (yPaddingTop / (ymax - ymin)))
/ requestedYres;
/*
* the padding has to be removed since inside the reader
* the padding is ignored and non present in the sourceRegion that
* is passed.
*/
sourceCols = sourceCols + xPaddingSx;
sourceRows = sourceRows + yPaddingTop;
subSamplingX = (int) Math.round(sourceCols);
subSamplingY = (int) Math.round(sourceRows);
if (subSamplingX < 1) {
subSamplingX = 1;
}
if (subSamplingY < 1) {
subSamplingY = 1;
}
}
} else {
/*
* if no region has been requested, the source and requested region
* are the same, i.e. the whole raster is read and passed.
*/
requestedRows = fileRows;
requestedCols = fileCols;
requestedWest = fileWest;
requestedEast = fileEast;
requestedSouth = fileSouth;
requestedNorth = fileNorth;
double scaleX = fileCols / (fileEast - fileWest);
double scaleY = fileRows / (fileNorth - fileSouth);
double EPS = 1E-6;
int xmin = (int) Math.floor((requestedWest - fileWest) * scaleX + EPS);
int xmax = (int) Math.ceil((requestedEast - fileWest) * scaleX - EPS);
int ymin = (int) Math.floor((fileNorth - requestedNorth) * scaleY + EPS);
int ymax = (int) Math.ceil((fileNorth - requestedSouth) * scaleY - EPS);
sourceRegion = new Rectangle(xmin, ymin, (xmax - xmin), ymax - ymin);
requestedRegionEnvelope =
new Envelope2D(
crs,
requestedWest,
requestedSouth,
requestedEast - requestedWest,
requestedNorth - requestedSouth);
/*
* define the subsampling values. This done starting from the
* original's image resolution.
*/
if (!useSubSamplingAsRequestedColsRows) {
/*
* in this case we respect the original subsampling contract.
*/
subSamplingX = 1;
subSamplingY = 1;
} else {
subSamplingX = fileCols;
subSamplingY = fileRows;
}
}
if (sourceRegion.getWidth() <= 0 || sourceRegion.getHeight() <= 0) {
return null;
}
// now we have enough info to create the ImageReadParam
imageReadParam.setSourceRegion(sourceRegion);
imageReadParam.setSourceSubsampling(subSamplingX, subSamplingY, 0, 0);
RenderedImage finalImage = null;
BufferedImage image =
imageReader.read(
0,
imageReadParam,
useSubSamplingAsRequestedColsRows,
castDoubleToFloating,
monitor);
imageReader.dispose();
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();
if (requestedSouth < fileSouth
|| requestedWest < fileWest
|| requestedEast > fileEast
|| requestedNorth > fileNorth) {
double totalHeigth = (requestedNorth - tmpDyN) - (requestedSouth - tmpDyS);
int xPaddingDx = 0;
if (xDeltaE > 0) {
xPaddingDx =
(int)
Math.round(
xDeltaE
* (double) imageWidth
/ ((requestedEast - tmpDxE)
- (requestedWest - tmpDxW)));
}
int yPaddingBottom = 0;
if (yDeltaS < 0) {
yPaddingBottom = (int) Math.round(yDeltaS * (double) imageHeight / (totalHeigth));
}
RenderedImage translatedImage =
setPadding(xPaddingSx, xPaddingDx, yPaddingTop, yPaddingBottom, image);
if (requestedRows != imageHeight || requestedCols != imageWidth) {
finalImage =
JGrassUtilities.scaleJAIImage(
requestedCols, requestedRows, translatedImage, interpolation);
} else {
finalImage = translatedImage;
}
} else if (requestedRows != imageHeight || requestedCols != imageWidth) {
finalImage =
JGrassUtilities.scaleJAIImage(
requestedCols, requestedRows, image, interpolation);
} else {
finalImage = image;
}
if (finalImage instanceof RenderedOp) {
RenderedOp rOp = (RenderedOp) finalImage;
finalImage = rOp.getAsBufferedImage();
}
// set the minimum and the maximum default value in order to obtain a
// color table.
double min = JGrassMapEnvironment.defaultMapMin;
double max = JGrassMapEnvironment.defaultMapMax;
File rangeFile = jgMapEnvironment.getCELLMISC_RANGE();
// if the file exists, read the range.
if (rangeFile.exists()) {
try (InputStream is = new FileInputStream(rangeFile)) {
byte[] numbers = new byte[16];
int testread = is.read(numbers);
if (testread == 16) {
ByteBuffer rangeBuffer = ByteBuffer.wrap(numbers);
min = rangeBuffer.getDouble();
max = rangeBuffer.getDouble();
}
}
}
range = new double[] {min, max};
// range = imageReader.getRasterReader().getRange();
/*
* create the categories from the color rules
*/
GridSampleDimension band = createGridSampleDimension(metaDataTable, range);
// create a relationship between the real region in the world and the
// jai space. N.B. the
// image dimension is only the real dimension which can be extract to a
// file.
GridToEnvelopeMapper g2eMapper = new GridToEnvelopeMapper();
g2eMapper.setEnvelope(requestedRegionEnvelope);
g2eMapper.setGridRange(new GridEnvelope2D(0, 0, requestedCols, requestedRows));
g2eMapper.setPixelAnchor(cellAnchor);
MathTransform gridToEnvelopeTransform = g2eMapper.createTransform();
GridCoverageFactory factory =
CoverageFactoryFinder.getGridCoverageFactory(GeoTools.getDefaultHints());
GridCoverage2D coverage2D =
factory.create(
name,
finalImage,
crs,
gridToEnvelopeTransform,
new GridSampleDimension[] {band},
null,
null);
return coverage2D;
}
private RenderedImage setPadding(
int xPaddingSx,
int xPaddingDx,
int yPaddingTop,
int yPaddingBottom,
RenderedImage image) {
ImageWorker worker = new ImageWorker(image);
worker.border(
Math.abs(xPaddingSx),
Math.abs(0),
Math.abs(yPaddingTop),
Math.abs(0),
new BorderExtenderConstant(new double[] {Double.NaN}));
worker.translate((float) -xPaddingSx, (float) -yPaddingTop, null);
return worker.getRenderedImage();
}
private GridSampleDimension createGridSampleDimension(
HashMap metaDataTable, double[] range) throws IOException {
colorRulesString = metaDataTable.get(GrassBinaryImageMetadata.COLOR_RULES_DESCRIPTOR);
categoriesString = metaDataTable.get(GrassBinaryImageMetadata.CATEGORIES_DESCRIPTOR);
String[] colorRulesSplit;
if (colorRulesString.length() > 3
&& !colorRulesString.matches(".*Infinty.*|.*NaN.*")) { // $NON-NLS-1$
colorRulesSplit = colorRulesString.split(GrassBinaryImageMetadata.RULESSPLIT);
} else {
List defColorTable = JGrassColorTable.createDefaultColorTable(range, 255);
colorRulesSplit = (String[]) defColorTable.toArray(new String[defColorTable.size()]);
// make it also persistent
File colrFile = jgMapEnvironment.getCOLR();
JGrassUtilities.makeColorRulesPersistent(colrFile, defColorTable, range, 255);
}
if (colorRulesSplit != null) {
int COLORNUM = 60000;
int rulesNum = colorRulesSplit.length;
if (colorRulesSplit.length > COLORNUM) {
COLORNUM = colorRulesSplit.length + 1;
}
if (COLORNUM > 65500) {
COLORNUM = 65500;
}
List catsList = new ArrayList();
double[][] values = new double[rulesNum][2];
Color[][] colors = new Color[rulesNum][2];
for (int i = 0; i < rulesNum; i++) {
String colorRule = colorRulesSplit[i];
JGrassColorTable.parseColorRule(colorRule, values[i], colors[i]);
if (values[i][0] == values[i][1]) {
colors[i][1] = colors[i][0];
}
// System.out.println("Processing colorrule: " + colorRule);
}
Category noData =
new Category(
"novalue",
new Color(
Color.WHITE.getRed(),
Color.WHITE // $NON-NLS-1$
.getGreen(),
Color.WHITE.getBlue(),
0),
0);
catsList.add(noData);
double a = (values[values.length - 1][1] - values[0][0]) / (double) (COLORNUM - 1);
double pmin = 1.0;
double scale = a;
if (scale == 0) {
scale = 1;
}
double offSet = values[0][0] - scale * pmin;
int previousUpper = -Integer.MAX_VALUE;
for (int i = 0; i < rulesNum; i++) {
StringBuilder sB = new StringBuilder();
sB.append(name);
sB.append("_"); // $NON-NLS-1$
sB.append(i);
double tmpLower = values[i][0];
double tmpUpper = values[i][1];
int lower = (int) ((tmpLower - values[0][0]) / scale + pmin);
int upper = (int) ((tmpUpper - values[0][0]) / scale + pmin);
if (lower <= previousUpper) {
lower = previousUpper + 1;
}
if (lower >= upper) {
upper = lower + 1;
}
previousUpper = upper;
Category dataCategory = new Category(sB.toString(), colors[i], lower, upper);
catsList.add(dataCategory);
}
Category[] array = (Category[]) catsList.toArray(new Category[catsList.size()]);
return new GridSampleDimension(name, array, scale, offSet);
} else {
return new GridSampleDimension(name, new Category[] {}, null);
}
}
// @SuppressWarnings("nls")
// public static void main( String[] args ) {
// try {
// String mapPath = "/home/daniele/Jgrassworkspace/testLettura/test/cell/testa";
// // ";
// // String mapPath =
// //
// "/home/moovida/rcpdevelopment/WORKSPACES/eclipseGanimede/jai_tests/spearfish/PERMANENT/cell/elevation.dem"
// // ;
//
// /*
// * test1 - read the whole data
// */
// Interpolation interpolation = Interpolation.getInstance(Interpolation.INTERP_NEAREST);
// GrassCoverageReader tmp = new GrassCoverageReader(PixelInCell.CELL_CENTER,
// interpolation, true, false, new PrintStreamProgressMonitor(System.out,
// System.out));
// tmp.setInput(new File(mapPath));
//
// // JGrassRegion readRegion = JGrassRegion
// // .getActiveRegionFromMapset("/home/daniele/Jgrassworkspace/testLettura/test");
// // JGrassRegion readRegion = new JGrassRegion(1640650.0, 1640950.0,
// // 5139780.0, 5140020.0, 30.0, 30.0);
// JGrassRegion readRegion = new JGrassRegion(1640650.0, 1640950.0, 5139780.0, 5140020.0,
// 60.0, 60.0);
//
// GrassCoverageReadParam gcReadParam = new GrassCoverageReadParam(readRegion);
//
// GridCoverage2D coverage2D = tmp.read(gcReadParam);
// Raster fileImage = coverage2D.getRenderedImage().getData();
// for( int j = fileImage.getMinX(); j < fileImage.getMinX() + fileImage.getHeight(); j++ ) {
// for( int i = fileImage.getMinY(); i < fileImage.getMinY() + fileImage.getWidth(); i++ ) {
// System.out.print(fileImage.getSampleDouble(i, j, 0) + "\t");
// }
// System.out.println();
// }
//
// if (true) {
// System.exit(0);
// }
//
// Point2D point = new Point2D.Double(608940.0, 4914330.0);
// double[] buffer = new double[1];
// System.out.println(coverage2D.evaluate(point, buffer)[0]);
//
// interpolation = Interpolation.getInstance(Interpolation.INTERP_BILINEAR);
// GridCoverage2D interpolated = (GridCoverage2D) Operations.DEFAULT.interpolate(
// coverage2D, interpolation);
// System.out.println(interpolated.evaluate(point, buffer)[0]);
//
// System.out.println(integerView.evaluate(point, buffer)[0]);
//
// RenderedImage renderedImage = integerView.getRenderedImage();
// OutputStream oStream = new FileOutputStream(new
// File("/Users/moovida/Desktop/test.png")); //$NON-NLS-1$
// ImageIO.write(renderedImage, "png", oStream); //$NON-NLS-1$
//
// // GridCoverage2D geographic = (GridCoverage2D)
// // Operations.DEFAULT.resample(coverage2D,
// // DefaultGeographicCRS.WGS84);
// // // GridGeometry2D g2d = new GridGeometry2D()
// // // with GridGeometry I can control the target grid
// //
// // ImageIO.write(geographic.getRenderedImage(),
// // "png", new File(
// // "/home/moovida/Desktop/test2.png"));
// //
// /*
// * test2 - read the map at lower resolution
// */
// tmp = new GrassCoverageReader(null, null, false, false, new PrintStreamProgressMonitor(
// System.out, System.out));
// tmp.setInput(new File(mapPath));
//
// readRegion = new JGrassRegion(589980.0, 609000.0, 4913690.0, 4928030.0, 478, 200);
// gcReadParam = new GrassCoverageReadParam(readRegion);
//
// coverage2D = tmp.read(gcReadParam);
// integerView = coverage2D.view(ViewType.RENDERED);
// renderedImage = integerView.getRenderedImage();
//
// oStream = new FileOutputStream(new File("/Users/moovida/Desktop/test1.png"));
// //$NON-NLS-1$
// ImageIO.write(renderedImage, "png", oStream);
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
/**
* Getter for the legend string.
*
* @return the legendstring.
*/
public String getLegendString() {
return colorRulesString;
}
/**
* Getter for the categories string.
*
* @return the categories string.
*/
public String getCategoriesString() {
return categoriesString;
}
/**
* Gets the range.
*
* Note that the range is available only if the raster was read once.
*
* @return the range non considering novalues.
*/
public double[] getRange() {
return range;
}
@Override
public GridCoverage2D read(GeneralParameterValue[] params)
throws IllegalArgumentException, IOException {
GeneralEnvelope requestedEnvelope = null;
Rectangle dim = null;
// OverviewPolicy overviewPolicy = null;
if (params != null) {
for (int i = 0; i < params.length; i++) {
final ParameterValue param = (ParameterValue) params[i];
final String name = param.getDescriptor().getName().getCode();
if (name.equals(AbstractGridFormat.READ_GRIDGEOMETRY2D.getName().toString())) {
final GridGeometry2D gg = (GridGeometry2D) param.getValue();
requestedEnvelope = new GeneralEnvelope((Envelope) gg.getEnvelope2D());
dim = gg.getGridRange2D().getBounds();
continue;
}
// if (name.equals(AbstractGridFormat.OVERVIEW_POLICY.getName().toString())) {
// overviewPolicy = (OverviewPolicy) param.getValue();
// continue;
// }
}
}
if (requestedEnvelope != null && dim != null) {
DirectPosition lowerCorner = requestedEnvelope.getLowerCorner();
double[] westSouth = lowerCorner.getCoordinate();
DirectPosition upperCorner = requestedEnvelope.getUpperCorner();
double[] eastNorth = upperCorner.getCoordinate();
JGrassRegion region =
new JGrassRegion(
westSouth[0],
eastNorth[0],
westSouth[1],
eastNorth[1],
dim.height,
dim.width);
return readRaster(region);
}
return readRaster((JGrassRegion) null);
}
public Format getFormat() {
return new GrassCoverageFormat();
}
}