From commits-return-3451-apmail-sis-commits-archive=sis.apache.org@sis.apache.org Wed Jan 15 22:02:56 2014 Return-Path: X-Original-To: apmail-sis-commits-archive@www.apache.org Delivered-To: apmail-sis-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 42DF710579 for ; Wed, 15 Jan 2014 22:02:56 +0000 (UTC) Received: (qmail 59078 invoked by uid 500); 15 Jan 2014 22:02:43 -0000 Delivered-To: apmail-sis-commits-archive@sis.apache.org Received: (qmail 58858 invoked by uid 500); 15 Jan 2014 22:02:32 -0000 Mailing-List: contact commits-help@sis.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: sis-dev@sis.apache.org Delivered-To: mailing list commits@sis.apache.org Received: (qmail 58657 invoked by uid 99); 15 Jan 2014 22:02:25 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 15 Jan 2014 22:02:25 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 15 Jan 2014 22:02:13 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id E63BC2388994; Wed, 15 Jan 2014 22:01:50 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r1558583 [2/3] - in /sis/branches/JDK6: ./ core/sis-referencing/src/main/java/org/apache/sis/geometry/ core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ core/sis-referencing/src/main/java/org/apache/sis/referencing/ co... Date: Wed, 15 Jan 2014 22:01:48 -0000 To: commits@sis.apache.org From: desruisseaux@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140115220150.E63BC2388994@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AbstractCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -17,6 +17,7 @@ package org.apache.sis.referencing.cs; import java.util.Map; +import java.util.EnumMap; import java.util.Arrays; import javax.measure.unit.SI; import javax.measure.unit.Unit; @@ -105,6 +106,14 @@ public class AbstractCS extends Abstract private final CoordinateSystemAxis[] axes; /** + * Other coordinate systems derived from this coordinate systems for other axes conventions. + * Created only when first needed. + * + * @see #forConvention(AxesConvention) + */ + private transient Map derived; + + /** * Constructs a new object in which every attributes are set to a null or empty value. * This is not a valid object. This constructor is strictly reserved * to JAXB, which will assign values to the fields using reflexion. @@ -180,14 +189,16 @@ public class AbstractCS extends Abstract } } /* - * Ensures there is no axis along the same direction - * (e.g. two North axes, or an East and a West axis). + * Ensures there is no axis along the same direction (e.g. two North axes, or an East and a West axis). + * An exception to this rule is the time axis, since ISO 19107 explicitely allows compound CRS to have + * more than one time axis. Such case happen in meteorological models. */ final AxisDirection dir = AxisDirections.absolute(direction); if (!dir.equals(AxisDirection.OTHER)) { for (int j=i; --j>=0;) { final AxisDirection other = axes[j].getDirection(); - if (dir.equals(AxisDirections.absolute(other))) { + final AxisDirection abs = AxisDirections.absolute(other); + if (dir.equals(abs) && !abs.equals(AxisDirection.FUTURE)) { throw new IllegalArgumentException(Errors.format( Errors.Keys.ColinearAxisDirections_2, direction, other)); } @@ -220,6 +231,42 @@ public class AbstractCS extends Abstract } /** + * Returns a SIS coordinate system implementation with the values of the given arbitrary implementation. + * This method performs the first applicable actions in the following choices: + * + *
    + *
  • If the given object is {@code null}, then this method returns {@code null}.
  • + *
  • Otherwise if the given object is is an instance of + * {@link org.opengis.referencing.cs.AffineCS}, + * {@link org.opengis.referencing.cs.CartesianCS}, + * {@link org.opengis.referencing.cs.SphericalCS}, + * {@link org.opengis.referencing.cs.EllipsoidalCS}, + * {@link org.opengis.referencing.cs.CylindricalCS}, + * {@link org.opengis.referencing.cs.PolarCS}, + * {@link org.opengis.referencing.cs.LinearCS}, + * {@link org.opengis.referencing.cs.VerticalCS}, + * {@link org.opengis.referencing.cs.TimeCS} or + * {@link org.opengis.referencing.cs.UserDefinedCS}, + * then this method delegates to the {@code castOrCopy(…)} method of the corresponding SIS subclass. + * Note that if the given object implements more than one of the above-cited interfaces, + * then the {@code castOrCopy(…)} method to be used is unspecified.
  • + *
  • Otherwise if the given object is already an instance of + * {@code AbstractCS}, then it is returned unchanged.
  • + *
  • Otherwise a new {@code AbstractCS} instance is created using the + * {@linkplain #AbstractCS(CoordinateSystem) copy constructor} + * and returned. Note that this is a shallow copy operation, since the other + * properties contained in the given object are not recursively copied.
  • + *
+ * + * @param object The object to get as a SIS implementation, or {@code null} if none. + * @return A SIS implementation containing the values of the given object (may be the + * given object itself), or {@code null} if the argument was null. + */ + public static AbstractCS castOrCopy(final CoordinateSystem object) { + return SubTypes.castOrCopy(object); + } + + /** * Returns {@link #VALID} if the given argument values are allowed for an axis in this coordinate system, * or an {@code INVALID_*} error code otherwise. This method is invoked at construction time for checking * argument validity. The default implementation returns {@code VALID} in all cases. Subclasses override @@ -274,6 +321,48 @@ public class AbstractCS extends Abstract } /** + * Returns a coordinate system equivalent to this one but with axes rearranged according the given convention. + * If this coordinate system is already compatible with the given convention, then this method returns + * {@code this}. + * + * @param convention The axes convention for which a coordinate system is desired. + * @return A coordinate system compatible with the given convention (may be {@code this}). + * + * @see org.apache.sis.referencing.crs.AbstractCRS#forConvention(AxesConvention) + */ + public synchronized AbstractCS forConvention(final AxesConvention convention) { + ensureNonNull("convention", convention); + if (derived == null) { + derived = new EnumMap(AxesConvention.class); + } + AbstractCS cs = derived.get(convention); + if (cs == null) { + switch (convention) { + case NORMALIZED: cs = Normalizer.normalize(this, true); break; + case RIGHT_HANDED: cs = Normalizer.normalize(this, false); break; + case POSITIVE_RANGE: cs = Normalizer.shiftAxisRange(this); break; + default: throw new AssertionError(convention); + } + for (final AbstractCS existing : derived.values()) { + if (cs.equals(existing)) { + cs = existing; + break; + } + } + derived.put(convention, cs); + } + return cs; + } + + /** + * Returns a coordinate system of the same type than this CS but with different axes. + * This method shall be overridden by all {@code AbstractCS} subclasses in this package. + */ + AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new AbstractCS(properties, axes); + } + + /** * Compares the specified object with this coordinate system for equality. * * @param object The object to compare to {@code this}. Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/CoordinateSystems.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -24,6 +24,8 @@ import javax.measure.converter.Conversio import org.opengis.referencing.cs.AxisDirection; import org.opengis.referencing.cs.CoordinateSystem; import org.opengis.referencing.operation.Matrix; +import org.apache.sis.measure.Angle; +import org.apache.sis.measure.ElevationAngle; import org.apache.sis.measure.Units; import org.apache.sis.util.Static; import org.apache.sis.util.Classes; @@ -49,11 +51,6 @@ import org.apache.sis.internal.jdk7.Obje */ public final class CoordinateSystems extends Static { /** - * Number of directions from "North", "North-North-East", "North-East", etc. - */ - static final int COMPASS_DIRECTION_COUNT = 16; - - /** * Do not allow instantiation of this class. */ private CoordinateSystems() { @@ -101,12 +98,12 @@ public final class CoordinateSystems ext } /** - * Returns the arithmetic (counterclockwise) angle from the first axis direction to the second direction, - * in decimal degrees. This method returns a value between -180° and +180°, - * or {@link Double#NaN NaN} if no angle can be computed. + * Returns the arithmetic (counterclockwise) angle from the first axis direction to the second direction. + * This method returns a value between -180° and +180°, or {@code null} if no angle can be computed. * - *

A positive angle denotes a right-handed system, while a negative angle denotes a left-handed system. - * Example:

+ * {@section Horizontal directions} + * For any pair of compass directions which are not opposite directions, a positive angle denotes + * a right-handed system while a negative angle denotes a left-handed system. Examples: * *
    *
  • The angle from {@link AxisDirection#EAST EAST} to {@link AxisDirection#NORTH NORTH} is 90°
  • @@ -114,51 +111,83 @@ public final class CoordinateSystems ext *
  • The angle from "North along 90° East" to "North along 0°" is 90°.
  • *
* + * {@section Horizontal and vertical directions} + * By convention this method defines the angle from any compass direction to the {@link AxisDirection#UP UP} + * vertical direction as 90°, and the angle of any compass direction to the {@link AxisDirection#DOWN DOWN} + * vertical direction as -90°. The sign of those angles gives no indication about whether the coordinate system + * is right-handed or left-handed. Those angles are returned as instances of {@link ElevationAngle}. + * + *

All angles are approximative since this method does not take the Earth ellipsoidal or geoidal shape in + * account.

+ * + * {@section Invariants} + * For any non-null return value: + *
    + *
  • {@code angle(A, A) = 0°}
  • + *
  • {@code angle(A, opposite(A)) = ±180°}
  • + *
  • {@code angle(A, B) = -angle(B, A)}
  • + *
+ * * @param source The source axis direction. * @param target The target axis direction. * @return The arithmetic angle (in degrees) of the rotation to apply on a line pointing toward * the source direction in order to make it point toward the target direction, or - * {@link Double#NaN} if this value can not be computed. + * {@code null} if this value can not be computed. */ - public static double angle(final AxisDirection source, final AxisDirection target) { + public static Angle angle(final AxisDirection source, final AxisDirection target) { ensureNonNull("source", source); ensureNonNull("target", target); - // Tests for NORTH, SOUTH, EAST, EAST-NORTH-EAST, etc. directions. - final int compass = getCompassAngle(source, target); - if (compass != Integer.MIN_VALUE) { - return compass * (360.0 / COMPASS_DIRECTION_COUNT); - } - // Tests for "South along 90 deg East", etc. directions. - final DirectionAlongMeridian src = DirectionAlongMeridian.parse(source); - if (src != null) { - final DirectionAlongMeridian tgt = DirectionAlongMeridian.parse(target); - if (tgt != null) { - return src.getAngle(tgt); - } + /* + * Check for NORTH, SOUTH, EAST, EAST-NORTH-EAST, etc. + * Checked first because this is the most common case. + */ + int c = AxisDirections.angleForCompass(source, target); + if (c != Integer.MIN_VALUE) { + return new Angle(c * (360.0 / AxisDirections.COMPASS_COUNT)); } - return Double.NaN; - } - - /** - * Tests for angle on compass only (do not tests angle between direction along meridians). - * Returns {@link Integer#MIN_VALUE} if the angle can't be computed. - */ - static int getCompassAngle(final AxisDirection source, final AxisDirection target) { - final int base = AxisDirection.NORTH.ordinal(); - final int src = source.ordinal() - base; - if (src >= 0 && src < COMPASS_DIRECTION_COUNT) { - int tgt = target.ordinal() - base; - if (tgt >= 0 && tgt < COMPASS_DIRECTION_COUNT) { - tgt = src - tgt; - if (tgt < -COMPASS_DIRECTION_COUNT/2) { - tgt += COMPASS_DIRECTION_COUNT; - } else if (tgt > COMPASS_DIRECTION_COUNT/2) { - tgt -= COMPASS_DIRECTION_COUNT; - } - return tgt; + /* + * Check for GEOCENTRIC_X, GEOCENTRIC_Y, GEOCENTRIC_Z. + */ + c = AxisDirections.angleForGeocentric(source, target); + if (c != Integer.MIN_VALUE) { + return new Angle(c * 90); + } + /* + * Check for DISPLAY_UP, DISPLAY_DOWN, etc. assuming a flat screen. + * Note that we do not check for grid directions (COLUMN_POSITIVE, + * ROW_POSITIVE, etc.) because the grid geometry may be anything. + */ + c = AxisDirections.angleForDisplay(source, target); + if (c != Integer.MIN_VALUE) { + return new Angle(c * (360 / AxisDirections.DISPLAY_COUNT)); + } + /* + * Check for "South along 90° East", etc. directions. Note that this + * check may perform a relatively costly parsing of axis direction name. + */ + final DirectionAlongMeridian srcMeridian = DirectionAlongMeridian.parse(source); + final DirectionAlongMeridian tgtMeridian = DirectionAlongMeridian.parse(target); + if (srcMeridian != null && tgtMeridian != null) { + return new Angle(srcMeridian.angle(tgtMeridian)); + } + /* + * Check for UP and DOWN, with special case if one of the direction is horizontal + * (either a compass direction of a direction along a meridian). + */ + final boolean srcVrt = AxisDirections.isVertical(source); + final boolean tgtVrt = AxisDirections.isVertical(target); + if (tgtVrt) { + if (srcVrt) { + return new Angle(source.equals(target) ? 0 : target.equals(AxisDirection.UP) ? 180 : -180); + } else if (AxisDirections.isCompass(source) || srcMeridian != null) { + return target.equals(AxisDirection.UP) ? ElevationAngle.ZENITH : ElevationAngle.NADIR; + } + } else if (srcVrt) { + if (AxisDirections.isCompass(target) || tgtMeridian != null) { + return source.equals(AxisDirection.UP) ? ElevationAngle.NADIR : ElevationAngle.ZENITH; } } - return Integer.MIN_VALUE; + return null; } /** Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultAffineCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -208,4 +208,23 @@ public class DefaultAffineCS extends Abs public Class getInterface() { return AffineCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultAffineCS forConvention(final AxesConvention convention) { + return (DefaultAffineCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + * This method shall be overridden by all {@code AffineCS} subclasses in this package. + */ + @Override + AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultAffineCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCartesianCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -22,8 +22,8 @@ import javax.xml.bind.annotation.XmlRoot import org.opengis.referencing.cs.CartesianCS; import org.opengis.referencing.cs.AxisDirection; import org.opengis.referencing.cs.CoordinateSystemAxis; -import org.apache.sis.internal.referencing.Formulas; import org.apache.sis.util.resources.Errors; +import org.apache.sis.measure.Angle; /** @@ -75,6 +75,15 @@ public class DefaultCartesianCS extends } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultCartesianCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a one-dimensional coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -194,8 +203,13 @@ public class DefaultCartesianCS extends final AxisDirection axis0 = getAxis(i).getDirection(); for (int j=i; ++j Formulas.ANGULAR_TOLERANCE) { + final Angle angle = CoordinateSystems.angle(axis0, axis1); + /* + * The angle may be null for grid directions (COLUMN_POSITIVE, COLUMN_NEGATIVE, + * ROW_POSITIVE, ROW_NEGATIVE). We conservatively accept those directions even if + * they are not really for Cartesian CS because we do not know the grid geometry. + */ + if (angle != null && Math.abs(angle.degrees()) != 90) { throw new IllegalArgumentException(Errors.format( Errors.Keys.NonPerpendicularDirections_2, axis0, axis1)); } @@ -217,4 +231,22 @@ public class DefaultCartesianCS extends public Class getInterface() { return CartesianCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultCartesianCS forConvention(final AxesConvention convention) { + return (DefaultCartesianCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultCartesianCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCompoundCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -18,11 +18,13 @@ package org.apache.sis.referencing.cs; import java.util.Map; import java.util.List; +import javax.measure.unit.Unit; import org.opengis.referencing.cs.CoordinateSystem; import org.opengis.referencing.cs.CoordinateSystemAxis; import org.apache.sis.internal.util.UnmodifiableArrayList; import org.apache.sis.util.ComparisonMode; import org.apache.sis.util.Workaround; +import org.apache.sis.util.iso.Types; import static java.util.Collections.singletonMap; import static org.apache.sis.util.ArgumentChecks.*; @@ -111,27 +113,49 @@ public class DefaultCompoundCS extends A * @param components The set of coordinate system. */ public DefaultCompoundCS(CoordinateSystem... components) { - super(singletonMap(NAME_KEY, nameFor(components = clone(components))), getAxes(components)); - this.components = UnmodifiableArrayList.wrap(components); + this(components = clone(components), getAxes(components)); } /** - * Constructs a name from a merge of the name of all coordinate systems. * This is a work around for RFE #4093999 in Sun's bug database * ("Relax constraint on placement of this()/super() call in constructors"). * * @param components The coordinate systems. */ @Workaround(library="JDK", version="1.7") - private static String nameFor(final CoordinateSystem[] components) { - final StringBuilder buffer = new StringBuilder(); - for (int i=0; i + *
  • Ellipsoidal CS: North (°), East (°).
  • + *
  • Cartesian CS: East (km), North (km).
  • + *
  • Compound CS: East (km), North (km), Up (m).
  • + * + * + * @param buffer A buffer filled with the name header. + * @param axes The axes. + * @return A name for the given coordinate system type and axes. + */ + static String createName(final StringBuilder buffer, final CoordinateSystemAxis[] axes) { + String separator = ": "; + for (final CoordinateSystemAxis axis : axes) { + buffer.append(separator).append(Types.getCodeLabel(axis.getDirection())); + separator = ", "; + final Unit unit = axis.getUnit(); + if (unit != null) { + final String symbol = unit.toString(); + if (!symbol.isEmpty()) { + buffer.append(" (").append(symbol).append(')'); + } } - buffer.append(components[i].getName().getCode()); } - return buffer.toString(); + return buffer.append('.').toString(); } /** @@ -175,6 +199,16 @@ public class DefaultCompoundCS extends A return components; } + /* + * Do not override createSameType(…) and forConvention(…) because we can not create a new DefaultCompoundCS + * without knownledge of the CoordinateSystem components to give to it. It would be possible to recursively + * invoke components[i].forConvention(…), but it would be useless to perform such decomposition here because + * DefaultCompoundCRS will need to perform its own decomposition anyway. + * + * If the user invokes DefaultCompoundCS.forConvention(…) anyway, he will get an AbstractCS instance, which + * is not that bad. + */ + /** * Compares this coordinate system with the specified object for equality. * Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCoordinateSystemAxis.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -605,7 +605,7 @@ public class DefaultCoordinateSystemAxis } else { /* * Checking the abbreviation is not sufficient. For example the polar angle and the - * spherical latitude have the same abbreviation (θ). SIS names like "Longitude" + * spherical latitude have the same abbreviation (θ). Legacy names like "Longitude" * (in addition to ISO 19111 "Geodetic longitude") bring more potential confusion. * Furthermore, not all implementors use the greek letters. For example most CRS in * WKT format use the "Lat" abbreviation instead of the greek letter φ. Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultCylindricalCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -69,6 +69,15 @@ public class DefaultCylindricalCS extend } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultCylindricalCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a three-dimensional coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -178,4 +187,22 @@ public class DefaultCylindricalCS extend public Class getInterface() { return CylindricalCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultCylindricalCS forConvention(final AxesConvention convention) { + return (DefaultCylindricalCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultCylindricalCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultEllipsoidalCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -69,6 +69,15 @@ public class DefaultEllipsoidalCS extend } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultEllipsoidalCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a two-dimensional coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -198,4 +207,22 @@ public class DefaultEllipsoidalCS extend public Class getInterface() { return EllipsoidalCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultEllipsoidalCS forConvention(final AxesConvention convention) { + return (DefaultEllipsoidalCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultEllipsoidalCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultLinearCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -68,6 +68,15 @@ public class DefaultLinearCS extends Abs } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultLinearCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -171,4 +180,22 @@ public class DefaultLinearCS extends Abs public Class getInterface() { return LinearCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultLinearCS forConvention(final AxesConvention convention) { + return (DefaultLinearCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultLinearCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultPolarCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -67,6 +67,15 @@ public class DefaultPolarCS extends Abst } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultPolarCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a two-dimensional coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -174,4 +183,22 @@ public class DefaultPolarCS extends Abst public Class getInterface() { return PolarCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultPolarCS forConvention(final AxesConvention convention) { + return (DefaultPolarCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultPolarCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultSphericalCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -71,6 +71,15 @@ public class DefaultSphericalCS extends } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultSphericalCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a three-dimensional coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -178,4 +187,22 @@ public class DefaultSphericalCS extends public Class getInterface() { return SphericalCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultSphericalCS forConvention(final AxesConvention convention) { + return (DefaultSphericalCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultSphericalCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultTimeCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -70,6 +70,15 @@ public class DefaultTimeCS extends Abstr } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultTimeCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -171,4 +180,22 @@ public class DefaultTimeCS extends Abstr public Class getInterface() { return TimeCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultTimeCS forConvention(final AxesConvention convention) { + return (DefaultTimeCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultTimeCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -54,6 +54,15 @@ public class DefaultUserDefinedCS extend } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultUserDefinedCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a two-dimensional coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -160,4 +169,22 @@ public class DefaultUserDefinedCS extend public Class getInterface() { return UserDefinedCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultUserDefinedCS forConvention(final AxesConvention convention) { + return (DefaultUserDefinedCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultUserDefinedCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DefaultVerticalCS.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -82,6 +82,15 @@ public class DefaultVerticalCS extends A } /** + * Creates a new coordinate system from an arbitrary number of axes. This constructor is for + * implementations of the {@link #createSameType(Map, CoordinateSystemAxis[])} method only, + * because it does not verify the number of axes. + */ + private DefaultVerticalCS(final Map properties, final CoordinateSystemAxis[] axes) { + super(properties, axes); + } + + /** * Constructs a coordinate system from a set of properties. * The properties map is given unchanged to the * {@linkplain AbstractCS#AbstractCS(Map,CoordinateSystemAxis[]) super-class constructor}. @@ -183,4 +192,22 @@ public class DefaultVerticalCS extends A public Class getInterface() { return VerticalCS.class; } + + /** + * {@inheritDoc} + * + * @return {@inheritDoc} + */ + @Override + public DefaultVerticalCS forConvention(final AxesConvention convention) { + return (DefaultVerticalCS) super.forConvention(convention); + } + + /** + * Returns a coordinate system of the same class than this CS but with different axes. + */ + @Override + final AbstractCS createSameType(final Map properties, final CoordinateSystemAxis[] axes) { + return new DefaultVerticalCS(properties, axes); + } } Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/DirectionAlongMeridian.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -21,6 +21,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.opengis.referencing.cs.AxisDirection; import org.apache.sis.util.iso.Types; +import org.apache.sis.measure.Longitude; import org.apache.sis.internal.util.Numerics; import org.apache.sis.internal.referencing.AxisDirections; @@ -127,7 +128,7 @@ final class DirectionAlongMeridian imple // since we are supposed to return 'null' in this situation. return null; } - if (!(meridian >= -180 && meridian <= 180)) { + if (!(meridian >= Longitude.MIN_VALUE && meridian <= Longitude.MAX_VALUE)) { // Meridian is NaN or is not in the valid range. return null; } @@ -172,24 +173,14 @@ final class DirectionAlongMeridian imple * * {@example The angle from "North along 90 deg East" to "North along 0 deg is 90°.} */ - public double getAngle(final DirectionAlongMeridian other) { + public double angle(final DirectionAlongMeridian other) { if (!baseDirection.equals(other.baseDirection)) { return Double.NaN; } /* - * We want the following pair of axis: - * (NORTH along 90°E, NORTH along 0°) - * to give a positive angle of 90° + * Example: angle between (NORTH along 90°E, NORTH along 0°) shall be +90° */ - double angle = meridian - other.meridian; - /* - * Forces to the [-180° .. +180°] range. - */ - if (angle < -180) { - angle += 360; - } else if (angle > 180) { - angle -= 360; - } + double angle = Longitude.normalize(meridian - other.meridian); /* * Reverses the sign for axis oriented toward SOUTH, * so a positive angle is a right-handed system. @@ -220,7 +211,7 @@ final class DirectionAlongMeridian imple if (c != 0) { return c; } - final double angle = getAngle(that); + final double angle = angle(that); if (angle < 0) return +1; // Really the opposite sign. if (angle > 0) return -1; // Really the opposite sign. return 0; @@ -275,7 +266,7 @@ final class DirectionAlongMeridian imple buffer.append(md); } buffer.append('°'); - if (md != 0 && md != 180) { + if (md != 0 && md != Longitude.MAX_VALUE) { buffer.append(meridian < 0 ? 'W' : 'E'); } name = buffer.toString(); Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/package-info.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/package-info.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/package-info.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/package-info.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -22,7 +22,11 @@ * *

    The root class in this package is {@link org.apache.sis.referencing.cs.AbstractCS}. * Various subclasses are defined for various kinds of mathematical rules that determine - * how coordinates are associated to quantities such as angles and distances.

    + * how coordinates are associated to quantities such as angles and distances. + * Those SIS subclasses provide additional methods that are not part of OGC/ISO specifications:

    + *
      + *
    • {@link org.apache.sis.referencing.cs.AbstractCS#forConvention AbstractCS.forConvention(AxesConvention)}
    • + *
    * * @author Martin Desruisseaux (IRD, Geomatys) * @since 0.4 (derived from geotk-2.0) Modified: sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/SubTypes.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/SubTypes.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/SubTypes.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/SubTypes.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -67,7 +67,12 @@ final class SubTypes { if (object instanceof ImageDatum) { return DefaultImageDatum.castOrCopy((ImageDatum) object); } - // Intentionally tested after the sub-interfaces. + /* + * Intentionally check for AbstractDatum after the interfaces because user may have defined his own + * subclass implementing the interface. If we were checking for AbstractDatum before the interfaces, + * the returned instance could have been a user subclass without the JAXB annotations required for + * XML marshalling. + */ if (object == null || object instanceof AbstractDatum) { return (AbstractDatum) object; } Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/geometry/AbstractEnvelopeTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/geometry/AbstractEnvelopeTest.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/geometry/AbstractEnvelopeTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/geometry/AbstractEnvelopeTest.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -20,10 +20,10 @@ import java.awt.geom.Rectangle2D; import org.opengis.geometry.Envelope; import org.opengis.geometry.DirectPosition; import org.opengis.referencing.crs.GeographicCRS; +import org.apache.sis.referencing.GeodeticObjects; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.DependsOn; import org.apache.sis.test.TestCase; -import org.junit.Ignore; import org.junit.Test; import static java.lang.Double.NaN; @@ -55,10 +55,8 @@ public final strictfp class AbstractEnve /** * The coordinate reference system used for the tests. - * - * @todo Need to be assigned when we will have ported the CRS implementations. */ - static final GeographicCRS WGS84 = null; + static final GeographicCRS WGS84 = GeodeticObjects.WGS84.normalizedGeographic(); /** * Creates an envelope of the given type. The type shall be one of the @@ -87,14 +85,15 @@ public final strictfp class AbstractEnve break; } case SUBENVELOPE: { - final GeneralEnvelope ge = new GeneralEnvelope(5); - ge.setCoordinateReferenceSystem(WGS84); + GeneralEnvelope ge = new GeneralEnvelope(5); ge.setRange(1, xmin, xmax); ge.setRange(2, ymin, ymax); ge.setRange(0, 2, 3); // Following values will be verified in verifyInvariants(…) ge.setRange(3, 4, 6); ge.setRange(4, 8, 9); - envelope = ge.subEnvelope(1, 3); + ge = ge.subEnvelope(1, 3); + ge.setCoordinateReferenceSystem(WGS84); + envelope = ge; break; } default: throw new IllegalArgumentException(String.valueOf(type)); @@ -190,7 +189,6 @@ public final strictfp class AbstractEnve * } */ @Test - @Ignore("The tested envelope needs to be associated to CRS:84") public void testCrossingAntiMeridian() { final DirectPosition2D inside = new DirectPosition2D(18, 32); final DirectPosition2D outside = new DirectPosition2D( 3, 32); @@ -253,7 +251,6 @@ public final strictfp class AbstractEnve * } */ @Test - @Ignore("The tested envelope needs to be associated to CRS:84") public void testCrossingAntiMeridianTwice() { final DirectPosition2D inside = new DirectPosition2D(18, 32); final DirectPosition2D outside = new DirectPosition2D( 3, 32); @@ -309,7 +306,6 @@ public final strictfp class AbstractEnve * on the left and right sides. */ @Test - @Ignore("The tested envelope needs to be associated to CRS:84") public void testCrossingAntiMeridianThreeTimes() { final DirectPosition2D wasInside = new DirectPosition2D(18, 32); final DirectPosition2D outside = new DirectPosition2D( 3, 32); @@ -415,7 +411,6 @@ public final strictfp class AbstractEnve * Tests a case crossing the anti-meridian crossing, from 0° to -0°. */ @Test - @Ignore("The tested envelope needs to be associated to CRS:84") public void testRange360() { final DirectPosition2D inside = new DirectPosition2D(18, 32); final DirectPosition2D wasOutside = new DirectPosition2D( 3, 32); @@ -501,7 +496,6 @@ public final strictfp class AbstractEnve */ @Test @DependsOnMethod("testToSimpleEnvelopesOnEmptyEnvelope") - @Ignore("The tested envelope needs to be associated to CRS:84") public void testToSimpleEnvelopesOverAntiMeridian() { for (int type=0; type= h) io -= AxisDirections.COMPASS_COUNT; + if (i > h) in -= AxisDirections.COMPASS_COUNT; + assertEquals(message, base + i, direction.ordinal()); + assertEquals(message, base + io, opposite.ordinal()); + assertEquals(message, 0, AxisDirections.angleForCompass(direction, direction)); + assertEquals(message, h, abs(AxisDirections.angleForCompass(direction, opposite))); + assertEquals(message, in, AxisDirections.angleForCompass(direction, NORTH)); + } + } + + /** + * Tests the {@link AxisDirections#angleForGeocentric(AxisDirection, AxisDirection)} method. + */ + @Test + public void testAngleForGeocentric() { + assertEquals( 0, AxisDirections.angleForGeocentric(GEOCENTRIC_X, GEOCENTRIC_X)); + assertEquals( 1, AxisDirections.angleForGeocentric(GEOCENTRIC_X, GEOCENTRIC_Y)); + assertEquals( 1, AxisDirections.angleForGeocentric(GEOCENTRIC_Y, GEOCENTRIC_Z)); + assertEquals( 1, AxisDirections.angleForGeocentric(GEOCENTRIC_Z, GEOCENTRIC_X)); + assertEquals(-1, AxisDirections.angleForGeocentric(GEOCENTRIC_X, GEOCENTRIC_Z)); + assertEquals(-1, AxisDirections.angleForGeocentric(GEOCENTRIC_Z, GEOCENTRIC_Y)); + assertEquals(-1, AxisDirections.angleForGeocentric(GEOCENTRIC_Y, GEOCENTRIC_X)); + } + + /** + * Tests the {@link AxisDirections#angleForDisplay(AxisDirection, AxisDirection)} method. + */ + @Test + public void testAngleForDisplay() { + assertEquals( 0, AxisDirections.angleForDisplay(DISPLAY_RIGHT, DISPLAY_RIGHT)); + assertEquals( 1, AxisDirections.angleForDisplay(DISPLAY_RIGHT, DISPLAY_UP)); + assertEquals(-2, AxisDirections.angleForDisplay(DISPLAY_RIGHT, DISPLAY_LEFT)); + assertEquals(-1, AxisDirections.angleForDisplay(DISPLAY_RIGHT, DISPLAY_DOWN)); + assertEquals( 0, AxisDirections.angleForDisplay(DISPLAY_UP, DISPLAY_UP)); + assertEquals( 1, AxisDirections.angleForDisplay(DISPLAY_UP, DISPLAY_LEFT)); + assertEquals(-2, AxisDirections.angleForDisplay(DISPLAY_UP, DISPLAY_DOWN)); + assertEquals(-1, AxisDirections.angleForDisplay(DISPLAY_UP, DISPLAY_RIGHT)); + assertEquals( 0, AxisDirections.angleForDisplay(DISPLAY_LEFT, DISPLAY_LEFT)); + assertEquals( 1, AxisDirections.angleForDisplay(DISPLAY_LEFT, DISPLAY_DOWN)); + assertEquals( 2, AxisDirections.angleForDisplay(DISPLAY_LEFT, DISPLAY_RIGHT)); + assertEquals(-1, AxisDirections.angleForDisplay(DISPLAY_LEFT, DISPLAY_UP)); + assertEquals( 0, AxisDirections.angleForDisplay(DISPLAY_DOWN, DISPLAY_DOWN)); + assertEquals( 1, AxisDirections.angleForDisplay(DISPLAY_DOWN, DISPLAY_RIGHT)); + assertEquals( 2, AxisDirections.angleForDisplay(DISPLAY_DOWN, DISPLAY_UP)); + assertEquals(-1, AxisDirections.angleForDisplay(DISPLAY_DOWN, DISPLAY_LEFT)); + } + + /** * Tests {@link AxisDirections#valueOf(String)} for the North, South, East and West directions. */ @Test Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/Assert.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/Assert.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/Assert.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/Assert.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -27,6 +27,9 @@ import org.opengis.parameter.ParameterVa import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.IdentifiedObject; import org.opengis.referencing.operation.Matrix; +import org.opengis.referencing.cs.AxisDirection; +import org.opengis.referencing.cs.CoordinateSystemAxis; +import org.opengis.referencing.cs.RangeMeaning; import org.apache.sis.geometry.AbstractEnvelope; import org.apache.sis.geometry.GeneralDirectPosition; @@ -44,12 +47,42 @@ import static java.lang.StrictMath.*; */ public strictfp class Assert extends org.apache.sis.test.Assert { /** + * Tolerance threshold for strict floating point comparisons. + */ + private static final double STRICT = 0; + + /** * For subclass constructor only. */ protected Assert() { } /** + * Compares the given coordinate system axis against the expected values. + * + * @param name The expected axis name code. + * @param abbreviation The expected axis abbreviation. + * @param direction The expected axis direction. + * @param minimumValue The expected axis minimal value. + * @param maximumValue The expected axis maximal value. + * @param unit The expected axis unit of measurement. + * @param rangeMeaning The expected axis range meaning. + * @param axis The axis to verify. + */ + public static void assertAxisEquals(final String name, final String abbreviation, final AxisDirection direction, + final double minimumValue, final double maximumValue, final Unit unit, final RangeMeaning rangeMeaning, + final CoordinateSystemAxis axis) + { + assertEquals("name", name, axis.getName().getCode()); + assertEquals("abbreviation", abbreviation, axis.getAbbreviation()); + assertEquals("direction", direction, axis.getDirection()); + assertEquals("minimumValue", minimumValue, axis.getMinimumValue(), STRICT); + assertEquals("maximumValue", maximumValue, axis.getMaximumValue(), STRICT); + assertEquals("unit", unit, axis.getUnit()); + assertEquals("rangeMeaning", rangeMeaning, axis.getRangeMeaning()); + } + + /** * Asserts that the given parameter values are equal to the expected ones within * a positive delta. Only the elements in the given descriptor are compared, and * the comparisons are done in the units declared in the descriptor. Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -18,6 +18,7 @@ package org.apache.sis.referencing; import java.util.Date; import org.opengis.referencing.crs.GeographicCRS; +import org.opengis.referencing.cs.CoordinateSystem; import org.opengis.referencing.datum.TemporalDatum; import org.opengis.referencing.datum.VerticalDatum; import org.opengis.referencing.datum.VerticalDatumType; @@ -40,7 +41,7 @@ import static org.apache.sis.test.TestUt * @module */ @DependsOn({ - org.apache.sis.referencing.datum.DefaultGeodeticDatumTest.class, + org.apache.sis.referencing.crs.DefaultGeodeticCRSTest.class, org.apache.sis.referencing.datum.DefaultVerticalDatumTest.class, StandardDefinitionsTest.class }) @@ -55,9 +56,21 @@ public final strictfp class GeodeticObje */ @Test public void testWGS84() { - final GeographicCRS crs = GeodeticObjects.WGS84.geographic(); - Validators.validate(crs); - GeodeticObjectVerifier.assertIsWGS84(crs, false, true); + final GeographicCRS geographic = GeodeticObjects.WGS84.geographic(); + Validators.validate(geographic); + GeodeticObjectVerifier.assertIsWGS84(geographic, false, true); + assertSame("Cached value", geographic, GeodeticObjects.WGS84.geographic()); + /* + * Verifies the variant using (longitude, latitude) axis order. + */ + final GeographicCRS normalized = GeodeticObjects.WGS84.normalizedGeographic(); + Validators.validate(normalized); + assertSame(geographic.getDatum(), normalized.getDatum()); + final CoordinateSystem φλ = geographic.getCoordinateSystem(); + final CoordinateSystem λφ = normalized.getCoordinateSystem(); + assertSame("Longitude", φλ.getAxis(1), λφ.getAxis(0)); + assertSame("Latitude", φλ.getAxis(0), λφ.getAxis(1)); + assertSame("Cached value", normalized, GeodeticObjects.WGS84.normalizedGeographic()); } /** Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeodeticCRSTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeodeticCRSTest.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeodeticCRSTest.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeodeticCRSTest.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -37,6 +37,7 @@ import static org.apache.sis.test.Assert * @module */ @DependsOn({ + AbstractCRSTest.class, org.apache.sis.referencing.cs.DefaultEllipsoidalCSTest.class, org.apache.sis.referencing.datum.DefaultGeodeticDatumTest.class }) Modified: sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CommonAxes.java URL: http://svn.apache.org/viewvc/sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CommonAxes.java?rev=1558583&r1=1558582&r2=1558583&view=diff ============================================================================== --- sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CommonAxes.java [UTF-8] (original) +++ sis/branches/JDK6/core/sis-referencing/src/test/java/org/apache/sis/referencing/cs/CommonAxes.java [UTF-8] Wed Jan 15 22:01:46 2014 @@ -50,7 +50,7 @@ public final strictfp class CommonAxes { * @see #GEODETIC_LATITUDE */ public static final DefaultCoordinateSystemAxis GEODETIC_LONGITUDE = create("Geodetic longitude", "λ", - AxisDirection.EAST, -180, 180, NonSI.DEGREE_ANGLE, RangeMeaning.WRAPAROUND); + AxisDirection.EAST, NonSI.DEGREE_ANGLE, -180, 180, RangeMeaning.WRAPAROUND); /** * Default axis info for geodetic latitudes in a @@ -67,7 +67,13 @@ public final strictfp class CommonAxes { * @see #GEODETIC_LONGITUDE */ public static final DefaultCoordinateSystemAxis GEODETIC_LATITUDE = create("Geodetic latitude", "φ", - AxisDirection.NORTH, -90, 90, NonSI.DEGREE_ANGLE, RangeMeaning.EXACT); + AxisDirection.NORTH, NonSI.DEGREE_ANGLE, -90, 90, RangeMeaning.EXACT); + + /** + * Identical to {@link #LONGITUDE} except for the range of longitude values. + */ + public static final DefaultCoordinateSystemAxis SHIFTED_LONGITUDE = create("Longitude", "λ", + AxisDirection.EAST, NonSI.DEGREE_ANGLE, 0, 360, RangeMeaning.WRAPAROUND); /** * Default axis info for longitudes. @@ -82,7 +88,7 @@ public final strictfp class CommonAxes { * @see #LATITUDE */ public static final DefaultCoordinateSystemAxis LONGITUDE = create("Longitude", "λ", - AxisDirection.EAST, -180, 180, NonSI.DEGREE_ANGLE, RangeMeaning.WRAPAROUND); + AxisDirection.EAST, NonSI.DEGREE_ANGLE, -180, 180, RangeMeaning.WRAPAROUND); /** * Default axis info for latitudes. @@ -97,7 +103,7 @@ public final strictfp class CommonAxes { * @see #LONGITUDE */ public static final DefaultCoordinateSystemAxis LATITUDE = create("Latitude", "φ", - AxisDirection.NORTH, -90, 90, NonSI.DEGREE_ANGLE, RangeMeaning.EXACT); + AxisDirection.NORTH, NonSI.DEGREE_ANGLE, -90, 90, RangeMeaning.EXACT); /** * The default axis for height values above the ellipsoid in a @@ -114,7 +120,7 @@ public final strictfp class CommonAxes { * @see #DEPTH */ public static final DefaultCoordinateSystemAxis ELLIPSOIDAL_HEIGHT = create("Ellipsoidal height", "h", - AxisDirection.UP, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.UP, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * The default axis for height values measured from gravity. @@ -127,13 +133,13 @@ public final strictfp class CommonAxes { * @see #DEPTH */ public static final DefaultCoordinateSystemAxis GRAVITY_RELATED_HEIGHT = create("Gravity-related height", "H", - AxisDirection.UP, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.UP, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * A height in centimetres, for {@link CoordinateSystemsTest} only. */ static final DefaultCoordinateSystemAxis HEIGHT_cm = create("Height", "h", - AxisDirection.UP, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.CENTIMETRE, null); + AxisDirection.UP, SI.CENTIMETRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * The default axis for altitude values. @@ -148,7 +154,7 @@ public final strictfp class CommonAxes { * @see #DEPTH */ public static final DefaultCoordinateSystemAxis ALTITUDE = create("Altitude", "h", - AxisDirection.UP, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.UP, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * The default axis for depth. @@ -161,7 +167,7 @@ public final strictfp class CommonAxes { * @see #GRAVITY_RELATED_HEIGHT */ public static final DefaultCoordinateSystemAxis DEPTH = create("Depth", "d", - AxisDirection.DOWN, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.DOWN, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for radius in a @@ -179,7 +185,7 @@ public final strictfp class CommonAxes { * @see #DEPTH */ public static final DefaultCoordinateSystemAxis GEOCENTRIC_RADIUS = create("Geocentric radius", "r", - AxisDirection.UP, 0, Double.POSITIVE_INFINITY, SI.METRE, RangeMeaning.EXACT); + AxisDirection.UP, SI.METRE, 0, Double.POSITIVE_INFINITY, RangeMeaning.EXACT); /** * Default axis info for longitudes in a @@ -197,7 +203,7 @@ public final strictfp class CommonAxes { * @see #SPHERICAL_LATITUDE */ public static final DefaultCoordinateSystemAxis SPHERICAL_LONGITUDE = create("Spherical longitude", "Ω", - AxisDirection.EAST, -180, 180, NonSI.DEGREE_ANGLE, RangeMeaning.WRAPAROUND); + AxisDirection.EAST, NonSI.DEGREE_ANGLE, -180, 180, RangeMeaning.WRAPAROUND); /** * Default axis info for latitudes in a @@ -215,7 +221,7 @@ public final strictfp class CommonAxes { * @see #SPHERICAL_LONGITUDE */ public static final DefaultCoordinateSystemAxis SPHERICAL_LATITUDE = create("Spherical latitude", "Θ", - AxisDirection.NORTH, -90, 90, NonSI.DEGREE_ANGLE, RangeMeaning.EXACT); + AxisDirection.NORTH, NonSI.DEGREE_ANGLE, -90, 90, RangeMeaning.EXACT); /** * Default axis info for x values in a @@ -233,7 +239,7 @@ public final strictfp class CommonAxes { * @see #COLUMN */ public static final DefaultCoordinateSystemAxis X = create("x", "x", - AxisDirection.EAST, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.EAST, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for y values in a @@ -251,7 +257,7 @@ public final strictfp class CommonAxes { * @see #ROW */ public static final DefaultCoordinateSystemAxis Y = create("y", "y", - AxisDirection.NORTH, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.NORTH, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for z values in a @@ -263,7 +269,7 @@ public final strictfp class CommonAxes { *

    This axis is usually part of a {@link #X}, {@link #Y}, {@link #Z} set.

    */ public static final DefaultCoordinateSystemAxis Z = create("z", "z", - AxisDirection.UP, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.UP, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for x values in a @@ -279,7 +285,7 @@ public final strictfp class CommonAxes { *

    This axis is usually part of a {@link #GEOCENTRIC_X}, {@link #GEOCENTRIC_Y}, {@link #GEOCENTRIC_Z} set.

    */ public static final DefaultCoordinateSystemAxis GEOCENTRIC_X = create("X", "X", - AxisDirection.GEOCENTRIC_X, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.GEOCENTRIC_X, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for y values in a @@ -295,7 +301,7 @@ public final strictfp class CommonAxes { *

    This axis is usually part of a {@link #GEOCENTRIC_X}, {@link #GEOCENTRIC_Y}, {@link #GEOCENTRIC_Z} set.

    */ public static final DefaultCoordinateSystemAxis GEOCENTRIC_Y = create("Y", "Y", - AxisDirection.GEOCENTRIC_Y, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.GEOCENTRIC_Y, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for z values in a @@ -311,7 +317,7 @@ public final strictfp class CommonAxes { *

    This axis is usually part of a {@link #GEOCENTRIC_X}, {@link #GEOCENTRIC_Y}, {@link #GEOCENTRIC_Z} set.

    */ public static final DefaultCoordinateSystemAxis GEOCENTRIC_Z = create("Z", "Z", - AxisDirection.GEOCENTRIC_Z, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.GEOCENTRIC_Z, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for Easting values in a @@ -326,7 +332,7 @@ public final strictfp class CommonAxes { * @see #WESTING */ public static final DefaultCoordinateSystemAxis EASTING = create("Easting", "E", - AxisDirection.EAST, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.EAST, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for Westing values in a @@ -339,7 +345,7 @@ public final strictfp class CommonAxes { * @see #WESTING */ public static final DefaultCoordinateSystemAxis WESTING = create("Westing", "W", - AxisDirection.WEST, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.WEST, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for Northing values in a @@ -354,7 +360,7 @@ public final strictfp class CommonAxes { * @see #SOUTHING */ public static final DefaultCoordinateSystemAxis NORTHING = create("Northing", "N", - AxisDirection.NORTH, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.NORTH, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Default axis info for Southing values in a @@ -367,19 +373,19 @@ public final strictfp class CommonAxes { * @see #SOUTHING */ public static final DefaultCoordinateSystemAxis SOUTHING = create("Southing", "S", - AxisDirection.SOUTH, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.SOUTH, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * An axis with North-East orientation. */ static final DefaultCoordinateSystemAxis NORTH_EAST = create("NORTH_EAST", "NE", - AxisDirection.NORTH_EAST, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.NORTH_EAST, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * An axis with South-East orientation. */ static final DefaultCoordinateSystemAxis SOUTH_EAST = create("SOUTH_EAST", "SE", - AxisDirection.SOUTH_EAST, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, SI.METRE, null); + AxisDirection.SOUTH_EAST, SI.METRE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * A default axis for time values in a {@linkplain org.opengis.referencing.cs.TimeCS time CS}. @@ -387,7 +393,7 @@ public final strictfp class CommonAxes { * The abbreviation is lower case "t". */ public static final DefaultCoordinateSystemAxis TIME = create("Time", "t", - AxisDirection.FUTURE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, NonSI.DAY, null); + AxisDirection.FUTURE, NonSI.DAY, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * A default axis for column indices in a {@linkplain org.opengis.coverage.grid.GridCoverage grid coverage}. @@ -395,7 +401,7 @@ public final strictfp class CommonAxes { * The abbreviation is lower case "i". */ public static final DefaultCoordinateSystemAxis COLUMN = create("Column", "i", - AxisDirection.COLUMN_POSITIVE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Unit.ONE, null); + AxisDirection.COLUMN_POSITIVE, Unit.ONE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * A default axis for row indices in a {@linkplain org.opengis.coverage.grid.GridCoverage grid coverage}. @@ -403,7 +409,7 @@ public final strictfp class CommonAxes { * The abbreviation is lower case "j". */ public static final DefaultCoordinateSystemAxis ROW = create("Row", "j", - AxisDirection.ROW_POSITIVE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Unit.ONE, null); + AxisDirection.ROW_POSITIVE, Unit.ONE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * A default axis for x values in a display device. Increasing values go toward @@ -411,7 +417,7 @@ public final strictfp class CommonAxes { * The abbreviation is lower case "x". */ public static final DefaultCoordinateSystemAxis DISPLAY_X = create("x", "x", - AxisDirection.DISPLAY_RIGHT, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Unit.ONE, null); + AxisDirection.DISPLAY_RIGHT, Unit.ONE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * A default axis for y values in a display device. Increasing values go toward @@ -419,7 +425,7 @@ public final strictfp class CommonAxes { * The abbreviation is lower case "y". */ public static final DefaultCoordinateSystemAxis DISPLAY_Y = create("y", "y", - AxisDirection.DISPLAY_DOWN, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Unit.ONE, null); + AxisDirection.DISPLAY_DOWN, Unit.ONE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Undefined or unknown axis. Axis direction is {@link AxisDirection#OTHER OTHER} @@ -427,13 +433,13 @@ public final strictfp class CommonAxes { * for axes that were not properly defined. */ public static final DefaultCoordinateSystemAxis UNDEFINED = create("Undefined", "?", - AxisDirection.OTHER, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Unit.ONE, null); + AxisDirection.OTHER, Unit.ONE, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, null); /** * Creates a new axis of the given name, abbreviation, direction and unit. */ private static DefaultCoordinateSystemAxis create(final String name, final String abbreviation, - final AxisDirection direction, final double minimum, final double maximum, final Unit unit, + final AxisDirection direction, final Unit unit, final double minimum, final double maximum, final RangeMeaning meaning) { return new DefaultCoordinateSystemAxis(singletonMap(DefaultCoordinateSystemAxis.NAME_KEY, name),