sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1786920 - in /sis/branches/JDK8: core/sis-referencing-by-identifiers/ core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gaze...
Date Tue, 14 Mar 2017 16:08:15 GMT
Author: desruisseaux
Date: Tue Mar 14 16:08:14 2017
New Revision: 1786920

URL: http://svn.apache.org/viewvc?rev=1786920&view=rev
Log:
Refactor GeohashCoder as a ReferenceSystemUsingGeographicIdentifiers and move it to the org.apache.sis.referencing.gazetteer package.

Added:
    sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java
      - copied, changed from r1786889, sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java
    sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystemTest.java
      - copied, changed from r1786919, sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/index/GeoHashCoderTest.java
Removed:
    sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/index/GeoHashCoderTest.java
Modified:
    sis/branches/JDK8/core/sis-referencing-by-identifiers/pom.xml
    sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
    sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java
    sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java
    sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java
    sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/test/suite/ReferencingByIdentifiersTestSuite.java
    sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java
    sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java

Modified: sis/branches/JDK8/core/sis-referencing-by-identifiers/pom.xml
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/pom.xml?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing-by-identifiers/pom.xml (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/pom.xml Tue Mar 14 16:08:14 2017
@@ -48,6 +48,18 @@ Implementations of Spatial Reference Sys
        =========================================================== -->
   <developers>
     <developer>
+      <name>Chris A. Mattmann</name>
+      <id>mattmann</id>
+      <email>mattmann@apache.org</email>
+      <url>http://sunset.usc.edu/~mattmann/</url>
+      <organization>NASA Jet Propulsion Laboratory</organization>
+      <organizationUrl>http://www.jpl.nasa.gov</organizationUrl>
+      <timezone>-8</timezone>
+      <roles>
+        <role>PMC emeritus</role>
+      </roles>
+    </developer>
+    <developer>
       <name>Martin Desruisseaux</name>
       <id>desruisseaux</id>
       <email>desruisseaux@apache.org</email>

Copied: sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java (from r1786889, sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java)
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java?p2=sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java&p1=sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java&r1=1786889&r2=1786920&rev=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystem.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -14,32 +14,46 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.index;
+package org.apache.sis.referencing.gazetteer;
 
-import java.io.Serializable;
-import java.text.ParseException;
-import org.opengis.geometry.DirectPosition;
+import javax.xml.bind.annotation.XmlTransient;
+import org.opengis.util.FactoryException;
+import org.opengis.referencing.crs.GeographicCRS;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
-import org.apache.sis.geometry.DirectPosition2D;
+import org.opengis.referencing.operation.CoordinateOperation;
+import org.opengis.referencing.operation.TransformException;
+import org.opengis.geometry.DirectPosition;
+import org.apache.sis.measure.Latitude;
+import org.apache.sis.measure.Longitude;
+import org.apache.sis.referencing.CRS;
 import org.apache.sis.referencing.CommonCRS;
+import org.apache.sis.referencing.cs.AxesConvention;
+import org.apache.sis.referencing.crs.DefaultGeographicCRS;
+import org.apache.sis.util.Utilities;
+import org.apache.sis.util.Workaround;
+import org.apache.sis.util.ComparisonMode;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.resources.Errors;
+import org.apache.sis.util.resources.Vocabulary;
+
+// Branch-dependent imports
+import org.opengis.referencing.gazetteer.Location;
+import org.opengis.referencing.gazetteer.LocationType;
 
 
 /**
- * Encodes geographic coordinates as <cite>geohashes</cite> strings, and decode such strings back to coordinates.
- * The current implementation is restricted to two-dimensional geographic coordinates, in the (<var>longitude</var>,
- * <var>latitude</var>) order with the longitudes ranging from -180° to 180° and the latitudes ranging from -90° to
- * 90°. The datum is unspecified.
+ * Geographic coordinates represented as <cite>geohashes</cite> strings.
  *
  * @author  Chris Mattmann (JPL)
- * @since   0.1
+ * @author  Martin Desruisseaux (Geomatys)
+ * @since   0.8
  * @version 0.8
  * @module
  *
- * @see <a href="http://en.wikipedia.org/wiki/Geohash">Wikipedia: Geohash</a>
+ * @see <a href="http://en.wikipedia.org/wiki/Geohash">Geohash on Wikipedia</a>
  */
-public class GeoHashCoder implements Serializable {
+@XmlTransient
+public class GeohashReferenceSystem extends ReferencingByIdentifiers {
     /**
      * For cross-version compatibility.
      */
@@ -68,8 +82,8 @@ public class GeoHashCoder implements Ser
         final int highestOneBit;
 
         /**
-         * Mapping from a numerical value to its symbol. The length of this array is the base of the encoding,
-         * e.g. 32 for {@link #BASE32}.
+         * Mapping from a numerical value to its symbol.
+         * The length of this array is the base of the encoding, e.g. 32 for {@link #BASE32}.
          */
         final byte[] encoding;
 
@@ -101,7 +115,7 @@ public class GeoHashCoder implements Ser
             decodingLowerCase = decoding;
             decodingUpperCase = decoding;
             /*
-             * Current version create a case-insensitive format.
+             * Current version creates a case-insensitive format.
              * However if we implement BASE36 in a future version,
              * then the two 'decoding' arrays will differ.
              */
@@ -109,214 +123,315 @@ public class GeoHashCoder implements Ser
     }
 
     /**
-     * The format used by the {@code GeoHashCoder}.
+     * The format used by the {@code GeohashReferenceSystem.Coder}.
      */
-    private Format format;
+    final Format format;
 
     /**
-     * Amount of letters or digits to format in the geohash.
-     * Stored as a {@code byte} on the assumption that attempts to create
-     * geohashes of more then 255 characters is likely to be an error anyway.
+     * The {@link #crs} with (<var>longitude</var>, <var>latitude</var>) axis order in degrees.
      */
-    private byte precision;
+    final DefaultGeographicCRS normalizedCRS;
 
     /**
-     * A buffer of length {@link #precision}, created when first needed.
+     * The coordinate operation from {@link #normalizedCRS} to the CRS specified by the user.
+     * The target CRS is the coordinate reference system to assign to the decoded positions.
      */
-    private transient char[] buffer;
+    final CoordinateOperation denormalize;
 
     /**
-     * The coordinate reference system to assign to the decoded direct positions,
-     * or {@code null} if none.
+     * Creates a new geohash reference system for the given format and coordinate reference system.
+     *
+     * @param  format  the format used by the {@code GeohashReferenceSystem.Coder}.
+     * @param  crs     the coordinate reference system. This is usually {@link CommonCRS#defaultGeographic()}.
+     * @throws GazetteerException if the reference system can not be created.
      */
-    private final CoordinateReferenceSystem crs;
+    public GeohashReferenceSystem(final Format format, final GeographicCRS crs) throws GazetteerException {
+        super(properties("Geohash", null), types());
+        ArgumentChecks.ensureNonNull("format", format);
+        ArgumentChecks.ensureNonNull("crs", crs);
+        ArgumentChecks.ensureDimensionMatches("crs", 2, crs);
+        this.format = format;
+        normalizedCRS = DefaultGeographicCRS.castOrCopy(crs).forConvention(AxesConvention.NORMALIZED);
+        try {
+            denormalize = CRS.findOperation(normalizedCRS, crs, null);
+        } catch (FactoryException e) {
+            throw new GazetteerException(e.getLocalizedMessage(), e);
+        }
+    }
 
     /**
-     * Creates a new geohash coder/decoder initialized to the default precision for {@link Format#BASE32}.
+     * Work around for RFE #4093999 in Sun's bug database
+     * ("Relax constraint on placement of this()/super() call in constructors").
      */
-    public GeoHashCoder() {
-        format = Format.BASE32;
-        precision = 12;
-        crs = CommonCRS.defaultGeographic();
+    @Workaround(library="JDK", version="1.8")
+    private static LocationType[] types() {
+        final ModifiableLocationType gzd = new ModifiableLocationType("Geohash");
+        gzd.addIdentification(Vocabulary.formatInternational(Vocabulary.Keys.Code));
+        return new LocationType[] {gzd};
     }
 
     /**
-     * Returns the current encoding/decoding format.
-     * The default value is {@link Format#BASE32}.
+     * Returns the encoding/decoding format.
      *
-     * @return the current format.
+     * @return the encoding/decoding format.
      */
     public Format getFormat() {
         return format;
     }
 
     /**
-     * Sets the encoding/decoding format.
+     * Returns a new object performing conversions between {@code DirectPosition} and geohashes.
+     * The returned object is <strong>not</strong> thread-safe; a new instance must be created
+     * for each thread, or synchronization must be applied by the caller.
      *
-     * @param  format  the new format.
+     * @return a new object performing conversions between {@link DirectPosition} and geohashes.
      */
-    public void setFormat(final Format format) {
-        ArgumentChecks.ensureNonNull("format", format);
-        this.format = format;
+    public Coder createCoder() {
+        return new Coder();
     }
 
     /**
-     * Returns the length of geohashes strings to be encoded by the {@link #encode(DirectPosition)} method.
-     * The default value is 12.
+     * Conversions between direct positions and geohashes. Each {@code Coder} instance can read codes
+     * at arbitrary precision, but formats at the {@linkplain #setHashLength specified precision}.
+     * The same {@code Coder} instance can be reused for reading or writing many geohashes.
      *
-     * @return the length of geohashes strings.
-     */
-    public int getPrecision() {
-        return precision;
-    }
-
-    /**
-     * Sets the length of geohashes strings to be encoded by the {@link #encode(DirectPosition)} method.
+     * <div class="section">Immutability and thread safety</div>
+     * This class is <strong>not</strong> thread-safe. A new instance must be created for each thread,
+     * or synchronization must be applied by the caller.
      *
-     * @param  precision  the new length of geohashes strings.
+     * @author  Chris Mattmann (JPL)
+     * @author  Martin Desruisseaux (Geomatys)
+     * @since   0.8
+     * @version 0.8
+     * @module
      */
-    public void setPrecision(final int precision) {
-        ArgumentChecks.ensureBetween("precision", 1, 255, precision);
-        this.precision = (byte) precision;
-        buffer = null;                                  // Will recreate a new buffer when first needed.
-    }
+    public class Coder {
+        /**
+         * Amount of letters or digits to format in the geohash.
+         * Stored as a {@code byte} on the assumption that attempts to create
+         * geohashes of more then 255 characters is likely to be an error anyway.
+         */
+        private byte length;
 
-    /**
-     * Encodes the given longitude and latitude into a geohash.
-     *
-     * @param  longitude  longitude to encode, as decimal degrees in the [-180 … 180]° range.
-     * @param  latitude   latitude to encode, as decimal degrees in the [-90 … 90]° range.
-     * @return Geohash encoding of the given longitude and latitude.
-     */
-    public String encode(final double longitude, final double latitude) {
-        final byte[] encoding = format.encoding;
-        final int highestOneBit = format.highestOneBit;
-        char[] geohash = buffer;
-        if (geohash == null) {
-            buffer = geohash = new char[Byte.toUnsignedInt(precision)];
-        }
-        /*
-         * The current implementation assumes a two-dimensional coordinates. The 'isEven' boolean takes
-         * the 'true' value for longitude, and 'false' for latitude. We could extend this algorithm to
-         * the multi-dimensional case by replacing 'isEven' by a counter over the ordinate dimension.
-         */
-        boolean isEven = true;
-        double xmin = -180, ymin = -90;
-        double xmax =  180, ymax =  90;
-        /*
-         * 'ch' is the index of the character to be added in the geohash. The actual character will be
-         * given by the 'encoding' array. 'bit' shall have a single one-bit, rotating from 10000 in the
-         * BASE32 case to 00001 (binary representation).
-         */
-        int ch = 0;
-        int bit = highestOneBit;
-        for (int i=0; i<geohash.length;) {
-            if (isEven) {
-                final double mid = (xmin + xmax) / 2;
-                if (longitude > mid) {
-                    ch |= bit;
-                    xmin = mid;
-                } else {
-                    xmax = mid;
-                }
-            } else {
-                final double mid = (ymin + ymax) / 2;
-                if (latitude > mid) {
-                    ch |= bit;
-                    ymin = mid;
-                } else {
-                    ymax = mid;
-                }
-            }
+        /**
+         * A buffer of length {@link #length}, created when first needed.
+         */
+        private transient char[] buffer;
 
-            isEven = !isEven;
+        /**
+         * Last coordinate operation used by {@link #encode(DirectPosition)}.
+         */
+        private transient CoordinateOperation lastOp;
 
-            bit >>>= 1;
-            if (bit == 0) {
-                geohash[i++] = (char) encoding[ch];
-                bit = highestOneBit;
-                ch = 0;
-            }
+        /**
+         * Temporary array for coordinate transformation, or {@code null} if not needed.
+         */
+        private transient final double[] coordinates;
+
+        /**
+         * Creates a new geohash coder/decoder initialized to the default precision.
+         */
+        protected Coder() {
+            length = 12;
+            coordinates = denormalize.getMathTransform().isIdentity() ? null : new double[4];
         }
-        return new String(geohash);
-    }
 
-    /**
-     * Encodes the given position into a geohash. The current implementation takes the first ordinate value as the
-     * longitude, the second ordinate value as the latitude, then delegates to {@link #encode(double, double)}.
-     *
-     * <p>The current implementation does not verify the Coordinate Reference System of the given position.
-     * However this may change in future SIS versions.</p>
-     *
-     * @param  position  the coordinate to encode.
-     * @return Geohash encoding of the given position.
-     */
-    public String encode(final DirectPosition position) {
-        ArgumentChecks.ensureDimensionMatches("position", 2, position);
-        return encode(position.getOrdinate(0), position.getOrdinate(1));
-    }
+        /**
+         * Returns the length of geohashes strings to be encoded by the {@link #encode(DirectPosition)} method.
+         * The default value for {@link Format#BASE32} is 12.
+         *
+         * @return the length of geohashes strings.
+         */
+        public int getHashLength() {
+            return length;
+        }
 
-    /**
-     * Decodes the given geohash into a longitude and a latitude.
-     *
-     * @param  geohash  geohash string to decode.
-     * @return a new position with the longitude at ordinate 0 and latitude at ordinate 1.
-     * @throws ParseException if an error occurred while parsing the given string.
-     */
-    public DirectPosition decode(final String geohash) throws ParseException {
-        final int length = geohash.length();
-        final int highestOneBit = format.highestOneBit;
-        final byte[] decodingLowerCase = format.decodingLowerCase;
-        final byte[] decodingUpperCase = format.decodingUpperCase;
-        /*
-         * The current implementation assumes a two-dimensional coordinates. The 'isEven' boolean takes
-         * the 'true' value for longitude, and 'false' for latitude. We could extend this algorithm to
-         * the multi-dimensional case by replacing 'isEven' by a counter over the ordinate dimension.
-         */
-        boolean isEven = true;
-        double xmin = -180, ymin = -90;
-        double xmax =  180, ymax =  90;
-
-        int nc;                                         // Number of characters for the 'c' code point.
-        for (int i=0; i<length; i+=nc) {
-            int c = geohash.codePointAt(i);
-            nc = Character.charCount(c);
-            if (c >= '0' && c <= '9') {
-                c -= '0';
-            } else {
-                if (c >= 'a' && c <= 'z') {
-                    c = decodingLowerCase[c - 'a'];
-                } else if (c >= 'A' && c <= 'Z') {
-                    c = decodingUpperCase[c - 'A'];
-                } else {
-                    c = 0;
-                }
-                if (c == 0) {
-                    throw new ParseException(Errors.format(Errors.Keys.UnparsableStringForClass_3,
-                            "GeoHash",geohash, geohash.substring(i, i+nc)), i);
-                }
+        /**
+         * Sets the length of geohashes strings to be encoded by the {@link #encode(DirectPosition)} method.
+         *
+         * @param  length  the new length of geohashes strings.
+         */
+        public void setHashLength(final int length) {
+            ArgumentChecks.ensureBetween("length", 1, 255, length);
+            this.length = (byte) length;
+            buffer = null;                                  // Will recreate a new buffer when first needed.
+        }
+
+        /**
+         * Encodes the given latitude and longitude into a geohash.
+         *
+         * @param  φ  latitude to encode,  as decimal degrees in the [-90 … 90]° range.
+         * @param  λ  longitude to encode, as decimal degrees in the [-180 … 180]° range.
+         * @return geohash encoding of the given longitude and latitude.
+         * @throws TransformException if an error occurred while transforming the given coordinate to a geohash reference.
+         */
+        public String encode(double φ, double λ) throws TransformException {
+            φ = Latitude.clamp(φ);
+            λ = Longitude.normalize(λ);
+            final byte[] encoding   = format.encoding;
+            final int highestOneBit = format.highestOneBit;
+            char[] geohash = buffer;
+            if (geohash == null) {
+                buffer = geohash = new char[Byte.toUnsignedInt(length)];
             }
-            int mask = highestOneBit;
-            do {
+            /*
+             * The current implementation assumes a two-dimensional coordinates. The 'isEven' boolean takes
+             * the 'true' value for longitude, and 'false' for latitude. We could extend this algorithm to
+             * the multi-dimensional case by replacing 'isEven' by a counter over the ordinate dimension.
+             */
+            boolean isEven = true;
+            double xmin = Longitude.MIN_VALUE, ymin = Latitude.MIN_VALUE;
+            double xmax = Longitude.MAX_VALUE, ymax = Latitude.MAX_VALUE;
+            /*
+             * 'ch' is the index of the character to be added in the geohash. The actual character will be
+             * given by the 'encoding' array. 'bit' shall have a single one-bit, rotating from 10000 in the
+             * BASE32 case to 00001 (binary representation).
+             */
+            int ch = 0;
+            int bit = highestOneBit;
+            for (int i=0; i < geohash.length;) {
                 if (isEven) {
                     final double mid = (xmin + xmax) / 2;
-                    if ((c & mask) != 0) {
+                    if (λ > mid) {
+                        ch |= bit;
                         xmin = mid;
                     } else {
                         xmax = mid;
                     }
                 } else {
                     final double mid = (ymin + ymax) / 2;
-                    if ((c & mask) != 0) {
+                    if (φ > mid) {
+                        ch |= bit;
                         ymin = mid;
                     } else {
                         ymax = mid;
                     }
                 }
                 isEven = !isEven;
-            } while ((mask >>>= 1) != 0);
+                bit >>>= 1;
+                if (bit == 0) {
+                    geohash[i++] = (char) encoding[ch];
+                    bit = highestOneBit;
+                    ch = 0;
+                }
+            }
+            return new String(geohash);
+        }
+
+        /**
+         * Encodes the given position into a geohash. The default implementation transforms the given position
+         * to the coordinate reference system expected by the enclosing {@link GeohashReferenceSystem}, then
+         * delegates to {@link #encode(double, double)}.
+         *
+         * @param  position  the coordinate to encode.
+         * @return geohash encoding of the given position.
+         * @throws TransformException if an error occurred while transforming the given coordinate to a geohash reference.
+         */
+        public String encode(DirectPosition position) throws TransformException {
+            ArgumentChecks.ensureNonNull("position", position);
+            final CoordinateReferenceSystem ps = position.getCoordinateReferenceSystem();
+            if (ps != null && !normalizedCRS.equals(ps, ComparisonMode.IGNORE_METADATA)) {
+                if (lastOp == null || !Utilities.equalsIgnoreMetadata(lastOp.getSourceCRS(), ps)) try {
+                    lastOp = CRS.findOperation(ps, normalizedCRS, null);
+                } catch (FactoryException e) {
+                    throw new GazetteerException(e.getLocalizedMessage(), e);
+                }
+                position = lastOp.getMathTransform().transform(position, null);
+            }
+            return encode(position.getOrdinate(1), position.getOrdinate(0));
+        }
+
+        /**
+         * Decodes the given geohash into a latitude and a longitude.
+         * The axis order depends on the coordinate reference system of the enclosing {@link GeohashReferenceSystem}.
+         *
+         * @param  geohash  geohash string to decode.
+         * @return a new geographic coordinate for the given geohash.
+         * @throws TransformException if an error occurred while parsing the given string.
+         */
+        public Location decode(final CharSequence geohash) throws TransformException {
+            ArgumentChecks.ensureNonEmpty("geohash", geohash);
+            return new Decoder(geohash, coordinates);
+        }
+    }
+
+    /**
+     * The result of decoding a geohash.
+     * The {@linkplain #getPosition() position} represents the centroid of the decoded geohash.
+     */
+    private final class Decoder extends SimpleLocation {
+        /**
+         * Decodes the given geohash.
+         *
+         * @param owner  the {@code Coder} which is creating this {@code Decoder}.
+         */
+        Decoder(final CharSequence geohash, final double[] coordinates) throws TransformException {
+            super(rootType(), geohash);
+            final int    length            = geohash.length();
+            final int    highestOneBit     = format.highestOneBit;
+            final byte[] decodingLowerCase = format.decodingLowerCase;
+            final byte[] decodingUpperCase = format.decodingUpperCase;
+            /*
+             * The current implementation assumes a two-dimensional coordinates. The 'isEven' boolean takes
+             * the 'true' value for longitude, and 'false' for latitude. We could extend this algorithm to
+             * the multi-dimensional case by replacing 'isEven' by a counter over the ordinate dimension.
+             */
+            boolean isEven = true;
+            minX = Longitude.MIN_VALUE;
+            maxX = Longitude.MAX_VALUE;
+            minY = Latitude .MIN_VALUE;
+            maxY = Latitude .MAX_VALUE;
+
+            int nc;                                         // Number of characters for the 'c' code point.
+            for (int i=0; i<length; i+=nc) {
+                int c = Character.codePointAt(geohash, i);
+                nc = Character.charCount(c);
+                if (c >= '0' && c <= '9') {
+                    c -= '0';
+                } else {
+                    if (c >= 'a' && c <= 'z') {
+                        c = decodingLowerCase[c - 'a'];
+                    } else if (c >= 'A' && c <= 'Z') {
+                        c = decodingUpperCase[c - 'A'];
+                    } else {
+                        c = 0;
+                    }
+                    if (c == 0) {
+                        throw new GazetteerException(Errors.format(Errors.Keys.UnparsableStringForClass_3,
+                                "GeoHash", geohash, geohash.subSequence(i, i+nc)));
+                    }
+                }
+                int mask = highestOneBit;
+                do {
+                    if (isEven) {
+                        final double mid = (minX + maxX) / 2;
+                        if ((c & mask) != 0) {
+                            minX = mid;
+                        } else {
+                            maxX = mid;
+                        }
+                    } else {
+                        final double mid = (minY + maxY) / 2;
+                        if ((c & mask) != 0) {
+                            minY = mid;
+                        } else {
+                            maxY = mid;
+                        }
+                    }
+                    isEven = !isEven;
+                } while ((mask >>>= 1) != 0);
+            }
+            if (coordinates != null) {
+                convert(denormalize.getMathTransform(), coordinates);
+            }
+        }
+
+        /**
+         * Returns the Coordinate Reference System of the decoded geohash.
+         */
+        @Override
+        public CoordinateReferenceSystem getCoordinateReferenceSystem() {
+            return denormalize.getTargetCRS();
         }
-        return new DirectPosition2D(crs, (xmin + xmax) / 2,
-                                         (ymin + ymax) / 2);
     }
 }

Modified: sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -18,11 +18,11 @@ package org.apache.sis.referencing.gazet
 
 import java.util.Arrays;
 import java.util.Map;
-import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.awt.geom.Rectangle2D;
+import javax.xml.bind.annotation.XmlTransient;
 import org.opengis.util.FactoryException;
 import org.opengis.geometry.Envelope;
 import org.opengis.geometry.DirectPosition;
@@ -45,7 +45,6 @@ import org.apache.sis.referencing.Identi
 import org.apache.sis.referencing.cs.AxesConvention;
 import org.apache.sis.referencing.crs.DefaultProjectedCRS;
 import org.apache.sis.internal.referencing.j2d.IntervalRectangle;
-import org.apache.sis.metadata.iso.extent.Extents;
 import org.apache.sis.metadata.sql.MetadataSource;
 import org.apache.sis.metadata.sql.MetadataStoreException;
 import org.apache.sis.math.MathFunctions;
@@ -140,6 +139,7 @@ import org.opengis.referencing.gazetteer
  * @see CommonCRS#universal(double, double)
  * @see <a href="https://en.wikipedia.org/wiki/Military_Grid_Reference_System">Military Grid Reference System on Wikipedia</a>
  */
+@XmlTransient
 public class MilitaryGridReferenceSystem extends ReferencingByIdentifiers {
     /**
      * For cross-version compatibility.
@@ -276,12 +276,7 @@ public class MilitaryGridReferenceSystem
             Logging.unexpectedException(Logging.getLogger(Modules.REFERENCING_BY_IDENTIFIERS),
                     MilitaryGridReferenceSystem.class, "<init>", e);
         }
-        final Map<String,Object> properties = new HashMap<>(6);
-        properties.put(NAME_KEY, new NamedIdentifier(null, "NATO", Resources.formatInternational(Resources.Keys.MGRS), null, null));
-        properties.put(DOMAIN_OF_VALIDITY_KEY, Extents.WORLD);
-        properties.put(THEME_KEY, Vocabulary.formatInternational(Vocabulary.Keys.Mapping));
-        properties.put(OVERALL_OWNER_KEY, party);
-        return properties;
+        return properties(new NamedIdentifier(null, "NATO", Resources.formatInternational(Resources.Keys.MGRS), null, null), party);
     }
 
     /**
@@ -301,13 +296,6 @@ public class MilitaryGridReferenceSystem
     }
 
     /**
-     * Returns the first location types, which should be the grid zone identifier.
-     */
-    final LocationType rootType() {
-        return super.getLocationTypes().get(0);     // Use super.… for protecting from method overriding.
-    }
-
-    /**
      * Returns the value to add to the row number in order to have the "A" letter on the southernmost or
      * northernmost value on Greenwich meridian of the Universal Polar Stereographic (UPS) projection.
      * If {@code south} is {@code true}, then this is computed from the northernmost value of UPS South;
@@ -435,6 +423,8 @@ public class MilitaryGridReferenceSystem
 
         /**
          * Returns the reference system for which MGRS references will be encoded or decoded.
+         *
+         * @return the enclosing reference system.
          */
         final MilitaryGridReferenceSystem getReferenceSystem() {
             return MilitaryGridReferenceSystem.this;
@@ -652,7 +642,7 @@ public class MilitaryGridReferenceSystem
          * @throws TransformException if an error occurred while parsing the given string.
          */
         public Location decode(final CharSequence reference) throws TransformException {
-            ArgumentChecks.ensureNonNull("reference", reference);
+            ArgumentChecks.ensureNonEmpty("reference", reference);
             return new Decoder(this, reference);
         }
 
@@ -1625,8 +1615,8 @@ public class MilitaryGridReferenceSystem
 
 
     /**
-     * The result of decoding a MGRS reference. The {@linkplain #getPosition() position}
-     * represents the lower-left corner (not the centroid) of the decoded MGRS reference.
+     * The result of decoding a MGRS reference.
+     * The {@linkplain #getPosition() position} represents the centroid of the decoded MGRS reference.
      *
      * @author  Martin Desruisseaux (Geomatys)
      * @since   0.8

Modified: sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -19,6 +19,7 @@ package org.apache.sis.referencing.gazet
 import java.util.Map;
 import java.util.List;
 import java.util.Objects;
+import java.util.HashMap;
 import javax.xml.bind.annotation.XmlTransient;
 import org.opengis.util.InternationalString;
 import org.apache.sis.referencing.AbstractReferenceSystem;
@@ -29,8 +30,10 @@ import org.apache.sis.util.iso.Types;
 import org.apache.sis.util.Debug;
 import org.apache.sis.io.wkt.Formatter;
 import org.apache.sis.io.wkt.ElementKind;
+import org.apache.sis.metadata.iso.extent.Extents;
 import org.apache.sis.internal.referencing.WKTUtilities;
 import org.apache.sis.io.wkt.FormattableObject;
+import org.apache.sis.util.resources.Vocabulary;
 
 // Branch-dependent imports
 import org.opengis.metadata.citation.Party;
@@ -164,6 +167,22 @@ public class ReferencingByIdentifiers ex
     }
 
     /**
+     * Convenience method for helping subclasses to build their argument for the constructor.
+     * The returned properties have the domain of validity set to the whole word and the theme to "mapping".
+     *
+     * @param name   the reference system name as an {@link org.opengis.metadata.Identifier} or a {@link String}.
+     * @param party  the overall owner, or {@code null} if none.
+     */
+    static Map<String,Object> properties(final Object name, final Party party) {
+        final Map<String,Object> properties = new HashMap<>(6);
+        properties.put(NAME_KEY, name);
+        properties.put(DOMAIN_OF_VALIDITY_KEY, Extents.WORLD);
+        properties.put(THEME_KEY, Vocabulary.formatInternational(Vocabulary.Keys.Mapping));
+        properties.put(OVERALL_OWNER_KEY, party);
+        return properties;
+    }
+
+    /**
      * Returns the GeoAPI interface implemented by this class.
      * The default implementation returns {@code ReferenceSystemUsingIdentifiers.class}.
      *
@@ -214,6 +233,13 @@ public class ReferencingByIdentifiers ex
     }
 
     /**
+     * Returns the first location type.
+     */
+    final LocationType rootType() {
+        return locationTypes.get(0);
+    }
+
+    /**
      * Compares this reference system with the specified object for equality.
      * If the {@code mode} argument value is {@link ComparisonMode#STRICT STRICT} or
      * {@link ComparisonMode#BY_CONTRACT BY_CONTRACT}, then all available properties are

Modified: sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -344,6 +344,42 @@ class SimpleLocation extends AbstractLoc
         }
 
         /**
+         * Returns the western-most coordinate of the limit of the dataset extent.
+         * The value is expressed in longitude in decimal degrees (positive east).
+         */
+        @Override
+        public final double getWestBoundLongitude() {
+            return westBoundLongitude;
+        }
+
+        /**
+         * Returns the eastern-most coordinate of the limit of the dataset extent.
+         * The value is expressed in longitude in decimal degrees (positive east).
+         */
+        @Override
+        public final double getEastBoundLongitude() {
+            return eastBoundLongitude;
+        }
+
+        /**
+         * Returns the southern-most coordinate of the limit of the dataset extent.
+         * The value is expressed in latitude in decimal degrees (positive north).
+         */
+        @Override
+        public final double getSouthBoundLatitude()  {
+            return southBoundLatitude;
+        }
+
+        /**
+         * Returns the northern-most, coordinate of the limit of the dataset extent.
+         * The value is expressed in latitude in decimal degrees (positive north).
+         */
+        @Override
+        public final double getNorthBoundLatitude()   {
+            return northBoundLatitude;
+        }
+
+        /**
          * Computes the geographic bounding box from the current values of {@link #minX}, {@link #minY}, {@link #maxX}
          * and {@link #maxY} fields. This method performs a work similar to the {@code Envelopes.transform(…)} methods
          * but using a much simpler (and faster) algorithm: this method projects only the 4 corners, without any check
@@ -430,41 +466,33 @@ class SimpleLocation extends AbstractLoc
             if (ymin > minY + ty) minY = ymin;
             if (ymax < maxY - ty) maxY = ymax;
         }
+    }
 
-        /**
-         * Returns the western-most coordinate of the limit of the dataset extent.
-         * The value is expressed in longitude in decimal degrees (positive east).
-         */
-        @Override
-        public final double getWestBoundLongitude() {
-            return westBoundLongitude;
-        }
-
-        /**
-         * Returns the eastern-most coordinate of the limit of the dataset extent.
-         * The value is expressed in longitude in decimal degrees (positive east).
-         */
-        @Override
-        public final double getEastBoundLongitude() {
-            return eastBoundLongitude;
-        }
-
-        /**
-         * Returns the southern-most coordinate of the limit of the dataset extent.
-         * The value is expressed in latitude in decimal degrees (positive north).
-         */
-        @Override
-        public final double getSouthBoundLatitude()  {
-            return southBoundLatitude;
-        }
-
-        /**
-         * Returns the northern-most, coordinate of the limit of the dataset extent.
-         * The value is expressed in latitude in decimal degrees (positive north).
-         */
-        @Override
-        public final double getNorthBoundLatitude()   {
-            return northBoundLatitude;
+    /**
+     * Converts the current envelope using the given math transform.
+     * The given transform usually performs nothing more than axis swapping or unit conversions.
+     *
+     * @param  mt      the math transform to use for conversion.
+     * @param  buffer  a temporary buffer of length 8 or more.
+     * @throws TransformException if an error occurred while converting the points.
+     */
+    final void convert(final MathTransform mt, final double[] buffer) throws TransformException {
+        buffer[3] = buffer[7] = maxY;
+        buffer[4] = buffer[6] = maxX;
+        buffer[1] = buffer[5] = minY;
+        buffer[0] = buffer[2] = minX;
+        minX = maxX = minY = maxY = Double.NaN;
+        mt.transform(buffer, 0, buffer, 0, 4);
+        for (int i=0; i<8;) {
+            final double x = buffer[i++];
+            final double y = buffer[i++];
+            if (Double.isNaN(x) || Double.isNaN(y)) {
+                throw new TransformException(Errors.format(Errors.Keys.CanNotTransformEnvelope));
+            }
+            if (!(x >= minX)) minX = x;     // Use '!' for accepting NaN.
+            if (!(x <= maxX)) maxX = x;
+            if (!(y >= minY)) minY = y;
+            if (!(y <= maxY)) maxY = y;
         }
     }
 }

Modified: sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/package-info.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -27,7 +27,7 @@
  *
  * <p>This package provides also implementations on top of above base classes.
  * Some implementation classes are {@link org.apache.sis.referencing.gazetteer.MilitaryGridReferenceSystem}
- * (also for civilian use).</p>
+ * (also for civilian use) and {@link org.apache.sis.referencing.gazetteer.GeohashReferenceSystem}.</p>
  *
  * @author  Chris Mattmann (JPL)
  * @author  Martin Desruisseaux (Geomatys)

Copied: sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystemTest.java (from r1786919, sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/index/GeoHashCoderTest.java)
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystemTest.java?p2=sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystemTest.java&p1=sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/index/GeoHashCoderTest.java&r1=1786919&r2=1786920&rev=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/index/GeoHashCoderTest.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/GeohashReferenceSystemTest.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -14,31 +14,48 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.sis.index;
+package org.apache.sis.referencing.gazetteer;
 
-import java.text.ParseException;
+import java.util.Locale;
+import org.opengis.referencing.operation.TransformException;
 import org.opengis.geometry.DirectPosition;
+import org.apache.sis.referencing.CommonCRS;
+import org.apache.sis.test.TestUtilities;
+import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
 
+// Branch-dependent imports
+import org.opengis.referencing.gazetteer.Location;
+import org.opengis.referencing.gazetteer.LocationType;
+
 
 /**
- * Tests methods from the {@link GeoHashCoder} class.
+ * Tests methods from the {@link GeohashReferenceSystem} class.
  *
  * @author  Ross Laidlaw
+ * @author  Martin Desruisseaux (Geomatys)
  * @since   0.1
- * @version 0.3
+ * @version 0.8
  * @module
  */
-public final strictfp class GeoHashCoderTest extends TestCase {
+@DependsOn(ReferencingByIdentifiersTest.class)
+public final strictfp class GeohashReferenceSystemTest extends TestCase {
     /**
      * Tolerance factor for floating point comparison.
      */
     private static final double TOLERANCE = 0.000001;
 
     /**
+     * Returns a reference system instance to test.
+     */
+    private static GeohashReferenceSystem instance() throws GazetteerException {
+        return new GeohashReferenceSystem(GeohashReferenceSystem.Format.BASE32, CommonCRS.defaultGeographic());
+    }
+
+    /**
      * A geographic coordinates together with the expected geohash.
      */
     private static final class Place {
@@ -69,28 +86,48 @@ public final strictfp class GeoHashCoder
     };
 
     /**
-     * Tests the {@link GeoHashCoder#encode(double, double)} method.
+     * Tests the {@link GeohashReferenceSystem#encode(double, double)} method.
+     *
+     * @throws TransformException if an exception occurred while formatting the geohash.
      */
     @Test
-    public void testEncode() {
-        final GeoHashCoder coder = new GeoHashCoder();
+    public void testEncode() throws TransformException {
+        final GeohashReferenceSystem.Coder coder = instance().createCoder();
         for (final Place place : PLACES) {
-            assertEquals(place.name, place.geohash, coder.encode(place.longitude, place.latitude));
+            assertEquals(place.name, place.geohash, coder.encode(place.latitude, place.longitude));
         }
     }
 
     /**
-     * Tests the {@link GeoHashCoder#decode(String)} method.
+     * Tests the {@link GeohashReferenceSystem#decode(String)} method.
      *
-     * @throws ParseException should never happen.
+     * @throws TransformException if an exception occurred while parsing the geohash.
      */
     @Test
-    public void testDecode() throws ParseException {
-        final GeoHashCoder coder = new GeoHashCoder();
+    public void testDecode() throws TransformException {
+        final GeohashReferenceSystem.Coder coder = instance().createCoder();
         for (final Place place : PLACES) {
-            final DirectPosition result = coder.decode(place.geohash);
+            final Location location = coder.decode(place.geohash);
+            final DirectPosition result = location.getPosition().getDirectPosition();
             assertEquals(place.name, place.longitude, result.getOrdinate(0), TOLERANCE);
             assertEquals(place.name, place.latitude,  result.getOrdinate(1), TOLERANCE);
         }
     }
+
+    /**
+     * Verifies the metadata.
+     *
+     * @throws GazetteerException if an error occurred while creating the instance.
+     */
+    @Test
+    public void verifyMetadata() throws GazetteerException {
+        final GeohashReferenceSystem rs = instance();
+        assertEquals("theme", "Mapping",      rs.getTheme().toString(Locale.ENGLISH));
+        assertEquals("theme", "Cartographie", rs.getTheme().toString(Locale.FRENCH));
+
+        final LocationType type = TestUtilities.getSingleton(rs.getLocationTypes());
+        assertEquals("type", "Geohash", type.getName().toString(Locale.ENGLISH));
+        assertEquals("parent",   0, type.getParents().size());
+        assertEquals("children", 0, type.getChildren().size());
+    }
 }

Modified: sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/test/suite/ReferencingByIdentifiersTestSuite.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/test/suite/ReferencingByIdentifiersTestSuite.java?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/test/suite/ReferencingByIdentifiersTestSuite.java [UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/test/suite/ReferencingByIdentifiersTestSuite.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -33,6 +33,7 @@ import org.junit.BeforeClass;
     org.apache.sis.referencing.gazetteer.LocationFormatTest.class,
     org.apache.sis.referencing.gazetteer.LocationTypeTest.class,
     org.apache.sis.referencing.gazetteer.ReferencingByIdentifiersTest.class,
+    org.apache.sis.referencing.gazetteer.GeohashReferenceSystemTest.class,
     org.apache.sis.referencing.gazetteer.MilitaryGridReferenceSystemTest.class
 })
 public final strictfp class ReferencingByIdentifiersTestSuite extends TestSuite {

Modified: sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java [UTF-8] (original)
+++ sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/index/GeoHashCoder.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -38,7 +38,11 @@ import org.apache.sis.util.resources.Err
  * @module
  *
  * @see <a href="http://en.wikipedia.org/wiki/Geohash">Wikipedia: Geohash</a>
+ *
+ * @deprecated Moved to {@link org.apache.sis.referencing.gazetteer.GeohashReferenceSystem}.
+ *             Note that axis order of {@code encode(double, double)} method differs.
  */
+@Deprecated
 public class GeoHashCoder implements Serializable {
     /**
      * For cross-version compatibility.
@@ -47,7 +51,10 @@ public class GeoHashCoder implements Ser
 
     /**
      * The encoding format used by {@link GeoHashCoder}.
+     *
+     * @deprecated Moved to {@link org.apache.sis.referencing.gazetteer.GeohashReferenceSystem.Format}.
      */
+    @Deprecated
     public static enum Format {
         /**
          * Format consisting of 32 symbols used at {@code http://geohash.org}. This encoding uses digits 0 to 9,

Modified: sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java?rev=1786920&r1=1786919&r2=1786920&view=diff
==============================================================================
--- sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java [UTF-8] (original)
+++ sis/branches/JDK8/storage/sis-storage/src/test/java/org/apache/sis/test/suite/StorageTestSuite.java [UTF-8] Tue Mar 14 16:08:14 2017
@@ -48,8 +48,7 @@ import org.junit.BeforeClass;
     org.apache.sis.internal.storage.wkt.StoreTest.class,
     org.apache.sis.internal.storage.csv.StoreProviderTest.class,
     org.apache.sis.internal.storage.csv.StoreTest.class,
-    org.apache.sis.storage.DataStoresTest.class,
-    org.apache.sis.index.GeoHashCoderTest.class
+    org.apache.sis.storage.DataStoresTest.class
 })
 public final strictfp class StorageTestSuite extends TestSuite {
     /**



Mime
View raw message