// // TrivialMapProjection.java // /* VisAD system for interactive analysis and visualization of numerical data. Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and Tommy Jasmin. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ package visad.georef; import visad.RealTupleType; import visad.VisADException; import java.awt.geom.Rectangle2D; /** * A trivial implementation for a MapProjection which provides an * identity coordinate system with a default bounding box. This is * useful for defining an area in LatLon or LonLat space with a * bounding box. What goes in, comes right back out. */ public class TrivialMapProjection extends MapProjection { private static final long serialVersionUID = 1L; private float x, y, width, height; /** * Create a MapProjection that just returns the input tuple. * Default Map area is set to be from (-180,-90) to (180, 90) * * @throws VisADException reference does not contain Latitude/Longitude * or couldn't create the necessary VisAD object */ public TrivialMapProjection() throws VisADException { this(RealTupleType.SpatialEarth2DTuple, new Rectangle2D.Float(-180, -90, 360, 180)); } /** * Create a MapProjection that just returns the input tuple. * * @param reference reference RealTupleType * * @throws VisADException reference does not contain Latitude/Longitude * or couldn't create the necessary VisAD object */ public TrivialMapProjection(RealTupleType reference) throws VisADException { this(reference, new Rectangle2D.Float(-180, -90, 360, 180)); } /** * Create a MapProjection that just returns the input tuple. * * @param type reference RealTupleType * @param bounds rectangle bounds * * @throws VisADException reference does not contain Latitude/Longitude * or couldn't create the necessary VisAD object */ public TrivialMapProjection(RealTupleType type, Rectangle2D bounds) throws VisADException { super(type, type.getDefaultUnits()); // have to do this because Rectangle2D is not Serializable x = (float) bounds.getX(); y = (float) bounds.getY(); width = (float) bounds.getWidth(); height = (float) bounds.getHeight(); } /** * Transform to the reference coordinates * * @param tuple array of values * @return input array * * @throws VisADException tuple is null or wrong dimension */ public double[][] toReference(double[][] tuple) throws VisADException { if (tuple == null || getDimension() != tuple.length) throw new VisADException( "Values are null or wrong dimension"); return tuple; } /** * Transform from the reference coordinates * * @param refTuple array of values * @return input array * * @throws VisADException tuple is null or wrong dimension */ public double[][] fromReference(double[][] refTuple) throws VisADException { if (refTuple == null || getDimension() != refTuple.length) throw new VisADException( "Values are null or wrong dimension"); return refTuple; } /** * Transform to the reference coordinates * * @param tuple array of values * @return input array * * @throws VisADException tuple is null or wrong dimension */ public float[][] toReference(float[][] tuple) throws VisADException { if (tuple == null || getDimension() != tuple.length) throw new VisADException( "Values are null or wrong dimension"); return tuple; } /** * Transform from the reference coordinates * * @param refTuple array of values * @return input array * * @throws VisADException tuple is null or wrong dimension */ public float[][] fromReference(float[][] refTuple) throws VisADException { if (refTuple == null || getDimension() != refTuple.length) throw new VisADException( "Values are null or wrong dimension"); return refTuple; } /** * See if the object in question is equal to this CoordinateSystem. * The two objects are equal if they are the same object or if they * are both TrivialMapProjection and have the same dimension. * * @param o Object in question * @return true if they are considered equal, otherwise false. */ public boolean equals(Object o) { if (!(o instanceof TrivialMapProjection)) return false; TrivialMapProjection that = (TrivialMapProjection) o; return (this == that) || (that.getReference().equals(this.getReference()) && Double.doubleToLongBits(that.x) == Double.doubleToLongBits(this.x) && Double.doubleToLongBits(that.y) == Double.doubleToLongBits(this.y) && Double.doubleToLongBits(that.width) == Double.doubleToLongBits(this.width) && Double.doubleToLongBits(that.height) == Double.doubleToLongBits(this.height)) ; } /** * Get a reasonable bounding box in this coordinate system. MapProjections * are typically specific to an area of the world; there's no bounding * box that works for all projections so each subclass must implement * this method. For example, the bounding box for a satellite image * MapProjection might have an upper left corner of (0,0) and the width * and height of the Rectangle2D would be the number of elements and * lines, respectively. * * @return the bounding box of the MapProjection * */ public Rectangle2D getDefaultMapArea() { return new Rectangle2D.Float(x,y,width,height); } }