001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/csct/cs/PrimeMeridian.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/exse/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 It has been implemented within SEAGIS - An OpenSource implementation of OpenGIS specification
012 (C) 2001, Institut de Recherche pour le D�veloppement (http://sourceforge.net/projects/seagis/)
013 SEAGIS Contacts: Surveillance de l'Environnement Assist�e par Satellite
014 Institut de Recherche pour le D�veloppement / US-Espace
015 mailto:seasnet@teledetection.fr
016
017
018 This library is free software; you can redistribute it and/or
019 modify it under the terms of the GNU Lesser General Public
020 License as published by the Free Software Foundation; either
021 version 2.1 of the License, or (at your option) any later version.
022
023 This library is distributed in the hope that it will be useful,
024 but WITHOUT ANY WARRANTY; without even the implied warranty of
025 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
026 Lesser General Public License for more details.
027
028 You should have received a copy of the GNU Lesser General Public
029 License along with this library; if not, write to the Free Software
030 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
031
032 Contact:
033
034 Andreas Poth
035 lat/lon GmbH
036 Aennchenstr. 19
037 53115 Bonn
038 Germany
039 E-Mail: poth@lat-lon.de
040
041 Klaus Greve
042 Department of Geography
043 University of Bonn
044 Meckenheimer Allee 166
045 53115 Bonn
046 Germany
047 E-Mail: klaus.greve@uni-bonn.de
048
049
050 ---------------------------------------------------------------------------*/
051 package org.deegree.model.csct.cs;
052
053 // OpenGIS dependencies
054 import java.util.Map;
055
056 import org.deegree.model.csct.resources.Utilities;
057 import org.deegree.model.csct.units.Unit;
058
059 /**
060 * A meridian used to take longitude measurements from.
061 *
062 * @version 1.00
063 * @author OpenGIS (www.opengis.org)
064 * @author Martin Desruisseaux
065 *
066 * @author last edited by: $Author: bezema $
067 *
068 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $
069 *
070 * @see "org.opengis.cs.CS_PrimeMeridian"
071 */
072 public class PrimeMeridian extends Info {
073 /**
074 * Serial number for interoperability with different versions.
075 */
076 private static final long serialVersionUID = 7570594768127669147L;
077
078 /**
079 * The Greenwich meridian, with angular measures in degrees.
080 */
081 public static final PrimeMeridian GREENWICH = (PrimeMeridian) pool.intern( new PrimeMeridian(
082 "Greenwich",
083 Unit.DEGREE,
084 0 ) );
085
086 /**
087 * The angular units.
088 */
089 private final Unit unit;
090
091 /**
092 * The longitude value relative to the Greenwich Meridian.
093 */
094 private final double longitude;
095
096 /**
097 * Creates a prime meridian, relative to Greenwich.
098 *
099 * @param name
100 * Name to give new object.
101 * @param unit
102 * Angular units of longitude.
103 * @param longitude
104 * Longitude of prime meridian in supplied angular units East of Greenwich.
105 *
106 */
107 public PrimeMeridian( final String name, final Unit unit, final double longitude ) {
108 super( name );
109 this.unit = unit;
110 this.longitude = longitude;
111 ensureNonNull( "unit", unit );
112 ensureAngularUnit( unit );
113 }
114
115 /**
116 * Creates a prime meridian, relative to Greenwich.
117 *
118 * @param properties
119 * The set of properties (see {@link Info}).
120 * @param unit
121 * Angular units of longitude.
122 * @param longitude
123 * Longitude of prime meridian in supplied angular units East of Greenwich.
124 */
125 PrimeMeridian( final Map properties, final Unit unit, final double longitude ) {
126 super( properties );
127 this.unit = unit;
128 this.longitude = longitude;
129 // Accept null values.
130 }
131
132 /**
133 * Returns the longitude value relative to the Greenwich Meridian. The longitude is expressed in
134 * this objects angular units.
135 *
136 * @return the longitude value relative to the Greenwich Meridian. The longitude is expressed in
137 * this objects angular units.
138 *
139 * @see "org.opengis.cs.CS_PrimeMeridian#getLongitude()"
140 */
141 public double getLongitude() {
142 return longitude;
143 }
144
145 /**
146 * Returns the longitude value relative to the Greenwich Meridian, expressed in the specified
147 * units. This convenience method make easier to obtains longitude in degrees (<code>getLongitude(Unit.DEGREE)</code>),
148 * no matter the underlying angular units of this prime meridian.
149 *
150 * @param targetUnit
151 * The unit in which to express longitude.
152 * @return the longitude value relative to the Greenwich Meridian, expressed in the specified
153 * units. This convenience method make easier to obtains longitude in degrees (<code>getLongitude(Unit.DEGREE)</code>),
154 * no matter the underlying angular units of this prime meridian.
155 */
156 public double getLongitude( final Unit targetUnit ) {
157 return targetUnit.convert( getLongitude(), getAngularUnit() );
158 }
159
160 /**
161 * Returns the angular units.
162 *
163 * @return the angular units.
164 *
165 * @see "org.opengis.cs.CS_PrimeMeridian#getAngularUnit()"
166 */
167 public Unit getAngularUnit() {
168 return unit;
169 }
170
171 /**
172 * Returns a hash value for this prime meridian.
173 *
174 * @return a hash value for this prime meridian.
175 */
176 public int hashCode() {
177 final long code = Double.doubleToLongBits( longitude );
178 return super.hashCode() * 37 + ( (int) ( code >>> 32 ) ^ (int) code );
179 }
180
181 /**
182 * Compares the specified object with this prime meridian for equality.
183 *
184 * @return
185 */
186 public boolean equals( final Object object ) {
187 if ( super.equals( object ) ) {
188 final PrimeMeridian that = (PrimeMeridian) object;
189 return Double.doubleToLongBits( this.longitude ) == Double.doubleToLongBits( that.longitude )
190 && Utilities.equals( this.unit, that.unit );
191 }
192 return false;
193 }
194
195 /**
196 * Fill the part inside "[...]". Used for formatting Well Know Text (WKT).
197 *
198 * @param buffer
199 * @return
200 */
201 String addString( final StringBuffer buffer ) {
202 buffer.append( ", " );
203 buffer.append( Unit.DEGREE.convert( longitude, unit ) );
204 return "PRIMEM";
205 }
206
207 }