001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2003-2006, GeoTools Project Managment Committee (PMC)
005: * (C) 2001, Institut de Recherche pour le Développement
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation;
010: * version 2.1 of the License.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * This package contains documentation from OpenGIS specifications.
018: * OpenGIS consortium's work is fully acknowledged here.
019: */
020: package org.geotools.referencing.crs;
021:
022: // J2SE dependencies and extensions
023: import java.util.Collections;
024: import java.util.Map;
025: import javax.units.Unit;
026:
027: // OpenGIS dependencies
028: import org.opengis.referencing.cs.CartesianCS;
029: import org.opengis.referencing.cs.SphericalCS;
030: import org.opengis.referencing.crs.GeocentricCRS;
031: import org.opengis.referencing.datum.GeodeticDatum;
032:
033: // Geotools dependencies
034: import org.geotools.referencing.wkt.Formatter;
035: import org.geotools.referencing.AbstractReferenceSystem;
036: import org.geotools.referencing.cs.DefaultCartesianCS;
037: import org.geotools.referencing.cs.DefaultSphericalCS;
038: import org.geotools.referencing.datum.DefaultGeodeticDatum;
039: import org.geotools.resources.i18n.VocabularyKeys;
040:
041: /**
042: * A 3D coordinate reference system with the origin at the approximate centre of mass of the earth.
043: * A geocentric CRS deals with the earth's curvature by taking a 3D spatial view, which obviates
044: * the need to model the earth's curvature.
045: *
046: * <TABLE CELLPADDING='6' BORDER='1'>
047: * <TR BGCOLOR="#EEEEFF"><TH NOWRAP>Used with CS type(s)</TH></TR>
048: * <TR><TD>
049: * {@link CartesianCS Cartesian},
050: * {@link SphericalCS Spherical}
051: * </TD></TR></TABLE>
052: *
053: * @since 2.1
054: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/referencing/src/main/java/org/geotools/referencing/crs/DefaultGeocentricCRS.java $
055: * @version $Id: DefaultGeocentricCRS.java 24609 2007-02-26 23:35:53Z desruisseaux $
056: * @author Martin Desruisseaux
057: */
058: public class DefaultGeocentricCRS extends AbstractSingleCRS implements
059: GeocentricCRS {
060: /**
061: * Serial number for interoperability with different versions.
062: */
063: private static final long serialVersionUID = 6784642848287659827L;
064:
065: /**
066: * The default geocentric CRS with a
067: * {@linkplain DefaultCartesianCS#GEOCENTRIC cartesian coordinate system}.
068: * Prime meridian is Greenwich, geodetic datum is WGS84 and linear units are metres.
069: * The <var>X</var> axis points towards the prime meridian.
070: * The <var>Y</var> axis points East.
071: * The <var>Z</var> axis points North.
072: */
073: public static final DefaultGeocentricCRS CARTESIAN = new DefaultGeocentricCRS(
074: name(VocabularyKeys.CARTESIAN), DefaultGeodeticDatum.WGS84,
075: DefaultCartesianCS.GEOCENTRIC);
076:
077: /**
078: * The default geocentric CRS with a
079: * {@linkplain DefaultSphericalCS#GEOCENTRIC spherical coordinate system}.
080: * Prime meridian is Greenwich, geodetic datum is WGS84 and linear units are metres.
081: */
082: public static final DefaultGeocentricCRS SPHERICAL = new DefaultGeocentricCRS(
083: name(VocabularyKeys.SPHERICAL), DefaultGeodeticDatum.WGS84,
084: DefaultSphericalCS.GEOCENTRIC);
085:
086: /**
087: * Constructs a new geocentric CRS with the same values than the specified one.
088: * This copy constructor provides a way to wrap an arbitrary implementation into a
089: * Geotools one or a user-defined one (as a subclass), usually in order to leverage
090: * some implementation-specific API. This constructor performs a shallow copy,
091: * i.e. the properties are not cloned.
092: *
093: * @since 2.2
094: */
095: public DefaultGeocentricCRS(final GeocentricCRS crs) {
096: super (crs);
097: }
098:
099: /**
100: * Constructs a geocentric CRS from a name.
101: *
102: * @param name The name.
103: * @param datum The datum.
104: * @param cs The coordinate system.
105: */
106: public DefaultGeocentricCRS(final String name,
107: final GeodeticDatum datum, final CartesianCS cs) {
108: this (Collections.singletonMap(NAME_KEY, name), datum, cs);
109: }
110:
111: /**
112: * Constructs a geocentric CRS from a name.
113: *
114: * @param name The name.
115: * @param datum The datum.
116: * @param cs The coordinate system.
117: */
118: public DefaultGeocentricCRS(final String name,
119: final GeodeticDatum datum, final SphericalCS cs) {
120: this (Collections.singletonMap(NAME_KEY, name), datum, cs);
121: }
122:
123: /**
124: * Constructs a geographic CRS from a set of properties. The properties are given unchanged to
125: * the {@linkplain AbstractReferenceSystem#AbstractReferenceSystem(Map) super-class constructor}.
126: *
127: * @param properties Set of properties. Should contains at least <code>"name"</code>.
128: * @param datum The datum.
129: * @param cs The coordinate system.
130: */
131: public DefaultGeocentricCRS(final Map properties,
132: final GeodeticDatum datum, final CartesianCS cs) {
133: super (properties, datum, cs);
134: }
135:
136: /**
137: * Constructs a geographic CRS from a set of properties.
138: * The properties are given unchanged to the
139: * {@linkplain AbstractReferenceSystem#AbstractReferenceSystem(Map) super-class constructor}.
140: *
141: * @param properties Set of properties. Should contains at least <code>"name"</code>.
142: * @param datum The datum.
143: * @param cs The coordinate system.
144: */
145: public DefaultGeocentricCRS(final Map properties,
146: final GeodeticDatum datum, final SphericalCS cs) {
147: super (properties, datum, cs);
148: }
149:
150: /**
151: * Returns a hash value for this geocentric CRS.
152: *
153: * @return The hash code value. This value doesn't need to be the same
154: * in past or future versions of this class.
155: */
156: public int hashCode() {
157: return (int) serialVersionUID ^ super .hashCode();
158: }
159:
160: /**
161: * Format the inner part of a
162: * <A HREF="http://geoapi.sourceforge.net/snapshot/javadoc/org/opengis/referencing/doc-files/WKT.html"><cite>Well
163: * Known Text</cite> (WKT)</A> element.
164: *
165: * @param formatter The formatter to use.
166: * @return The name of the WKT element type, which is {@code "GEOCCS"}.
167: */
168: protected String formatWKT(final Formatter formatter) {
169: final Unit unit = getUnit();
170: formatter.append(datum);
171: formatter.append(((GeodeticDatum) datum).getPrimeMeridian());
172: formatter.append(unit);
173: final int dimension = coordinateSystem.getDimension();
174: for (int i = 0; i < dimension; i++) {
175: formatter.append(coordinateSystem.getAxis(i));
176: }
177: if (unit == null) {
178: formatter.setInvalidWKT(GeocentricCRS.class);
179: }
180: return "GEOCCS";
181: }
182: }
|