*/
int mapNum = maps.size();
monitor.beginTask("Reprojecting maps to new Location...", mapNum);
for( int i = 0; i < mapNum; i++ ) {
JGrassMapGeoResource tmpMap = maps.get(i);
JGrassMapEnvironment jgMEnv = new JGrassMapEnvironment(tmpMap.getMapFile());
try {
/*
* TODO get envelope from original region and reproject it.
* then adapt it to the output resolution and
* finally reproject the map on the new grid.
*/
JGrassRegion sourceRegion = jgMEnv.getActiveRegion();
CoordinateReferenceSystem sourceCrs = jgMEnv.getCoordinateReferenceSystem();
com.vividsolutions.jts.geom.Envelope sourceEnvelope = sourceRegion.getEnvelope();
MathTransform tr = CRS.findMathTransform(sourceCrs, crs);
com.vividsolutions.jts.geom.Envelope outputEnvelope = JTS.transform(sourceEnvelope, tr);
double west = outputEnvelope.getMinX();
double east = outputEnvelope.getMaxX();
double south = outputEnvelope.getMinY();
double north = outputEnvelope.getMaxY();
double xResolution = Double.parseDouble(xRes);
double yResolution = Double.parseDouble(yRes);
Coordinate tmp1 = new Coordinate(west, south);
Coordinate tmp2 = new Coordinate(west + xResolution, south + yResolution);
JTS.transform(tmp1, tmp1, tr);
JTS.transform(tmp2, tmp2, tr);
xResolution = tmp2.x - tmp1.x;
yResolution = tmp2.y - tmp1.y;
// if in metric, snap to integer bounds
int intWest = (int) Math.floor(west);
int intSouth = (int) Math.floor(south);
if (west - intWest < xResolution && south - intSouth < yResolution) {
west = intWest;
south = intSouth;
}
double w = east - west;
double h = north - south;
// modify the envelope to be in the requested resolution
double cols = Math.floor(w / xResolution) + 1.0;
double rows = Math.floor(h / yResolution) + 1.0;
double newEast = west + cols * xResolution;
double newNorth = south + rows * yResolution;
ReferencedEnvelope referencedEnvelope = new ReferencedEnvelope(west, newEast, south, newNorth, crs);
GridToEnvelopeMapper g2eMapper = new GridToEnvelopeMapper();
g2eMapper.setEnvelope(referencedEnvelope);
GridEnvelope2D gridEnvelope2D = new GridEnvelope2D(0, 0, (int) cols, (int) rows);
g2eMapper.setGridRange(gridEnvelope2D);
g2eMapper.setPixelAnchor(PixelInCell.CELL_CENTER);
MathTransform gridToEnvelopeTransform = g2eMapper.createTransform();
GridGeometry outputGridGeometry = new GridGeometry2D(gridEnvelope2D, gridToEnvelopeTransform, crs);
GridCoverage2D coverage2D = JGrassCatalogUtilities.getGridcoverageFromGrassraster(jgMEnv, sourceRegion);
// GrassCoverageReadParam gcReadParam = new
// GrassCoverageReadParam(sourceRegion);
GridCoverage2D reprojected = (GridCoverage2D) Operations.DEFAULT.resample(coverage2D, crs,
outputGridGeometry, Interpolation.getInstance(Interpolation.INTERP_BICUBIC));
JGrassRegion jgRegion = new JGrassRegion(west, newEast, south, newNorth, xResolution, yResolution);
// GridCoverage2D coverage2D = tmp.read(null);
// GridCoverage2D reprojected = (GridCoverage2D)
// Operations.DEFAULT.resample(
// coverage2D, crs);
// Envelope2D envelope2D = reprojected.getEnvelope2D();
// JGrassRegion jgRegion = new JGrassRegion(envelope2D);
if (i == 0) {
// create the location structure
File grassDbFile = jgMEnv.getLOCATION().getParentFile();
File newLocationFile = new File(grassDbFile, locationName);
try {
JGrassCatalogUtilities.createLocation(newLocationFile.getAbsolutePath(), crs, jgRegion);
JGrassCatalogUtilities
.createMapset(newLocationFile.getAbsolutePath(), mapsetName, null, jgRegion);