001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/csct/cs/HorizontalDatum.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2007 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 058 /** 059 * Procedure used to measure positions on the surface of the Earth. 060 * 061 * @version 1.00 062 * @author OpenGIS (www.opengis.org) 063 * @author Martin Desruisseaux 064 * 065 * @author last edited by: $Author: apoth $ 066 * 067 * @version $Revision: 7056 $, $Date: 2007-05-10 09:27:49 +0200 (Do, 10 Mai 2007) $ 068 * 069 * @see "org.opengis.cs.CS_HorizontalDatum" 070 */ 071 public class HorizontalDatum extends Datum { 072 /** 073 * Serial number for interoperability with different versions. 074 */ 075 private static final long serialVersionUID = -1424482162002300865L; 076 077 /** 078 * The default WGS 1984 datum. 079 */ 080 public static final HorizontalDatum WGS84 = (HorizontalDatum) pool.intern( new HorizontalDatum( 081 "WGS84", 082 DatumType.GEOCENTRIC, 083 Ellipsoid.WGS84, 084 null ) ); 085 086 /** 087 * The ellipsoid for this datum. 088 */ 089 private final Ellipsoid ellipsoid; 090 091 /** 092 * Preferred parameters for a Bursa Wolf transformation. 093 */ 094 private final WGS84ConversionInfo parameters; 095 096 /** 097 * Creates horizontal datum from an ellipsoid. The datum type will be 098 * {@link DatumType.Horizontal#OTHER}. 099 * 100 * @param name 101 * Name to give new object. 102 * @param ellipsoid 103 * Ellipsoid to use in new horizontal datum. 104 */ 105 public HorizontalDatum( final String name, final Ellipsoid ellipsoid ) { 106 this( name, DatumType.Horizontal.OTHER, ellipsoid, null ); 107 } 108 109 /** 110 * Creates horizontal datum from ellipsoid and Bursa-Wolf parameters. 111 * 112 * @param name 113 * Name to give new object. 114 * @param type 115 * Type of horizontal datum to create. 116 * @param ellipsoid 117 * Ellipsoid to use in new horizontal datum. 118 * @param parameters 119 * Suggested approximate conversion from new datum to WGS84, or <code>null</code> 120 * if there is none. 121 * 122 */ 123 public HorizontalDatum( final String name, final DatumType.Horizontal type, 124 final Ellipsoid ellipsoid, final WGS84ConversionInfo parameters ) { 125 super( name, type ); 126 this.ellipsoid = ellipsoid; 127 this.parameters = ( parameters != null ) ? (WGS84ConversionInfo) parameters.clone() : null; 128 ensureNonNull( "ellipsoid", ellipsoid ); 129 } 130 131 /** 132 * Creates horizontal datum from ellipsoid and Bursa-Wolf parameters. 133 * 134 * @param properties 135 * The set of properties (see {@link Info}). 136 * @param type 137 * Type of horizontal datum to create. 138 * @param ellipsoid 139 * Ellipsoid to use in new horizontal datum. 140 * @param parameters 141 * Suggested approximate conversion from new datum to WGS84, or <code>null</code> 142 * if there is none. 143 */ 144 HorizontalDatum( final Map properties, final DatumType type, final Ellipsoid ellipsoid, 145 final WGS84ConversionInfo parameters ) { 146 super( properties, type ); 147 this.ellipsoid = ellipsoid; 148 this.parameters = parameters; 149 // Accept null values. 150 } 151 152 /** 153 * Gets the type of the datum as an enumerated code. 154 * 155 * Note: return type will be changed to {@link DatumType.Horizontal} when we will be able to use 156 * generic types (with JDK 1.5). 157 * 158 * @return 159 * 160 * @see "org.opengis.cs.CS_HorizontalDatum#getDatumType()" 161 */ 162 public DatumType/* .Horizontal */getDatumType() { 163 return super.getDatumType(); 164 } 165 166 /** 167 * Returns the ellipsoid. 168 * 169 * @return the ellipsoid. 170 * 171 * @see "org.opengis.cs.CS_HorizontalDatum#getEllipsoid()" 172 */ 173 public Ellipsoid getEllipsoid() { 174 return ellipsoid; 175 } 176 177 /** 178 * Gets preferred parameters for a Bursa Wolf transformation into WGS84. The 7 returned values 179 * correspond to (dx,dy,dz) in meters, (ex,ey,ez) in arc-seconds, and scaling in 180 * parts-per-million. This method will always returns <code>null</code> for horizontal datums 181 * with type {@link DatumType.Horizontal#OTHER}. This method may also returns <code>null</code> 182 * if no suitable transformation is available. 183 * 184 * @return 185 * 186 * @see "org.opengis.cs.CS_HorizontalDatum#getWGS84Parameters()" 187 */ 188 public WGS84ConversionInfo getWGS84Parameters() { 189 return ( parameters != null ) ? (WGS84ConversionInfo) parameters.clone() : null; 190 } 191 192 /** 193 * Fill the part inside "[...]". Used for formatting Well Know Text (WKT). 194 * 195 * @param buffer 196 * @return 197 */ 198 String addString( final StringBuffer buffer ) { 199 super.addString( buffer ); 200 buffer.append( ", " ); 201 buffer.append( ellipsoid ); 202 if ( parameters != null ) { 203 buffer.append( ", " ); 204 buffer.append( parameters ); 205 } 206 return "DATUM"; 207 } 208 209 /** 210 * Compares the specified object with this datum for equality. 211 * 212 * @param object 213 * @return 214 */ 215 public boolean equals( final Object object ) { 216 if ( super.equals( object ) ) { 217 final HorizontalDatum that = (HorizontalDatum) object; 218 return Utilities.equals( this.ellipsoid, that.ellipsoid ) 219 && Utilities.equals( this.parameters, that.parameters ); 220 } 221 return false; 222 } 223 224 }