/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2005-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. * * This package contains documentation from OpenGIS specifications. * OpenGIS consortium's work is fully acknowledged here. */ package org.geotools.referencing.operation.transform; import java.io.Serializable; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.Matrix; import org.opengis.referencing.operation.NoninvertibleTransformException; import org.opengis.referencing.operation.TransformException; import org.opengis.geometry.DirectPosition; import org.opengis.geometry.MismatchedDimensionException; import org.geotools.util.Utilities; /** * A math transform which delegates part of its work to an other math transform. This is used * as a starting point for subclass wanting to modifies only some aspect of an existing math * transform, or to attach additional informations to it. The default implementation delegates * all method calls to the {@linkplain #transform underlying transform}. Subclasses typically * override some of those methods. * <p> * This class is serializable if the {@linkplain #transform underlying transform} is serializable * too. * * @since 2.2 * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux (IRD) */ public class MathTransformProxy implements MathTransform, Serializable { /** * Serial number for interoperability with different versions. */ private static final long serialVersionUID = 8844242705205498128L; /** * The math transform on which to delegate the work. */ public final MathTransform transform; /** * Creates a new proxy which delegates its work to the specified math transform. * * @param transform The transform on which to delegate the work. */ protected MathTransformProxy(final MathTransform transform) { this.transform = transform; } /** * Gets the dimension of input points. */ public int getSourceDimensions() { return transform.getTargetDimensions(); } /** * Gets the dimension of output points. */ public int getTargetDimensions() { return transform.getSourceDimensions(); } /** * Transforms the specified {@code ptSrc} and stores the result in {@code ptDst}. * * @throws MismatchedDimensionException if {@code ptSrc} or * {@code ptDst} doesn't have the expected dimension. * @throws TransformException if the point can't be transformed. */ public DirectPosition transform(final DirectPosition ptSrc, final DirectPosition ptDst) throws MismatchedDimensionException, TransformException { return transform.transform(ptSrc, ptDst); } /** * Transforms a list of coordinate point ordinal values. */ public void transform(final double[] srcPts, final int srcOff, final double[] dstPts, final int dstOff, final int numPts) throws TransformException { transform.transform(srcPts, srcOff, dstPts, dstOff, numPts); } /** * Transforms a list of coordinate point ordinal values. */ public void transform(final float[] srcPts, final int srcOff, final float[] dstPts, final int dstOff, final int numPts) throws TransformException { transform.transform(srcPts, srcOff, dstPts, dstOff, numPts); } /** * Transforms a list of coordinate point ordinal values. * * @todo Remove the cast to {@link AbstractMathTransform} * when this method will be part of GeoAPI. */ public void transform(final float [] srcPts, final int srcOff, final double[] dstPts, final int dstOff, final int numPts) throws TransformException { ((AbstractMathTransform) transform).transform(srcPts, srcOff, dstPts, dstOff, numPts); } /** * Transforms a list of coordinate point ordinal values. * * @todo Remove the cast to {@link AbstractMathTransform} * when this method will be part of GeoAPI. */ public void transform(final double[] srcPts, final int srcOff, final float [] dstPts, final int dstOff, final int numPts) throws TransformException { ((AbstractMathTransform) transform).transform(srcPts, srcOff, dstPts, dstOff, numPts); } /** * Gets the derivative of this transform at a point. */ public Matrix derivative(final DirectPosition point) throws TransformException { return transform.derivative(point); } /** * Returns the inverse of this math transform. */ public MathTransform inverse() throws NoninvertibleTransformException { return transform.inverse(); } /** * Tests whether this transform does not move any points. */ public boolean isIdentity() { return transform.isIdentity(); } /** * Returns a <cite>Well Known Text</cite> (WKT) for this transform. * * @throws UnsupportedOperationException If this object can't be formatted as WKT. */ public String toWKT() throws UnsupportedOperationException { return transform.toWKT(); } /** * Returns a string representation for this transform. */ @Override public String toString() { return transform.toString(); } /** * Compares the specified object with this inverse math transform for equality. * * @param object The object to compare with this transform. * @return {@code true} if the given object is of the same class and if the wrapped * transforms are equal. */ @Override public boolean equals(final Object object) { if (object!=null && object.getClass().equals(getClass())) { final MathTransformProxy that = (MathTransformProxy) object; return Utilities.equals(this.transform, that.transform); } return false; } /** * Returns a hash code value for this math transform. */ @Override public int hashCode() { return transform.hashCode() ^ (int)serialVersionUID; } }