/* * 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.coverage.grid; import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.io.Serializable; import org.geotools.referencing.operation.transform.AffineTransform2D; import org.geotools.resources.Classes; import org.geotools.util.Utilities; import org.opengis.coverage.grid.GridGeometry; import org.opengis.util.Cloneable; /** * A simple grid geometry holding the grid range as a {@linkplain Rectangle rectangle} and the * <cite>grid to CRS</cite> relationship as an {@linkplain AffineTransform affine transform}. * This grid geometry does not hold any Coordinate Reference System information. Because of that, * it is not suitable to {@link GridCoverage2D} (the later rather use {@link GridGeometry2D}). * But it is sometime used with plain {@linkplain java.awt.image.RenderedImage rendered image} * instances. * * @since 2.5 * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux * * @see GridGeometry2D * @see GeneralGridGeometry */ public class ImageGeometry implements GridGeometry, Serializable, Cloneable { /** * For cross-version compatibility. */ private static final long serialVersionUID = 1985363181119389264L; /** * The grid range. */ private final GridEnvelope2D gridRange; /** * The <cite>grid to CRS</cite> affine transform. */ private final AffineTransform2D gridToCRS; /** * Creates a grid geometry from the specified bounds and <cite>grid to CRS</cite> * affine transform. * * @param bounds The image bounds in pixel coordinates. * @param gridToCRS The affine transform from pixel coordinates to "real world" coordinates. */ public ImageGeometry(final Rectangle bounds, final AffineTransform gridToCRS) { this.gridRange = new GridEnvelope2D(bounds); this.gridToCRS = new AffineTransform2D(gridToCRS); } /** * Returns the image bounds in pixel coordinates. */ public GridEnvelope2D getGridRange() { return gridRange.clone(); } /** * Returns the conversion from grid coordinates to real world earth coordinates. */ public AffineTransform2D getGridToCRS() { return gridToCRS; // No need to clone since AffineTransform2D is immutable. } /** * @deprecated Renamed as {@link #getGridToCRS()}. */ public AffineTransform2D getGridToCoordinateSystem() { return gridToCRS; } /** * Returns a string representation of this grid geometry. The returned string * is implementation dependent. It is usually provided for debugging purposes. */ @Override public String toString() { return Classes.getShortClassName(this) + '[' + gridRange + ", " + gridToCRS + ']'; } /** * Returns a hash code value for this grid geometry. */ @Override public int hashCode() { return gridRange.hashCode() ^ gridToCRS.hashCode(); } /** * Compares this grid geometry with the specified one for equality. * * @param object The object to compare with. * @return {@code true} if the given object is equals to this grid geometry. */ @Override public boolean equals(final Object object) { if (object == this) { return true; } if (object != null && object.getClass().equals(getClass())) { final ImageGeometry that = (ImageGeometry) object; return Utilities.equals(gridRange, that.gridRange) && Utilities.equals(gridToCRS, that.gridToCRS); } return false; } /** * Returns a clone of this image geometry. * * @return A clone of this grid geometry. */ @Override public ImageGeometry clone() { try { return (ImageGeometry) super.clone(); } catch (CloneNotSupportedException exception) { throw new AssertionError(exception); // Should never happen, since we are cloneable. } } }