Class OrderedAxisCRSAuthorityFactory

All Implemented Interfaces:
Comparator<CoordinateSystemAxis>, AuthorityFactory, CRSAuthorityFactory, Factory, Factory, OptionalFactory, RegistrableFactory
Direct Known Subclasses:
OrderedAxisAuthorityFactory

public class OrderedAxisCRSAuthorityFactory extends TransformedAuthorityFactory implements CRSAuthorityFactory, Comparator<CoordinateSystemAxis>
An authority factory which delegates all the work to an other factory, and reorder the axis in some pre-determined order. This factory is mostly used by application expecting geographic coordinates in (longitude, latitude) order, while most geographic CRS specified in the EPSG database use the opposite axis order.

It is better to avoid this class if you can. This class exists primarily for compatibility with external data or applications that assume (longitude, latitude) axis order no matter what the EPSG database said, for example Shapefiles.

The axis order can be specified at construction time as an array of axis directions. If no such array is explicitly specified, then the default order is East, East-North-East, North-East, North-North-East, North, Up, Geocentric X, Geocentric Y, Geocentric Z, Column, Row, Display right, Display up and Future. This means that, for example, axis with East or West direction will be placed before any axis with North or South direction. Axis directions not specified in the table (for example OTHER) will be ordered last. This is somewhat equivalent to the ordering of NaN values in an array of double.

Notes:

  • This class compares only the "absolute" axis directions, so North and South are considered equivalent.
  • The default direction order may changes in future Geotools version in order to fit what appears to be the most common usage on the market.
  • The actual axis ordering is determined by the compare method implementation. Subclasses may override this method if the want to provide a more sophesticated axis ordering.

For some authority factories, an instance of this class can be obtained by passing a FORCE_LONGITUDE_FIRST_AXIS_ORDER hint to the FactoryFinder.getCRSAuthorityFactory(...) method. Whatever this hint is supported or not is authority dependent. Example:

 Hints                   hints = new Hints(Hints.FORCE_LONGITUDE_FIRST_AXIS_ORDER, Boolean.TRUE);
 CRSAuthorityFactory   factory = FactoryFinder.getCRSAuthorityFactory("EPSG", hints);
 CoordinateReferenceSystem crs = factory.createCoordinateReferenceSystem("EPSG:4326");
 
This class is named ordered axis authority factory instead of something like longitude first axis order because the axis order can be user-supplied. The (longitude, latitude) order just appears to be the default one.

This class implements CRSAuthorityFactory only. For an implementation that supports also CSAuthorityFactory, see OrderedAxisAuthorityFactory.

Since:
2.2
Author:
Martin Desruisseaux (IRD)
See Also:
  • Field Details

    • directionRanks

      protected final int[] directionRanks
      The rank to be given to each axis direction. The rank is stored at the indice corresponding to the direction ordinal value.
    • forceStandardDirections

      protected final boolean forceStandardDirections
      true if this authority factory should also force the axis to their standard direction. For example if true, then axis with increasing values toward South will be converted to axis with increasing values toward North. The default value is false.
      Since:
      2.3
      See Also:
    • forceStandardUnits

      protected final boolean forceStandardUnits
      true if this authority factory should also force all angular units to decimal degrees and linear units to meters. The default value is false.
      Since:
      2.3
      See Also:
  • Constructor Details

  • Method Details

    • booleanValue

      protected static boolean booleanValue(Hints userHints, Hints.Key key)
      Returns the boolean value for the specified hint.
    • computeDirectionRanks

      protected static int[] computeDirectionRanks(AxisDirection... axisOrder) throws IllegalArgumentException
      Computes the rank for every direction in the specified. The rank is stored in an array at the indice corresponding to the direction ordinal value. This method is used by constructors for computing the directionRanks field.
      Throws:
      IllegalArgumentException - If at least two axis directions are colinear.
    • completeHints

      protected void completeHints()
      Completes the set of hints according the value currently set in this object. This method is invoked by constructors only.
    • compare

      public int compare(CoordinateSystemAxis axis1, CoordinateSystemAxis axis2)
      Compares two axis for order. This method is invoked automatically by the replace method for ordering the axis in a coordinate system. The default implementation orders the axis according their direction, using the direction table given at construction time (see also the class description). Subclasses may override this method if they want to define a more sophesticated axis ordering.
      Specified by:
      compare in interface Comparator<CoordinateSystemAxis>
      Parameters:
      axis1 - The first axis to compare.
      axis2 - The second axis to compare.
      Returns:
      A negative integer if axis1 should appears before axis2, or a positive number if axis2 should appears before axis1, or 0 if the two axis are unordered one relative to the other.
      Since:
      2.3
    • replace

      public Unit<?> replace(Unit<?> units)
      Replaces the specified unit, if applicable. This method is invoked automatically by the replace(CoordinateSystem) method. The default implementation replaces the unit only if the FORCE_STANDARD_AXIS_UNITS hint was specified as TRUE at construction time. In such case, the default substitution table is:

      • Any linear units converted to meters
      • Radians and grades converted to decimal degrees

      This default substitution table may be expanded in future GeoTools versions.

      Overrides:
      replace in class TransformedAuthorityFactory
      Parameters:
      units - The units to replace.
      Returns:
      The new units, or units if no change were needed.
      Since:
      2.3
    • replace

      protected AxisDirection replace(AxisDirection direction)
      Replaces the specified direction, if applicable. This method is invoked automatically by the replace(CoordinateSystem) method. The default implementation replaces the direction only if the FORCE_STANDARD_AXIS_DIRECTIONS hint was specified as TRUE at construction time. In such case, the default substitution table is as specified in the AxisDirection.absolute() method. Subclasses may override this method if they want to use a different substitution table.
      Overrides:
      replace in class TransformedAuthorityFactory
      Parameters:
      direction - The axis direction to replace.
      Returns:
      The new direction, or direction if no change were needed.
      Since:
      2.3