You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2014/01/29 19:33:27 UTC

svn commit: r1562541 - in /sis/branches/JDK7/core: sis-referencing/src/main/java/org/apache/sis/geometry/ sis-referencing/src/test/java/org/apache/sis/geometry/ sis-referencing/src/test/java/org/apache/sis/referencing/ sis-referencing/src/test/java/org...

Author: desruisseaux
Date: Wed Jan 29 18:33:26 2014
New Revision: 1562541

URL: http://svn.apache.org/r1562541
Log:
Added a check in the GeneralEnvelope class for range validity, and added JUnit tests.

Modified:
    sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
    sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
    sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
    sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/SubEnvelope.java
    sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/geometry/GeneralEnvelopeTest.java
    sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java
    sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java
    sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties

Modified: sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/AbstractEnvelope.java [UTF-8] Wed Jan 29 18:33:26 2014
@@ -1185,7 +1185,10 @@ public abstract class AbstractEnvelope i
      * @param  dimension The dimension to set.
      * @param  lower     The limit in the direction of decreasing ordinate values.
      * @param  upper     The limit in the direction of increasing ordinate values.
+     * @throws UnmodifiableGeometryException If this envelope is not modifiable.
      * @throws IndexOutOfBoundsException If the given index is out of bounds.
+     * @throws IllegalArgumentException If {@code lower > upper}, this envelope has a CRS
+     *         and the axis range meaning at the given dimension is not "wraparound".
      */
     void setRange(final int dimension, final double lower, final double upper)
             throws IndexOutOfBoundsException

Modified: sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/ArrayEnvelope.java [UTF-8] Wed Jan 29 18:33:26 2014
@@ -28,8 +28,10 @@ import org.opengis.geometry.DirectPositi
 import org.opengis.geometry.MismatchedDimensionException;
 import org.opengis.geometry.MismatchedReferenceSystemException;
 import org.opengis.metadata.extent.GeographicBoundingBox;
+import org.opengis.referencing.cs.RangeMeaning;
 import org.opengis.referencing.cs.CoordinateSystemAxis;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.apache.sis.referencing.IdentifiedObjects;
 import org.apache.sis.referencing.CommonCRS;
 import org.apache.sis.util.ArraysExt;
 import org.apache.sis.util.CharSequences;
@@ -116,6 +118,7 @@ class ArrayEnvelope extends AbstractEnve
             ordinates[i            ] = lowerCorner.getOrdinate(i);
             ordinates[i + dimension] = upperCorner.getOrdinate(i);
         }
+        verifyRanges(crs, ordinates);
     }
 
     /**
@@ -172,6 +175,7 @@ class ArrayEnvelope extends AbstractEnve
             ordinates[i]           = lowerCorner.getOrdinate(i);
             ordinates[i+dimension] = upperCorner.getOrdinate(i);
         }
+        verifyRanges(crs, ordinates);
     }
 
     /**
@@ -197,6 +201,7 @@ class ArrayEnvelope extends AbstractEnve
             }
         }
         crs = CommonCRS.defaultGeographic();
+        verifyRanges(crs, ordinates);
     }
 
     /**
@@ -317,6 +322,59 @@ scanNumber: while ((i += Character.charC
     }
 
     /**
+     * Verifies the validity of the range of ordinates values in the given array.
+     * If the given CRS is null, then this method conservatively does nothing.
+     * Otherwise this method performs the following verifications:
+     *
+     * <ul>
+     *   <li>{@code lower > upper} is allowed only for axes having {@link RangeMeaning#WRAPAROUND}.</li>
+     * </ul>
+     *
+     * This method does <strong>not</strong> verify if the ordinate values are between the axis minimum and
+     * maximum values. This is because out-of-range values exist in practice but do not impact the working
+     * of {@code add(…)}, {@code intersect(…)}, {@code contains(…)} and similar methods. This in contrast
+     * with the checks listed above, where failure to meet those conditions will cause the methods to
+     * behave in an unexpected way.
+     *
+     * {@section Implementation consistency}
+     * The checks performed by this method shall be consistent with the checks performed by the following methods:
+     * <ul>
+     *   <li>{@link GeneralEnvelope#setCoordinateReferenceSystem(CoordinateReferenceSystem)}</li>
+     *   <li>{@link GeneralEnvelope#setRange(int, double, double)}</li>
+     *   <li>{@link SubEnvelope#setRange(int, double, double)}</li>
+     * </ul>
+     *
+     * @param crs The coordinate reference system, or {@code null}.
+     * @param ordinates The array of ordinate values to verify.
+     */
+    static void verifyRanges(final CoordinateReferenceSystem crs, final double[] ordinates) {
+        if (crs != null) {
+            final int dimension = ordinates.length >>> 1;
+            for (int i=0; i<dimension; i++) {
+                final double lower = ordinates[i];
+                final double upper = ordinates[i + dimension];
+                if (lower > upper && !isWrapAround(crs, i)) {
+                    throw new IllegalArgumentException(illegalRange(crs, dimension, lower, upper));
+                }
+            }
+        }
+    }
+
+    /**
+     * Creates an error message for an illegal ordinates range at the given dimension.
+     * This is used for formatting the exception message.
+     */
+    static String illegalRange(final CoordinateReferenceSystem crs,
+            final int dimension, final double lower, final double upper)
+    {
+        Object name = IdentifiedObjects.getName(getAxis(crs, dimension), null);
+        if (name == null) {
+            name = dimension; // Paranoiac fallback (name should never be null).
+        }
+        return Errors.format(Errors.Keys.IllegalOrdinateRange_3, lower, upper, name);
+    }
+
+    /**
      * Returns the index of the first valid ordinate value of the lower corner in the {@link #ordinates} array.
      * This is always 0, unless this envelope is a {@link SubEnvelope}.
      *

Modified: sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/GeneralEnvelope.java [UTF-8] Wed Jan 29 18:33:26 2014
@@ -91,6 +91,24 @@ import static org.apache.sis.math.MathFu
  * </ul>
  * </td></tr></table>
  *
+ * {@section Envelope validation}
+ * If and only if this envelope is associated to a non-null CRS, then constructors and setter methods
+ * in this class perform the following checks:
+ *
+ * <ul>
+ *   <li>The number of CRS dimensions must be equals to <code>this.{@linkplain #getDimension()}</code>.</li>
+ *   <li>For each dimension <var>i</var>,
+ *       <code>{@linkplain #getLower(int) getLower}(i) &gt; {@linkplain #getUpper(int) getUpper}(i)</code> is allowed
+ *       only if the {@linkplain org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis#getRangeMeaning() coordinate
+ *       system axis range meaning} is {@code WRAPAROUND}.</li>
+ * </ul>
+ *
+ * Note that this class does <em>not</em> require the ordinate values to be between the axis minimum and
+ * maximum values. This flexibility exists because out-of-range values happen in practice, while they do
+ * not hurt the working of {@code add(…)}, {@code intersect(…)}, {@code contains(…)} and similar methods.
+ * This in contrast with the {@code lower > upper} case, which cause the above-cited methods to behave in
+ * an unexpected way if the axis does not have wraparound range meaning.
+ *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Johann Sorel (Geomatys)
  * @since   0.3 (derived from geotk-2.4)
@@ -259,21 +277,42 @@ public class GeneralEnvelope extends Arr
 
     /**
      * Sets the coordinate reference system in which the coordinate are given.
-     * This method <strong>does not</strong> reproject the envelope, and do not
-     * check if the envelope is contained in the new domain of validity.
+     * This method <strong>does not</strong> reproject the envelope, and does
+     * not check if the envelope is contained in the new domain of validity.
      *
      * <p>If the envelope coordinates need to be transformed to the new CRS, consider
      * using {@link Envelopes#transform(Envelope, CoordinateReferenceSystem)} instead.</p>
      *
      * @param  crs The new coordinate reference system, or {@code null}.
-     * @throws MismatchedDimensionException if the specified CRS doesn't have the expected
-     *         number of dimensions.
+     * @throws MismatchedDimensionException if the specified CRS doesn't have the expected number of dimensions.
+     * @throws IllegalStateException if a range of ordinate values in this envelope is compatible with the given CRS.
+     *         See <cite>Envelope validation</cite> in class javadoc for more details.
      */
     public void setCoordinateReferenceSystem(final CoordinateReferenceSystem crs)
             throws MismatchedDimensionException
     {
         ensureDimensionMatches("crs", getDimension(), crs);
-        this.crs = crs;
+        /*
+         * The check performed here shall be identical to ArrayEnvelope.verifyRanges(crs, ordinates)
+         * except that it may verify only a subset of the ordinate array and throws a different kind
+         * of exception in caseo of failure.
+         */
+        if (crs != null) {
+            final int beginIndex = beginIndex();
+            final int endIndex = endIndex();
+            final int d = ordinates.length >>> 1;
+            for (int i=beginIndex; i<endIndex; i++) {
+                final double lower = ordinates[i];
+                final double upper = ordinates[i + d];
+                if (lower > upper) {
+                    final int j = i - beginIndex;
+                    if (!isWrapAround(crs, j)) {
+                        throw new IllegalStateException(illegalRange(crs, j, lower, upper));
+                    }
+                }
+            }
+        }
+        this.crs = crs; // Set only on success.
     }
 
     /**
@@ -283,6 +322,8 @@ public class GeneralEnvelope extends Arr
      * @param  lower     The limit in the direction of decreasing ordinate values.
      * @param  upper     The limit in the direction of increasing ordinate values.
      * @throws IndexOutOfBoundsException If the given index is out of bounds.
+     * @throws IllegalArgumentException If {@code lower > upper} and the axis range meaning at the given dimension
+     *         is not "wraparound". See <cite>Envelope validation</cite> in class javadoc for more details.
      */
     @Override // Must also be overridden in SubEnvelope
     public void setRange(final int dimension, final double lower, final double upper)
@@ -290,6 +331,13 @@ public class GeneralEnvelope extends Arr
     {
         final int d = ordinates.length >>> 1;
         ensureValidIndex(d, dimension);
+        /*
+         * The check performed here shall be identical to ArrayEnvelope.verifyRanges(crs, ordinates),
+         * except that there is no loop.
+         */
+        if (lower > upper && crs != null && !isWrapAround(crs, dimension)) {
+            throw new IllegalArgumentException(illegalRange(crs, dimension, lower, upper));
+        }
         ordinates[dimension + d] = upper;
         ordinates[dimension]     = lower;
     }
@@ -308,6 +356,7 @@ public class GeneralEnvelope extends Arr
      */
     public void setEnvelope(final double... corners) {
         verifyArrayLength(ordinates.length >>> 1, corners);
+        verifyRanges(crs, corners);
         System.arraycopy(corners, 0, ordinates, 0, ordinates.length);
     }
 

Modified: sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/SubEnvelope.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/SubEnvelope.java?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/SubEnvelope.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/geometry/SubEnvelope.java [UTF-8] Wed Jan 29 18:33:26 2014
@@ -22,6 +22,7 @@ package org.apache.sis.geometry;
  * force installation of the Java2D module (e.g. JavaFX/SWT).
  */
 import java.util.Arrays;
+import org.apache.sis.util.resources.Errors;
 
 import static org.apache.sis.util.ArgumentChecks.ensureValidIndex;
 import static org.apache.sis.util.ArgumentChecks.ensureValidIndexRange;
@@ -126,6 +127,13 @@ final class SubEnvelope extends GeneralE
             throws IndexOutOfBoundsException
     {
         ensureValidIndex(endIndex, dimension);
+        /*
+         * The check performed here shall be identical to the super-class method, which is itself
+         * identical to ArrayEnvelope.verifyRanges(crs, ordinates) except that there is no loop.
+         */
+        if (lower > upper && crs != null && !isWrapAround(crs, dimension)) {
+            throw new IllegalArgumentException(illegalRange(crs, dimension, lower, upper));
+        }
         dimension += beginIndex;
         ordinates[dimension + (ordinates.length >>> 1)] = upper;
         ordinates[dimension] = lower;
@@ -138,6 +146,7 @@ final class SubEnvelope extends GeneralE
     public void setEnvelope(final double... corners) {
         final int dimension = getDimension();
         verifyArrayLength(dimension, corners);
+        verifyRanges(crs, corners);
         final int d = ordinates.length >>> 1;
         System.arraycopy(corners, 0,         ordinates, beginIndex,     dimension);
         System.arraycopy(corners, dimension, ordinates, beginIndex + d, dimension);

Modified: sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/geometry/GeneralEnvelopeTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/geometry/GeneralEnvelopeTest.java?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/geometry/GeneralEnvelopeTest.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/geometry/GeneralEnvelopeTest.java [UTF-8] Wed Jan 29 18:33:26 2014
@@ -426,17 +426,39 @@ public strictfp class GeneralEnvelopeTes
     }
 
     /**
+     * Tests {@link GeneralEnvelope#setRange(int, double, double)} with a range which is known to be invalid.
+     */
+    @Test
+    public void testSetRange() {
+        final GeneralEnvelope e = create(2, -4, 3, -3);
+        e.setRange(1, -5, 2);
+        try {
+            e.setRange(1, -10, -20);
+            fail("Invalid range shall not be allowed.");
+        } catch (IllegalArgumentException ex) {
+            // This is the expected exception.
+            final String message = ex.getMessage();
+            assertTrue(message, message.contains("Geodetic latitude"));
+        }
+        // Verify that the envelope still have the old values.
+        assertEquals( 2, e.getLower(0), STRICT);
+        assertEquals(-5, e.getLower(1), STRICT);
+        assertEquals( 3, e.getUpper(0), STRICT);
+        assertEquals( 2, e.getUpper(1), STRICT);
+    }
+
+    /**
      * Tests modifying the corner of an envelope.
      */
     @Test
     public void testCornerModifications() {
-        final GeneralEnvelope e = create(2, -2, 3, -3);
+        final GeneralEnvelope e = create(2, -4, 3, -3);
         e.getLowerCorner().setOrdinate(0,  1);
         e.getUpperCorner().setOrdinate(1, -1);
-        assertEquals( 1.0, e.getLower(0), 0.0);
-        assertEquals(-2.0, e.getLower(1), 0.0);
-        assertEquals( 3.0, e.getUpper(0), 0.0);
-        assertEquals(-1.0, e.getUpper(1), 0.0);
+        assertEquals( 1, e.getLower(0), STRICT);
+        assertEquals(-4, e.getLower(1), STRICT);
+        assertEquals( 3, e.getUpper(0), STRICT);
+        assertEquals(-1, e.getUpper(1), STRICT);
         verifyInvariants(e);
     }
 

Modified: sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java [UTF-8] Wed Jan 29 18:33:26 2014
@@ -16,14 +16,16 @@
  */
 package org.apache.sis.referencing;
 
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.crs.SingleCRS;
 import org.opengis.util.FactoryException;
+import org.apache.sis.referencing.crs.HardCodedCRS;
 import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
+import static org.apache.sis.test.Assert.*;
 
 
 /**
@@ -83,4 +85,68 @@ public final strictfp class CRSTest exte
         verifyForCode(CommonCRS.NAD83.normalizedGeographic(), "CRS:83");
         verifyForCode(CommonCRS.NAD27.normalizedGeographic(), "CRS:27");
     }
+
+    /**
+     * Tests {@link CRS#isHorizontalCRS(CoordinateReferenceSystem)}.
+     */
+    @Test
+    public void testIsHorizontalCRS() {
+        assertFalse(CRS.isHorizontalCRS(HardCodedCRS.TIME));
+        assertFalse(CRS.isHorizontalCRS(HardCodedCRS.ELLIPSOIDAL_HEIGHT));
+        assertTrue (CRS.isHorizontalCRS(HardCodedCRS.WGS84));
+        assertTrue (CRS.isHorizontalCRS(HardCodedCRS.WGS84_φλ));
+        assertFalse(CRS.isHorizontalCRS(HardCodedCRS.WGS84_3D));
+        assertFalse(CRS.isHorizontalCRS(HardCodedCRS.GEOID_4D));
+        assertFalse(CRS.isHorizontalCRS(HardCodedCRS.GEOCENTRIC));
+    }
+
+    /**
+     * Tests {@link CRS#getHorizontalComponent(CoordinateReferenceSystem)}.
+     */
+    @Test
+    @DependsOnMethod("testIsHorizontalCRS")
+    public void testGetHorizontalComponent() {
+        assertNull(CRS.getHorizontalComponent(HardCodedCRS.TIME));
+        assertNull(CRS.getHorizontalComponent(HardCodedCRS.ELLIPSOIDAL_HEIGHT));
+        assertNull(CRS.getHorizontalComponent(HardCodedCRS.GEOCENTRIC));
+
+        assertSame(HardCodedCRS.WGS84,    CRS.getHorizontalComponent(HardCodedCRS.WGS84));
+        assertSame(HardCodedCRS.WGS84_φλ, CRS.getHorizontalComponent(HardCodedCRS.WGS84_φλ));
+
+        assertEqualsIgnoreMetadata(HardCodedCRS.WGS84, CRS.getHorizontalComponent(HardCodedCRS.WGS84_3D));
+    }
+
+    /**
+     * Tests {@link CRS#getVerticalComponent(CoordinateReferenceSystem, boolean)}.
+     */
+    @Test
+    public void testGetVerticalComponent() {
+        assertNull(CRS.getVerticalComponent(HardCodedCRS.TIME,  false));
+        assertNull(CRS.getVerticalComponent(HardCodedCRS.TIME,  true));
+        assertNull(CRS.getVerticalComponent(HardCodedCRS.WGS84, false));
+        assertNull(CRS.getVerticalComponent(HardCodedCRS.WGS84, true));
+
+        assertSame(HardCodedCRS.ELLIPSOIDAL_HEIGHT,     CRS.getVerticalComponent(HardCodedCRS.ELLIPSOIDAL_HEIGHT, false));
+        assertSame(HardCodedCRS.ELLIPSOIDAL_HEIGHT,     CRS.getVerticalComponent(HardCodedCRS.ELLIPSOIDAL_HEIGHT, true));
+        assertSame(HardCodedCRS.GRAVITY_RELATED_HEIGHT, CRS.getVerticalComponent(HardCodedCRS.GEOID_4D, false));
+        assertSame(HardCodedCRS.GRAVITY_RELATED_HEIGHT, CRS.getVerticalComponent(HardCodedCRS.GEOID_4D, true));
+
+        assertNull(CRS.getVerticalComponent(HardCodedCRS.WGS84_3D, false));
+        assertEqualsIgnoreMetadata(HardCodedCRS.ELLIPSOIDAL_HEIGHT,
+                CRS.getVerticalComponent(HardCodedCRS.WGS84_3D, true));
+    }
+
+    /**
+     * Tests {@link CRS#getTemporalComponent(CoordinateReferenceSystem)}.
+     */
+    @Test
+    public void testGetTemporalComponent() {
+        assertNull(CRS.getTemporalComponent(HardCodedCRS.ELLIPSOIDAL_HEIGHT));
+        assertNull(CRS.getTemporalComponent(HardCodedCRS.WGS84));
+        assertNull(CRS.getTemporalComponent(HardCodedCRS.WGS84_φλ));
+        assertNull(CRS.getTemporalComponent(HardCodedCRS.WGS84_3D));
+
+        assertSame(HardCodedCRS.TIME, CRS.getTemporalComponent(HardCodedCRS.TIME));
+        assertSame(HardCodedCRS.TIME, CRS.getTemporalComponent(HardCodedCRS.GEOID_4D));
+    }
 }

Modified: sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java [UTF-8] (original)
+++ sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/HardCodedCRS.java [UTF-8] Wed Jan 29 18:33:26 2014
@@ -137,6 +137,13 @@ public final strictfp class HardCodedCRS
             getProperties(HardCodedCS.DAYS), HardCodedDatum.UNIX, HardCodedCS.DAYS);
 
     /**
+     * A (λ,φ,h,t) CRS where <var>h</var> is the {@link #GRAVITY_RELATED_HEIGHT}.
+     * This constant uses the "geoid" term as an approximation for the gravity related height.
+     */
+    public static final DefaultCompoundCRS GEOID_4D = new DefaultCompoundCRS(
+            properties("WGS 84 + height + time"), GRAVITY_RELATED_HEIGHT, TIME);
+
+    /**
      * A two-dimensional Cartesian coordinate reference system with (column, row) axes.
      * By default, this CRS has no transformation path to any other CRS (i.e. a map using
      * this CS can't be reprojected to a geographic coordinate reference system for example).

Modified: sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties
URL: http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties?rev=1562541&r1=1562540&r2=1562541&view=diff
==============================================================================
--- sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] (original)
+++ sis/branches/JDK7/core/sis-utility/src/main/java/org/apache/sis/util/resources/Errors_fr.properties [ISO-8859-1] Wed Jan 29 18:33:26 2014
@@ -52,7 +52,7 @@ IllegalClass_2                    = La c
 IllegalFormatPatternForClass_2    = Le mod\u00e8le \u201c{1}\u201d ne peut pas \u00eatre appliqu\u00e9 au formatage d\u2019objets de type \u2018{0}\u2019.
 IllegalLanguageCode_1             = Le code de langue \u201c{0}\u201d n\u2019est pas reconnu.
 IllegalMemberType_2               = Le membre \u201c{0}\u201d ne peut pas \u00eatre associ\u00e9 au type \u201c{1}\u201d.
-IllegalOrdinateRange_3            = La plage de valeurs de coordonn\u00e9es [{1} \u2026 {2}] n\u2019est pas valide pour l\u2019axe \u201c{0}\u201d.
+IllegalOrdinateRange_3            = La plage de valeurs de coordonn\u00e9es [{0} \u2026 {1}] n\u2019est pas valide pour l\u2019axe \u201c{2}\u201d.
 IllegalPropertyClass_2            = La propri\u00e9t\u00e9 \u2018{0}\u2019 n\u2019accepte pas les valeurs de type \u2018{1}\u2019.
 IllegalRange_2                    = La plage [{0} \u2026 {1}] n\u2019est pas valide.
 IllegalUnicodeCodePoint_2         = La valeur {1} de \u201c{0}\u201d n\u2019est pas un code Unicode valide.