001: /*
002: * GeoTools - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2005-2006, GeoTools Project Managment Committee (PMC)
005: * (C) 2005, 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.operation;
021:
022: // J2SE dependencies
023: import java.util.Map;
024: import java.util.Collections;
025:
026: // OpenGIS dependencies
027: import org.opengis.parameter.ParameterDescriptorGroup;
028: import org.opengis.parameter.ParameterValueGroup;
029: import org.opengis.referencing.crs.GeneralDerivedCRS;
030: import org.opengis.referencing.operation.OperationMethod;
031: import org.geotools.referencing.wkt.Formatter;
032:
033: /**
034: * A conversion used for the definition of a {@linkplain GeneralDerivedCRS derived CRS}
035: * (including projections). This conversion has no source and target CRS, and no math
036: * transform. Those elements are created by the derived CRS itself.
037: *
038: * @since 2.1
039: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/library/referencing/src/main/java/org/geotools/referencing/operation/DefiningConversion.java $
040: * @version $Id: DefiningConversion.java 20874 2006-08-07 10:00:01Z jgarnett $
041: * @author Martin Desruisseaux
042: * @author Matthias Basler
043: */
044: public class DefiningConversion extends DefaultConversion {
045: /**
046: * Serial number for interoperability with different versions.
047: */
048: private static final long serialVersionUID = 7399026512478064721L;
049:
050: /**
051: * The parameter values.
052: */
053: private final ParameterValueGroup parameters;
054:
055: /**
056: * Convenience constructor for creating a defining conversion with a default operation method.
057: * The operation method is assumed two-dimensional.
058: *
059: * @param name The conversion name.
060: * @param parameters The parameter values.
061: *
062: * @since 2.2
063: */
064: public DefiningConversion(final String name,
065: final ParameterValueGroup parameters) {
066: this (Collections.singletonMap(NAME_KEY, name),
067: getOperationMethod(parameters), parameters);
068: }
069:
070: /**
071: * Work around for RFE #4093999 in Sun's bug database
072: * ("Relax constraint on placement of this()/super() call in constructors").
073: */
074: private static OperationMethod getOperationMethod(
075: final ParameterValueGroup parameters) {
076: ensureNonNull("parameters", parameters);
077: // TODO: remove the cast when we will be allowed to compile for J2SE 1.5.
078: final ParameterDescriptorGroup descriptor = (ParameterDescriptorGroup) parameters
079: .getDescriptor();
080: return new DefaultOperationMethod(getProperties(descriptor,
081: null), 2, 2, descriptor);
082: }
083:
084: /**
085: * Constructs a conversion from a set of properties. The properties given in argument
086: * follow the same rules than for the {@link AbstractCoordinateOperation} constructor.
087: *
088: * @param properties Set of properties. Should contains at least <code>"name"</code>.
089: * @param method The operation method.
090: * @param parameters The parameter values.
091: */
092: public DefiningConversion(final Map properties,
093: final OperationMethod method,
094: final ParameterValueGroup parameters) {
095: super (properties, null, null, null, method);
096: ensureNonNull("parameters", parameters);
097: this .parameters = (ParameterValueGroup) parameters.clone();
098: }
099:
100: /**
101: * Returns the parameter values.
102: */
103: public ParameterValueGroup getParameterValues() {
104: return (ParameterValueGroup) parameters.clone();
105: }
106:
107: /**
108: * {@inheritDoc}
109: */
110: protected String formatWKT(final Formatter formatter) {
111: final String name = super.formatWKT(formatter);
112: formatter.append(parameters);
113: return name;
114: }
115: }
|