Author: desruisseaux Date: Sun Feb 8 20:57:33 2015 New Revision: 1658254 URL: http://svn.apache.org/r1658254 Log: Added javadoc. Restricted DefaultOperationMethod.getOperationType() to SingleOperation subtypes.
Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java?rev=1658254&r1=1658253&r2=1658254&view=diff ============================================================================== --- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java [UTF-8] (original) +++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultOperationMethod.java [UTF-8] Sun Feb 8 20:57:33 2015 @@ -25,7 +25,7 @@ import org.opengis.referencing.operation import org.opengis.referencing.operation.Projection; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.OperationMethod; -import org.opengis.referencing.operation.CoordinateOperation; +import org.opengis.referencing.operation.SingleOperation; import org.opengis.parameter.ParameterDescriptorGroup; import org.apache.sis.util.Utilities; import org.apache.sis.util.ComparisonMode; @@ -45,12 +45,30 @@ import java.util.Objects; /** - * Defines the algorithm and describes the parameters used to perform a coordinate operation. An {@code OperationMethod} - * contains an arbitrary amount of {@linkplain org.apache.sis.parameter.DefaultParameterDescriptor parameter descriptors}. - * Values for those parameters will be assigned by {@linkplain DefaultSingleOperation coordinate operations}. + * Describes the algorithm and parameters used to perform a coordinate operation. An {@code OperationMethod} + * is a kind of metadata: it does not perform any coordinate operation (e.g. map projection) by itself, but + * tells us what is needed in order to perform such operation. * - * <div class="note"><b>Departure from the ISO 19111 standard:</b> - * the following properties are mandatory according ISO 19111, + * <p>The most important parts of an {@code OperationMethod} are its {@linkplain #getName() name} and its + * {@linkplain #getParameters() group of parameter descriptors}. The parameter descriptors do not contain + * any value, but tell us what are the expected parameters, together with their units of measurement.</p> + * + * <div class="note"><b>Example:</b> + * An operation method named “<cite>Mercator (variant A)</cite>” (EPSG:9804) expects the following parameters: + * <ul> + * <li>“<cite>Latitude of natural origin</cite>” in degrees. Default value is 0°.</li> + * <li>“<cite>Longitude of natural origin</cite>” in degrees. Default value is 0°.</li> + * <li>“<cite>Scale factor at natural origin</cite>” as a dimensionless number. Default value is 1.</li> + * <li>“<cite>False easting</cite>” in metres. Default value is 0 m.</li> + * <li>“<cite>False northing</cite>” in metres. Default value is 0 m.</li> + * </ul></div> + * + * In Apache SIS implementation, the {@linkplain #getName() name} is the only mandatory property. However it is + * recommended to provide also {@linkplain #getIdentifiers() identifiers} (e.g. “EPSG:9804” in the above example) + * since names can sometime be ambiguous or be spelled in different ways. + * + * <div class="note"><b>Departure from the ISO 19111 standard</b><br> + * The following properties are mandatory according ISO 19111, * but may be missing under some conditions in Apache SIS: * <ul> * <li>The {@linkplain #getFormula() formula} if it has not been provided to the @@ -60,12 +78,26 @@ import java.util.Objects; * constructor can not infer them.</li> * </ul></div> * + * {@section Relationship with other classes or interfaces} + * {@code OperationMethod} describes parameters without providing any value (except sometime default values). + * When values have been assigned to parameters, the result is a {@link SingleOperation}. + * Note that there is different kinds of {@code SingleOperation} depending on the nature and accuracy of the + * coordinate operation. See {@link #getOperationType()} for more information. + * + * <p>The interface performing the actual work of taking coordinates in the + * {@linkplain AbstractCoordinateOperation#getSourceCRS() source CRS} and calculating the new coordinates in the + * {@linkplain AbstractCoordinateOperation#getTargetCRS() target CRS} is {@link MathTransform}. + * In order to allow Apache SIS to instantiate those {@code MathTransform}s from given parameter values, + * {@code DefaultOperationMethod} subclasses should implement the + * {@link org.apache.sis.referencing.operation.transform.MathTransformProvider} interface.</p> + * * @author Martin Desruisseaux (IRD, Geomatys) * @version 0.5 * @since 0.5 * @module * * @see DefaultSingleOperation + * @see org.apache.sis.referencing.operation.transform.MathTransformProvider */ public class DefaultOperationMethod extends AbstractIdentifiedObject implements OperationMethod { /** @@ -337,29 +369,29 @@ public class DefaultOperationMethod exte * The base {@code CoordinateOperation} interface is usually one of the following subtypes: * * <ul> - * <li>{@link org.opengis.referencing.operation.Transformation} + * <li><p>{@link org.opengis.referencing.operation.Transformation} * if the coordinate operation has some errors (typically of a few metres) because of the empirical process by * which the operation parameters were determined. Those errors do not depend on the floating point precision - * or the accuracy of the implementation algorithm.</li> - * <li>{@link org.opengis.referencing.operation.Conversion} + * or the accuracy of the implementation algorithm.</p></li> + * <li><p>{@link org.opengis.referencing.operation.Conversion} * if the coordinate operation is theoretically of infinite precision, ignoring the limitations of floating - * point arithmetic (including rounding errors) and the approximations implied by finite series expansions.</li> - * <li>{@link org.opengis.referencing.operation.Projection} + * point arithmetic (including rounding errors) and the approximations implied by finite series expansions.</p></li> + * <li><p>{@link org.opengis.referencing.operation.Projection} * if the coordinate operation is a conversion (as defined above) converting geodetic latitudes and longitudes * to plane (map) coordinates. This type can optionally be refined with one of the * {@link org.opengis.referencing.operation.CylindricalProjection}, * {@link org.opengis.referencing.operation.ConicProjection} or - * {@link org.opengis.referencing.operation.PlanarProjection} subtypes.</li> + * {@link org.opengis.referencing.operation.PlanarProjection} subtypes.</p></li> * </ul> * * In case of doubt, this method can conservatively return the base type. - * The default implementation returns {@code CoordinateOperation.class}, + * The default implementation returns {@code SingleOperation.class}, * which is the most conservative return value. * * @return Interface implemented by all coordinate operations that use this method. */ - public Class<? extends CoordinateOperation> getOperationType() { - return CoordinateOperation.class; + public Class<? extends SingleOperation> getOperationType() { + return SingleOperation.class; } /** @@ -404,7 +436,7 @@ public class DefaultOperationMethod exte * * <div class="note"><b>Departure from the ISO 19111 standard:</b> * this property is mandatory according ISO 19111, but may be null in Apache SIS if the - * {@linkplain #DefaultOperationMethod(MathTransform)} constructor has been unable to infer it.</div> + * {@link #DefaultOperationMethod(MathTransform)} constructor has been unable to infer it.</div> * * @return The parameters, or {@code null} if unknown. */ @@ -515,7 +547,7 @@ public class DefaultOperationMethod exte * Transformation, ConcatenatedOperation, PassThroughOperation, or any user-defined type that * do not extend Projection. All other operation types are accepted. */ - final Class<? extends CoordinateOperation> type = getOperationType(); + final Class<? extends SingleOperation> type = getOperationType(); if (Projection.class.isAssignableFrom(type) || type.isAssignableFrom(Projection.class)) { return "Projection"; } Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java?rev=1658254&r1=1658253&r2=1658254&view=diff ============================================================================== --- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java [UTF-8] (original) +++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/MathTransformProvider.java [UTF-8] Sun Feb 8 20:57:33 2015 @@ -26,14 +26,37 @@ import org.opengis.referencing.operation /** * An object capable to create {@code MathTransform} instances from given parameter values. - * The Apache SIS {@link DefaultMathTransformFactory} implementation checks for this interface - * when creating a {@code MathTransform} for an - * {@linkplain org.apache.sis.referencing.operation.DefaultOperationMethod operation method}. + * {@code MathTransformProvider} is the "glue" expressing an abstract formula into concrete Java code. + * There is one {@code MathTransformProvider} for each map projection: one for Mercator, one for Lambert, + * <i>etc</i>. + * + * <p>This interface is used by {@link DefaultMathTransformFactory} or by developers who want to plug + * their own operation methods into Apache SIS. This interface is generally not used directly. + * The recommended way to get a {@code MathTransform} is to first get the {@code CoordinateOperation} + * (generally from a pair of <var>source</var> and <var>target</var> CRS), then to invoke + * {@link org.opengis.referencing.operation.CoordinateOperation#getMathTransform()}.</p> + * + * {@section How to add custom coordinate operations} + * To define a custom coordinate operation, one needs to define a class implementing <strong>both</strong> this + * {@code MathTransformProvider} interface and the {@link org.opengis.referencing.operation.OperationMethod} one. + * While not mandatory, we suggest to extend {@link org.apache.sis.referencing.operation.DefaultOperationMethod}. + * Then the fully-qualified class name of that implementation should be listed in a file having this exact name: + * + * {@preformat text + * META-INF/services/org.opengis.referencing.operation.OperationMethod + * } + * + * <div class="note"><b>Design note:</b> + * this interface does not extend {@code OperationMethod} directly in order to allow its usage + * in other contexts than coordinate operations.</div> * * @author Martin Desruisseaux (Geomatys, IRD) * @since 0.6 * @version 0.6 * @module + * + * @see org.apache.sis.referencing.operation.DefaultOperationMethod + * @see DefaultMathTransformFactory */ @FunctionalInterface public interface MathTransformProvider {