Author: desruisseaux
Date: Wed Jan 15 19:06:04 2014
New Revision: 1558519

URL: http://svn.apache.org/r1558519
Log:
Added GeodeticObjects.normalizedGeographic() method.

Modified:
    
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticObjects.java
    
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java
    
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java

Modified: 
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticObjects.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticObjects.java?rev=1558519&r1=1558518&r2=1558519&view=diff
==============================================================================
--- 
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticObjects.java
 [UTF-8] (original)
+++ 
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/GeodeticObjects.java
 [UTF-8] Wed Jan 15 19:06:04 2014
@@ -38,8 +38,10 @@ import org.opengis.referencing.datum.Ver
 import org.opengis.referencing.datum.TemporalDatum;
 import org.opengis.referencing.datum.DatumAuthorityFactory;
 import org.opengis.referencing.crs.CRSAuthorityFactory;
+import org.apache.sis.referencing.crs.DefaultGeographicCRS;
 import org.apache.sis.referencing.datum.DefaultVerticalDatum;
 import org.apache.sis.referencing.datum.DefaultTemporalDatum;
+import org.apache.sis.referencing.cs.AxesConvention;
 import org.apache.sis.util.resources.Vocabulary;
 
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
@@ -60,7 +62,7 @@ import static org.opengis.referencing.Id
  * (<var>longitude</var>, <var>latitude</var>) axis order on the {@link 
#WGS84} geodetic datum:</p>
  *
  * {@preformat java
- *   GeographicCRS crs = GeodeticObjects.WGS84.geographic();
+ *   GeographicCRS crs = GeodeticObjects.WGS84.normalizedGeographic();
  * }
  *
  * For each enumeration value, the name of the CRS, datum and ellipsoid 
objects may or may not be the same.
@@ -223,10 +225,10 @@ public enum GeodeticObjects {
     /**
      * The EPSG code of the geographic CRS.
      */
-    final short crs;
+    final short geographic;
 
     /**
-     * The EPSG code of the datum. The value is often {@link #crs} + 2000,
+     * The EPSG code of the datum. The value is often {@link #geographic} + 
2000,
      * but it doesn't have to be always the case.
      */
     final short datum;
@@ -244,16 +246,23 @@ public enum GeodeticObjects {
     private transient volatile IdentifiedObject cached;
 
     /**
+     * The normalized geographic CRS, created when first needed.
+     *
+     * @see #normalizedGeographic()
+     */
+    private transient volatile GeographicCRS normalized;
+
+    /**
      * Creates a new constant for the given EPSG or SIS codes.
      *
-     * @param crs       The EPSG code for the geographic CRS.
-     * @param datum     The EPSG code for the datum.
-     * @param ellipsoid The EPSG code for the ellipsoid.
-     */
-    private GeodeticObjects(final short crs, final short datum, final short 
ellipsoid) {
-        this.crs       = crs;
-        this.datum     = datum;
-        this.ellipsoid = ellipsoid;
+     * @param geographic The EPSG code for the geographic CRS.
+     * @param datum      The EPSG code for the datum.
+     * @param ellipsoid  The EPSG code for the ellipsoid.
+     */
+    private GeodeticObjects(final short geographic, final short datum, final 
short ellipsoid) {
+        this.geographic = geographic;
+        this.datum      = datum;
+        this.ellipsoid  = ellipsoid;
     }
 
     /**
@@ -272,10 +281,47 @@ public enum GeodeticObjects {
     }
 
     /**
-     * Returns the two-dimensional geographic CRS associated to this geodetic 
object.
-     * The coordinate system axes will be in (<var>latitude</var>, 
<var>longitude</var>) order
-     * oriented toward {@linkplain AxisDirection#NORTH North} and {@linkplain 
AxisDirection#EAST East}
-     * respectively, with units in degrees.
+     * Returns a two-dimensional geographic CRS with axes in the non-standard 
but computationally convenient
+     * (<var>longitude</var>, <var>latitude</var>) order. The coordinate 
system axes will be oriented toward
+     * {@linkplain AxisDirection#EAST East} and {@linkplain 
AxisDirection#NORTH North} respectively, with units
+     * in degrees. The following table summarizes the coordinate reference 
systems known to this class,
+     * together with an enumeration value that can be used for fetching that 
CRS:
+     *
+     * <blockquote><table class="sis">
+     *   <tr><th>Name or alias</th>            <th>Enum</th>            
<th>EPSG</th></tr>
+     *   <tr><td>ED50</td>                     <td>{@link #ED50}</td>   
<td></td></tr>
+     *   <tr><td>ETRS89</td>                   <td>{@link #ETRS89}</td> 
<td></td></tr>
+     *   <tr><td>NAD27</td>                    <td>{@link #NAD27}</td>  
<td></td></tr>
+     *   <tr><td>NAD83</td>                    <td>{@link #NAD83}</td>  
<td></td></tr>
+     *   <tr><td>GRS 1980 Authalic Sphere</td> <td>{@link #SPHERE}</td> 
<td></td></tr>
+     *   <tr><td>WGS 72</td>                   <td>{@link #WGS72}</td>  
<td></td></tr>
+     *   <tr><td>WGS 84</td>                   <td>{@link #WGS84}</td>  
<td></td></tr>
+     * </table></blockquote>
+     *
+     * @return The geographic CRS with non-standard (<var>longitude</var>, 
<var>latitude</var>) axis order.
+     *
+     * @see DefaultGeographicCRS#forConvention(AxesConvention)
+     * @see AxesConvention#NORMALIZED
+     */
+    public GeographicCRS normalizedGeographic() {
+        GeographicCRS object = normalized;
+        if (object == null) {
+            DefaultGeographicCRS crs = 
DefaultGeographicCRS.castOrCopy(geographic());
+            crs = crs.forConvention(AxesConvention.RIGHT_HANDED); // 
Equivalent to NORMALIZED in our cases, but faster.
+            synchronized (this) {
+                object = normalized;
+                if (object == null) {
+                    normalized = object = crs;
+                }
+            }
+        }
+        return object;
+    }
+
+    /**
+     * Returns the two-dimensional geographic CRS with axes in the standard 
(<var>latitude</var>, <var>longitude</var>)
+     * order. The coordinate system axes will be oriented toward {@linkplain 
AxisDirection#NORTH North} and
+     * {@linkplain AxisDirection#EAST East} respectively, with units in 
degrees.
      * The following table summarizes the coordinate reference systems known 
to this class,
      * together with an enumeration value that can be used for fetching that 
CRS:
      *
@@ -290,7 +336,7 @@ public enum GeodeticObjects {
      *   <tr><td>WGS 84</td>                   <td>{@link #WGS84}</td>  
<td>4326</td></tr>
      * </table></blockquote>
      *
-     * @return The geographic CRS associated to this constant.
+     * @return The geographic CRS with standard (<var>latitude</var>, 
<var>longitude</var>) axis order.
      *
      * @see org.apache.sis.referencing.crs.DefaultGeographicCRS
      * @see CRSAuthorityFactory#createGeographicCRS(String)
@@ -303,7 +349,7 @@ public enum GeodeticObjects {
                 if (object == null) {
                     final CRSAuthorityFactory factory = 
StandardObjects.crsFactory();
                     if (factory != null) try {
-                        cached = object = 
factory.createGeographicCRS(String.valueOf(crs));
+                        cached = object = 
factory.createGeographicCRS(String.valueOf(geographic));
                         return object;
                     } catch (FactoryException e) {
                         StandardObjects.failure(this, "geographic", e);
@@ -319,7 +365,8 @@ public enum GeodeticObjects {
                     } else {
                         cs = WGS84.geographic().getCoordinateSystem();
                     }
-                    object = StandardDefinitions.createGeographicCRS(crs, 
datum(), cs);
+                    object = 
StandardDefinitions.createGeographicCRS(geographic, datum(), cs);
+                    cached = object;
                 }
             }
         }

Modified: 
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java?rev=1558519&r1=1558518&r2=1558519&view=diff
==============================================================================
--- 
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java
 [UTF-8] (original)
+++ 
sis/branches/JDK7/core/sis-referencing/src/main/java/org/apache/sis/referencing/cs/AxesConvention.java
 [UTF-8] Wed Jan 15 19:06:04 2014
@@ -113,6 +113,8 @@ public enum AxesConvention {
      *
      * {@note The rules for normalized coordinate systems may be adjusted in 
future SIS versions based on experience
      *        gained. For more predictable results, consider using the 
<code>RIGHT_HANDED</code> enum instead.}
+     *
+     * @see org.apache.sis.referencing.GeodeticObjects#normalizedGeographic()
      */
     NORMALIZED,
 

Modified: 
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java?rev=1558519&r1=1558518&r2=1558519&view=diff
==============================================================================
--- 
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK7/core/sis-referencing/src/test/java/org/apache/sis/referencing/GeodeticObjectsTest.java
 [UTF-8] Wed Jan 15 19:06:04 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());
     }
 
     /**


Reply via email to