001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/csct/cs/HorizontalCoordinateSystem.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.resources.css.ResourceKeys;
058    import org.deegree.model.csct.resources.css.Resources;
059    
060    /**
061     * A 2D coordinate system suitable for positions on the Earth's surface.
062     * 
063     * @version 1.00
064     * @author OpenGIS (www.opengis.org)
065     * @author Martin Desruisseaux
066     * 
067     * @author last edited by: $Author: bezema $
068     * 
069     * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $
070     * 
071     * @see "org.opengis.cs.CS_HorizontalCoordinateSystem"
072     */
073    public abstract class HorizontalCoordinateSystem extends CoordinateSystem {
074        /**
075         * Serial number for interoperability with different versions.
076         */
077        private static final long serialVersionUID = 350661821531782559L;
078    
079        /**
080         * The horizontal datum.
081         */
082        private final HorizontalDatum datum;
083    
084        /**
085         * Details of 0th ordinates.
086         */
087        private final AxisInfo axis0;
088    
089        /**
090         * Details of 1th ordinates.
091         */
092        private final AxisInfo axis1;
093    
094        /**
095         * Construct a coordinate system.
096         * 
097         * @param name
098         *            The coordinate system name.
099         * @param datum
100         *            The horizontal datum.
101         * @param axis0
102         *            Details of 0th ordinates in created coordinate system.
103         * @param axis1
104         *            Details of 1st ordinates in created coordinate system.
105         */
106        public HorizontalCoordinateSystem( final String name, final HorizontalDatum datum,
107                                           final AxisInfo axis0, final AxisInfo axis1 ) {
108            super( name );
109            this.datum = datum;
110            this.axis0 = axis0;
111            this.axis1 = axis1;
112            ensureNonNull( "datum", datum );
113            ensureNonNull( "axis0", axis0 );
114            ensureNonNull( "axis1", axis1 );
115            checkAxis( datum.getDatumType() );
116        }
117    
118        /**
119         * Construct a coordinate system.
120         * 
121         * @param properties
122         *            The set of properties (see {@link Info}).
123         * @param datum
124         *            The horizontal datum.
125         * @param axis0
126         *            Details of 0th ordinates in created coordinate system.
127         * @param axis1
128         *            Details of 1st ordinates in created coordinate system.
129         */
130        HorizontalCoordinateSystem( final Map properties, final HorizontalDatum datum,
131                                    final AxisInfo axis0, final AxisInfo axis1 ) {
132            super( properties );
133            this.datum = datum;
134            this.axis0 = axis0;
135            this.axis1 = axis1;
136            // Accept null values
137        }
138    
139        /**
140         * Returns the dimension of this coordinate system, which is 2.
141         * 
142         * @return the dimension of this coordinate system, which is 2.
143         * 
144         * @see "org.opengis.cs.CS_HorizontalCoordinateSystem#getDimension()"
145         */
146        public final int getDimension() {
147            return 2;
148        }
149    
150        /**
151         * Override {@link CoordinateSystem#getDatum()}.
152         */
153        final Datum getDatum() {
154            return getHorizontalDatum();
155        }
156    
157        /**
158         * Returns the horizontal datum.
159         * 
160         * @return the horizontal datum.
161         * 
162         * @see "org.opengis.cs.CS_HorizontalCoordinateSystem#getHorizontalDatum()"
163         */
164        public HorizontalDatum getHorizontalDatum() {
165            return datum;
166        }
167    
168        /**
169         * Gets axis details for dimension within coordinate system.
170         * 
171         * @param dimension
172         *            Zero based index of axis.
173         * @return
174         * 
175         * @see "org.opengis.cs.CS_HorizontalCoordinateSystem#getAxis(int)"
176         */
177        public AxisInfo getAxis( final int dimension ) {
178            switch ( dimension ) {
179            case 0:
180                return axis0;
181            case 1:
182                return axis1;
183            default:
184                throw new IndexOutOfBoundsException(
185                                                     Resources.format(
186                                                                       ResourceKeys.ERROR_INDEX_OUT_OF_BOUNDS_$1,
187                                                                       new Integer( dimension ) ) );
188            }
189        }
190    
191        /**
192         * Returns <code>true</code> if this coordinate system is equivalents to the specified
193         * coordinate system. Two coordinate systems are considered equivalent if the
194         * {@link org.deegree.model.csct.ct.CoordinateTransformation} from <code>this</code> to
195         * <code>cs</code> would be the identity transform. The default implementation compare datum,
196         * units and axis, but ignore name, alias and other meta-data informations.
197         * 
198         * @param cs
199         *            The coordinate system (may be <code>null</code>).
200         * @return <code>true</code> if both coordinate systems are equivalent.
201         */
202        public boolean equivalents( final CoordinateSystem cs ) {
203            if ( cs == this )
204                return true;
205            if ( super.equivalents( cs ) ) {
206                final HorizontalCoordinateSystem that = (HorizontalCoordinateSystem) cs;
207                return Utilities.equals( this.datum, that.datum )
208                       && Utilities.equals( this.axis0, that.axis0 )
209                       && Utilities.equals( this.axis1, that.axis1 );
210            }
211            return false;
212        }
213    
214        /**
215         * Fill the part inside "[...]". Used for formatting Well Know Text (WKT).
216         * 
217         * @param buffer
218         * @return
219         */
220        String addString( final StringBuffer buffer ) {
221            buffer.append( ", " );
222            buffer.append( datum );
223            buffer.append( ", " );
224            buffer.append( axis0 );
225            buffer.append( ", " );
226            buffer.append( axis1 );
227            return "HORZ_CS";
228        }
229    
230    }