org.geotoolkit.referencing.operation
Class DefaultCoordinateOperationFactory

Object
  extended by Factory
      extended by ReferencingFactory
          extended by AbstractCoordinateOperationFactory
              extended by DefaultCoordinateOperationFactory
All Implemented Interfaces:
ObjectFactory, CoordinateOperationFactory, Factory
Direct Known Subclasses:
AuthorityBackedFactory

@ThreadSafe
public class DefaultCoordinateOperationFactory
extends AbstractCoordinateOperationFactory

Creates coordinate operations. This factory is capable to find coordinate transformations or conversions between two coordinate reference systems. It delegates most of its work to one or many of createOperationStep methods. Subclasses can override those methods in order to extend the factory capability to some more CRS.

Since:
1.2
Version:
3.18
Author:
Martin Desruisseaux (IRD, Geomatys)
Module:
referencing/geotk-referencing (download)    View source code for this class

Nested Class Summary
 
Nested classes/interfaces inherited from class Factory
Factory.Availability, Factory.Organizer
 
Field Summary
 
Fields inherited from class AbstractCoordinateOperationFactory
AXIS_CHANGES, DATUM_SHIFT, ELLIPSOID_SHIFT, GEOCENTRIC_CONVERSION, IDENTITY, INVERSE_OPERATION
 
Fields inherited from class ReferencingFactory
LOGGER
 
Fields inherited from class Factory
EMPTY_HINTS, hints
 
Constructor Summary
DefaultCoordinateOperationFactory()
          Constructs a coordinate operation factory using the default factories.
DefaultCoordinateOperationFactory(Hints userHints)
          Constructs a coordinate operation factory using the specified hints.
 
Method Summary
protected  CoordinateOperation createFromDatabase(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS)
          If the coordinate operation is explicitly defined in some database (typically EPSG), returns it.
 CoordinateOperation createOperation(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS)
          Returns an operation for conversion or transformation between two coordinate reference systems.
 CoordinateOperation createOperation(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS, OperationMethod method)
          Returns an operation using a particular method for conversion or transformation between two coordinate reference systems.
protected  CoordinateOperation createOperationStep(CompoundCRS sourceCRS, CompoundCRS targetCRS)
          Creates an operation between two compound coordinate reference systems.
protected  CoordinateOperation createOperationStep(CompoundCRS sourceCRS, SingleCRS targetCRS)
          Creates an operation from a compound to a single coordinate reference systems.
protected  CoordinateOperation createOperationStep(GeocentricCRS sourceCRS, GeocentricCRS targetCRS)
          Creates an operation between two geocentric coordinate reference systems.
protected  CoordinateOperation createOperationStep(GeocentricCRS sourceCRS, GeographicCRS targetCRS)
          Creates an operation from a geocentric to a geographic coordinate reference systems.
protected  CoordinateOperation createOperationStep(GeographicCRS sourceCRS, GeocentricCRS targetCRS)
          Creates an operation from a geographic to a geocentric coordinate reference systems.
protected  CoordinateOperation createOperationStep(GeographicCRS sourceCRS, GeographicCRS targetCRS)
          Creates an operation between two geographic coordinate reference systems.
protected  CoordinateOperation createOperationStep(GeographicCRS sourceCRS, ProjectedCRS targetCRS)
          Creates an operation from a geographic to a projected coordinate reference system.
protected  CoordinateOperation createOperationStep(GeographicCRS sourceCRS, VerticalCRS targetCRS)
          Creates an operation between a geographic and a vertical coordinate reference systems.
protected  CoordinateOperation createOperationStep(ProjectedCRS sourceCRS, GeographicCRS targetCRS)
          Creates an operation from a projected to a geographic coordinate reference system.
protected  CoordinateOperation createOperationStep(ProjectedCRS sourceCRS, ProjectedCRS targetCRS)
          Creates an operation between two projected coordinate reference systems.
protected  CoordinateOperation createOperationStep(SingleCRS sourceCRS, CompoundCRS targetCRS)
          Creates an operation from a single to a compound coordinate reference system.
protected  CoordinateOperation createOperationStep(TemporalCRS sourceCRS, TemporalCRS targetCRS)
          Creates an operation between two temporal coordinate reference systems.
protected  CoordinateOperation createOperationStep(VerticalCRS sourceCRS, VerticalCRS targetCRS)
          Creates an operation between two vertical coordinate reference systems.
protected  void setOrdering(Factory.Organizer organizer)
          Invoked by FactoryRegistry in order to set the ordering relative to other factories.
 
Methods inherited from class AbstractCoordinateOperationFactory
concatenate, concatenate, createConcatenatedOperation, createDefiningConversion, createFromAffineTransform, createFromMathTransform, createFromMathTransform, createFromParameters, createOperationMethod, getErrorMessage, getImplementationHints, getMathTransformFactory, getOperationMethod, inverse, swapAndScaleAxis
 
Methods inherited from class ReferencingFactory
ensureNonNull, getVendor
 
Methods inherited from class Factory
availability, dispose, equals, hasCompatibleHints, hashCode, toString
 
Methods inherited from class Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface Factory
getVendor
 

Constructor Detail

DefaultCoordinateOperationFactory

public DefaultCoordinateOperationFactory()
Constructs a coordinate operation factory using the default factories.


DefaultCoordinateOperationFactory

public DefaultCoordinateOperationFactory(Hints userHints)
Constructs a coordinate operation factory using the specified hints. This constructor recognizes the CRS, CS, DATUM and MATH_TRANSFORM FACTORY hints.

Parameters:
userHints - The hints, or null if none.
Method Detail

setOrdering

protected void setOrdering(Factory.Organizer organizer)
Invoked by FactoryRegistry in order to set the ordering relative to other factories. The current implementation specifies that this factory should defer to CachingCoordinateOperationFactory.

Overrides:
setOrdering in class Factory
Since:
3.00

createOperation

public CoordinateOperation createOperation(CoordinateReferenceSystem sourceCRS,
                                           CoordinateReferenceSystem targetCRS)
                                    throws OperationNotFoundException,
                                           FactoryException
Returns an operation for conversion or transformation between two coordinate reference systems. If an operation exists, it is returned. If more than one operation exists, the default is returned. If no operation exists, then the exception is thrown.

The default implementation inspects the CRS and delegates the work to one or many createOperationStep(...) methods. This method fails if no path between the CRS is found.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
OperationNotFoundException - if no operation path was found from sourceCRS to targetCRS.
FactoryException - if the operation creation failed for some other reason.

createOperation

public CoordinateOperation createOperation(CoordinateReferenceSystem sourceCRS,
                                           CoordinateReferenceSystem targetCRS,
                                           OperationMethod method)
                                    throws OperationNotFoundException,
                                           FactoryException
Returns an operation using a particular method for conversion or transformation between two coordinate reference systems. If the operation exists on the implementation, then it is returned. If the operation does not exist on the implementation, then the implementation has the option of inferring the operation from the argument objects. If for whatever reason the specified operation will not be returned, then the exception is thrown.

Current implementation ignores the method argument. This behavior may change in a future Geotk version.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
method - the algorithmic method for conversion or transformation.
Throws:
OperationNotFoundException - if no operation path was found from sourceCRS to targetCRS.
FactoryException - if the operation creation failed for some other reason.

createOperationStep

protected CoordinateOperation createOperationStep(TemporalCRS sourceCRS,
                                                  TemporalCRS targetCRS)
                                           throws FactoryException
Creates an operation between two temporal coordinate reference systems. The default implementation checks if both CRS use the same datum, and then adjusts for axis direction, units and epoch.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createOperationStep

protected CoordinateOperation createOperationStep(VerticalCRS sourceCRS,
                                                  VerticalCRS targetCRS)
                                           throws FactoryException
Creates an operation between two vertical coordinate reference systems. The default implementation checks if both CRS use the same datum, and then adjusts for axis direction and units.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createOperationStep

protected CoordinateOperation createOperationStep(GeographicCRS sourceCRS,
                                                  VerticalCRS targetCRS)
                                           throws FactoryException
Creates an operation between a geographic and a vertical coordinate reference systems. The default implementation accepts the conversion only if the geographic CRS is a tridimensional one and the vertical CRS is for height above the ellipsoid. More elaborated operation, like transformation from ellipsoidal to geoidal height, should be implemented here.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.
TODO:
Implement GEOT-352 here.

createOperationStep

protected CoordinateOperation createOperationStep(GeographicCRS sourceCRS,
                                                  GeographicCRS targetCRS)
                                           throws FactoryException
Creates an operation between two geographic coordinate reference systems. The default implementation can adjust axis order and orientation (e.g. transforming from (NORTH,WEST) to (EAST,NORTH)), performs units conversion and apply datum shifts if needed.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.
TODO:
When rotating the prime meridian, we should ensure that transformed longitudes stay in the range [-180..+180°].

createOperationStep

protected CoordinateOperation createOperationStep(ProjectedCRS sourceCRS,
                                                  ProjectedCRS targetCRS)
                                           throws FactoryException
Creates an operation between two projected coordinate reference systems. The default implementation can adjust axis order and orientation. It also performs units conversion if it is the only extra change needed. Otherwise, it performs three steps:

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createOperationStep

protected CoordinateOperation createOperationStep(GeographicCRS sourceCRS,
                                                  ProjectedCRS targetCRS)
                                           throws FactoryException
Creates an operation from a geographic to a projected coordinate reference system. The default implementation constructs the following operation chain:
sourceCRS → baseCRS → targetCRS
where the conversion from baseCRS to targetCRS is obtained from targetCRS.getConversionFromBase().

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createOperationStep

protected CoordinateOperation createOperationStep(ProjectedCRS sourceCRS,
                                                  GeographicCRS targetCRS)
                                           throws FactoryException
Creates an operation from a projected to a geographic coordinate reference system. The default implementation constructs the following operation chain:
sourceCRS → baseCRS → targetCRS
where the conversion from sourceCRS to baseCRS is obtained from the inverse of sourceCRS.getConversionFromBase().

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.
TODO:
Provides a non-null method.

createOperationStep

protected CoordinateOperation createOperationStep(GeocentricCRS sourceCRS,
                                                  GeocentricCRS targetCRS)
                                           throws FactoryException
Creates an operation between two geocentric coordinate reference systems. The default implementation can adjust for axis order and orientation, performs units conversion and apply Bursa Wolf transformation if needed.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.
TODO:
Rotation of prime meridian not yet implemented., Transformation version set to "(unknown)". We should search this information somewhere.

createOperationStep

protected CoordinateOperation createOperationStep(GeographicCRS sourceCRS,
                                                  GeocentricCRS targetCRS)
                                           throws FactoryException
Creates an operation from a geographic to a geocentric coordinate reference systems. If the source CRS doesn't have a vertical axis, height above the ellipsoid will be assumed equal to zero everywhere. The default implementation uses the "Ellipsoid_To_Geocentric" math transform.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createOperationStep

protected CoordinateOperation createOperationStep(GeocentricCRS sourceCRS,
                                                  GeographicCRS targetCRS)
                                           throws FactoryException
Creates an operation from a geocentric to a geographic coordinate reference systems. The default implementation use the "Geocentric_To_Ellipsoid" math transform.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createOperationStep

protected CoordinateOperation createOperationStep(CompoundCRS sourceCRS,
                                                  SingleCRS targetCRS)
                                           throws FactoryException
Creates an operation from a compound to a single coordinate reference systems.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.
TODO:
(GEOTK-83) This method works for some simple cases (e.g. no datum change), and give up otherwise. Before to give up at the end of this method, we should try the following:
  • Maybe sourceCRS uses a non-ellipsoidal height. We should replace the non-ellipsoidal height by an ellipsoidal one, create a transformation step for that (to be concatenated), and then try again this operation step.
  • Maybe sourceCRS contains some extra axis, like a temporal CRS. We should revisit this code in other to lets supplemental ordinates to be pass through or removed.

createOperationStep

protected CoordinateOperation createOperationStep(SingleCRS sourceCRS,
                                                  CompoundCRS targetCRS)
                                           throws FactoryException
Creates an operation from a single to a compound coordinate reference system.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createOperationStep

protected CoordinateOperation createOperationStep(CompoundCRS sourceCRS,
                                                  CompoundCRS targetCRS)
                                           throws FactoryException
Creates an operation between two compound coordinate reference systems.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS.
Throws:
FactoryException - If the operation can't be constructed.

createFromDatabase

protected CoordinateOperation createFromDatabase(CoordinateReferenceSystem sourceCRS,
                                                 CoordinateReferenceSystem targetCRS)
If the coordinate operation is explicitly defined in some database (typically EPSG), returns it. Otherwise (if there is no database, or if the database doesn't contains an explicit operation from sourceCRS to targetCRS, or if this method failed to create an operation from the database), returns null.

The default implementation always returns null, since there is no database connected to a DefaultCoordinateOperationFactory instance. In other words, the default implementation is "standalone": it tries to figure out transformation paths by itself. Subclasses should override this method if they can fetch a more accurate operation from some database. The mean subclass doing so is AuthorityBackedFactory.

This method is invoked by createOperation(sourceCRS, targetCRS) before to try to figure out a transformation path by itself. It is also invoked by various createOperationStep(...) methods when an intermediate CRS was obtained by GeneralDerivedCRS.getBaseCRS() (this case occurs especially during geographic from/to projected CRS operations). This method is not invoked for synthetic CRS generated by createOperationStep(...), since those temporary CRS are not expected to exist in a database.

Parameters:
sourceCRS - Input coordinate reference system.
targetCRS - Output coordinate reference system.
Returns:
A coordinate operation from sourceCRS to targetCRS if and only if one is explicitly defined in some underlying database, or null otherwise.
Since:
2.3


Copyright © 2009-2011 Geotoolkit.org. All Rights Reserved.