final CoverageInfo cinfo = requestedLayers[i].getCoverage();
final AbstractGridCoverage2DReader reader=(AbstractGridCoverage2DReader) cinfo.getGridCoverageReader(new NullProgressListener(),GeoTools.getDefaultHints());
final ParameterValueGroup params = reader.getFormat().getReadParameters();
final GeneralParameterValue[] parameters = CoverageUtils.getParameters(params, requestedLayers[i].getCoverage().getParameters(),true);
//get the original grid geometry
final GridGeometry2D coverageGeometry=(GridGeometry2D) cinfo.getGrid();
// set the requested position in model space for this request
final Coordinate middle = pixelToWorld(x, y, bbox, width, height);
DirectPosition position = new DirectPosition2D(requestedCRS, middle.x, middle.y);
//change from request crs to coverage crs in order to compute a minimal request area,
// TODO this code need to be made much more robust
if (requestedCRS != null) {
final CoordinateReferenceSystem targetCRS = coverageGeometry.getCoordinateReferenceSystem();
final TransformedDirectPosition arbitraryToInternal = new
TransformedDirectPosition(requestedCRS, targetCRS, new Hints(Hints.LENIENT_DATUM_SHIFT,Boolean.TRUE));
try {
arbitraryToInternal.transform(position);
} catch (TransformException exception) {
throw new CannotEvaluateException("Unable to answer the geatfeatureinfo",exception);
}
position=arbitraryToInternal;
}
//check that the provided point is inside the bbox for this coverage
if(!reader.getOriginalEnvelope().contains(position)) {
continue;
}
//now get the position in raster space using the world to grid related to corner
final MathTransform worldToGrid=reader.getOriginalGridToWorld(PixelInCell.CELL_CORNER).inverse();
final DirectPosition rasterMid = worldToGrid.transform(position,null);
// create a 20X20 rectangle aruond the mid point and then intersect with the original range
final Rectangle2D.Double rasterArea= new Rectangle2D.Double();
rasterArea.setFrameFromCenter(rasterMid.getOrdinate(0), rasterMid.getOrdinate(1), rasterMid.getOrdinate(0)+10, rasterMid.getOrdinate(1)+10);
final Rectangle integerRasterArea=rasterArea.getBounds();
final GridEnvelope gridEnvelope=reader.getOriginalGridRange();
final Rectangle originalArea=
(gridEnvelope instanceof GridEnvelope2D)?
(GridEnvelope2D)gridEnvelope:
new Rectangle();
XRectangle2D.intersect(integerRasterArea, originalArea, integerRasterArea);
//paranoiac check, did we fall outside the coverage raster area? This should never really happne if the request is well formed.
if(integerRasterArea.isEmpty())
return;
// now set the grid geometry for this request
for(int k=0;k<parameters.length;k++){
if(!(parameters[k] instanceof Parameter<?>))
continue;
final Parameter<?> parameter = (Parameter<?>) parameters[k];
if(parameter.getDescriptor().getName().equals(AbstractGridFormat.READ_GRIDGEOMETRY2D.getName()))
{
//
//create a suitable geometry for this request reusing the getmap (we could probably optimize)
//
parameter.setValue(new GridGeometry2D(
new GridEnvelope2D(integerRasterArea),
reader.getOriginalGridToWorld(PixelInCell.CELL_CENTER),
reader.getCrs()
));
}