Package org.geotools.gce.imagemosaic

Source Code of org.geotools.gce.imagemosaic.SpatialRequestHelperTest

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2013, 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.imagemosaic;

import java.awt.Rectangle;
import java.awt.geom.AffineTransform;

import org.geotools.coverage.grid.GridEnvelope2D;
import org.geotools.coverage.grid.GridGeometry2D;
import org.geotools.gce.imagemosaic.SpatialRequestHelper.CoverageProperties;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.referencing.operation.builder.GridToEnvelopeMapper;
import org.geotools.referencing.operation.matrix.XAffineTransform;
import org.junit.Assert;
import org.junit.Test;
import org.opengis.geometry.BoundingBox;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.datum.PixelInCell;
import org.opengis.referencing.operation.MathTransform2D;
/**
*
* @author Simone Giannecchini, GeoSolutions
*
*/
public class SpatialRequestHelperTest extends Assert {
 
  /**
   * Requesting the same area at a much smaller resolution.
   *
   * The computed resolution should be much coarser and that is it.
   *
   * @throws Exception
   */
    @Test
    public void testNoRequest() throws Exception {
     
      // using CoverageProperties to build the SpatialRequestHelper
        CoverageProperties coverageProperties = new CoverageProperties();

        // source area in project crs
        CoordinateReferenceSystem sourceCRS =DefaultGeographicCRS.WGS84;
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope(
            -180,180,
            -90,90,
            sourceCRS);
    coverageProperties.setBBox(sourceBBox);
        coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
        Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);

    // creating the g2d
        final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
            new GridEnvelope2D(sourceRasterArea),
            sourceBBox);
        AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
        coverageProperties.setFullResolution(new double[]{
            XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform),
            });
        coverageProperties.setGeographicBBox(sourceBBox);
        coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
        SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
       
        //
        // no target request
        //
       
       
       
        ///// TEST
        spatialRequestHelper.compute();
        assertFalse(spatialRequestHelper.isEmpty());
        assertFalse(spatialRequestHelper.isNeedsReprojection()); // no reprojection
       
        // computed raster area
        Rectangle computedRasterArea = spatialRequestHelper.getComputedRasterArea();
        assertFalse(computedRasterArea.isEmpty());
        assertTrue(computedRasterArea.equals(coverageProperties.rasterArea));
       
        // computed bbox
        BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
        assertFalse(computedBBox.isEmpty());
        assertTrue(computedBBox.equals(sourceBBox));
       
        // transform
        AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
        assertNotNull(computedG2W);
        double[] computedResolution = spatialRequestHelper.getComputedResolution();
        double scale=1; // we scaled down the original image
        assertNotNull(computedResolution);
        assertEquals(scale*XAffineTransform.getScaleX0(sourceGridToWorldTransform),computedResolution[0],1E-6);
        assertEquals(scale*XAffineTransform.getScaleY0(sourceGridToWorldTransform),computedResolution[1],1E-6);
       

    // all this intersecting and so on MUST not impact the requested resolutions
        GridToEnvelopeMapper gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(coverageProperties.rasterArea),
        sourceBBox);
        gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
        double[] expectedResolution=new double[]{
            XAffineTransform.getScaleX0(gridToEnvelopeMapper.createAffineTransform()),
            XAffineTransform.getScaleY0(gridToEnvelopeMapper.createAffineTransform())};
        assertNotNull(computedResolution);
        assertEquals(expectedResolution[0],computedResolution[0],1E-6);
        assertEquals(expectedResolution[1],computedResolution[1],1E-6);
       
        // for code coverage
        assertNotNull(spatialRequestHelper.toString());
       
        // accurate resolution
        // should not change anything since it is used only when there is a reprojection involved
        spatialRequestHelper.setAccurateResolution(true);
        spatialRequestHelper.compute();
        double[] computedResolution2 = spatialRequestHelper.getComputedResolution();
        assertEquals(computedResolution[0],computedResolution2[0],1E-6);
        assertEquals(computedResolution[1],computedResolution2[1],1E-6);
    }

    /**
   * Requesting an included area at a much smaller resolution.
   *
   * 1) The computed resolution should be much coarser.
   * 2) The computed BBOX and the Computed raster area should be equal to the requested ones
   *
   * @throws Exception
   */
    @Test
    public void testBasic2() throws Exception {
     
      // using CoverageProperties to build the SpatialRequestHelper
        CoverageProperties coverageProperties = new CoverageProperties();

        // source area in project crs
        CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope(
            -180,180,
            -90,90,
            sourceCRS);
    coverageProperties.setBBox(sourceBBox);
        coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
        Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);

    // creating the g2d
        final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
            new GridEnvelope2D(sourceRasterArea),
            sourceBBox);
        AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
        coverageProperties.setFullResolution(new double[]{
            XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform)
            });
        coverageProperties.setGeographicBBox(sourceBBox);
        coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
        SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
       
        //
        // now the target request
        //
        spatialRequestHelper.setAccurateResolution(false);
    ReferencedEnvelope requestedBBox = new ReferencedEnvelope(
            0,180,
            0,90,
            sourceCRS);       
        GridEnvelope2D requestedRasterArea = new GridEnvelope2D(0,0,250,250);
    spatialRequestHelper.setRequestedGridGeometry(new GridGeometry2D(
            requestedRasterArea,
            new GeneralEnvelope(requestedBBox)));
       
       
        ///// TEST
        spatialRequestHelper.compute();
        assertFalse(spatialRequestHelper.isEmpty());
        assertFalse(spatialRequestHelper.isNeedsReprojection()); // no reprojection
       
        // computed raster area is equal to requested raster area
        Rectangle computedRasterArea = spatialRequestHelper.getComputedRasterArea();
        assertFalse(computedRasterArea.isEmpty());
        assertTrue(computedRasterArea.equals(requestedRasterArea));
       
        // computed bbox is equal to requestede bbox
        BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
        assertFalse(computedBBox.isEmpty());
        assertTrue(computedBBox.equals(requestedBBox));
       
        // transform
        AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
        assertNotNull(computedG2W);
        double[] computedResolution = spatialRequestHelper.getComputedResolution();
        double scale=(1000.0/2)/250; // we scaled down the original image but we also use a portion of it
        assertNotNull(computedResolution);
        assertEquals(scale*XAffineTransform.getScaleX0(sourceGridToWorldTransform),computedResolution[0],1E-6);
        assertEquals(scale*XAffineTransform.getScaleY0(sourceGridToWorldTransform),computedResolution[1],1E-6);

    // all this intersecting and so on MUST not impact the requested resolutions
        GridToEnvelopeMapper gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(requestedRasterArea),
        requestedBBox);
        gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
        double[] expectedResolution=new double[]{
            XAffineTransform.getScaleX0(gridToEnvelopeMapper.createAffineTransform()),
            XAffineTransform.getScaleY0(gridToEnvelopeMapper.createAffineTransform())};
        assertNotNull(computedResolution);
        assertEquals(expectedResolution[0],computedResolution[0],1E-6);
        assertEquals(expectedResolution[1],computedResolution[1],1E-6);
       
    }
   
    /**
   * Requesting an intersecting area at a much smaller resolution.
   *
   * 1) The computed resolution should be much coarser.
   * 2) The computed BBOX and the Computed raster area should be equal to the requested ones
   *
   * @throws Exception
   */
    @Test
    public void testBasic3() throws Exception {
     
      // using CoverageProperties to build the SpatialRequestHelper
        CoverageProperties coverageProperties = new CoverageProperties();

        // source area in project crs
        CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope(
            -180,100,
            -20,90,
            sourceCRS);
    coverageProperties.setBBox(sourceBBox);
        coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
        Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);

    // creating the g2d
        final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
            new GridEnvelope2D(sourceRasterArea),
            sourceBBox);
        AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
        coverageProperties.setFullResolution(new double[]{
            XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform)
            });
        coverageProperties.setGeographicBBox(sourceBBox);
        coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
        SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
       
        //
        // now the target request
        //
        spatialRequestHelper.setAccurateResolution(false);
    ReferencedEnvelope requestedBBox = new ReferencedEnvelope(
            0,180,
            0,90,
            sourceCRS);       
        GridEnvelope2D requestedRasterArea = new GridEnvelope2D(0,0,250,250);
    spatialRequestHelper.setRequestedGridGeometry(new GridGeometry2D(
            requestedRasterArea,
            new GeneralEnvelope(requestedBBox)));
       
       
        ///// TEST
        spatialRequestHelper.compute();
        assertFalse(spatialRequestHelper.isEmpty());
        assertFalse(spatialRequestHelper.isNeedsReprojection()); // no reprojection
       
        // computed bbox is equal to requestede bbox
        BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
        assertFalse(computedBBox.isEmpty());
        ReferencedEnvelope finalReferencedEnvelope = new ReferencedEnvelope(
            0,100,
            0,90,
            sourceCRS);
    assertTrue(computedBBox.equals(finalReferencedEnvelope));
   
        // computed raster area is equal to requested raster area
        Rectangle computedRasterArea = spatialRequestHelper.getComputedRasterArea();
        assertFalse(computedRasterArea.isEmpty());
        GridToEnvelopeMapper gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(requestedRasterArea),
        requestedBBox);
        gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
    assertEquals(computedRasterArea, CRS.transform(gridToEnvelopeMapper.createTransform().inverse(), computedBBox).toRectangle2D().getBounds());
       

       
        // g2w transform
    // all this intersecting and so on MUST not impact the requested resolutions
        AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
        assertNotNull(computedG2W);
        double[] computedResolution = spatialRequestHelper.getComputedResolution();
        double[] expectedResolution=new double[]{
            XAffineTransform.getScaleX0(gridToEnvelopeMapper.createAffineTransform()),
            XAffineTransform.getScaleY0(gridToEnvelopeMapper.createAffineTransform())};
        assertNotNull(computedResolution);
        assertEquals(expectedResolution[0],computedResolution[0],1E-6);
        assertEquals(expectedResolution[1],computedResolution[1],1E-6);
       
       
    }
   
    @Test
    public void testReprojectQuick() throws Exception {
     
      // using CoverageProperties to build the SpatialRequestHelper
        CoverageProperties coverageProperties = new CoverageProperties();

        // source area in project crs
        CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:27700");
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope(
            414000,420000,
            237000,301000,
            sourceCRS);
    coverageProperties.setBBox(sourceBBox);
        coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
        Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);

    // creating the g2d
        final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
            new GridEnvelope2D(sourceRasterArea),
            sourceBBox);

        AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
        coverageProperties.setFullResolution(new double[]{
            XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform)
            });
        coverageProperties.setGeographicBBox(new ReferencedEnvelope(
            -1.7973440460762267,-1.7061039437509753,
            52.03105268214016,52.60660481087451,
            DefaultGeographicCRS.WGS84));
        coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
        SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
       
        // now the target request
        spatialRequestHelper.setAccurateResolution(false);
        spatialRequestHelper.setRequestedGridGeometry(new GridGeometry2D(
            new GridEnvelope2D(0,0,256,256),
            new GeneralEnvelope(new ReferencedEnvelope(
            -1.9868610903408341,-1.1430930819885086,
            51.938491047471814,52.705668101075581,
            DefaultGeographicCRS.WGS84))));
       
       
        ///// TEST
        spatialRequestHelper.compute();
        assertFalse(spatialRequestHelper.isEmpty());
        assertTrue(spatialRequestHelper.isNeedsReprojection());
        Rectangle destinationRasterArea = spatialRequestHelper.getComputedRasterArea();
        assertFalse(destinationRasterArea.isEmpty());
        BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
        assertFalse(computedBBox.isEmpty());
        AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
        assertNotNull(computedG2W);
        double[] computedResolution = spatialRequestHelper.getComputedResolution();
        assertNotNull(computedResolution);
       
       
    }
   
    /**
   * Requesting the same area at a much smaller resolution in a different project.
   *
   * The computed resolution should be much coarser and that is it.
   *
   * @throws Exception
   */
    @Test
    public void testBasicReproject() throws Exception {
     
      // using CoverageProperties to build the SpatialRequestHelper
        CoverageProperties coverageProperties = new CoverageProperties();

        // source area in project crs
        CoordinateReferenceSystem sourceCRS =DefaultGeographicCRS.WGS84;
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope//Italy?
            8,11,
            42,44,
            sourceCRS);
    coverageProperties.setBBox(sourceBBox);
        coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
        Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);

    // creating the g2d
        final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
            new GridEnvelope2D(sourceRasterArea),
            sourceBBox);
        AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
        coverageProperties.setFullResolution(new double[]{
            XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform)
            });
        coverageProperties.setGeographicBBox(sourceBBox);
        coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
        SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
       
        //
        // now the request
        //
        spatialRequestHelper.setAccurateResolution(false);
        GridEnvelope2D requestedRasterArea = new GridEnvelope2D(0,0,256,256);
        CoordinateReferenceSystem requestCRS = CRS.decode("EPSG:3857");
        GeneralEnvelope requestedBBox = CRS.transform(sourceBBox, requestCRS);  
    spatialRequestHelper.setRequestedGridGeometry(new GridGeometry2D(
            requestedRasterArea,
            requestedBBox));
       
       
        ///// TEST
        spatialRequestHelper.compute();
        assertFalse(spatialRequestHelper.isEmpty());
        assertTrue(spatialRequestHelper.isNeedsReprojection()); // no reprojection
       
        // computed raster area
        Rectangle computedRasterArea = spatialRequestHelper.getComputedRasterArea();
        assertFalse(computedRasterArea.isEmpty());
        assertTrue(computedRasterArea.equals(requestedRasterArea));
       
        // computed bbox is equal to the requested one
        BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
        assertFalse(computedBBox.isEmpty());
        // the source bbox and the computed one are the same
        // there might be minor differences due to multiple back and forth roundings, but we need
        // to make sure they are negligible
        assertTrue(new GeneralEnvelope(computedBBox).equals(sourceBBox, 1E-4, true));
       
        // transform
        AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
        assertNotNull(computedG2W);
        double[] computedResolution = spatialRequestHelper.getComputedResolution();
        double scale=1000.0/256; // we scaled down the original image
        assertNotNull(computedResolution);
        assertEquals(scale*XAffineTransform.getScaleX0(sourceGridToWorldTransform),computedResolution[0],1E-6);
        assertEquals(scale*XAffineTransform.getScaleY0(sourceGridToWorldTransform),computedResolution[1],1E-6);
       

    // all this intersecting and so on MUST not impact the requested resolutions
        GridToEnvelopeMapper gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(requestedRasterArea),
        sourceBBox);
        gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
        double[] expectedResolution=new double[]{
            XAffineTransform.getScaleX0(gridToEnvelopeMapper.createAffineTransform()),
            XAffineTransform.getScaleY0(gridToEnvelopeMapper.createAffineTransform())};
        assertNotNull(computedResolution);
        assertEquals(expectedResolution[0],computedResolution[0],1E-6);
        assertEquals(expectedResolution[1],computedResolution[1],1E-6);
    }
   
    /**
   * Requesting an included area at a much smaller resolution.
   *
   * 1) The computed resolution should be much coarser.
   * 2) The computed BBOX and the Computed raster area should be equal to the requested ones
   *
   * @throws Exception
   */
    @Test
    public void testBasic2Reproject() throws Exception {
     
      // using CoverageProperties to build the SpatialRequestHelper
        CoverageProperties coverageProperties = new CoverageProperties();

        // source area in project crs
        CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope(
            -180,180,
            -70,70,
            sourceCRS);
    coverageProperties.setBBox(sourceBBox);
        coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
        Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);

    // creating the g2d
        final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
            new GridEnvelope2D(sourceRasterArea),
            sourceBBox);
        AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
        coverageProperties.setFullResolution(new double[]{
            XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform)
            });
        coverageProperties.setGeographicBBox(sourceBBox);
        coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
        SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
       
        //
        // now the target request
        //
        spatialRequestHelper.setAccurateResolution(false);
        GridEnvelope2D requestedRasterArea = new GridEnvelope2D(0,0,256,256);
        CoordinateReferenceSystem requestCRS = CRS.decode("EPSG:3857");
    ReferencedEnvelope requestedBBox_ = new ReferencedEnvelope(
            0,180,
            0,70,
            sourceCRS);  
        GeneralEnvelope requestedBBox = CRS.transform(requestedBBox_, requestCRS);  
    spatialRequestHelper.setRequestedGridGeometry(new GridGeometry2D(
            requestedRasterArea,
            requestedBBox));
   
       
       
        ///// TEST
        spatialRequestHelper.compute();
        assertFalse(spatialRequestHelper.isEmpty());
        assertTrue(spatialRequestHelper.isNeedsReprojection()); // no reprojection
       
        // computed raster area is equal to requested raster area
        Rectangle computedRasterArea = spatialRequestHelper.getComputedRasterArea();
        assertFalse(computedRasterArea.isEmpty());
        assertTrue(computedRasterArea.equals(requestedRasterArea));
       
        // computed bbox is equal to requestede bbox
        BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
        assertFalse(computedBBox.isEmpty());
        // the source bbox and the computed one are the same
        // there might be minor differences due to multiple back and forth roundings, but we need
        // to make sure they are negligible
        assertTrue(new GeneralEnvelope(computedBBox).equals(requestedBBox_, 1E-4, true));
       
        // transform
        AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
        assertNotNull(computedG2W);
        double[] computedResolution = spatialRequestHelper.getComputedResolution();
        double scaleX=(1000.0/2)/256; // we scaled down the original image but we also use a portion of it
        double scaleY=(1000.0/2)/256; // we scaled down the original image but we also use a portion of it
        assertNotNull(computedResolution);
        assertEquals(scaleX*XAffineTransform.getScaleX0(sourceGridToWorldTransform),computedResolution[0],1E-6);
        assertEquals(scaleY*XAffineTransform.getScaleY0(sourceGridToWorldTransform),computedResolution[1],1E-6);

    // all this intersecting and so on MUST not impact the requested resolutions
        GridToEnvelopeMapper gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(requestedRasterArea),
        requestedBBox_);
        gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
        double[] expectedResolution=new double[]{
            XAffineTransform.getScaleX0(gridToEnvelopeMapper.createAffineTransform()),
            XAffineTransform.getScaleY0(gridToEnvelopeMapper.createAffineTransform())};
        assertNotNull(computedResolution);
        assertEquals(expectedResolution[0],computedResolution[0],1E-6);
        assertEquals(expectedResolution[1],computedResolution[1],1E-6);
       
        // accurate resolution
        // should not change anything since it is used only when there is a reprojection involved
        spatialRequestHelper.setAccurateResolution(true);
        spatialRequestHelper.compute();
        double[] computedResolution2 = spatialRequestHelper.getComputedResolution();
        assertNotEquals(computedResolution[0], computedResolution2[0], 1E-6);
        assertNotEquals(computedResolution[1],computedResolution2[1],1E-6);// high deformations on latitude for large areas
       
    }   
   
   
    /**
   * Requesting an intersecting area at a much smaller resolution.
   *
   * 1) The computed resolution should be much coarser.
   * 2) The computed BBOX and the Computed raster area should be equal to the requested ones
   *
   * @throws Exception
   */
    @Test
    public void testBasic3Reproject() throws Exception {
     
      // using CoverageProperties to build the SpatialRequestHelper
        CoverageProperties coverageProperties = new CoverageProperties();

        // source area in project crs
        CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope(
            -180,100,
            -20,90,
            sourceCRS);
    coverageProperties.setBBox(sourceBBox);
        coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
        Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);

    // creating the g2d
        final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
            new GridEnvelope2D(sourceRasterArea),
            sourceBBox);
        AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
        coverageProperties.setFullResolution(new double[]{
            XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform)
            });
        coverageProperties.setGeographicBBox(sourceBBox);
        coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
        SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
       
        //
        // now the request
        //
        spatialRequestHelper.setAccurateResolution(false);
        GridEnvelope2D requestedRasterArea = new GridEnvelope2D(0,0,256,256);
        CoordinateReferenceSystem requestCRS = CRS.decode("EPSG:3857");
    ReferencedEnvelope requestedBBox_ = new ReferencedEnvelope(
            0,180,
            0,70,
            sourceCRS);  
        GeneralEnvelope requestedBBox = CRS.transform(requestedBBox_, requestCRS);  
    spatialRequestHelper.setRequestedGridGeometry(new GridGeometry2D(
            requestedRasterArea,
            requestedBBox));
       
        ///// TEST
        spatialRequestHelper.compute();
        assertFalse(spatialRequestHelper.isEmpty());
        assertTrue(spatialRequestHelper.isNeedsReprojection()); // no reprojection
       
        // computed bbox is equal to requestede bbox
        BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
        assertFalse(computedBBox.isEmpty());
        ReferencedEnvelope finalReferencedEnvelope = new ReferencedEnvelope(
            0,100,
            0,70,
            sourceCRS);
        // the source bbox and the computed one are the same
        // there might be minor differences due to multiple back and forth roundings, but we need
        // to make sure they are negligible
        assertTrue(new GeneralEnvelope(computedBBox).equals(finalReferencedEnvelope, 1E-4, true));
   
        // computed raster area is equal to requested raster area
        Rectangle computedRasterArea = spatialRequestHelper.getComputedRasterArea();
        assertFalse(computedRasterArea.isEmpty());
        GridToEnvelopeMapper gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(requestedRasterArea),
        requestedBBox);
        gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
    assertEquals(
        computedRasterArea,
        new Rectangle(0,0,142,256));
       

       
        // g2w transform
    // all this intersecting and so on MUST not impact the requested resolutions
        // transform
        AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
        assertNotNull(computedG2W);
        double[] computedResolution = spatialRequestHelper.getComputedResolution();

    // all this intersecting and so on MUST not impact the requested resolutions
        gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(computedRasterArea),
        finalReferencedEnvelope);
        gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
        double[] expectedResolution=new double[]{
            XAffineTransform.getScaleX0(gridToEnvelopeMapper.createAffineTransform()),
            XAffineTransform.getScaleY0(gridToEnvelopeMapper.createAffineTransform())};
        assertNotNull(computedResolution);
        assertEquals(expectedResolution[0],computedResolution[0],1E-6);
        assertEquals(expectedResolution[1],computedResolution[1],1E-6);
       
       
       
    }

  /**
   * Requesting the same area at a much smaller resolution.
   *
   * The computed resolution should be much coarser and that is it.
   *
   * @throws Exception
   */
  @Test
  public void testBasic() throws Exception {
   
    // using CoverageProperties to build the SpatialRequestHelper
      CoverageProperties coverageProperties = new CoverageProperties();
 
      // source area in project crs
      CoordinateReferenceSystem sourceCRS =DefaultGeographicCRS.WGS84;
    ReferencedEnvelope sourceBBox = new ReferencedEnvelope(
          -180,180,
          -90,90,
          sourceCRS);
    coverageProperties.setBBox(sourceBBox);
      coverageProperties.setCrs2D(sourceCRS);
   
    //raster area
      Rectangle sourceRasterArea = new Rectangle(0,0,1000,1000);
    coverageProperties.setRasterArea(sourceRasterArea);
 
    // creating the g2d
      final GridToEnvelopeMapper geMapper = new GridToEnvelopeMapper(
          new GridEnvelope2D(sourceRasterArea),
          sourceBBox);
      AffineTransform sourceGridToWorldTransform = geMapper.createAffineTransform();
    coverageProperties.setGridToWorld2D((MathTransform2D) sourceGridToWorldTransform);
      coverageProperties.setFullResolution(new double[]{
          XAffineTransform.getScaleX0(sourceGridToWorldTransform),
            XAffineTransform.getScaleY0(sourceGridToWorldTransform)
          });
      coverageProperties.setGeographicBBox(sourceBBox);
      coverageProperties.setGeographicCRS2D(DefaultGeographicCRS.WGS84);
      SpatialRequestHelper spatialRequestHelper = new SpatialRequestHelper(coverageProperties);
     
      //
      // now the target request
      //
      spatialRequestHelper.setAccurateResolution(false);
      GridEnvelope2D requestedRasterArea = new GridEnvelope2D(0,0,256,256);
    spatialRequestHelper.setRequestedGridGeometry(new GridGeometry2D(
          requestedRasterArea,
          new GeneralEnvelope(sourceBBox)));
     
     
      ///// TEST
      spatialRequestHelper.compute();
      assertFalse(spatialRequestHelper.isEmpty());
      assertFalse(spatialRequestHelper.isNeedsReprojection()); // no reprojection
     
      // computed raster area
      Rectangle computedRasterArea = spatialRequestHelper.getComputedRasterArea();
      assertFalse(computedRasterArea.isEmpty());
      assertTrue(computedRasterArea.equals(requestedRasterArea));
     
      // computed bbox
      BoundingBox computedBBox = spatialRequestHelper.getComputedBBox();
      assertFalse(computedBBox.isEmpty());
      assertTrue(computedBBox.equals(sourceBBox));
     
      // transform
      AffineTransform computedG2W = spatialRequestHelper.getComputedGridToWorld();
      assertNotNull(computedG2W);
      double[] computedResolution = spatialRequestHelper.getComputedResolution();
      double scale=1000.0/256; // we scaled down the original image
      assertNotNull(computedResolution);
      assertEquals(scale*XAffineTransform.getScaleX0(sourceGridToWorldTransform),computedResolution[0],1E-6);
      assertEquals(scale*XAffineTransform.getScaleY0(sourceGridToWorldTransform),computedResolution[1],1E-6);
     
 
    // all this intersecting and so on MUST not impact the requested resolutions
      GridToEnvelopeMapper gridToEnvelopeMapper = new GridToEnvelopeMapper(
        new GridEnvelope2D(requestedRasterArea),
        sourceBBox);
      gridToEnvelopeMapper.setPixelAnchor(PixelInCell.CELL_CORNER);
      double[] expectedResolution=new double[]{
          XAffineTransform.getScaleX0(gridToEnvelopeMapper.createAffineTransform()),
          XAffineTransform.getScaleY0(gridToEnvelopeMapper.createAffineTransform())};
      assertNotNull(computedResolution);
      assertEquals(expectedResolution[0],computedResolution[0],1E-6);
      assertEquals(expectedResolution[1],computedResolution[1],1E-6);
     
      // for code coverage
      assertNotNull(spatialRequestHelper.toString());
     
      // accurate resolution
      // should not change anything since it is used only when there is a reprojection involved
      spatialRequestHelper.setAccurateResolution(true);
      spatialRequestHelper.compute();
      double[] computedResolution2 = spatialRequestHelper.getComputedResolution();
      assertEquals(computedResolution[0],computedResolution2[0],1E-6);
      assertEquals(computedResolution[1],computedResolution2[1],1E-6);
  }
}
TOP

Related Classes of org.geotools.gce.imagemosaic.SpatialRequestHelperTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.