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.Collection;
025: import java.util.Map;
026: import javax.units.SI;
027:
028: // OpenGIS dependencies
029: import org.opengis.referencing.cs.CoordinateSystem;
030: import org.opengis.referencing.crs.EngineeringCRS;
031: import org.opengis.referencing.datum.EngineeringDatum;
032: import org.opengis.util.GenericName;
033: import org.opengis.util.InternationalString;
034:
035: // Geotools dependencies
036: import org.geotools.referencing.AbstractIdentifiedObject;
037: import org.geotools.referencing.AbstractReferenceSystem;
038: import org.geotools.referencing.datum.DefaultEngineeringDatum;
039: import org.geotools.referencing.cs.DefaultCoordinateSystemAxis;
040: import org.geotools.referencing.cs.DefaultCartesianCS;
041: import org.geotools.referencing.wkt.Formatter;
042: import org.geotools.resources.Utilities;
043: import org.geotools.resources.i18n.Vocabulary;
044: import org.geotools.resources.i18n.VocabularyKeys;
045: import org.geotools.util.NameFactory;
046:
047: /**
048: * A contextually local coordinate reference system. It can be divided into two broad categories:
049: * <ul>
050: * <li>earth-fixed systems applied to engineering activities on or near the surface of the
051: * earth;</li>
052: * <li>CRSs on moving platforms such as road vehicles, vessels, aircraft, or spacecraft.</li>
053: * </ul>
054: *
055: * <TABLE CELLPADDING='6' BORDER='1'>
056: * <TR BGCOLOR="#EEEEFF"><TH NOWRAP>Used with CS type(s)</TH></TR>
057: * <TR><TD>
058: * {@link org.opengis.referencing.cs.CartesianCS Cartesian},
059: * {@link org.opengis.referencing.cs.AffineCS Affine},
060: * {@link org.opengis.referencing.cs.EllipsoidalCS Ellipsoidal},
061: * {@link org.opengis.referencing.cs.SphericalCS Spherical},
062: * {@link org.opengis.referencing.cs.CylindricalCS Cylindrical},
063: * {@link org.opengis.referencing.cs.PolarCS Polar},
064: * {@link org.opengis.referencing.cs.VerticalCS Vertical},
065: * {@link org.opengis.referencing.cs.LinearCS Linear}
066: * </TD></TR></TABLE>
067: *
068: * @since 2.1
069: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/referencing/src/main/java/org/geotools/referencing/crs/DefaultEngineeringCRS.java $
070: * @version $Id: DefaultEngineeringCRS.java 24609 2007-02-26 23:35:53Z desruisseaux $
071: * @author Martin Desruisseaux
072: */
073: public class DefaultEngineeringCRS extends AbstractSingleCRS implements
074: EngineeringCRS {
075: /**
076: * Serial number for interoperability with different versions.
077: */
078: private static final long serialVersionUID = 6695541732063382701L;
079:
080: /**
081: * A cartesian local coordinate system.
082: */
083: private static final class Cartesian extends DefaultEngineeringCRS {
084: /** Serial number for interoperability with different versions. */
085: private static final long serialVersionUID = -1773381554353809683L;
086:
087: /** Constructs a coordinate system with the given name. */
088: public Cartesian(final int key, final CoordinateSystem cs) {
089: super (name(key), DefaultEngineeringDatum.UNKNOW, cs);
090: }
091:
092: /**
093: * Compares the specified object to this CRS for equality. This method is overridden
094: * because, otherwise, {@code CARTESIAN_xD} and {@code GENERIC_xD} would be considered
095: * equals when metadata are ignored.
096: */
097: public boolean equals(final AbstractIdentifiedObject object,
098: final boolean compareMetadata) {
099: if (super .equals(object, compareMetadata)) {
100: if (compareMetadata) {
101: // No need to performs the check below if metadata were already compared.
102: return true;
103: }
104: final Cartesian that = (Cartesian) object;
105: return Utilities.equals(this .getName().getCode(), that
106: .getName().getCode());
107: }
108: return false;
109: }
110: }
111:
112: /**
113: * A two-dimensional cartesian coordinate reference system with
114: * {@linkplain DefaultCoordinateSystemAxis#X x},
115: * {@linkplain DefaultCoordinateSystemAxis#Y y}
116: * axis in {@linkplain SI#METER metres}. By default, this CRS has no transformation
117: * path to any other CRS (i.e. a map using this CS can't be reprojected to a
118: * {@linkplain DefaultGeographicCRS geographic coordinate reference system} for example).
119: */
120: public static final DefaultEngineeringCRS CARTESIAN_2D = new Cartesian(
121: VocabularyKeys.CARTESIAN_2D, DefaultCartesianCS.GENERIC_2D);
122:
123: /**
124: * A three-dimensional cartesian coordinate reference system with
125: * {@linkplain DefaultCoordinateSystemAxis#X x},
126: * {@linkplain DefaultCoordinateSystemAxis#Y y},
127: * {@linkplain DefaultCoordinateSystemAxis#Z z}
128: * axis in {@linkplain SI#METER metres}. By default, this CRS has no transformation
129: * path to any other CRS (i.e. a map using this CS can't be reprojected to a
130: * {@linkplain DefaultGeographicCRS geographic coordinate reference system} for example).
131: */
132: public static final DefaultEngineeringCRS CARTESIAN_3D = new Cartesian(
133: VocabularyKeys.CARTESIAN_3D, DefaultCartesianCS.GENERIC_3D);
134:
135: /**
136: * A two-dimensional wildcard coordinate system with
137: * {@linkplain DefaultCoordinateSystemAxis#X x},
138: * {@linkplain DefaultCoordinateSystemAxis#Y y}
139: * axis in {@linkplain SI#METER metres}. At the difference of {@link #CARTESIAN_2D},
140: * this coordinate system is treated specially by the default {@linkplain
141: * org.geotools.referencing.operation.DefaultCoordinateOperationFactory coordinate operation
142: * factory} with loose transformation rules: if no transformation path were found (for example
143: * through a {@linkplain DefaultDerivedCRS derived CRS}), then the transformation from this
144: * CRS to any CRS with a compatible number of dimensions is assumed to be the identity
145: * transform. This CRS is usefull as a kind of wildcard when no CRS were explicitly specified.
146: */
147: public static final DefaultEngineeringCRS GENERIC_2D = new Cartesian(
148: VocabularyKeys.GENERIC_CARTESIAN_2D,
149: DefaultCartesianCS.GENERIC_2D);
150:
151: /**
152: * A three-dimensional wildcard coordinate system with
153: * {@linkplain DefaultCoordinateSystemAxis#X x},
154: * {@linkplain DefaultCoordinateSystemAxis#Y y},
155: * {@linkplain DefaultCoordinateSystemAxis#Z z}
156: * axis in {@linkplain SI#METER metres}. At the difference of {@link #CARTESIAN_3D},
157: * this coordinate system is treated specially by the default {@linkplain
158: * org.geotools.referencing.operation.DefaultCoordinateOperationFactory coordinate operation
159: * factory} with loose transformation rules: if no transformation path were found (for example
160: * through a {@linkplain DefaultDerivedCRS derived CRS}), then the transformation from this
161: * CRS to any CRS with a compatible number of dimensions is assumed to be the identity
162: * transform. This CRS is usefull as a kind of wildcard when no CRS were explicitly specified.
163: */
164: public static final DefaultEngineeringCRS GENERIC_3D = new Cartesian(
165: VocabularyKeys.GENERIC_CARTESIAN_3D,
166: DefaultCartesianCS.GENERIC_3D);
167:
168: /**
169: * Constructs a new enginnering CRS with the same values than the specified one.
170: * This copy constructor provides a way to wrap an arbitrary implementation into a
171: * Geotools one or a user-defined one (as a subclass), usually in order to leverage
172: * some implementation-specific API. This constructor performs a shallow copy,
173: * i.e. the properties are not cloned.
174: *
175: * @since 2.2
176: */
177: public DefaultEngineeringCRS(final EngineeringCRS crs) {
178: super (crs);
179: }
180:
181: /**
182: * Constructs an engineering CRS from a name.
183: *
184: * @param name The name.
185: * @param datum The datum.
186: * @param cs The coordinate system.
187: */
188: public DefaultEngineeringCRS(final String name,
189: final EngineeringDatum datum, final CoordinateSystem cs) {
190: this (Collections.singletonMap(NAME_KEY, name), datum, cs);
191: }
192:
193: /**
194: * Constructs an engineering CRS from a set of properties. The properties are given unchanged to
195: * the {@linkplain AbstractReferenceSystem#AbstractReferenceSystem(Map) super-class constructor}.
196: *
197: * @param properties Set of properties. Should contains at least <code>"name"</code>.
198: * @param datum The datum.
199: * @param cs The coordinate system.
200: */
201: public DefaultEngineeringCRS(final Map properties,
202: final EngineeringDatum datum, final CoordinateSystem cs) {
203: super (properties, datum, cs);
204: }
205:
206: /**
207: * Returns a hash value for this derived CRS.
208: *
209: * @return The hash code value. This value doesn't need to be the same
210: * in past or future versions of this class.
211: */
212: public int hashCode() {
213: return (int) serialVersionUID ^ super .hashCode();
214: }
215:
216: /**
217: * Format the inner part of a
218: * <A HREF="http://geoapi.sourceforge.net/snapshot/javadoc/org/opengis/referencing/doc-files/WKT.html"><cite>Well
219: * Known Text</cite> (WKT)</A> element.
220: *
221: * @param formatter The formatter to use.
222: * @return The name of the WKT element type, which is {@code "LOCAL_CS"}.
223: */
224: protected String formatWKT(final Formatter formatter) {
225: formatDefaultWKT(formatter);
226: return "LOCAL_CS";
227: }
228: }
|