001 //$HeadURL: $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 This file is part of deegree. 004 Copyright (C) 2001-2008 by: 005 Department of Geography, University of Bonn 006 http://www.giub.uni-bonn.de/deegree/ 007 lat/lon GmbH 008 http://www.lat-lon.de 009 010 This library is free software; you can redistribute it and/or 011 modify it under the terms of the GNU Lesser General Public 012 License as published by the Free Software Foundation; either 013 version 2.1 of the License, or (at your option) any later version. 014 This library is distributed in the hope that it will be useful, 015 but WITHOUT ANY WARRANTY; without even the implied warranty of 016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 Lesser General Public License for more details. 018 You should have received a copy of the GNU Lesser General Public 019 License along with this library; if not, write to the Free Software 020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 021 Contact: 022 023 Andreas Poth 024 lat/lon GmbH 025 Aennchenstr. 19 026 53177 Bonn 027 Germany 028 E-Mail: poth@lat-lon.de 029 030 Prof. Dr. Klaus Greve 031 Department of Geography 032 University of Bonn 033 Meckenheimer Allee 166 034 53115 Bonn 035 Germany 036 E-Mail: greve@giub.uni-bonn.de 037 ---------------------------------------------------------------------------*/ 038 039 package org.deegree.crs.components; 040 041 import org.deegree.crs.transformations.WGS84ConversionInfo; 042 043 /** 044 * A <code>GeodeticDatum</code> (aka. HorizontalDatum) holds an ellipse and a prime-meridian. 045 * 046 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a> 047 * 048 * @author last edited by: $Author:$ 049 * 050 * @version $Revision:$, $Date:$ 051 * 052 */ 053 054 public class GeodeticDatum extends Datum { 055 056 /** 057 * The default WGS 1984 datum, with primeMeridian set to Greenwich and default (no) wgs84 conversion info. 058 */ 059 public static final GeodeticDatum WGS84 = new GeodeticDatum( Ellipsoid.WGS84, new WGS84ConversionInfo("-1"), "EPSG:6326", "WGS_1984" ); 060 061 private PrimeMeridian primeMeridian; 062 063 private Ellipsoid ellipsoid; 064 065 private WGS84ConversionInfo toWGS84; 066 067 /** 068 * @param ellipsoid 069 * of this datum 070 * @param primeMeridian 071 * to which this datum is defined. 072 * @param toWGS84 073 * bursa-wolf parameters describing the transform from this datum into the wgs84 datum. 074 * @param identifiers 075 * @param names 076 * @param versions 077 * @param descriptions 078 * @param areasOfUse 079 */ 080 public GeodeticDatum( Ellipsoid ellipsoid, PrimeMeridian primeMeridian, WGS84ConversionInfo toWGS84, 081 String[] identifiers, String[] names, String[] versions, String[] descriptions, String[] areasOfUse ) { 082 super( identifiers, names, versions, descriptions, areasOfUse ); 083 this.ellipsoid = ellipsoid; 084 this.primeMeridian = primeMeridian; 085 this.toWGS84 = toWGS84; 086 } 087 088 /** 089 * A datum with given ellipsoid and a GreenWich prime-meridian. 090 * 091 * @param ellipsoid 092 * of this datum 093 * @param toWGS84 094 * bursa-wolf parameters describing the transform from this datum into the wgs84 datum. 095 * @param identifiers 096 */ 097 public GeodeticDatum( Ellipsoid ellipsoid, WGS84ConversionInfo toWGS84, String[] identifiers ) { 098 this( ellipsoid, PrimeMeridian.GREENWICH, toWGS84, identifiers, null, null, null,null ); 099 } 100 101 /** 102 * A datum with given ellipsoid and a prime-meridian. 103 * 104 * @param ellipsoid 105 * of this datum 106 * @param primeMeridian 107 * to which this datum is defined. 108 * @param toWGS84 109 * bursa-wolf parameters describing the transform from this datum into the wgs84 datum. 110 * @param identifiers 111 */ 112 public GeodeticDatum( Ellipsoid ellipsoid, PrimeMeridian primeMeridian, WGS84ConversionInfo toWGS84, String[] identifiers ) { 113 this( ellipsoid, primeMeridian, toWGS84, identifiers, null, null, null,null ); 114 } 115 116 /** 117 * @param ellipsoid 118 * of this datum 119 * @param primeMeridian 120 * to which this datum is defined. 121 * @param toWGS84 122 * bursa-wolf parameters describing the transform from this datum into the wgs84 datum. 123 * @param identifier 124 * @param name 125 * @param version 126 * @param description 127 * @param areaOfUse 128 */ 129 public GeodeticDatum( Ellipsoid ellipsoid, PrimeMeridian primeMeridian, WGS84ConversionInfo toWGS84, 130 String identifier, String name, String version, String description, String areaOfUse ) { 131 this( ellipsoid, primeMeridian, toWGS84, new String[]{identifier}, new String[]{name}, new String[]{version}, new String[]{description}, new String[]{areaOfUse} ); 132 } 133 134 /** 135 * A datum with given ellipsoid and a GreenWich prime-meridian. 136 * 137 * @param ellipsoid 138 * of this datum 139 * @param toWGS84 140 * bursa-wolf parameters describing the transform from this datum into the wgs84 datum. 141 * @param identifier 142 * @param name 143 */ 144 public GeodeticDatum( Ellipsoid ellipsoid, WGS84ConversionInfo toWGS84, String identifier, String name ) { 145 this( ellipsoid, PrimeMeridian.GREENWICH, toWGS84, new String[]{identifier}, new String[]{name}, null, null,null ); 146 } 147 148 /** 149 * @return the ellipsoid. 150 */ 151 public final Ellipsoid getEllipsoid() { 152 return ellipsoid; 153 } 154 155 /** 156 * @return the primeMeridian. 157 */ 158 public final PrimeMeridian getPrimeMeridian() { 159 return primeMeridian; 160 } 161 162 /** 163 * @return the toWGS84Conversion information needed to convert this geodetic Datum into the geocentric WGS84 Datum. 164 */ 165 public final WGS84ConversionInfo getWGS84Conversion() { 166 return toWGS84; 167 } 168 169 @Override 170 public boolean equals( Object other ) { 171 if ( other != null && other instanceof GeodeticDatum ) { 172 GeodeticDatum that = (GeodeticDatum) other; 173 return this.getPrimeMeridian().equals( that.getPrimeMeridian() ) && this.getEllipsoid().equals( that.getEllipsoid() ) && this.getWGS84Conversion().equals( that.getWGS84Conversion() ); 174 } 175 return false; 176 } 177 178 /* (non-Javadoc) 179 * @see org.deegree.crs.Identifiable#toString() 180 */ 181 @Override 182 public String toString() { 183 StringBuilder sb = new StringBuilder( super.toString() ); 184 sb.append( "\n - Ellipsoid: " ).append( ellipsoid ); 185 sb.append( "\n - Primemeridian: " ).append( primeMeridian ); 186 sb.append( "\n - wgs84-conversion-info: " ).append( toWGS84 ); 187 return sb.toString(); 188 } 189 190 /** 191 * Implementation as proposed by Joshua Block in Effective Java (Addison-Wesley 2001), which supplies an even 192 * distribution and is relatively fast. It is created from field <b>f</b> as follows: 193 * <ul> 194 * <li>boolean -- code = (f ? 0 : 1)</li> 195 * <li>byte, char, short, int -- code = (int)f </li> 196 * <li>long -- code = (int)(f ^ (f >>>32))</li> 197 * <li>float -- code = Float.floatToIntBits(f);</li> 198 * <li>double -- long l = Double.doubleToLongBits(f); code = (int)(l ^ (l >>> 32))</li> 199 * <li>all Objects, (where equals( ) calls equals( ) for this field) -- code = f.hashCode( )</li> 200 * <li>Array -- Apply above rules to each element</li> 201 * </ul> 202 * <p> 203 * Combining the hash code(s) computed above: result = 37 * result + code; 204 * </p> 205 * 206 * @return (int) ( result >>> 32 ) ^ (int) result; 207 * 208 * @see java.lang.Object#hashCode() 209 */ 210 @Override 211 public int hashCode() { 212 // the 2.nd million th. prime, :-) 213 long code = 32452843; 214 if( primeMeridian != null ){ 215 code = code * 37 + primeMeridian.hashCode(); 216 } 217 if( ellipsoid != null ){ 218 code = code * 37 + ellipsoid.hashCode(); 219 } 220 if( toWGS84 != null ){ 221 code = code * 37 + toWGS84.hashCode(); 222 } 223 return (int) ( code >>> 32 ) ^ (int) code; 224 } 225 226 }