Author: desruisseaux
Date: Thu Mar  2 18:12:22 2017
New Revision: 1785180

URL: http://svn.apache.org/viewvc?rev=1785180&view=rev
Log:
Begin the transformation of "Encoder" inner class as a Location implementation.

Modified:
    
sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/AbstractLocation.java
    
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/package-info.java

Modified: 
sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/AbstractLocation.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/AbstractLocation.java?rev=1785180&r1=1785179&r2=1785180&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/AbstractLocation.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/AbstractLocation.java
 [UTF-8] Thu Mar  2 18:12:22 2017
@@ -22,11 +22,13 @@ import org.opengis.metadata.citation.Par
 import org.opengis.metadata.extent.TemporalExtent;
 import org.opengis.metadata.extent.GeographicExtent;
 import org.opengis.metadata.extent.GeographicBoundingBox;
+import org.opengis.geometry.Envelope;
 import org.opengis.geometry.coordinate.Position;
 import org.opengis.referencing.gazetteer.Location;
 import org.opengis.referencing.gazetteer.LocationType;
 import org.opengis.util.InternationalString;
 import org.apache.sis.util.iso.Types;
+import org.apache.sis.geometry.Envelope2D;
 import org.apache.sis.metadata.iso.extent.Extents;
 
 
@@ -48,6 +50,7 @@ import org.apache.sis.metadata.iso.exten
  * <ul>
  *   <li><b>temporal extent</b></li>
  *   <li><b>alternative geographic identifier</b></li>
+ *   <li><b>envelope</b> (an Apache SIS extension not in ISO 19112 
standard)</li>
  *   <li><b>position</b> (mandatory if the geographic identifier contains 
insufficient information to identify location)</li>
  *   <li><b>parent location instance</b></li>
  *   <li><b>child location instance</b></li>
@@ -60,6 +63,13 @@ import org.apache.sis.metadata.iso.exten
  */
 public abstract class AbstractLocation implements Location {
     /**
+     * The description of the nature of this geographic identifier, or {@code 
null} if unspecified.
+     *
+     * @see #getLocationType()
+     */
+    private final LocationType type;
+
+    /**
      * The geographic identifier, or {@code null} if unspecified.
      *
      * @see #getGeographicIdentifier()
@@ -70,9 +80,11 @@ public abstract class AbstractLocation i
      * Creates a new location for the given geographic identifier.
      * This constructor accepts a {@code null} argument, but this is not 
recommended.
      *
+     * @param type        the description of the nature of this geographic 
identifier.
      * @param identifier  the geographic identifier to be returned by {@link 
#getGeographicIdentifier()}.
      */
-    protected AbstractLocation(final CharSequence identifier) {
+    protected AbstractLocation(final LocationType type, final CharSequence 
identifier) {
+        this.type       = type;
         this.identifier = identifier;
     }
 
@@ -138,9 +150,26 @@ public abstract class AbstractLocation i
     }
 
     /**
+     * Returns an envelope that encompass the location. This property is 
partially redundant with
+     * {@link #getGeographicExtent()}, except that this method allows 
envelopes in non-geographic CRS.
+     *
+     * <p>The default implementation copies the {@link #getGeographicExtent()} 
in a new envelope associated
+     * to the {@linkplain 
org.apache.sis.referencing.CommonCRS#defaultGeographic() default geographic 
CRS}.</p>
+     *
+     * @return envelope that encompass the location, or {@code null} if none.
+     */
+    public Envelope getEnvelope() {
+        final GeographicExtent extent = getGeographicExtent();
+        return (extent instanceof GeographicBoundingBox) ? new 
Envelope2D((GeographicBoundingBox) extent) : null;
+    }
+
+    /**
      * Returns coordinates of a representative point for the location instance.
-     * The default implementation returns the centroid of the {@linkplain 
#getGeographicExtent() geographic extent}
-     * if that extent is geographic bounding box.
+     * This is often the centroid of the location instance, but not 
necessarily;
+     * another typical value is the lower-left corner.
+     *
+     * <p>The default implementation returns the centroid of the {@linkplain 
#getGeographicExtent()
+     * geographic extent} if that extent is geographic bounding box.</p>
      *
      * @return coordinates of a representative point for the location 
instance, or {@code null} if none.
      */
@@ -156,7 +185,9 @@ public abstract class AbstractLocation i
      * @return the nature of the identifier and its associated geographic 
location.
      */
     @Override
-    public abstract LocationType getLocationType();
+    public LocationType getLocationType() {
+        return type;
+    }
 
     /**
      * Returns the organization responsible for defining the characteristics 
of the location instance.

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=1785180&r1=1785179&r2=1785180&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] Thu Mar  2 18:12:22 2017
@@ -53,6 +53,7 @@ import org.apache.sis.util.resources.Voc
 import org.apache.sis.geometry.DirectPosition2D;
 import org.apache.sis.internal.system.Modules;
 import org.apache.sis.measure.Latitude;
+import org.opengis.geometry.coordinate.Position;
 
 // Branch-dependent imports
 import org.opengis.metadata.citation.Party;
@@ -239,6 +240,13 @@ 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;
@@ -341,6 +349,13 @@ public class MilitaryGridReferenceSystem
         }
 
         /**
+         * Returns the reference system for which MGRS references will be 
encoded or decoded.
+         */
+        final MilitaryGridReferenceSystem getReferenceSystem() {
+            return MilitaryGridReferenceSystem.this;
+        }
+
+        /**
          * Returns the precision of the references formatted by this coder.
          * This method returns one of the following values:
          *
@@ -421,14 +436,6 @@ public class MilitaryGridReferenceSystem
         }
 
         /**
-         * Bridge to {@link MilitaryGridReferenceSystem#polarOffset(boolean)}
-         * for the {@link Encoder} and {@link Decoder} classes.
-         */
-        final int polarOffset(final boolean south) throws TransformException {
-            return MilitaryGridReferenceSystem.this.polarOffset(south);
-        }
-
-        /**
          * Returns the encoder for the given coordinate reference system.
          *
          * @throws IllegalArgumentException if the given CRS do not use one of 
the supported datums.
@@ -747,7 +754,7 @@ public class MilitaryGridReferenceSystem
                         throw new 
GazetteerException(Errors.format(Errors.Keys.OutsideDomainOfValidity));
                     }
                     col  = columns[col];
-                    row -= owner.polarOffset(signedZone < 0);
+                    row -= owner.getReferenceSystem().polarOffset(signedZone < 
0);
                 }
                 row += 'A';
                 if (row >= EXCLUDE_I && ++row >= EXCLUDE_O) row++;
@@ -796,14 +803,15 @@ public class MilitaryGridReferenceSystem
 
 
     /**
-     * The result of decoding a MGRS reference.
+     * The result of decoding a MGRS reference. The {@linkplain #getPosition() 
position}
+     * represents the lower-left corner (not the centroid) of the decoded MGRS 
reference.
      *
      * @author  Martin Desruisseaux (Geomatys)
      * @since   0.8
      * @version 0.8
      * @module
      */
-    static final class Decoder {
+    static final class Decoder extends AbstractLocation {
         /**
          * Number of bits reserved for storing the minimal northing value of 
latitude bands in the
          * {@link #ROW_RESOLVER} table.
@@ -879,6 +887,8 @@ public class MilitaryGridReferenceSystem
          * The position decoded from the MGRS reference given to the 
constructor.
          * This is the lower-left corner of a cell of size {@link #sx} × 
{@link #sy}
          * The CRS of that position will be a UTM or UPS projected CRS.
+         *
+         * @see #getPosition()
          */
         private final DirectPosition2D position;
 
@@ -894,6 +904,7 @@ public class MilitaryGridReferenceSystem
          * @param owner  the {@code Coder} which is creating this {@code 
Decoder}.
          */
         Decoder(final Coder owner, final CharSequence reference) throws 
TransformException {
+            super(owner.getReferenceSystem().rootType(), reference);
             final int zone;                     // UTM zone, or 0 if UPS.
             final ProjectedCRS crs;             // UTM or UPS projection for 
the zone.
             boolean hasSquareIdentification;    // Whether a square 
identification is present (UTM only).
@@ -944,7 +955,7 @@ parse:                  switch (part) {
                             case 2: {
                                 if (c >= EXCLUDE_O) c--;
                                 if (c >= EXCLUDE_I) c--;
-                                row = (c - 'A') + owner.polarOffset(south);
+                                row = (c - 'A') + 
owner.getReferenceSystem().polarOffset(south);
                                 i = ni;
                                 continue;
                             }
@@ -1296,5 +1307,13 @@ parse:                  switch (part) {
             return φ < TransverseMercator.Zoner.SVALBARD_BOUNDS ? φ + 
LATITUDE_BAND_HEIGHT
                      : TransverseMercator.Zoner.NORTH_BOUNDS;
         }
+
+        /**
+         * Returns the lower-left corner of the decoded MGRS cell.
+         */
+        @Override
+        public Position getPosition() {
+            return position;
+        }
     }
 }

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=1785180&r1=1785179&r2=1785180&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] Thu Mar  2 18:12:22 2017
@@ -17,7 +17,7 @@
 package org.apache.sis.referencing.gazetteer;
 
 import java.util.Map;
-import java.util.Collection;
+import java.util.List;
 import java.util.Objects;
 import javax.xml.bind.annotation.XmlTransient;
 import org.opengis.util.InternationalString;
@@ -82,7 +82,7 @@ public class ReferencingByIdentifiers ex
      *
      * @see #getLocationTypes()
      */
-    private final Collection<LocationType> locationTypes;
+    private final List<LocationType> locationTypes;
 
     /**
      * Creates a reference system from the given properties.
@@ -208,7 +208,7 @@ public class ReferencingByIdentifiers ex
      */
     @Override
     @SuppressWarnings("ReturnOfCollectionOrArrayField")         // Because the 
collection is unmodifiable.
-    public Collection<LocationType> getLocationTypes() {
+    public List<LocationType> getLocationTypes() {
         return locationTypes;
     }
 

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=1785180&r1=1785179&r2=1785180&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] Thu Mar  2 18:12:22 2017
@@ -23,6 +23,14 @@
  * Gazetteers provide linking mechanism between referencing using geographic 
identifiers (this package)
  * and referencing using coordinates (…{@link org.apache.sis.referencing.crs 
.crs} package).
  *
+ * <div class="section">Extensions to ISO 19112</div>
+ * In addition to standard properties, the Apache SIS implementation provides 
the following extensions:
+ *
+ * <ul>
+ *   <li>{@link 
org.apache.sis.referencing.gazetteer.AbstractLocation#getEnvelope()} can 
provide envelopes
+ *       in non-geographic CRS.</li>
+ * </ul>
+ *
  * @author  Chris Mattmann (JPL)
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.8


Reply via email to