/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2005-2008, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.referencing.operation.projection; import org.opengis.parameter.ParameterDescriptor; import org.opengis.parameter.ParameterDescriptorGroup; import org.opengis.parameter.ParameterNotFoundException; import org.opengis.parameter.ParameterValue; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.operation.ConicProjection; import org.opengis.referencing.operation.MathTransform; import org.geotools.metadata.iso.citation.Citations; import org.geotools.referencing.NamedIdentifier; import org.geotools.referencing.operation.MathTransformProvider; import org.geotools.referencing.operation.projection.MapProjection.AbstractProvider; import org.geotools.resources.i18n.VocabularyKeys; import org.geotools.resources.i18n.Vocabulary; import org.geotools.util.Utilities; /** * Lambert Conical Conformal 2SP Projection. * * @see lambert_conic_conformal_2sp * * @since 2.2 * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux * @author Rueben Schulz */ public class LambertConformal2SP extends LambertConformal { /** * For cross-version compatibility. */ private static final long serialVersionUID = 7184350446186057405L; /** * Constructs a new map projection from the supplied parameters. * * @param parameters The parameter values in standard units. * @throws ParameterNotFoundException if a mandatory parameter is missing. */ protected LambertConformal2SP(final ParameterValueGroup parameters) throws ParameterNotFoundException { super(parameters); } /** * {@inheritDoc} */ public ParameterDescriptorGroup getParameterDescriptors() { return Provider.PARAMETERS; } ////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// //////// //////// //////// PROVIDERS //////// //////// //////// ////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// /** * The {@linkplain org.geotools.referencing.operation.MathTransformProvider math transform * provider} for a {@linkplain LambertConformal2SP Lambert Conformal 2SP} projection (EPSG * code 9802). * * @since 2.2 * @version $Id$ * @author Martin Desruisseaux * @author Rueben Schulz * * @see org.geotools.referencing.operation.DefaultMathTransformFactory */ public static class Provider extends AbstractProvider { /** * For cross-version compatibility. */ private static final long serialVersionUID = 3240860802816724947L; /** * The parameters group. */ static final ParameterDescriptorGroup PARAMETERS = createDescriptorGroup(new NamedIdentifier[] { new NamedIdentifier(Citations.OGC, "Lambert_Conformal_Conic_2SP"), new NamedIdentifier(Citations.EPSG, "Lambert Conic Conformal (2SP)"), new NamedIdentifier(Citations.ESRI, "Lambert_Conformal_Conic"), new NamedIdentifier(Citations.ESRI, "Lambert_Conformal_Conic_2SP"), new NamedIdentifier(Citations.EPSG, "9802"), new NamedIdentifier(Citations.GEOTIFF, "CT_LambertConfConic_2SP"), new NamedIdentifier(Citations.GEOTIFF, "CT_LambertConfConic"), new NamedIdentifier(Citations.GEOTOOLS, Vocabulary.formatInternational( VocabularyKeys.LAMBERT_CONFORMAL_PROJECTION)) }, new ParameterDescriptor[] { SEMI_MAJOR, SEMI_MINOR, CENTRAL_MERIDIAN, LATITUDE_OF_ORIGIN, STANDARD_PARALLEL_1, STANDARD_PARALLEL_2, FALSE_EASTING, FALSE_NORTHING, SCALE_FACTOR // This last parameter is for ESRI compatibility }); /** * Constructs a new provider. */ public Provider() { super(PARAMETERS); } /** * Returns the operation type for this map projection. */ @Override public Class getOperationType() { return ConicProjection.class; } /** * Creates a transform from the specified group of parameter values. * * @param parameters The group of parameter values. * @return The created math transform. * @throws ParameterNotFoundException if a required parameter was not found. */ protected MathTransform createMathTransform(final ParameterValueGroup parameters) throws ParameterNotFoundException { if(getParameter(STANDARD_PARALLEL_2, parameters) == null && getParameter(STANDARD_PARALLEL_1, parameters) == null && getParameter(LATITUDE_OF_ORIGIN, parameters) != null) { // handle the ESRI 1SP case return new LambertConformal1SP(parameters); } else if(Utilities.equals(doubleValue(STANDARD_PARALLEL_1, parameters), doubleValue(STANDARD_PARALLEL_2, parameters)) && Utilities.equals(doubleValue(STANDARD_PARALLEL_1, parameters), doubleValue(LATITUDE_OF_ORIGIN, parameters)) ) { // handle the ESRI 1SP case return new LambertConformal1SP(parameters); } else if(getParameter(STANDARD_PARALLEL_2, parameters) == null && Utilities.equals(doubleValue(STANDARD_PARALLEL_1, parameters), doubleValue(LATITUDE_OF_ORIGIN, parameters))) { // handle the ESRI 1SP case return new LambertConformal1SP(parameters); } else { // switch sp1 and sp2 so that we get a consistent ordering, this allows to recognize // tow Lamber conformal with the same standard parallels declared in opposite order ParameterValue sp1 = getParameter(STANDARD_PARALLEL_1, parameters); ParameterValue sp2 = getParameter(STANDARD_PARALLEL_2, parameters); if(sp1 != null && sp2 != null) { if(sp1.doubleValue() < sp2.doubleValue()) { final double temp = sp1.doubleValue(); sp1.setValue(sp2.doubleValue()); sp2.setValue(temp); } } return new LambertConformal2SP(parameters); } } } }