Author: desruisseaux
Date: Sat Mar 31 15:49:27 2018
New Revision: 1828113

URL: http://svn.apache.org/viewvc?rev=1828113&view=rev
Log:
Add public API for CRS.findOperations(sourceCRS, targetCRS) - see SIS-412.

Modified:
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java?rev=1828113&r1=1828112&r2=1828113&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
 [UTF-8] Sat Mar 31 15:49:27 2018
@@ -136,7 +136,7 @@ import org.opengis.geometry.Geometry;
  * </ul>
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.3
  * @module
  */
@@ -626,14 +626,7 @@ public final class CRS extends Static {
     {
         ArgumentChecks.ensureNonNull("sourceCRS", sourceCRS);
         ArgumentChecks.ensureNonNull("targetCRS", targetCRS);
-        CoordinateOperationContext context = null;
-        if (areaOfInterest != null) {
-            if (areaOfInterest instanceof DefaultGeographicBoundingBox && 
((DefaultGeographicBoundingBox) areaOfInterest).isEmpty()) {
-                throw new 
IllegalArgumentException(Errors.format(Errors.Keys.EmptyArgument_1, 
"areaOfInterest"));
-            }
-            context = new CoordinateOperationContext();
-            context.setAreaOfInterest(areaOfInterest);
-        }
+        final CoordinateOperationContext context = 
CoordinateOperationContext.fromBoundingBox(areaOfInterest);
         /*
          * In principle we should just delegate to factory.createOperation(…). 
However this operation may fail
          * if a connection to the EPSG database has been found, but the EPSG 
tables do not yet exist in that
@@ -645,12 +638,53 @@ public final class CRS extends Static {
         } catch (UnavailableFactoryException e) {
             if (AuthorityFactories.failure(e)) {
                 throw e;
-            } try {
+            } else try {
                 // Above method call replaced the EPSG factory by a fallback. 
Try again.
                 return factory.createOperation(sourceCRS, targetCRS, context);
             } catch (FactoryException ex) {
                 ex.addSuppressed(e);
                 throw ex;
+            }
+        }
+    }
+
+    /**
+     * Finds mathematical operations that transform or convert coordinates 
from the given source to the
+     * given target coordinate reference system. If at least one operation 
exists, they are returned in
+     * preference order: the operation having the widest intersection between 
its
+     * {@linkplain AbstractCoordinateOperation#getDomainOfValidity() domain of 
validity}
+     * and the given area of interest are returned first.
+     *
+     * @param  sourceCRS       the CRS of source coordinates.
+     * @param  targetCRS       the CRS of target coordinates.
+     * @param  areaOfInterest  the area of interest, or {@code null} if none.
+     * @return mathematical operations from {@code sourceCRS} to {@code 
targetCRS}.
+     * @throws OperationNotFoundException if no operation was found between 
the given pair of CRS.
+     * @throws FactoryException if the operation can not be created for 
another reason.
+     *
+     * @see 
DefaultCoordinateOperationFactory#createOperations(CoordinateReferenceSystem, 
CoordinateReferenceSystem, CoordinateOperationContext)
+     *
+     * @since 1.0
+     */
+    public static List<CoordinateOperation> findOperations(final 
CoordinateReferenceSystem sourceCRS,
+                                                           final 
CoordinateReferenceSystem targetCRS,
+                                                           final 
GeographicBoundingBox areaOfInterest)
+            throws FactoryException
+    {
+        ArgumentChecks.ensureNonNull("sourceCRS", sourceCRS);
+        ArgumentChecks.ensureNonNull("targetCRS", targetCRS);
+        final CoordinateOperationContext context = 
CoordinateOperationContext.fromBoundingBox(areaOfInterest);
+        final DefaultCoordinateOperationFactory factory = 
CoordinateOperations.factory();
+        try {
+            return factory.createOperations(sourceCRS, targetCRS, context);
+        } catch (UnavailableFactoryException e) {
+            if (AuthorityFactories.failure(e)) {
+                throw e;
+            } else try {
+                return 
Collections.singletonList(factory.createOperation(sourceCRS, targetCRS, 
context));
+            } catch (FactoryException ex) {
+                ex.addSuppressed(e);
+                throw ex;
             }
         }
     }

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java?rev=1828113&r1=1828112&r2=1828113&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/CoordinateOperationContext.java
 [UTF-8] Sat Mar 31 15:49:27 2018
@@ -21,10 +21,12 @@ import java.util.function.Predicate;
 import org.opengis.metadata.extent.Extent;
 import org.opengis.metadata.extent.GeographicBoundingBox;
 import org.opengis.referencing.operation.CoordinateOperation;
+import org.apache.sis.metadata.iso.extent.DefaultGeographicBoundingBox;
 import org.apache.sis.metadata.iso.extent.DefaultExtent;
 import org.apache.sis.metadata.iso.extent.Extents;
 import org.apache.sis.internal.util.CollectionsExt;
 import org.apache.sis.util.ArgumentChecks;
+import org.apache.sis.util.resources.Errors;
 
 
 /**
@@ -52,7 +54,7 @@ import org.apache.sis.util.ArgumentCheck
  * late binding implementations.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 0.7
+ * @version 1.0
  * @since   0.7
  * @module
  *
@@ -96,6 +98,27 @@ public class CoordinateOperationContext
     }
 
     /**
+     * Creates an operation context for the given area of interest, which may 
be null.
+     * This is a convenience method for a frequently-used operation.
+     *
+     * @param  areaOfInterest  the area of interest, or {@code null} if none.
+     * @return the operation context, or {@code null} if the given bounding 
box was null.
+     *
+     * @since 1.0
+     */
+    public static CoordinateOperationContext fromBoundingBox(final 
GeographicBoundingBox areaOfInterest) {
+        if (areaOfInterest != null) {
+            if (areaOfInterest instanceof DefaultGeographicBoundingBox && 
((DefaultGeographicBoundingBox) areaOfInterest).isEmpty()) {
+                throw new 
IllegalArgumentException(Errors.format(Errors.Keys.EmptyArgument_1, 
"areaOfInterest"));
+            }
+            final CoordinateOperationContext context = new 
CoordinateOperationContext();
+            context.setAreaOfInterest(areaOfInterest);
+            return context;
+        }
+        return null;
+    }
+
+    /**
      * Returns the spatio-temporal area of interest, or {@code null} if none.
      *
      * @return the spatio-temporal area of interest, or {@code null} if none.

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java?rev=1828113&r1=1828112&r2=1828113&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/DefaultCoordinateOperationFactory.java
 [UTF-8] Sat Mar 31 15:49:27 2018
@@ -85,7 +85,7 @@ import org.apache.sis.util.Utilities;
  * The second approach is the most frequently used.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.6
  * @module
  */
@@ -822,6 +822,43 @@ next:   for (int i=components.size(); --
     }
 
     /**
+     * Finds or creates operations for conversions or transformations between 
two coordinate reference systems.
+     * If at least one operation exists, they are returned in preference 
order: the operation having the widest
+     * intersection between its {@linkplain 
AbstractCoordinateOperation#getDomainOfValidity() domain of validity}
+     * and the {@linkplain CoordinateOperationContext#getAreaOfInterest() area 
of interest} is returned.
+     *
+     * <p>The default implementation performs the following steps:</p>
+     * <ul>
+     *   <li>Invoke {@link 
#createOperationFinder(CoordinateOperationAuthorityFactory, 
CoordinateOperationContext)}.</li>
+     *   <li>Invoke {@link 
CoordinateOperationFinder#createOperations(CoordinateReferenceSystem, 
CoordinateReferenceSystem)}
+     *       on the object returned by the previous step.</li>
+     * </ul>
+     *
+     * Subclasses can override {@link #createOperationFinder 
createOperationFinder(…)} if they need more control on
+     * the way coordinate operations are inferred.
+     *
+     * @param  sourceCRS  input coordinate reference system.
+     * @param  targetCRS  output coordinate reference system.
+     * @param  context    area of interest and desired accuracy, or {@code 
null}.
+     * @return coordinate operations from {@code sourceCRS} to {@code 
targetCRS}.
+     * @throws OperationNotFoundException if no operation path was found from 
{@code sourceCRS} to {@code targetCRS}.
+     * @throws FactoryException if the operation creation failed for some 
other reason.
+     *
+     * @see CoordinateOperationFinder
+     *
+     * @since 1.0
+     */
+    public List<CoordinateOperation> createOperations(final 
CoordinateReferenceSystem sourceCRS,
+                                                      final 
CoordinateReferenceSystem targetCRS,
+                                                      final 
CoordinateOperationContext context)
+            throws OperationNotFoundException, FactoryException
+    {
+        final AuthorityFactory registry = USE_EPSG_FACTORY ? 
CRS.getAuthorityFactory(Constants.EPSG) : null;
+        return createOperationFinder((registry instanceof 
CoordinateOperationAuthorityFactory) ?
+                (CoordinateOperationAuthorityFactory) registry : null, 
context).createOperations(sourceCRS, targetCRS);
+    }
+
+    /**
      * Creates the object which will perform the actual task of finding a 
coordinate operation path between two CRS.
      * This method is invoked by {@link 
#createOperation(CoordinateReferenceSystem, CoordinateReferenceSystem,
      * CoordinateOperationContext) createOperation(…)} when no operation was 
found in the cache.

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java?rev=1828113&r1=1828112&r2=1828113&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/package-info.java
 [UTF-8] Sat Mar 31 15:49:27 2018
@@ -94,7 +94,7 @@
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Guilhem Legal (Geomatys)
- * @version 0.8
+ * @version 1.0
  * @since   0.4
  * @module
  */


Reply via email to