sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1783173 - in /sis/branches/JDK8: core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ core/sis-referencing/src/main/java/org/apache/sis/ref...
Date Thu, 16 Feb 2017 06:14:18 GMT
Author: desruisseaux
Date: Thu Feb 16 06:14:17 2017
New Revision: 1783173

URL: http://svn.apache.org/viewvc?rev=1783173&view=rev
Log:
Support Norway and Svalbard special cases at the source (in the UTM) methods rather than in
MGRS only.

Modified:
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MGRSEncoder.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java
    sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/TransverseMercatorTest.java
    sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MGRSEncoderTest.java
    sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java
    sis/branches/JDK8/src/main/javadoc/stylesheet.css

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -238,11 +238,16 @@ public class GeodeticObjectBuilder exten
      *   <tr><td>False northing</td>                 <td>0 (North
hemisphere) or 10000000 (South hemisphere) metres</td></tr>
      * </table></blockquote>
      *
+     * Note that calculation of UTM zone contains special cases for Norway and Svalbard.
+     * If not desired, those exceptions can be avoided by making sure that the given latitude
is below 56°N.
+     *
      * @param  isUTM      if {@code true}, the given central meridian will be snapped to
the central meridian of a UTM zone.
      * @param  latitude   the latitude in the center of the desired projection.
      * @param  longitude  the longitude in the center of the desired projection.
      * @return {@code this}, for method calls chaining.
      * @throws FactoryException if the operation method for the Transverse Mercator projection
can not be obtained.
+     *
+     * @see CommonCRS#UTM(double, double)
      */
     public GeodeticObjectBuilder setTransverseMercator(boolean isUTM, double latitude, double
longitude)
             throws FactoryException

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -31,6 +31,7 @@ import org.apache.sis.measure.Units;
 
 /**
  * The provider for <cite>"Polar Stereographic (Variant A)"</cite> projection
(EPSG:9810).
+ * Also used for the definition of Universal Polar Stereographic (UPS) projection.
  *
  * @author  Rueben Schulz (UBC)
  * @author  Martin Desruisseaux (Geomatys)

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -142,6 +142,7 @@ public final class TransverseMercator ex
     public static enum Zoner {
         /**
          * Computes zones for the Universal Transverse Mercator (UTM) projections.
+         * This computation includes special cases for Norway and Svalbard.
          *
          * <blockquote><table class="sis">
          *   <caption>Universal Transverse Mercator parameters</caption>
@@ -153,7 +154,24 @@ public final class TransverseMercator ex
          *   <tr><td>False northing</td>                 <td>0 (North
hemisphere) or 10000000 (South hemisphere) metres</td></tr>
          * </table></blockquote>
          */
-        UTM(Longitude.MIN_VALUE, 6, 0.9996, 500000, 10000000),
+        UTM(Longitude.MIN_VALUE, 6, 0.9996, 500000, 10000000) {
+            @Override public int zone(final double φ, final double λ) {
+                int zone = super.zone(φ, λ);
+                switch (zone) {
+                    /*
+                     * Between 56° and 64°, zone  32 is widened to 9° at the expense of
zone 31 to accommodate Norway.
+                     * Between 72° and 84°, zones 33 and 35 are widened to 12° to accommodate
Svalbard. To compensate,
+                     * zones 31 and 37 are widened to 9° and zones 32, 34, and 36 are eliminated.
+                     * In this switch statement, only the zones that are reduced or eliminated
needs to appear.
+                     */
+                    case 31: if (isNorway  (φ)) {if (λ >=  3) zone++;             }
break;   //  3° is zone 31 central meridian.
+                    case 32: if (isSvalbard(φ)) {if (λ >=  9) zone++; else zone--;}
break;   //  9° is zone 32 central meridian.
+                    case 34: if (isSvalbard(φ)) {if (λ >= 21) zone++; else zone--;}
break;   // 21° is zone 34 central meridian.
+                    case 36: if (isSvalbard(φ)) {if (λ >= 33) zone++; else zone--;}
break;   // 33° is zone 36 central meridian.
+                }
+                return zone;
+            }
+        },
 
         /**
          * Computes zones for the Modified Transverse Mercator (MTM) projections.
@@ -236,7 +254,7 @@ public final class TransverseMercator ex
                 final boolean zoned, double latitude, double longitude)
         {
             final boolean isSouth = MathFunctions.isNegative(latitude);
-            int zone = zone(longitude);
+            int zone = zone(latitude, longitude);
             if (zoned) {
                 latitude = 0;
                 longitude = centralMeridian(zone);
@@ -272,7 +290,7 @@ public final class TransverseMercator ex
                 final boolean isNorth = Numerics.epsilonEqual(v, 0, Formulas.LINEAR_TOLERANCE);
                 if (isNorth || Numerics.epsilonEqual(v, northing, Formulas.LINEAR_TOLERANCE))
{
                     v = group.parameter(Constants.CENTRAL_MERIDIAN).doubleValue(Units.DEGREE);
-                    int zone = zone(v);
+                    int zone = zone(0, v);
                     if (Numerics.epsilonEqual(centralMeridian(zone), v, Formulas.ANGULAR_TOLERANCE))
{
                         if (!isNorth) zone = -zone;
                         return zone;
@@ -285,16 +303,17 @@ public final class TransverseMercator ex
         /**
          * Computes the zone from a meridian in the zone.
          *
-         * @param  longitude  a meridian inside the desired zone, in degrees relative to
Greenwich.
-         *                    Positive longitudes are toward east, and negative longitudes
toward west.
+         * @param  φ  a latitude for which to get the zone. Used for taking in account the
special cases.
+         * @param  λ  a meridian inside the desired zone, in degrees relative to Greenwich.
+         *            Positive longitudes are toward east, and negative longitudes toward
west.
          * @return the zone number numbered from 1 inclusive, or 0 if the given central meridian
was NaN.
          */
-        public final int zone(double longitude) {
+        public int zone(final double φ, final double λ) {
             /*
              * Casts to int are equivalent to Math.floor(double) for positive values, which
is guaranteed
              * to be the case here since we normalize the central meridian to the [MIN_VALUE
… MAX_VALUE] range.
              */
-            double z = (longitude - origin) / width;                                    
 // Zone number with fractional part.
+            double z = (λ - origin) / width;                                           
  // Zone number with fractional part.
             z -= Math.floor(z / ((Longitude.MAX_VALUE - Longitude.MIN_VALUE) / width))  
 // Roll in the [0 … 60) range.
                               * ((Longitude.MAX_VALUE - Longitude.MIN_VALUE) / width);
             return (int) (z + 1);   // Cast only after addition in order to handle NaN as
documented.
@@ -309,5 +328,27 @@ public final class TransverseMercator ex
         public final double centralMeridian(final int zone) {
             return (zone - 0.5) * width + origin;
         }
+
+        /**
+         * First exception in UTM projection, corresponding to latitude band V.
+         * This method is public for {@code MGRSEncoderTest.verifyZonerConsistency()} purpose
only.
+         *
+         * @param  φ  the latitude in degrees to test.
+         * @return whether the given latitude is in the Norway latitude band.
+         */
+        public static boolean isNorway(final double φ) {
+            return (φ >= 56) && (φ < 64);
+        }
+
+        /**
+         * Second exception in UTM projection, corresponding to latitude band X.
+         * This method is public for {@code MGRSEncoderTest.verifyZonerConsistency()} purpose
only.
+         *
+         * @param  φ  the latitude in degrees to test.
+         * @return whether the given latitude is in the Svalbard latitude band.
+         */
+        public static boolean isSvalbard(final double φ) {
+            return (φ >= 72) && (φ < 84);
+        }
     }
 }

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -431,13 +431,15 @@ public enum CommonCRS {
      *       or an instance of {@link org.opengis.referencing.crs.CompoundCRS}
      *       with an {@linkplain CRS#getHorizontalComponent horizontal component}.</li>
      *   <li>The {@code crs} or the horizontal component of {@code crs} is associated
to a {@link GeodeticDatum}.</li>
-     *   <li>The geodetic datum has the same EPSG code than one of the {@code CommonCRS} enumeration
values,
-     *       or has no EPSG code but is {@linkplain Utilities#equalsIgnoreMetadata equal,
ignoring metadata},
+     *   <li>The geodetic datum either<ul>
+     *     <li>has the same EPSG code than one of the {@code CommonCRS} enumeration
values, or</li>
+     *     <li>has no EPSG code but is {@linkplain Utilities#equalsIgnoreMetadata equal,
ignoring metadata},
      *       to the {@link #datum()} value of one of the {@code CommonCRS} enumeration values.</li>
+     *   </ul></li>
      * </ul>
      *
      * This method is useful for easier creation of various coordinate reference systems
through the
-     * {@link #geographic()}, {@link #geocentric()} and other convenience methods when the
set of datum
+     * {@link #geographic()}, {@link #geocentric()} or other convenience methods when the
set of datums
      * supported by {@code CommonCRS} is known to be sufficient.
      *
      * @param  crs  the coordinate reference system for which to get a {@code CommonCRS}
value.
@@ -959,16 +961,29 @@ public enum CommonCRS {
      * There is a total of 120 UTM zones, with 60 zones in the North hemisphere and 60 zones
in the South hemisphere.
      * The projection zone is determined from the arguments as below:
      *
-     * <ul>
+     * <ul class="verbose">
      *   <li>The sign of the <var>latitude</var> argument determines the
hemisphere:
      *       North for positive latitudes (including positive zero) or
      *       South for negative latitudes (including negative zero).
-     *       The latitude magnitude is ignored, except for ensuring that the latitude is
inside the [-90 … 90]° range.</li>
+     *       The latitude magnitude is ignored, except for the special cases documented below
+     *       and for ensuring that the latitude is inside the [-90 … 90]° range.</li>
      *   <li>The value of the <var>longitude</var> argument determines
the 6°-width zone,
      *       numbered from 1 for the zone starting at 180°W up to 60 for the zone finishing
at 180°E.
      *       Longitudes outside the [-180 … 180]° range will be rolled as needed before
to compute the zone.</li>
+     *   <li>Calculation of UTM zone involves two special cases:
+     *     <ul>
+     *       <li>Between 56°N and 64°N, zone 32 is widened to 9° (at the expense
of zone 31)
+     *           to accommodate southwest Norway.</li>
+     *       <li>Between 72°N and 84°N, zones 33 and 35 are widened to 12° to accommodate
Svalbard.
+     *           To compensate for these 12° wide zones, zones 31 and 37 are widened to
9° and
+     *           zones 32, 34, and 36 are eliminated.</li>
+     *     </ul>
+     *   </li>
      * </ul>
      *
+     * If the special cases for Norway and Svalbard are not desired, they can be avoided
by making sure
+     * that the given latitude is below 56°N.
+     *
      * <div class="note"><b>Warning:</b>
      * be aware of parameter order! For this method, latitude is first.
      * This order is for consistency with the non-normalized {@linkplain #geographic() geographic}
CRS
@@ -998,7 +1013,7 @@ public enum CommonCRS {
         ArgumentChecks.ensureBetween("latitude",   Latitude.MIN_VALUE,     Latitude.MAX_VALUE,
    latitude);
         ArgumentChecks.ensureBetween("longitude", -Formulas.LONGITUDE_MAX, Formulas.LONGITUDE_MAX,
longitude);
         final boolean isSouth = MathFunctions.isNegative(latitude);
-        final int zone = TransverseMercator.Zoner.UTM.zone(longitude);
+        final int zone = TransverseMercator.Zoner.UTM.zone(latitude, longitude);
         final Integer key = isSouth ? -zone : zone;
         ProjectedCRS crs;
         synchronized (cachedUTM) {

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/factory/CommonAuthorityFactory.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -587,7 +587,7 @@ public class CommonAuthorityFactory exte
              * 42005: WGS 84 / Auto Mollweide         —   defined by "Central_Meridian"
only.
              */
             case 42001: isUTM  = true; break;
-            case 42002: isUTM  = (latitude == 0) && (UTM.centralMeridian(UTM.zone(longitude))
== longitude); break;
+            case 42002: isUTM  = (latitude == 0) && (UTM.centralMeridian(UTM.zone(0,
longitude)) == longitude); break;
             case 42003: method = "Orthographic";       param = Constants.LATITUDE_OF_ORIGIN;
 break;
             case 42004: method = "Equirectangular";    param = Constants.STANDARD_PARALLEL_1;
break;
             case 42005: method = "Mollweide";                                           
     break;

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MGRSEncoder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MGRSEncoder.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MGRSEncoder.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MGRSEncoder.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -63,12 +63,12 @@ final class MGRSEncoder {
     /**
      * Southernmost bound of the first latitude band ({@code 'C'}).
      */
-    private static final double UTM_SOUTH_BOUNDS = -80;
+    static final double UTM_SOUTH_BOUNDS = -80;
 
     /**
      * Northernmost bound of the last latitude band ({@code 'X'}).
      */
-    private static final double UTM_NORTH_BOUNDS = 84;
+    static final double UTM_NORTH_BOUNDS = 84;
 
     /**
      * Special {@link #crsZone} value for the UPS South (Universal Polar Stereographic) projection.
@@ -253,47 +253,6 @@ final class MGRSEncoder {
     }
 
     /**
-     * Computes the UTM zone for the given longitude and latitude band.
-     * Those zones are normally the same than UTM, except for Norway and
-     * Svalbard which have special rules.
-     *
-     * @param  band  the latitude band computed by {@link #latitudeBand(double)}.
-     * @param  λ     the longitude for which to compute the UTM zone.
-     * @return the UTM zone for the given longitude, or 0 if the given longitude is NaN or
infinite.
-     */
-    static int zone(final double λ, final char band) {
-        int zone = TransverseMercator.Zoner.UTM.zone(λ);
-        switch (band) {
-            /*
-             * Zone 32 has been widened to 9° (at the expense of zone 31)
-             * between latitudes 56° and 64° to accommodate southwest Norway.
-             */
-            case 'V': {
-                if (zone == 31 && λ >= 3) zone++;           // 3° is the central
meridian of zone 31.
-                break;
-            }
-            /*
-             * Between 72° and 84°, zones 33 and 35 have been widened to 12° to accommodate
Svalbard.
-             * To compensate for these 12° wide zones, zones 31 and 37 are widened to 9°
and zones 32,
-             * 34, and 36 are eliminated.
-             */
-            case 'X': {
-                switch (zone) {
-                    case 32: if (λ >=  9) zone++; else zone--; break;   //  9° is zone
32 central meridian.
-                    case 34: if (λ >= 21) zone++; else zone--; break;   // 21° is zone
34 central meridian.
-                    case 36: if (λ >= 33) zone++; else zone--; break;   // 33° is zone
36 central meridian.
-                }
-                break;
-            }
-        }
-        if (zone == 0) {
-            throw new IllegalArgumentException(Errors.format(Errors.Keys.NotANumber_1, "λ"));
-        }
-        assert zone >= 1 && zone <= 60 : zone;
-        return zone;
-    }
-
-    /**
      * Encodes the given position into a MGRS label. It is caller responsibility to ensure
that the
      * position CRS is the same than the CRS specified at this {@code MGRSEncoder} creation
time.
      *
@@ -317,20 +276,23 @@ final class MGRSEncoder {
             /*
              * Universal Transverse Mercator (UTM) case.
              */
-            final char band = latitudeBand(φ);
-            final int  zone = zone(geographic.getOrdinate(1), band);
-            final int  sz   = MathFunctions.isNegative(φ) ? -zone : zone;       // Never
zero.
+            final double λ = geographic.getOrdinate(1);
+            final int zone = TransverseMercator.Zoner.UTM.zone(φ, λ);
+            final int sz   = MathFunctions.isNegative(φ) ? -zone : zone;
+            if (sz == 0) {
+                // Zero value at this point is the result of NaN of infinite ordinate value.
+                throw new GazetteerException(Errors.format(Errors.Keys.NotANumber_1, "longitude"));
+            }
             if (sz != crsZone) {
                 if (sz != actualZone) {
-                    double cm    = TransverseMercator.Zoner.UTM.centralMeridian(zone);
-                    actualZone   = 0;   // In case an exception is thrown on the next line.
-                    toActualZone = CRS.findOperation(datum.geographic(), datum.UTM(φ, cm),
null).getMathTransform();
+                    actualZone   = 0;                           // In case an exception is
thrown on the next line.
+                    toActualZone = CRS.findOperation(datum.geographic(), datum.UTM(φ, λ),
null).getMathTransform();
                     actualZone   = sz;
                 }
                 owner.normalized = position = toActualZone.transform(geographic, owner.normalized);
             }
             buffer.setLength(0);
-            buffer.append(zone).append(separator).append(band);
+            buffer.append(zone).append(separator).append(latitudeBand(φ));
             if (digits >= 0) {
                 /*
                  * Specification said that 100,000-meters columns are lettered from A through
Z (omitting I and O)

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -33,13 +33,14 @@ import org.apache.sis.util.resources.Err
 /**
  * The Military Grid Reference System (MGRS).
  * The MGRS is the geocoordinate standard used by NATO militaries for locating points on
the earth.
- * It is based on the Universal Transverse Mercator (UTM) and the polar stereographic projections.
- * Despite its name, MGRS is not used only for military purposes; it is used also for organizing
- * Earth Observation data in a directory tree on some cloud storages for example.
+ * It is based on the Universal Transverse Mercator (UTM) and the Universal Polar Stereographic
(UPS) projections.
+ * Despite its name, MGRS is used not only for military purposes; it is used also for organizing
Earth Observation
+ * data in directory trees for example.
  *
  * <div class="section">Immutability and thread safety</div>
- * This class is immutable and thus thread-safe. However the {@code Coder} performing conversions
- * between labels and coordinates are not thread-safe; a new instance must be created for
each thread.
+ * This class is immutable and thus thread-safe.
+ * However the {@link Coder Coder} instances performing conversions between labels and coordinates
are not thread-safe;
+ * it is recommended to create a new {@code Coder} instance for each thread.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.8
@@ -143,13 +144,13 @@ public class MilitaryGridReferenceSystem
          * <table class="sis">
          *   <caption>MGRS label precisions</caption>
          *   <tr><th>Precision (m)</th>             <th>Label example</th></tr>
-         *   <tr><td style="text-align:right">1</td> <td>4QFJ 12345
67890</td></tr>
-         *   <tr><td style="text-align:right">10</td> <td>4QFJ 1234
6789</td></tr>
-         *   <tr><td style="text-align:right">100</td> <td>4QFJ 123
678</td></tr>
-         *   <tr><td style="text-align:right">1000</td> <td>4QFJ
12 67</td></tr>
-         *   <tr><td style="text-align:right">10 000</td> <td>4QFJ
1 6</td></tr>
-         *   <tr><td style="text-align:right">100 000</td> <td>4QFJ</td></tr>
-         *   <tr><td style="text-align:right">(approximative) 1 000 000</td>
<td>4Q</td></tr>
+         *   <tr><td style="text-align:right">1</td> <td>4 Q FJ 12345 67890</td></tr>
+         *   <tr><td style="text-align:right">10</td> <td>4 Q FJ 1234 6789</td></tr>
+         *   <tr><td style="text-align:right">100</td> <td>4 Q FJ 123 678</td></tr>
+         *   <tr><td style="text-align:right">1000</td> <td>4 Q FJ 12 67</td></tr>
+         *   <tr><td style="text-align:right">10 000</td> <td>4 Q FJ 1 6</td></tr>
+         *   <tr><td style="text-align:right">100 000</td> <td>4 Q FJ</td></tr>
+         *   <tr><td style="text-align:right">(approximative) 1 000 000</td>
<td>4 Q</td></tr>
          * </table>
          *
          * Values smaller than 1 (e.g. 0.01 for a centimetre precision) may also be returned

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -21,7 +21,7 @@
  * Geographic identifiers are location descriptors such as addresses and grid indexes.
  * Their reference systems are defined by <cite>Spatial referencing by geographic identifiers</cite>
(ISO 19112).
  * Gazetteers provide linking mechanism between referencing using geographic identifiers
(this package)
- * and referencing using coordinates ({@link org.apache.sis.referencing.crs} package).
+ * and referencing using coordinates (…{@link org.apache.sis.referencing.crs .crs} package).
  *
  * @author  Chris Mattmann (JPL)
  * @author  Martin Desruisseaux (Geomatys)

Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/TransverseMercatorTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/TransverseMercatorTest.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/TransverseMercatorTest.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/TransverseMercatorTest.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -37,13 +37,18 @@ import static org.junit.Assert.*;
  */
 public final strictfp class TransverseMercatorTest extends TestCase {
     /**
-     * Tests {@link TransverseMercator.Zoner#zone(double)}.
+     * Tests {@link TransverseMercator.Zoner#zone(double)},
+     * including the special cases for Norway and Svalbard.
      */
     @Test
     public void testZone() {
-        assertEquals(1,  TransverseMercator.Zoner.UTM.zone(-180));
-        assertEquals(10, TransverseMercator.Zoner.UTM.zone(-123));
-        assertEquals(60, TransverseMercator.Zoner.UTM.zone(179.9));
+        assertEquals("180°E",        1, TransverseMercator.Zoner.UTM.zone( 0, -180  ));
+        assertEquals("123°E",       10, TransverseMercator.Zoner.UTM.zone( 0, -123  ));
+        assertEquals("179.9°W",     60, TransverseMercator.Zoner.UTM.zone( 0,  179.9));
+        assertEquals( "4°E band T", 31, TransverseMercator.Zoner.UTM.zone(45,    4  ));
+        assertEquals( "4°E band V", 32, TransverseMercator.Zoner.UTM.zone(56,    4  ));
+        assertEquals("20°E band W", 34, TransverseMercator.Zoner.UTM.zone(71,   20  ));
+        assertEquals("20°E band X", 33, TransverseMercator.Zoner.UTM.zone(72,   20  ));
     }
 
     /**

Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MGRSEncoderTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MGRSEncoderTest.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MGRSEncoderTest.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MGRSEncoderTest.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.sis.referencing.gazetteer;
 
+import org.apache.sis.internal.referencing.provider.TransverseMercator.Zoner;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
@@ -47,6 +48,7 @@ public final strictfp class MGRSEncoderT
     @Test
     public void testLatitudeBand() {
         assertEquals("80°S", 'C', MGRSEncoder.latitudeBand(-80));
+        assertEquals("45°N", 'T', MGRSEncoder.latitudeBand( 45));
         assertEquals("55°N", 'U', MGRSEncoder.latitudeBand( 55));
         assertEquals("56°N", 'V', MGRSEncoder.latitudeBand( 56));
         assertEquals("63°N", 'V', MGRSEncoder.latitudeBand( 63));
@@ -57,13 +59,17 @@ public final strictfp class MGRSEncoderT
     }
 
     /**
-     * Tests {@link MGRSEncoder#zone(double, char)}.
+     * Verifies that {@link Zoner#isNorway(double)} and {@link Zoner#isSvalbard(double)}
+     * are consistent with the latitude bands.
      */
     @Test
-    public void testZone() {
-        assertEquals( "4°E band T", 31, MGRSEncoder.zone( 4, 'T'));
-        assertEquals( "4°E band V", 32, MGRSEncoder.zone( 4, 'V'));
-        assertEquals("20°E band W", 34, MGRSEncoder.zone(20, 'W'));
-        assertEquals("20°E band X", 33, MGRSEncoder.zone(20, 'X'));
+    public void verifyZonerConsistency() {
+        for (double φ = MGRSEncoder.UTM_SOUTH_BOUNDS; φ < MGRSEncoder.UTM_NORTH_BOUNDS;
φ++) {
+            final String latitude = String.valueOf(φ);
+            final char band = MGRSEncoder.latitudeBand(φ);
+            assertTrue  (latitude, band >= 'C' && band <= 'X');
+            assertEquals(latitude, band == 'V', Zoner.isNorway(φ));
+            assertEquals(latitude, band == 'X', Zoner.isSvalbard(φ));
+        }
     }
 }

Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java
[UTF-8] Thu Feb 16 06:14:17 2017
@@ -76,8 +76,9 @@ public final strictfp class MilitaryGrid
         assertEquals("32GNV8410260761", coder.encode(position));
         /*
          * 82°N 10°E (UTM zone 32) — in this special case, zone 32 is replaced by zone
33.
+         * Call to WGS84.UTM(φ,λ) needs to specify a smaller latitude for getting zone
32.
          */
-        position.setCoordinateReferenceSystem(CommonCRS.WGS84.UTM(82, 10));
+        position.setCoordinateReferenceSystem(CommonCRS.WGS84.UTM(40, 10));
         position.x =  515537;
         position.y = 9104963;
         assertEquals("33XVM2240708183", coder.encode(position));

Modified: sis/branches/JDK8/src/main/javadoc/stylesheet.css
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/src/main/javadoc/stylesheet.css?rev=1783173&r1=1783172&r2=1783173&view=diff
==============================================================================
--- sis/branches/JDK8/src/main/javadoc/stylesheet.css (original)
+++ sis/branches/JDK8/src/main/javadoc/stylesheet.css Thu Feb 16 06:14:17 2017
@@ -168,7 +168,7 @@ div.description div.section {
 
 /*
  * Bullet and ordered lists. Put some space before and after the list.
- * Listes of the "verbose" class also have some space betweem items.
+ * Lists of the "verbose" class also have some space betweem items.
  */
 div.block ul,
 div.block ol {



Mime
View raw message