WcsExceptionCode.MissingParameterValue, "BBOX");
//
// GRID management
//
final RectifiedGridType grid = Gml4wcsFactory.eINSTANCE.createRectifiedGridType();
final Object w = kvp.get("width");
final Object h = kvp.get("height");
if (w != null && h != null) {
//
// normal grid management, only the envelope and the raster dimensions have been specified,
// we need to compute RESX, RESY, RESZ afterwards
//
// get W and H
int width = w instanceof Integer?((Integer)w):Integer.parseInt((String)w);
int height =w instanceof Integer?((Integer)h):Integer.parseInt((String)h);
grid.getAxisName().add("x");
grid.getAxisName().add("y");
final Object d = kvp.get("depth");
if (d != null) {
// afabiani: we consider 2D grdis only
throw new WcsException("3D grids are not supported.", InvalidParameterValue, "depth");
// // check that the envelope is 3D or throw an error
// if (bbox.getDimension() != 3)
// throw new WcsException("Found depth but envelope is of dimension "
// + bbox.getDimension(), InvalidParameterValue, "");
//
// // notice that as for the spec this element represents the number of ticks on the
// // third dimension
// grid.getAxisName().add("z");
//
// final int depth = Integer.parseInt((String) d);
// grid.setDimension(BigInteger.valueOf(3));
// // notice that the third element indicates how many layers we do have requested on the third dimension
// grid.setLimits(new GeneralGridEnvelope(new int[] { 0, 0, 0 }, new int[] {width, height, depth }, false));
//
//
// // 3D grid
// grid.setDimension(BigInteger.valueOf(3));
} else {
// 2d grid
grid.setDimension(BigInteger.valueOf(2));
grid.setLimits(new GridEnvelope2D(0, 0, width, height));
}
} else {
//
// we might be working with a rectified grid request there we need
// to try and use that type. we cannot build a raster grid at this
// stage yet since we have no idea about how the envelope will be intersected with the
// native envelope for this raster
//
final Object rx = kvp.get("resx");
final Object ry = kvp.get("resy");
if (rx != null && ry != null) {
// get resx e resy but correct also the sign for them taking into account
final CoordinateSystem cs=crs.getCoordinateSystem();
final AxisDirection northingDirection=cs.getAxis(1).getDirection();
final int yAxisCorrection=AxisDirection.NORTH.equals(northingDirection)?-1:1;
final AxisDirection eastingDirection=cs.getAxis(0).getDirection();
final int xAxisCorrection=AxisDirection.EAST.equals(eastingDirection)?1:-1;
final double resX = Double.parseDouble((String) rx)*xAxisCorrection;
final double resY = Double.parseDouble((String) ry)*yAxisCorrection;
// basic check, the resolution cannot be larger than any of the two spans
// for the envelope because otherwise the size in raster space will be invalid
// We expect the final raster area to be at least 2 pixel on each raster dimension
if(Math.abs(envelope.getSpan(0)/Math.abs(resX))<2||Math.abs(envelope.getSpan(1)/Math.abs(resY))<2)
throw new IllegalArgumentException(Errors.format(ErrorKeys.ILLEGAL_ARGUMENT_$1,"resolutions"));
// now compute offset vector for the transform from the envelope
// Following ISO 19123 we use the CELL_CENTER convention but with the raster
final double origX = envelope.getLowerCorner().getOrdinate(0)+resX/2;
final double origY = envelope.getUpperCorner().getOrdinate(1)+resY/2;
// create offset point
final PointType origin = Gml4wcsFactory.eINSTANCE.createPointType();
final DirectPositionType dp = Gml4wcsFactory.eINSTANCE.createDirectPositionType();
origin.setPos(dp);
origin.setSrsName(crsName);
// create resolutions vector
final VectorType resolutionVector = Gml4wcsFactory.eINSTANCE.createVectorType();
//
// Third dimension management
//
final Object rz = kvp.get("resz");
if (rz != null) {
// afabiani: we consider 2D grdis only
throw new WcsException("3D grids are not supported.", InvalidParameterValue, "resz");
// // eventual depth
// final double resZ = Double.parseDouble((String) rz);
// // check that the envelope is 3D or throw an error
// if (bbox.getDimension() != 3)
// throw new WcsException("Found ResZ but envelope is of dimension "
// + bbox.getDimension(), InvalidParameterValue, "");
// final double origZ = bbox.getLowerCorner().getOrdinate(2);
//
// // 3D grid
// grid.setDimension(BigInteger.valueOf(3));
// // set the origin position
// dp.setDimension(grid.getDimension());
// dp.setValue(Arrays.asList(origX, origY, origZ));
// grid.setOrigin(origin);
//
// // set the resolution vector
// resolutionVector.setDimension(grid.getDimension());
// resolutionVector.setValue(Arrays.asList(resX, resY, resZ));
// grid.getOffsetVector().add(resolutionVector);
} else {
// 2d grid
grid.setDimension(BigInteger.valueOf(2));
// set the origin position
dp.setDimension(grid.getDimension());
dp.setValue(Arrays.asList(origX, origY));
grid.setOrigin(origin);
// set the resolution vector
resolutionVector.setDimension(grid.getDimension());
resolutionVector.setValue(Arrays.asList(resX, resY));
grid.getOffsetVector().add(resolutionVector);
}
} else
throw new WcsException("Could not recognize grid resolution",
InvalidParameterValue, "");