Package org.geotools.referencing.operation.builder

Source Code of org.geotools.referencing.operation.builder.RSGridBuilder

/*
*    GeoTools - The Open Source Java GIS Toolkit
*    http://geotools.org
*
*    (C) 2007-2008, 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.referencing.operation.builder;

import java.util.ArrayList;
import java.util.List;

import javax.vecmath.MismatchedSizeException;

import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.CRS;
import org.geotools.resources.i18n.ErrorKeys;
import org.geotools.resources.i18n.Errors;
import org.opengis.geometry.DirectPosition;
import org.opengis.geometry.Envelope;
import org.opengis.geometry.MismatchedDimensionException;
import org.opengis.geometry.MismatchedReferenceSystemException;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchIdentifierException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;


public class RSGridBuilder extends WarpGridBuilder {
 

  private RubberSheetBuilder rsBuilder;
 
  private List<DirectPosition> quad;

    /**
     * Builds controlling Grid using RubberSheet Transformation
     * @param vectors
     * @param dx
     * @param dy
     * @param envelope
     * @param realToGrid
     * @throws MismatchedSizeException
     * @throws MismatchedDimensionException
     * @throws MismatchedReferenceSystemException
     * @throws TransformException
     */
    public RSGridBuilder(List<MappedPosition> vectors, double dx, double dy, Envelope envelope,
        MathTransform realToGrid)
        throws MismatchedSizeException, MismatchedDimensionException, NoSuchIdentifierException,
            MismatchedReferenceSystemException, TransformException, TriangulationException {
        super(vectors, dx, dy, envelope, realToGrid);

        Envelope gridEnvelope = CRS.transform(worldToGrid, envelope);
            
        double enlarge = gridEnvelope.getSpan(0)*0.01;
        DirectPosition p0 = new DirectPosition2D(
            gridEnvelope.getLowerCorner().getOrdinate(0)-enlarge,
            gridEnvelope.getLowerCorner().getOrdinate(1)-enlarge);
       
        DirectPosition p2 = new DirectPosition2D(
            gridEnvelope.getUpperCorner().getOrdinate(0)+enlarge,
            gridEnvelope.getUpperCorner().getOrdinate(1)+enlarge);             

        DirectPosition p1 = new DirectPosition2D(
                p0.getOrdinate(0), p2.getOrdinate(1));
        DirectPosition p3 = new DirectPosition2D(
                p2.getOrdinate(0), p0.getOrdinate(1));
       
        List<MappedPosition> gridMP = super.getGridMappedPositions();
        CoordinateReferenceSystem crs = ((MappedPosition)gridMP.get(0)).getSource().getCoordinateReferenceSystem();
        p0 = new DirectPosition2D(crs, p0.getOrdinate(0), p0.getOrdinate(1));
        p1 = new DirectPosition2D(crs, p1.getOrdinate(0), p1.getOrdinate(1));
        p2 = new DirectPosition2D(crs, p2.getOrdinate(0), p2.getOrdinate(1));
        p3 = new DirectPosition2D(crs, p3.getOrdinate(0), p3.getOrdinate(1));
       
       
        quad = new ArrayList<DirectPosition>();
        quad.add(p0);//new Quadrilateral(p0, p1, p2, p3);
        quad.add(p1);
        quad.add(p2);
        quad.add(p3);
        rsBuilder = new RubberSheetBuilder(super.getGridMappedPositions(), quad);
    }

    /**
     * Generates grid of source points.
     * @param values general values of grid
     * @return generated grid
     */
    private float[] generateSourcePoints(GridParameters gridParams) {
        float[] sourcePoints = ((float[]) gridParams.getWarpPositions());//values.parameter("warpPositions").getValue());

        for (int i = 0; i <= gridParams.getYNumber(); i++) {
            for (int j = 0; j <= gridParams.getXNumber(); j++) {
                float x = new Double((j * gridParams.getXStep())
                    + gridParams.getXStart()).floatValue();
                float y = new Double((i * gridParams.getYStep())
                    + gridParams.getYStart()).floatValue();

                sourcePoints[(i * ((1 + gridParams.getXNumber()) * 2)) + (2 * j)] = (float) x;

                sourcePoints[(i * ((1 + gridParams.getXNumber()) * 2)) + (2 * j)
                + 1] = (float) y;
            }
        }

        return sourcePoints;
    }

    /**
     * Computes target grid.
     * @return computed target grid.
     */
    protected float[] computeWarpGrid(GridParameters gridParams) throws FactoryException {
        float[] source = generateSourcePoints(gridParams);

     
      try {
    rsBuilder.getMathTransform().transform(source, 0, source, 0, (source.length + 1) / 2);
  } catch (TransformException e) {
      throw new FactoryException(Errors.format(ErrorKeys.CANT_TRANSFORM_VALID_POINTS), e);                  
  }
      

        return source;
    }  
      

 
  public void setMappedPositions(List<MappedPosition> positions)
      throws MismatchedSizeException, MismatchedDimensionException,
      MismatchedReferenceSystemException {
     
    super.setMappedPositions(positions);
    try {
      rsBuilder = new RubberSheetBuilder(super.getGridMappedPositions(), quad);
    } catch (TriangulationException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (TransformException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}
TOP

Related Classes of org.geotools.referencing.operation.builder.RSGridBuilder

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.