You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2017/03/07 23:37:50 UTC
svn commit: r1785905 [2/5] - in /sis/trunk: ./
application/sis-console/src/main/java/org/apache/sis/console/ core/
core/sis-feature/src/main/java/org/apache/sis/feature/
core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/
core/sis-metadat...
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/FinalLocationType.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/FinalLocationType.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/FinalLocationType.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/FinalLocationType.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -29,9 +29,7 @@ import org.apache.sis.metadata.Modifiabl
import org.apache.sis.util.ArgumentChecks;
// Branch-dependent imports
-import org.opengis.metadata.citation.Party;
-import org.opengis.referencing.gazetteer.LocationType;
-import org.opengis.referencing.gazetteer.ReferenceSystemUsingIdentifiers;
+import org.apache.sis.metadata.iso.citation.AbstractParty;
/**
@@ -74,7 +72,7 @@ final class FinalLocationType extends Ab
/**
* The reference system that comprises this location type.
*/
- private final ReferenceSystemUsingIdentifiers referenceSystem;
+ private final ReferencingByIdentifiers referenceSystem;
/**
* Geographic area within which the location type occurs.
@@ -84,19 +82,19 @@ final class FinalLocationType extends Ab
/**
* Name of organization or class of organization able to create and destroy location instances.
*/
- private final Party owner;
+ private final AbstractParty owner;
/**
* Parent location types (location types of which this location type is a sub-division).
* This list is unmodifiable.
*/
- private final List<LocationType> parents;
+ private final List<AbstractLocationType> parents;
/**
* Child location types (location types which sub-divides this location type).
* This list is unmodifiable.
*/
- final List<LocationType> children;
+ final List<AbstractLocationType> children;
/**
* Creates a copy of the given location type with the reference system set to the given value.
@@ -106,8 +104,8 @@ final class FinalLocationType extends Ab
* @param existing other {@code FinalLocationType} instances created before this one.
*/
@SuppressWarnings("ThisEscapedInObjectConstruction")
- private FinalLocationType(final LocationType source, final ReferenceSystemUsingIdentifiers rs,
- final Map<LocationType, FinalLocationType> existing)
+ private FinalLocationType(final AbstractLocationType source, final ReferencingByIdentifiers rs,
+ final Map<AbstractLocationType, FinalLocationType> existing)
{
/*
* Put 'this' in the map at the beginning in case the parents and children contain cyclic references.
@@ -125,7 +123,7 @@ final class FinalLocationType extends Ab
*/
InternationalString theme;
GeographicExtent territoryOfUse;
- Party owner;
+ AbstractParty owner;
/*
* Copy the value from the source location type, make them unmodifiable,
* fallback on the ReferenceSystemUsingIdentifiers if necessary.
@@ -135,7 +133,7 @@ final class FinalLocationType extends Ab
identifications = snapshot(source.getIdentifications());
definition = source.getDefinition();
territoryOfUse = (GeographicExtent) unmodifiable(source.getTerritoryOfUse());
- owner = (Party) unmodifiable(source.getOwner());
+ owner = (AbstractParty) unmodifiable(source.getOwner());
parents = snapshot(source.getParents(), rs, existing);
children = snapshot(source.getChildren(), rs, existing);
referenceSystem = rs;
@@ -162,12 +160,12 @@ final class FinalLocationType extends Ab
* @param rs the reference system to assign to the new location types.
* @param existing an initially empty identity hash map for internal usage by this method.
*/
- static List<LocationType> snapshot(final Collection<? extends LocationType> types,
- final ReferenceSystemUsingIdentifiers rs, final Map<LocationType, FinalLocationType> existing)
+ static List<AbstractLocationType> snapshot(final Collection<? extends AbstractLocationType> types,
+ final ReferencingByIdentifiers rs, final Map<AbstractLocationType, FinalLocationType> existing)
{
- final LocationType[] array = types.toArray(new LocationType[types.size()]);
+ final AbstractLocationType[] array = types.toArray(new AbstractLocationType[types.size()]);
for (int i=0; i < array.length; i++) {
- final LocationType source = array[i];
+ final AbstractLocationType source = array[i];
ArgumentChecks.ensureNonNullElement("types", i, source);
FinalLocationType copy = existing.get(source);
if (copy == null) {
@@ -280,7 +278,7 @@ final class FinalLocationType extends Ab
* @return the reference system that comprises this location type.
*/
@Override
- public ReferenceSystemUsingIdentifiers getReferenceSystem() {
+ public ReferencingByIdentifiers getReferenceSystem() {
return referenceSystem;
}
@@ -290,7 +288,7 @@ final class FinalLocationType extends Ab
* @return organization or class of organization able to create and destroy location instances.
*/
@Override
- public Party getOwner() {
+ public AbstractParty getOwner() {
return owner;
}
@@ -303,7 +301,7 @@ final class FinalLocationType extends Ab
*/
@Override
@SuppressWarnings("ReturnOfCollectionOrArrayField") // Because unmodifiable
- public Collection<LocationType> getParents() {
+ public Collection<AbstractLocationType> getParents() {
return parents;
}
@@ -314,7 +312,7 @@ final class FinalLocationType extends Ab
*/
@Override
@SuppressWarnings("ReturnOfCollectionOrArrayField") // Because unmodifiable
- public Collection<LocationType> getChildren() {
+ public Collection<AbstractLocationType> getChildren() {
return children;
}
}
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/LocationFormat.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/LocationFormat.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/LocationFormat.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/LocationFormat.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -30,15 +30,12 @@ import java.text.ParsePosition;
import javax.measure.Unit;
import org.opengis.util.FactoryException;
import org.opengis.util.InternationalString;
-import org.opengis.referencing.gazetteer.Location;
-import org.opengis.referencing.gazetteer.LocationType;
import org.opengis.referencing.operation.TransformException;
import org.opengis.referencing.cs.CoordinateSystem;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.metadata.extent.GeographicBoundingBox;
import org.opengis.referencing.crs.GeographicCRS;
import org.opengis.metadata.extent.Extent;
-import org.opengis.metadata.citation.Party;
import org.opengis.geometry.Envelope;
import org.opengis.geometry.DirectPosition;
import org.opengis.geometry.coordinate.Position;
@@ -63,6 +60,9 @@ import org.apache.sis.util.ArgumentCheck
import org.apache.sis.util.resources.Errors;
import org.apache.sis.util.resources.Vocabulary;
+// Branch-dependent imports
+import org.apache.sis.metadata.iso.citation.AbstractParty;
+
/**
* Formats {@link Location} instances in a tabular format.
@@ -99,7 +99,7 @@ import org.apache.sis.util.resources.Voc
* @version 0.8
* @module
*/
-public class LocationFormat extends TabularFormat<Location> {
+public class LocationFormat extends TabularFormat<AbstractLocation> {
/**
* For cross-version compatibility.
*/
@@ -140,8 +140,8 @@ public class LocationFormat extends Tabu
* @return the type of values formatted by this {@code Format} instance.
*/
@Override
- public Class<Location> getValueType() {
- return Location.class;
+ public Class<AbstractLocation> getValueType() {
+ return AbstractLocation.class;
}
/**
@@ -198,13 +198,18 @@ public class LocationFormat extends Tabu
/**
* Writes a textual representation of the given location in the given stream or buffer.
*
+ * <div class="warning"><b>Warning:</b>
+ * in a future SIS version, the type of {@code location} parameter may be generalized
+ * to the {@code org.opengis.referencing.gazetteer.Location} interface.
+ * This change is pending GeoAPI revision.</div>
+ *
* @param location the location to format.
* @param toAppendTo where to format the location.
* @throws IOException if an error occurred while writing to the given appendable.
*/
@Override
@SuppressWarnings({"fallthrough", "null"})
- public void format(final Location location, final Appendable toAppendTo) throws IOException {
+ public void format(final AbstractLocation location, final Appendable toAppendTo) throws IOException {
ArgumentChecks.ensureNonNull("location", location);
final Locale locale = getLocale(Locale.Category.DISPLAY);
final Vocabulary vocabulary = Vocabulary.getResources(locale);
@@ -214,7 +219,7 @@ public class LocationFormat extends Tabu
* Location type.
*/
table.appendHorizontalSeparator();
- final LocationType type = location.getLocationType();
+ final AbstractLocationType type = location.getLocationType();
if (type != null) {
append(table, vocabulary, Vocabulary.Keys.LocationType, toString(type.getName(), locale));
}
@@ -415,7 +420,7 @@ public class LocationFormat extends Tabu
/*
* Organization responsible for defining the characteristics of the location instance.
*/
- final Party administrator = location.getAdministrator();
+ final AbstractParty administrator = location.getAdministrator();
if (administrator != null) {
append(table, vocabulary, Vocabulary.Keys.Administrator, toString(administrator.getName(), locale));
}
@@ -482,7 +487,7 @@ public class LocationFormat extends Tabu
* @throws ParseException if an error occurred while parsing the location.
*/
@Override
- public Location parse(CharSequence text, ParsePosition pos) throws ParseException {
+ public AbstractLocation parse(CharSequence text, ParsePosition pos) throws ParseException {
throw new ParseException(Errors.format(Errors.Keys.UnsupportedOperation_1, "parse"), pos.getIndex());
}
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystem.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -39,27 +39,21 @@ import org.apache.sis.referencing.Identi
import org.apache.sis.referencing.crs.DefaultProjectedCRS;
import org.apache.sis.referencing.cs.AxesConvention;
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;
import org.apache.sis.util.CharSequences;
import org.apache.sis.util.ArgumentChecks;
import org.apache.sis.util.StringBuilders;
import org.apache.sis.util.Utilities;
import org.apache.sis.util.Workaround;
-import org.apache.sis.util.logging.Logging;
import org.apache.sis.util.resources.Errors;
import org.apache.sis.util.resources.Vocabulary;
import org.apache.sis.geometry.DirectPosition2D;
-import org.apache.sis.internal.system.Modules;
import org.apache.sis.measure.Longitude;
import org.apache.sis.measure.Latitude;
// Branch-dependent imports
import org.apache.sis.internal.jdk8.JDK8;
-import org.opengis.metadata.citation.Party;
-import org.opengis.referencing.gazetteer.Location;
-import org.opengis.referencing.gazetteer.LocationType;
+import org.apache.sis.metadata.iso.citation.AbstractParty;
/**
@@ -253,14 +247,7 @@ public class MilitaryGridReferenceSystem
*/
@Workaround(library="JDK", version="1.8")
private static Map<String,?> properties() {
- Party party;
- try {
- party = MetadataSource.getProvided().lookup(Party.class, "NATO");
- } catch (MetadataStoreException e) {
- party = null;
- Logging.unexpectedException(Logging.getLogger(Modules.REFERENCING_BY_IDENTIFIERS),
- MilitaryGridReferenceSystem.class, "<init>", e);
- }
+ AbstractParty party = new AbstractParty("North Atlantic Treaty Organization", null);
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);
@@ -274,7 +261,7 @@ public class MilitaryGridReferenceSystem
* ("Relax constraint on placement of this()/super() call in constructors").
*/
@Workaround(library="JDK", version="1.8")
- private static LocationType[] types() {
+ private static AbstractLocationType[] types() {
final ModifiableLocationType gzd = new ModifiableLocationType(Resources.formatInternational(Resources.Keys.GridZoneDesignator));
final ModifiableLocationType square = new ModifiableLocationType(Resources.formatInternational(Resources.Keys.SquareIdentifier100));
final ModifiableLocationType coord = new ModifiableLocationType(Resources.formatInternational(Resources.Keys.GridCoordinates));
@@ -282,13 +269,13 @@ public class MilitaryGridReferenceSystem
coord .addIdentification(Vocabulary.formatInternational(Vocabulary.Keys.Coordinate));
square.addParent(gzd);
coord .addParent(square);
- return new LocationType[] {gzd};
+ return new AbstractLocationType[] {gzd};
}
/**
* Returns the first location types, which should be the grid zone identifier.
*/
- final LocationType rootType() {
+ final AbstractLocationType rootType() {
return super.getLocationTypes().get(0); // Use super.\u2026 for protecting from method overriding.
}
@@ -527,11 +514,16 @@ public class MilitaryGridReferenceSystem
* Decodes the given MGRS reference into a position and an envelope.
* The Coordinate Reference System (CRS) associated to the returned position depends on the given reference.
*
+ * <div class="warning"><b>Warning:</b>
+ * in a future SIS version, the type of returned elements may be generalized
+ * to the {@code org.opengis.referencing.gazetteer.Location} interface.
+ * This change is pending GeoAPI revision.</div>
+ *
* @param reference MGRS string to decode.
* @return a new position with the longitude at ordinate 0 and latitude at ordinate 1.
* @throws TransformException if an error occurred while parsing the given string.
*/
- public Location decode(final CharSequence reference) throws TransformException {
+ public AbstractLocation decode(final CharSequence reference) throws TransformException {
ArgumentChecks.ensureNonNull("reference", reference);
return new Decoder(this, reference);
}
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ModifiableLocationType.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -34,8 +34,7 @@ import org.apache.sis.util.iso.Types;
// Branch-dependent imports
import org.apache.sis.internal.jdk8.JDK8;
import org.apache.sis.internal.jdk8.Function;
-import org.opengis.metadata.citation.Party;
-import org.opengis.referencing.gazetteer.ReferenceSystemUsingIdentifiers;
+import org.apache.sis.metadata.iso.citation.AbstractParty;
/**
@@ -144,7 +143,7 @@ public class ModifiableLocationType exte
/**
* Name of organization or class of organization able to create and destroy location instances.
*/
- private Party owner;
+ private AbstractParty owner;
/**
* Parent location types (location types of which this location type is a sub-division).
@@ -369,6 +368,11 @@ public class ModifiableLocationType exte
* If no organization has been explicitely set, then this method inherits the value from
* the parents providing that all parents specify the same organization.
*
+ * <div class="warning"><b>Warning:</b>
+ * in a future SIS version, the type of returned element may be generalized to the
+ * {@code org.opengis.metadata.citation.Party} interface. This change is pending
+ * GeoAPI revision for upgrade from ISO 19115:2003 to ISO 19115:2014.</div>
+ *
* @return organization or class of organization able to create and destroy location instances,
* or {@code null} if no value has been defined or can be inherited.
*
@@ -376,9 +380,9 @@ public class ModifiableLocationType exte
* @see ReferencingByIdentifiers#getOverallOwner()
*/
@Override
- public Party getOwner() {
- return (owner != null) ? owner : inherit(new Function<ModifiableLocationType, Party>() {
- @Override public Party apply(final ModifiableLocationType type) {
+ public AbstractParty getOwner() {
+ return (owner != null) ? owner : inherit(new Function<ModifiableLocationType, AbstractParty>() {
+ @Override public AbstractParty apply(final ModifiableLocationType type) {
return type.getOwner();
}
});
@@ -389,9 +393,14 @@ public class ModifiableLocationType exte
* The given value is typically an instance of {@link DefaultOrganisation}.
* For an alternative where only the organization name is specified, see {@link #setOwner(CharSequence)}.
*
+ * <div class="warning"><b>Warning:</b>
+ * in a future SIS version, the argument type may be generalized to the
+ * {@code org.opengis.metadata.citation.Party} interface. This change is pending
+ * GeoAPI revision for upgrade from ISO 19115:2003 to ISO 19115:2014.</div>
+ *
* @param value the new owner.
*/
- public void setOwner(final Party value) {
+ public void setOwner(final AbstractParty value) {
owner = value;
}
@@ -496,12 +505,17 @@ public class ModifiableLocationType exte
* the reference system is always null. The reference system is defined when the location types are
* given to the {@link ReferencingByIdentifiers} constructor for example.
*
+ * <div class="warning"><b>Warning:</b>
+ * in a future SIS version, the type of returned element may be generalized to the
+ * {@code org.opengis.referencing.gazetteer.ReferenceSystemUsingIdentifiers} interface.
+ * This change is pending GeoAPI revision.</div>
+ *
* @return {@code null}.
*
* @see ReferencingByIdentifiers#getLocationTypes()
*/
@Override
- public ReferenceSystemUsingIdentifiers getReferenceSystem() {
+ public ReferencingByIdentifiers getReferenceSystem() {
return null;
}
}
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/ReferencingByIdentifiers.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -33,9 +33,7 @@ import org.apache.sis.internal.referenci
import org.apache.sis.io.wkt.FormattableObject;
// Branch-dependent imports
-import org.opengis.metadata.citation.Party;
-import org.opengis.referencing.gazetteer.LocationType;
-import org.opengis.referencing.gazetteer.ReferenceSystemUsingIdentifiers;
+import org.apache.sis.metadata.iso.citation.AbstractParty;
/**
@@ -57,7 +55,25 @@ import org.opengis.referencing.gazetteer
* @see AbstractLocation
*/
@XmlTransient
-public class ReferencingByIdentifiers extends AbstractReferenceSystem implements ReferenceSystemUsingIdentifiers {
+public class ReferencingByIdentifiers extends AbstractReferenceSystem {
+ /**
+ * Key for the <code>{@value}</code> property to be given to the
+ * object factory {@code createFoo(\u2026)} methods.
+ * This is used for setting the value to be returned by {@link #getTheme()}.
+ *
+ * @see #getTheme()
+ */
+ public static final String THEME_KEY = "theme";
+
+ /**
+ * Key for the <code>{@value}</code> property to be given to the
+ * object factory {@code createFoo(\u2026)} methods.
+ * This is used for setting the value to be returned by {@link #getOverallOwner()}.
+ *
+ * @see #getOverallOwner()
+ */
+ public static final String OVERALL_OWNER_KEY = "overallOwner";
+
/**
* Serial number for inter-operability with different versions.
*/
@@ -75,7 +91,7 @@ public class ReferencingByIdentifiers ex
*
* @see #getOverallOwner()
*/
- private final Party overallOwner;
+ private final AbstractParty overallOwner;
/**
* Description of location type(s) in the spatial reference system.
@@ -83,7 +99,7 @@ public class ReferencingByIdentifiers ex
*
* @see #getLocationTypes()
*/
- private final List<LocationType> locationTypes;
+ private final List<AbstractLocationType> locationTypes;
/**
* Creates a reference system from the given properties.
@@ -147,14 +163,18 @@ public class ReferencingByIdentifiers ex
* {@link ModifiableLocationType#snapshot(ReferenceSystemUsingIdentifiers, LocationType...)}.
* Changes in the given location types after construction will not affect this {@code ReferencingByIdentifiers}.
*
+ * <div class="warning"><b>Warning:</b> In a future SIS version, the type of array elements may be
+ * generalized to the {@code org.opengis.referencing.gazetteer.LocationType} interface.
+ * This change is pending GeoAPI revision.</div>
+ *
* @param properties the properties to be given to the reference system.
* @param types description of location type(s) in the spatial reference system.
*/
@SuppressWarnings("ThisEscapedInObjectConstruction")
- public ReferencingByIdentifiers(final Map<String,?> properties, final LocationType... types) {
+ public ReferencingByIdentifiers(final Map<String,?> properties, final AbstractLocationType... types) {
super(properties);
theme = Types.toInternationalString(properties, THEME_KEY);
- overallOwner = Containers.property(properties, OVERALL_OWNER_KEY, Party.class);
+ overallOwner = Containers.property(properties, OVERALL_OWNER_KEY, AbstractParty.class);
/*
* Having the 'this' reference escaped in object construction should not be an issue here because
* we invoke package-private method in such a way that if an exception is thrown, the whole tree
@@ -164,24 +184,12 @@ public class ReferencingByIdentifiers ex
}
/**
- * Returns the GeoAPI interface implemented by this class.
- * The default implementation returns {@code ReferenceSystemUsingIdentifiers.class}.
- *
- * @return the GeoAPI interface implemented by this class.
- */
- @Override
- public Class<? extends ReferenceSystemUsingIdentifiers> getInterface() {
- return ReferenceSystemUsingIdentifiers.class;
- }
-
- /**
* Property used to characterize the spatial reference system.
*
* @return property used to characterize the spatial reference system.
*
* @see AbstractLocationType#getTheme()
*/
- @Override
public InternationalString getTheme() {
return theme;
}
@@ -189,13 +197,17 @@ public class ReferencingByIdentifiers ex
/**
* Authority with overall responsibility for the spatial reference system.
*
+ * <div class="warning"><b>Warning:</b>
+ * in a future SIS version, the type of returned element may be generalized to the
+ * {@code org.opengis.metadata.citation.Party} interface. This change is pending
+ * GeoAPI revision for upgrade from ISO 19115:2003 to ISO 19115:2014.</div>
+ *
* @return authority with overall responsibility for the spatial reference system.
*
* @see ModifiableLocationType#getOwner()
* @see AbstractLocation#getAdministrator()
*/
- @Override
- public Party getOverallOwner() {
+ public AbstractParty getOverallOwner() {
return overallOwner;
}
@@ -207,9 +219,8 @@ public class ReferencingByIdentifiers ex
*
* @see ModifiableLocationType#getReferenceSystem()
*/
- @Override
@SuppressWarnings("ReturnOfCollectionOrArrayField") // Because the collection is unmodifiable.
- public List<LocationType> getLocationTypes() {
+ public List<AbstractLocationType> getLocationTypes() {
return locationTypes;
}
@@ -240,7 +251,7 @@ public class ReferencingByIdentifiers ex
locationTypes.equals(that.locationTypes);
}
case BY_CONTRACT: {
- final ReferenceSystemUsingIdentifiers that = (ReferenceSystemUsingIdentifiers) object;
+ final ReferencingByIdentifiers that = (ReferencingByIdentifiers) object;
if (!Utilities.deepEquals(getTheme(), that.getTheme(), mode) ||
!Utilities.deepEquals(getOverallOwner(), that.getOverallOwner(), mode))
{
@@ -251,7 +262,7 @@ public class ReferencingByIdentifiers ex
default: {
// Theme and owner are metadata, so they can be ignored.
return Utilities.deepEquals(getLocationTypes(),
- ((ReferenceSystemUsingIdentifiers) object).getLocationTypes(), mode);
+ ((ReferencingByIdentifiers) object).getLocationTypes(), mode);
}
}
}
@@ -287,7 +298,7 @@ public class ReferencingByIdentifiers ex
formatter.newLine();
formatter.append(new SubElement("Owner", overallOwner.getName()));
}
- for (final LocationType type : locationTypes) {
+ for (final AbstractLocationType type : locationTypes) {
formatter.newLine();
formatter.append(new SubElement("LocationType", type.getName()));
}
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/main/java/org/apache/sis/referencing/gazetteer/SimpleLocation.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -21,7 +21,6 @@ import org.opengis.geometry.DirectPositi
import org.opengis.geometry.coordinate.Position;
import org.opengis.metadata.extent.GeographicExtent;
import org.opengis.metadata.extent.GeographicBoundingBox;
-import org.opengis.referencing.gazetteer.LocationType;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
@@ -91,7 +90,7 @@ class SimpleLocation extends AbstractLoc
* @param type the description of the nature of this geographic identifier.
* @param identifier the geographic identifier to be returned by {@link #getGeographicIdentifier()}.
*/
- SimpleLocation(final LocationType type, final CharSequence identifier) {
+ SimpleLocation(final AbstractLocationType type, final CharSequence identifier) {
super(type, identifier);
}
@@ -339,7 +338,7 @@ class SimpleLocation extends AbstractLoc
* @param type the description of the nature of this geographic identifier.
* @param identifier the geographic identifier to be returned by {@link #getGeographicIdentifier()}.
*/
- Projected(final LocationType type, final CharSequence identifier) {
+ Projected(final AbstractLocationType type, final CharSequence identifier) {
super(type, identifier);
}
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/LocationTypeTest.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/LocationTypeTest.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/LocationTypeTest.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/LocationTypeTest.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -25,9 +25,6 @@ import org.junit.Test;
import static org.apache.sis.test.Assert.*;
-// Branch-dependent imports
-import org.opengis.referencing.gazetteer.LocationType;
-
/**
* Tests {@link AbstractLocationType}, {@link FinalLocationType} and {@link ModifiableLocationType}.
@@ -115,7 +112,7 @@ public final strictfp class LocationType
/**
* Verifies the value of a "administrative area" location type.
*/
- private static void verify(final LocationType[] type) {
+ private static void verify(final AbstractLocationType[] type) {
assertEquals(5, type.length);
verify(type[0], "administrative area",
"local administration",
@@ -147,8 +144,8 @@ public final strictfp class LocationType
/**
* Verifies the value of a location type created by or copied from {@link #create(boolean)}.
*/
- private static void verify(final LocationType type, final String name, final String theme, final String definition,
- final String identification, final String owner)
+ private static void verify(final AbstractLocationType type, final String name, final String theme,
+ final String definition, final String identification, final String owner)
{
assertEquals("name", name, String.valueOf(type.getName()));
assertEquals("theme", theme, String.valueOf(type.getTheme()));
@@ -183,8 +180,8 @@ public final strictfp class LocationType
@Test
@DependsOnMethod("testInheritance")
public void testSnapshot() {
- final List<LocationType> snapshot = ModifiableLocationType.snapshot(null, create(true));
- verify(snapshot.toArray(new LocationType[snapshot.size()]));
+ final List<AbstractLocationType> snapshot = ModifiableLocationType.snapshot(null, create(true));
+ verify(snapshot.toArray(new AbstractLocationType[snapshot.size()]));
}
/**
Modified: sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java?rev=1785905&r1=1785895&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing-by-identifiers/src/test/java/org/apache/sis/referencing/gazetteer/MilitaryGridReferenceSystemTest.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -35,10 +35,6 @@ 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 {@link MilitaryGridReferenceSystem}.
@@ -59,15 +55,15 @@ public final strictfp class MilitaryGrid
assertEquals("theme", "Mapping", rs.getTheme().toString(Locale.ENGLISH));
assertEquals("theme", "Cartographie", rs.getTheme().toString(Locale.FRENCH));
- final LocationType gzd = TestUtilities.getSingleton(rs.getLocationTypes());
+ final AbstractLocationType gzd = TestUtilities.getSingleton(rs.getLocationTypes());
assertEquals("type", "Grid zone designator", gzd.getName().toString(Locale.ENGLISH));
assertEquals("parent", 0, gzd.getParents().size());
- final LocationType sid = TestUtilities.getSingleton(gzd.getChildren());
+ final AbstractLocationType sid = TestUtilities.getSingleton(gzd.getChildren());
assertEquals("type", "100�km square identifier", sid.getName().toString(Locale.ENGLISH));
assertSame("parent", gzd, TestUtilities.getSingleton(sid.getParents()));
- final LocationType gc = TestUtilities.getSingleton(sid.getChildren());
+ final AbstractLocationType gc = TestUtilities.getSingleton(sid.getChildren());
assertEquals("type", "Grid coordinate", gc.getName().toString(Locale.ENGLISH));
assertSame("parent", sid, TestUtilities.getSingleton(gc.getParents()));
}
@@ -205,7 +201,7 @@ public final strictfp class MilitaryGrid
private static DirectPosition decode(final MilitaryGridReferenceSystem.Coder coder, final String reference)
throws TransformException
{
- final Location loc = coder.decode(reference);
+ final AbstractLocation loc = coder.decode(reference);
final Envelope2D envelope = new Envelope2D(loc.getEnvelope());
final DirectPosition2D pos = new DirectPosition2D(loc.getPosition().getDirectPosition());
assertTrue(reference, envelope.contains(pos));
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -44,6 +44,7 @@ import org.apache.sis.util.ArgumentCheck
import org.apache.sis.util.resources.Errors;
import org.apache.sis.internal.system.DefaultFactories;
import org.apache.sis.internal.referencing.provider.TransverseMercator;
+import org.apache.sis.internal.referencing.provider.PolarStereographicA;
import org.apache.sis.measure.Latitude;
import org.apache.sis.referencing.Builder;
import org.apache.sis.referencing.CommonCRS;
@@ -232,27 +233,68 @@ public class GeodeticObjectBuilder exten
*
* <blockquote><table class="sis">
* <caption>Transverse Mercator parameters</caption>
- * <tr><th>Parameter name</th> <th>Value</th></tr>
+ * <tr><th>Parameter name</th> <th>Parameter value</th></tr>
* <tr><td>Latitude of natural origin</td> <td>Given latitude, snapped to 0� in the UTM case</td></tr>
* <tr><td>Longitude of natural origin</td> <td>Given longitude, optionally snapped to a UTM zone</td></tr>
- * <tr><td>Scale factor at natural origin</td> <td>0.9996</td></tr>
- * <tr><td>False easting</td> <td>500000 metres</td></tr>
+ * <tr><td>Scale factor at natural origin</td> <td>0.9996 in UTM case</td></tr>
+ * <tr><td>False easting</td> <td>500000 metres in UTM case</td></tr>
* <tr><td>False northing</td> <td>0 (North hemisphere) or 10000000 (South hemisphere) metres</td></tr>
* </table></blockquote>
*
- * @param isUTM if {@code true}, the given central meridian will be snapped to the central meridian of a UTM zone.
+ * 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.
+ *
+ * <p>If the given {@code zoner} is {@link TransverseMercator.Zoner#ANY ANY}, then this method will use the given
+ * latitude and longitude verbatim (without snapping them to a zone) but will still use the UTM scale factor,
+ * false easting and false northing.
+ *
+ * @param zoner whether to use UTM or MTM zones, or {@code ANY} for using arbitrary central meridian.
* @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)
+ public GeodeticObjectBuilder setTransverseMercator(TransverseMercator.Zoner zoner, double latitude, double longitude)
throws FactoryException
{
ArgumentChecks.ensureBetween("latitude", Latitude.MIN_VALUE, Latitude.MAX_VALUE, latitude);
ArgumentChecks.ensureBetween("longitude", -Formulas.LONGITUDE_MAX, Formulas.LONGITUDE_MAX, longitude);
setConversionMethod(TransverseMercator.NAME);
- setConversionName(TransverseMercator.Zoner.UTM.setParameters(parameters, isUTM, latitude, longitude));
+ setConversionName(zoner.setParameters(parameters, latitude, longitude));
+ return this;
+ }
+
+ /**
+ * Sets the operation method, parameters and conversion name for a Polar Stereographic projection.
+ * This convenience method delegates to the following methods:
+ *
+ * <ul>
+ * <li>{@link #setConversionName(String)} with a name like <cite>"Universal Polar Stereographic North"</cite>,
+ * depending on the argument given to this method.</li>
+ * <li>{@link #setConversionMethod(String)} with the name of the Polar Stereographic (variant A) projection method.</li>
+ * <li>{@link #setParameter(String, double, Unit)} for each of the parameters enumerated below:</li>
+ * </ul>
+ *
+ * <blockquote><table class="sis">
+ * <caption>Universal Polar Stereographic parameters</caption>
+ * <tr><th>Parameter name</th> <th>Parameter value</th></tr>
+ * <tr><td>Latitude of natural origin</td> <td>90�N or 90�S</td></tr>
+ * <tr><td>Longitude of natural origin</td> <td>0�</td></tr>
+ * <tr><td>Scale factor at natural origin</td> <td>0.994</td></tr>
+ * <tr><td>False easting</td> <td>2000000 metres</td></tr>
+ * <tr><td>False northing</td> <td>2000000 metres</td></tr>
+ * </table></blockquote>
+ *
+ * @param north {@code true} for North pole, or {@code false} for South pole.
+ * @return {@code this}, for method calls chaining.
+ * @throws FactoryException if the operation method for the Polar Stereographic (variant A)
+ * projection can not be obtained.
+ */
+ public GeodeticObjectBuilder setPolarStereographic(final boolean north) throws FactoryException {
+ setConversionMethod(PolarStereographicA.NAME);
+ setConversionName(PolarStereographicA.setParameters(parameters, north));
return this;
}
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -321,6 +321,11 @@ public final class Resources extends Ind
public static final short NoSuchOperationMethod_1 = 50;
/**
+ * No horizontal component found in the \u201c{0}\u201d coordinate reference system.
+ */
+ public static final short NonHorizontalCRS_1 = 71;
+
+ /**
* Non invertible {0}�{1} matrix.
*/
public static final short NonInvertibleMatrix_2 = 51;
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties [ISO-8859-1] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties [ISO-8859-1] Tue Mar 7 23:37:49 2017
@@ -73,6 +73,7 @@ MissingSpatioTemporalDimension_1 = No s
MissingValueForParameter_1 = Missing value for \u201c{0}\u201d parameter.
NoConvergence = No convergence.
NoConvergenceForPoints_2 = No convergence for points {0} and {1}.
+NonHorizontalCRS_1 = No horizontal component found in the \u201c{0}\u201d coordinate reference system.
NonInvertibleMatrix_2 = Non invertible {0}\u00d7{1} matrix.
NonInvertibleOperation_1 = Can not invert the \u201c{0}\u201d operation.
NonInvertibleTransform = Transform is not invertible.
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties [ISO-8859-1] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties [ISO-8859-1] Tue Mar 7 23:37:49 2017
@@ -78,6 +78,7 @@ MissingSpatioTemporalDimension_1 = Aucu
MissingValueForParameter_1 = Aucune valeur n\u2019a \u00e9t\u00e9 d\u00e9finie pour le param\u00e8tre \u00ab\u202f{0}\u202f\u00bb.
NoConvergence = Le calcul ne converge pas.
NoConvergenceForPoints_2 = Le calcul ne converge pas pour les points {0} et {1}.
+NonHorizontalCRS_1 = Aucune composante horizontale n\u2019a \u00e9t\u00e9 trouv\u00e9e dans le syst\u00e8me de r\u00e9f\u00e9rence des coordonn\u00e9es \u00ab\u202f{0}\u202f\u00bb.
NonInvertibleMatrix_2 = Matrice {0}\u00d7{1} non inversible.
NonInvertibleOperation_1 = Ne peut pas inverser l\u2019op\u00e9ration \u00ab\u202f{0}\u202f\u00bb.
NonInvertibleTransform = La transformation n\u2019est pas inversible.
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/ServicesForMetadata.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -22,6 +22,8 @@ import java.util.Iterator;
import java.util.Collection;
import java.util.Collections;
import java.util.Locale;
+import java.util.TimeZone;
+import java.text.Format;
import javax.measure.Unit;
import javax.measure.quantity.Length;
@@ -57,9 +59,12 @@ import org.opengis.metadata.citation.Onl
import org.opengis.metadata.extent.GeographicBoundingBox;
import org.opengis.metadata.extent.GeographicExtent;
import org.opengis.metadata.extent.VerticalExtent;
+import org.opengis.geometry.DirectPosition;
import org.opengis.geometry.Envelope;
import org.apache.sis.geometry.Envelopes;
+import org.apache.sis.geometry.DirectPosition2D;
+import org.apache.sis.geometry.CoordinateFormat;
import org.apache.sis.referencing.CRS;
import org.apache.sis.referencing.CommonCRS;
import org.apache.sis.referencing.IdentifiedObjects;
@@ -108,7 +113,7 @@ import org.opengis.referencing.datum.Dat
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.5
- * @version 0.7
+ * @version 0.8
* @module
*/
public final class ServicesForMetadata extends ReferencingServices {
@@ -400,6 +405,21 @@ public final class ServicesForMetadata e
}
}
+ /**
+ * Creates a two-dimensional geographic position associated to the default geographic CRS.
+ * Axis order is (longitude, latitude).
+ *
+ * @param \u03bb the longitude value.
+ * @param \u03c6 the latitude value.
+ * @return the direct position for the given geographic coordinate.
+ *
+ * @since 0.8
+ */
+ @Override
+ public DirectPosition geographic(final double \u03bb, final double \u03c6) {
+ return new DirectPosition2D(CommonCRS.defaultGeographic(), \u03bb, \u03c6);
+ }
+
@@ -639,6 +659,20 @@ public final class ServicesForMetadata e
}
/**
+ * Creates a format for {@link DirectPosition} instances.
+ *
+ * @param locale the locale for the new {@code Format}, or {@code null} for {@code Locale.ROOT}.
+ * @param timezone the timezone, or {@code null} for UTC.
+ * @return a {@link org.apache.sis.geometry.CoordinateFormat}.
+ *
+ * @since 0.8
+ */
+ @Override
+ public Format createCoordinateFormat(final Locale locale, final TimeZone timezone) {
+ return new CoordinateFormat(locale, timezone);
+ }
+
+ /**
* Returns an axis direction from a pole along a meridian.
* The given meridian is usually, but not necessarily, relative to the Greenwich meridian.
*
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/PolarStereographicA.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -17,14 +17,21 @@
package org.apache.sis.internal.referencing.provider;
import javax.xml.bind.annotation.XmlTransient;
+import org.opengis.parameter.ParameterValueGroup;
import org.opengis.parameter.ParameterDescriptor;
import org.opengis.parameter.ParameterDescriptorGroup;
import org.apache.sis.metadata.iso.citation.Citations;
import org.apache.sis.parameter.ParameterBuilder;
+import org.apache.sis.internal.referencing.Formulas;
+import org.apache.sis.internal.util.Constants;
+import org.apache.sis.internal.util.Numerics;
+import org.apache.sis.measure.Latitude;
+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)
@@ -101,4 +108,62 @@ public final class PolarStereographicA e
public PolarStereographicA() {
super(PARAMETERS);
}
+
+ /**
+ * False Easting and false Northing value used in Universal Polar Stereographic (UPS) projections.
+ */
+ public static final double UPS_SHIFT = 2000000;
+
+ /**
+ * Sets the parameter values for a Universal Polar Stereographic projection
+ * and returns a suggested conversion name.
+ *
+ * <blockquote><table class="sis">
+ * <caption>Universal Polar Stereographic parameters</caption>
+ * <tr><th>Parameter name</th> <th>Value</th></tr>
+ * <tr><td>Latitude of natural origin</td> <td>90�N or 90�S</td></tr>
+ * <tr><td>Longitude of natural origin</td> <td>0�</td></tr>
+ * <tr><td>Scale factor at natural origin</td> <td>0.994</td></tr>
+ * <tr><td>False easting</td> <td>2000000 metres</td></tr>
+ * <tr><td>False northing</td> <td>2000000 metres</td></tr>
+ * </table></blockquote>
+ *
+ * @param group the parameters for which to set the values.
+ * @param north {@code true} for North pole, or {@code false} for South pole.
+ * @return a name like <cite>"Universal Polar Stereographic North"</cite>,
+ * depending on the arguments given to this method.
+ *
+ * @since 0.8
+ */
+ public static String setParameters(final ParameterValueGroup group, final boolean north) {
+ group.parameter(Constants.LATITUDE_OF_ORIGIN).setValue(north ? Latitude.MAX_VALUE : Latitude.MIN_VALUE, Units.DEGREE);
+ group.parameter(Constants.CENTRAL_MERIDIAN) .setValue(0, Units.DEGREE);
+ group.parameter(Constants.SCALE_FACTOR) .setValue(0.994, Units.UNITY);
+ group.parameter(Constants.FALSE_EASTING) .setValue(UPS_SHIFT, Units.METRE);
+ group.parameter(Constants.FALSE_NORTHING) .setValue(UPS_SHIFT, Units.METRE);
+ return "Universal Polar Stereographic " + (north ? "North" : "South");
+ }
+
+ /**
+ * If the given parameter values are those of a Universal Polar Stereographic projection,
+ * returns -1 for South pole or +1 for North pole. Otherwise returns 0. It is caller's
+ * responsibility to verify that the operation method is {@value #NAME}.
+ *
+ * @param group the Transverse Mercator projection parameters.
+ * @return +1 if UPS north, -1 if UPS south, or 0 if the given parameters are not for a UPS projection.
+ *
+ * @since 0.8
+ */
+ public static int isUPS(final ParameterValueGroup group) {
+ if (Numerics.epsilonEqual(group.parameter(Constants.SCALE_FACTOR) .doubleValue(Units.UNITY), 0.994, Numerics.COMPARISON_THRESHOLD) &&
+ Numerics.epsilonEqual(group.parameter(Constants.FALSE_EASTING) .doubleValue(Units.METRE), UPS_SHIFT, Formulas.LINEAR_TOLERANCE) &&
+ Numerics.epsilonEqual(group.parameter(Constants.FALSE_NORTHING) .doubleValue(Units.METRE), UPS_SHIFT, Formulas.LINEAR_TOLERANCE) &&
+ Numerics.epsilonEqual(group.parameter(Constants.CENTRAL_MERIDIAN).doubleValue(Units.DEGREE), 0, Formulas.ANGULAR_TOLERANCE))
+ {
+ final double \u03c6 = group.parameter(Constants.LATITUDE_OF_ORIGIN).doubleValue(Units.DEGREE);
+ if (Numerics.epsilonEqual(\u03c6, Latitude.MAX_VALUE, Formulas.ANGULAR_TOLERANCE)) return +1;
+ if (Numerics.epsilonEqual(\u03c6, Latitude.MIN_VALUE, Formulas.ANGULAR_TOLERANCE)) return -1;
+ }
+ return 0;
+ }
}
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/TransverseMercator.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -141,7 +141,8 @@ public final class TransverseMercator ex
*/
public static enum Zoner {
/**
- * Computes zones for the Universal Transverse Mercator (UTM) projections.
+ * Universal Transverse Mercator (UTM) projection zones.
+ * The zone computation includes special cases for Norway and Svalbard.
*
* <blockquote><table class="sis">
* <caption>Universal Transverse Mercator parameters</caption>
@@ -153,11 +154,37 @@ 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) {
+ /** Computes the zone from a meridian in the zone. */
+ @Override public int zone(final double \u03c6, final double \u03bb) {
+ int zone = super.zone(\u03c6, \u03bb);
+ 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 (\u03c6)) {if (\u03bb >= 3) zone++; } break; // 3� is zone 31 central meridian.
+ case 32: if (isSvalbard(\u03c6)) {if (\u03bb >= 9) zone++; else zone--;} break; // 9� is zone 32 central meridian.
+ case 34: if (isSvalbard(\u03c6)) {if (\u03bb >= 21) zone++; else zone--;} break; // 21� is zone 34 central meridian.
+ case 36: if (isSvalbard(\u03c6)) {if (\u03bb >= 33) zone++; else zone--;} break; // 33� is zone 36 central meridian.
+ }
+ return zone;
+ }
+
+ /** Indicates whether the given zone needs to be handled in a special way for the given latitude. */
+ @Override public boolean isSpecialCase(final int zone, final double \u03c6) {
+ if (zone >= 31 && zone <= 37) {
+ return isSvalbard(\u03c6) || (zone <= 32 && isNorway(\u03c6));
+ }
+ return false;
+ }
+ },
/**
- * Computes zones for the Modified Transverse Mercator (MTM) projections.
- * This projection is in used in Canada only.
+ * Modified Transverse Mercator (MTM) projection zones.
+ * This projection is used in Canada only.
*
* <blockquote><table class="sis">
* <caption>Modified Transverse Mercator parameters</caption>
@@ -169,13 +196,23 @@ public final class TransverseMercator ex
* <tr><td>False northing</td> <td>0 metres</td></tr>
* </table></blockquote>
*/
- MTM(-51.5, -3, 0.9999, 304800, Double.NaN);
+ MTM(-51.5, -3, 0.9999, 304800, Double.NaN),
+
+ /**
+ * Like UTM, but allows <cite>latitude of origin</cite> and <cite>central meridian</cite> to be anywhere.
+ * The given central meridian is not snapped to the UTM zone center and no special case is applied for
+ * Norway or Svalbard.
+ *
+ * <p>This zoner matches the behavior of {@code AUTO(2):42002} authority code specified in the
+ * OGC <cite>Web Map Service</cite> (WMS) specification.</p>
+ */
+ ANY(Longitude.MIN_VALUE, 6, 0.9996, 500000, 10000000);
/**
* Longitude of the beginning of zone 1. This is the westmost longitude if {@link #width}�is positive,
* or the eastmost longitude if {@code width} is negative.
*/
- private final double origin;
+ public final double origin;
/**
* Width of a zone, in degrees of longitude.
@@ -184,22 +221,22 @@ public final class TransverseMercator ex
* @see #zone(double)
* @see #centralMeridian(int)
*/
- private final double width;
+ public final double width;
/**
- * The scale factor of UTM projections.
+ * The scale factor of zoned projections.
*/
- private final double scale;
+ public final double scale;
/**
- * The false easting of UTM projections, in metres.
+ * The false easting of zoned projections, in metres.
*/
- private final double easting;
+ public final double easting;
/**
- * The false northing in South hemisphere of UTM projection, in metres.
+ * The false northing in South hemisphere of zoned projection, in metres.
*/
- private final double northing;
+ public final double northing;
/**
* Creates a new instance for computing zones using the given parameters.
@@ -220,32 +257,34 @@ public final class TransverseMercator ex
* <tr><th>Parameter name</th> <th>Value</th></tr>
* <tr><td>Latitude of natural origin</td> <td>Given latitude, or 0� if zoned projection</td></tr>
* <tr><td>Longitude of natural origin</td> <td>Given longitude, optionally snapped to a zone central meridian</td></tr>
- * <tr><td>Scale factor at natural origin</td> <td>0.9996</td></tr>
- * <tr><td>False easting</td> <td>500000 metres</td></tr>
+ * <tr><td>Scale factor at natural origin</td> <td>0.9996 for UTM or 0.9999 for MTM</td></tr>
+ * <tr><td>False easting</td> <td>500000 metres for UTM or 304800 metres for MTM</td></tr>
* <tr><td>False northing</td> <td>0 (North hemisphere) or 10000000 (South hemisphere) metres</td></tr>
* </table></blockquote>
*
* @param group the parameters for which to set the values.
- * @param zoned {@code true} for snapping the given latitude/longitude to a zone.
* @param latitude the latitude in the center of the desired projection.
* @param longitude the longitude in the center of the desired projection.
* @return a name like <cite>"Transverse Mercator"</cite> or <cite>"UTM zone 10N"</cite>,
* depending on the arguments given to this method.
*/
- public String setParameters(final ParameterValueGroup group,
- final boolean zoned, double latitude, double longitude)
- {
+ public final String setParameters(final ParameterValueGroup group, double latitude, double longitude) {
final boolean isSouth = MathFunctions.isNegative(latitude);
- int zone = zone(longitude);
- if (zoned) {
- latitude = 0;
+ int zone = zone(latitude, longitude);
+ String name;
+ if (this == ANY) {
+ name = "UTM";
+ if (latitude != 0 || longitude != centralMeridian(zone)) {
+ name = NAME;
+ zone = 0;
+ }
+ } else {
+ name = name();
+ latitude = 0;
longitude = centralMeridian(zone);
- } else if (longitude != centralMeridian(zone)) {
- zone = 0;
}
- String name = NAME;
if (zone != 0) {
- name = name() + " zone " + zone + (isSouth ? 'S' : 'N');
+ name = name + " zone " + zone + (isSouth ? 'S' : 'N');
}
group.parameter(Constants.LATITUDE_OF_ORIGIN).setValue(latitude, Units.DEGREE);
group.parameter(Constants.CENTRAL_MERIDIAN) .setValue(longitude, Units.DEGREE);
@@ -256,14 +295,14 @@ public final class TransverseMercator ex
}
/**
- * If the given parameter values are those of an UTM projection, returns the zone number (negative if South).
+ * If the given parameter values are those of a zoned projection, returns the zone number (negative if South).
* Otherwise returns 0. It is caller's responsibility to verify that the operation method is {@value #NAME}.
*
* @param group the Transverse Mercator projection parameters.
- * @return UTM zone number (positive if North, negative if South),
- * or 0 if the given parameters are not for a UTM projection.
+ * @return zone number (positive if North, negative if South),
+ * or 0 if the given parameters are not for a zoned projection.
*/
- public int zone(final ParameterValueGroup group) {
+ public final int zone(final ParameterValueGroup group) {
if (Numerics.epsilonEqual(group.parameter(Constants.SCALE_FACTOR) .doubleValue(Units.UNITY), scale, Numerics.COMPARISON_THRESHOLD) &&
Numerics.epsilonEqual(group.parameter(Constants.FALSE_EASTING) .doubleValue(Units.METRE), easting, Formulas.LINEAR_TOLERANCE) &&
Numerics.epsilonEqual(group.parameter(Constants.LATITUDE_OF_ORIGIN).doubleValue(Units.DEGREE), 0, Formulas.ANGULAR_TOLERANCE))
@@ -272,7 +311,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;
@@ -283,31 +322,95 @@ public final class TransverseMercator ex
}
/**
- * Computes the UTM zone from a meridian in the zone.
+ * 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.
- * @return the UTM zone number numbered from 1 to 60 inclusive, or 0 if the given central meridian was NaN.
- */
- public int zone(double longitude) {
+ * @param \u03c6 a latitude for which to get the zone. Used for taking in account the special cases.
+ * @param \u03bb 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 int zone(final double \u03c6, final double \u03bb) {
+ double z = (\u03bb - origin) / width; // Zone number with fractional part.
+ final double count = (Longitude.MAX_VALUE - Longitude.MIN_VALUE) / width;
+ z -= Math.floor(z / count) * count; // Roll in the [0 \u2026 60) range.
/*
* 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 \u2026 MAX_VALUE] range.
+ * to be the case here since we normalize the central meridian to the [MIN_VALUE \u2026 MAX_VALUE]
+ * range. We cast only after addition in order to handle NaN as documented.
*/
- double z = (longitude - origin) / width; // Zone number with fractional part.
- z -= Math.floor(z / ((Longitude.MAX_VALUE - Longitude.MIN_VALUE) / width)) // Roll in the [0 \u2026 60) range.
- * ((Longitude.MAX_VALUE - Longitude.MIN_VALUE) / width);
- return (int) (z + 1); // Cast only after addition in order to handle NaN as documented.
+ return (int) (z + 1);
}
/**
- * Computes the central meridian of a given UTM zone.
+ * Returns the number of zones.
*
- * @param zone the UTM zone as a number in the [1 \u2026 60] range.
- * @return the central meridian of the given UTM zone.
+ * @return number of zones.
*/
- public double centralMeridian(final int zone) {
+ public final int zoneCount() {
+ return (int) ((Longitude.MAX_VALUE - Longitude.MIN_VALUE) / width);
+ }
+
+ /**
+ * Computes the central meridian of a given zone.
+ *
+ * @param zone the zone as a number starting with 1.
+ * @return the central meridian of the given zone.
+ */
+ public final double centralMeridian(final int zone) {
return (zone - 0.5) * width + origin;
}
+
+ /**
+ * Indicates whether the given zone needs to be handled in a special way for the given latitude.
+ *
+ * @param zone the zone to test if it is a special case.
+ * @param \u03c6 the latitude for which to test if there is a special case.
+ * @return whether the given zone at the given latitude is a special case.
+ */
+ public boolean isSpecialCase(final int zone, final double \u03c6) {
+ return false;
+ }
+
+ /**
+ * First exception in UTM projection, corresponding to latitude band V.
+ * This method is public for {@code MilitaryGridReferenceSystemTest.verifyZonerConsistency()} purpose only.
+ *
+ * @param \u03c6 the latitude in degrees to test.
+ * @return whether the given latitude is in the Norway latitude band.
+ */
+ public static boolean isNorway(final double \u03c6) {
+ return (\u03c6 >= 56) && (\u03c6 < 64);
+ }
+
+ /**
+ * Second exception in UTM projection, corresponding to latitude band X.
+ * This method is public for {@code MilitaryGridReferenceSystemTest.verifyZonerConsistency()} purpose only.
+ *
+ * @param \u03c6 the latitude in degrees to test.
+ * @return whether the given latitude is in the Svalbard latitude band.
+ */
+ public static boolean isSvalbard(final double \u03c6) {
+ return (\u03c6 >= SVALBARD_BOUNDS) && (\u03c6 < NORTH_BOUNDS);
+ }
+
+ /**
+ * Southernmost bound of the first latitude band ({@code 'C'}), inclusive.
+ *
+ * @see #NORTH_BOUNDS
+ */
+ public static final double SOUTH_BOUNDS = -80;
+
+ /**
+ * Southernmost bounds (inclusive) of the last latitude band, which contains Svalbard.
+ * This latitude band is 12� height instead of 8�.
+ */
+ public static final double SVALBARD_BOUNDS = 72;
+
+ /**
+ * Northernmost bound of the last latitude band ({@code 'X'}), exclusive.
+ *
+ * @see #SOUTH_BOUNDS
+ */
+ public static final double NORTH_BOUNDS = 84;
}
}
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptor.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -28,6 +28,7 @@ import org.opengis.parameter.ParameterVa
import org.opengis.parameter.ParameterDescriptor;
import org.apache.sis.util.Classes;
import org.apache.sis.util.Numbers;
+import org.apache.sis.util.Utilities;
import org.apache.sis.util.ComparisonMode;
import org.apache.sis.util.resources.Errors;
import org.apache.sis.measure.Range;
@@ -67,7 +68,7 @@ import static org.apache.sis.util.Argume
* @author Martin Desruisseaux (IRD, Geomatys)
* @author Johann Sorel (Geomatys)
* @since 0.4
- * @version 0.6
+ * @version 0.8
* @module
*
* @see DefaultParameterValue
@@ -468,7 +469,7 @@ public class DefaultParameterDescriptor<
final ParameterDescriptor<?> that = (ParameterDescriptor<?>) object;
return getValueClass() == that.getValueClass() &&
Objects.deepEquals(getDefaultValue(), that.getDefaultValue()) &&
- Objects.equals(getUnit(), that.getUnit()) &&
+ Utilities.deepEquals(getUnit(), that.getUnit(), mode) &&
(isHeuristicMatchForName(that.getName().getCode()) ||
IdentifiedObjects.isHeuristicMatchForName(that, getName().getCode()));
}
@@ -481,7 +482,7 @@ public class DefaultParameterDescriptor<
Objects. equals(getMinimumValue(), that.getMinimumValue()) &&
Objects. equals(getMaximumValue(), that.getMaximumValue()) &&
Objects.deepEquals(getDefaultValue(), that.getDefaultValue()) &&
- Objects. equals(getUnit(), that.getUnit());
+ Utilities.deepEquals(getUnit(), that.getUnit(), mode);
}
case STRICT: {
final DefaultParameterDescriptor<?> that = (DefaultParameterDescriptor<?>) object;
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterValue.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -118,7 +118,7 @@ import static org.apache.sis.util.Utilit
*
* @author Martin Desruisseaux (IRD, Geomatys)
* @since 0.4
- * @version 0.7
+ * @version 0.8
* @module
*
* @see DefaultParameterDescriptor
@@ -787,8 +787,8 @@ public class DefaultParameterValue<T> ex
} else if (object instanceof ParameterValue<?>) {
final ParameterValue<?> that = (ParameterValue<?>) object;
return deepEquals(getDescriptor(), that.getDescriptor(), mode) &&
- deepEquals(getValue(), that.getValue(), mode) &&
- Objects.equals(getUnit(), that.getUnit());
+ deepEquals(getValue(), that.getValue(), mode) &&
+ deepEquals(getUnit(), that.getUnit(), mode);
}
}
return false;
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -98,8 +98,11 @@ import static org.apache.sis.util.collec
* <tr><td><code>{@linkplain IdentifiedObject}[]</code></td><td>Accepted only for {@link ContentLevel#NAME_SUMMARY}.</td></tr>
* </table>
*
+ * Like most {@link java.text.Format} implementations, this class is not thread-safe.
+ * Each thread should use its own {@code ParameterFormat} instance or apply synchronization.
+ *
* <div class="warning"><b>Limitation:</b>
- * Current implementation supports only formatting, not parsing.
+ * the current implementation can only format parameters \u2014 parsing is not yet implemented.
* </div>
*
* @author Martin Desruisseaux (IRD, Geomatys)
Modified: sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
URL: http://svn.apache.org/viewvc/sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java?rev=1785905&r1=1785904&r2=1785905&view=diff
==============================================================================
--- sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java [UTF-8] (original)
+++ sis/trunk/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java [UTF-8] Tue Mar 7 23:37:49 2017
@@ -140,23 +140,29 @@ public final class CRS extends Static {
*
* <blockquote><table class="sis">
* <caption>Minimal set of supported authority codes</caption>
- * <tr><th>Code</th> <th>Enum</th> <th>CRS Type</th> <th>Description</th></tr>
- * <tr><td>CRS:27</td> <td>{@link CommonCRS#NAD27 NAD27}</td> <td>Geographic</td> <td>Like EPSG:4267 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
- * <tr><td>CRS:83</td> <td>{@link CommonCRS#NAD83 NAD83}</td> <td>Geographic</td> <td>Like EPSG:4269 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
- * <tr><td>CRS:84</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geographic</td> <td>Like EPSG:4326 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
- * <tr><td>EPSG:4047</td> <td>{@link CommonCRS#SPHERE SPHERE}</td> <td>Geographic</td> <td>GRS 1980 Authalic Sphere</td></tr>
- * <tr><td>EPSG:4230</td> <td>{@link CommonCRS#ED50 ED50}</td> <td>Geographic</td> <td>European Datum 1950</td></tr>
- * <tr><td>EPSG:4258</td> <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geographic</td> <td>European Terrestrial Reference Frame 1989</td></tr>
- * <tr><td>EPSG:4267</td> <td>{@link CommonCRS#NAD27 NAD27}</td> <td>Geographic</td> <td>North American Datum 1927</td></tr>
- * <tr><td>EPSG:4269</td> <td>{@link CommonCRS#NAD83 NAD83}</td> <td>Geographic</td> <td>North American Datum 1983</td></tr>
- * <tr><td>EPSG:4322</td> <td>{@link CommonCRS#WGS72 WGS72}</td> <td>Geographic</td> <td>World Geodetic System 1972</td></tr>
- * <tr><td>EPSG:4326</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geographic</td> <td>World Geodetic System 1984</td></tr>
- * <tr><td>EPSG:4936</td> <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geocentric</td> <td>European Terrestrial Reference Frame 1989</td></tr>
- * <tr><td>EPSG:4937</td> <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geographic 3D</td> <td>European Terrestrial Reference Frame 1989</td></tr>
- * <tr><td>EPSG:4978</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geocentric</td> <td>World Geodetic System 1984</td></tr>
- * <tr><td>EPSG:4979</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geographic 3D</td> <td>World Geodetic System 1984</td></tr>
- * <tr><td>EPSG:4984</td> <td>{@link CommonCRS#WGS72 WGS72}</td> <td>Geocentric</td> <td>World Geodetic System 1972</td></tr>
- * <tr><td>EPSG:4985</td> <td>{@link CommonCRS#WGS72 WGS72}</td> <td>Geographic 3D</td> <td>World Geodetic System 1972</td></tr>
+ * <tr><th>Code</th> <th>Enum</th> <th>CRS Type</th> <th>Description</th></tr>
+ * <tr><td>CRS:27</td> <td>{@link CommonCRS#NAD27 NAD27}</td> <td>Geographic</td> <td>Like EPSG:4267 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
+ * <tr><td>CRS:83</td> <td>{@link CommonCRS#NAD83 NAD83}</td> <td>Geographic</td> <td>Like EPSG:4269 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
+ * <tr><td>CRS:84</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geographic</td> <td>Like EPSG:4326 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
+ * <tr><td>EPSG:4047</td> <td>{@link CommonCRS#SPHERE SPHERE}</td> <td>Geographic</td> <td>GRS 1980 Authalic Sphere</td></tr>
+ * <tr><td>EPSG:4230</td> <td>{@link CommonCRS#ED50 ED50}</td> <td>Geographic</td> <td>European Datum 1950</td></tr>
+ * <tr><td>EPSG:4258</td> <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geographic</td> <td>European Terrestrial Reference Frame 1989</td></tr>
+ * <tr><td>EPSG:4267</td> <td>{@link CommonCRS#NAD27 NAD27}</td> <td>Geographic</td> <td>North American Datum 1927</td></tr>
+ * <tr><td>EPSG:4269</td> <td>{@link CommonCRS#NAD83 NAD83}</td> <td>Geographic</td> <td>North American Datum 1983</td></tr>
+ * <tr><td>EPSG:4322</td> <td>{@link CommonCRS#WGS72 WGS72}</td> <td>Geographic</td> <td>World Geodetic System 1972</td></tr>
+ * <tr><td>EPSG:4326</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geographic</td> <td>World Geodetic System 1984</td></tr>
+ * <tr><td>EPSG:4936</td> <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geocentric</td> <td>European Terrestrial Reference Frame 1989</td></tr>
+ * <tr><td>EPSG:4937</td> <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geographic 3D</td> <td>European Terrestrial Reference Frame 1989</td></tr>
+ * <tr><td>EPSG:4978</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geocentric</td> <td>World Geodetic System 1984</td></tr>
+ * <tr><td>EPSG:4979</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Geographic 3D</td> <td>World Geodetic System 1984</td></tr>
+ * <tr><td>EPSG:4984</td> <td>{@link CommonCRS#WGS72 WGS72}</td> <td>Geocentric</td> <td>World Geodetic System 1972</td></tr>
+ * <tr><td>EPSG:4985</td> <td>{@link CommonCRS#WGS72 WGS72}</td> <td>Geographic 3D</td> <td>World Geodetic System 1972</td></tr>
+ * <tr><td>EPSG:5041</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Projected</td> <td>WGS 84 / UPS North (E,N)</td></tr>
+ * <tr><td>EPSG:5042</td> <td>{@link CommonCRS#WGS84 WGS84}</td> <td>Projected</td> <td>WGS 84 / UPS South (E,N)</td></tr>
+ * <tr><td>EPSG:322##</td><td>{@link CommonCRS#WGS72 WGS72}</td> <td>Projected</td> <td>WGS 72 / UTM zone ##N</td></tr>
+ * <tr><td>EPSG:323##</td><td>{@link CommonCRS#WGS72 WGS72}</td> <td>Projected</td> <td>WGS 72 / UTM zone ##S</td></tr>
+ * <tr><td>EPSG:326##</td><td>{@link CommonCRS#WGS84 WGS84}</td> <td>Projected</td> <td>WGS 84 / UTM zone ##N</td></tr>
+ * <tr><td>EPSG:327##</td><td>{@link CommonCRS#WGS84 WGS84}</td> <td>Projected</td> <td>WGS 84 / UTM zone ##S</td></tr>
* <tr><td>EPSG:5715</td> <td>{@link CommonCRS.Vertical#DEPTH DEPTH}</td> <td>Vertical</td> <td>Mean Sea Level depth</td></tr>
* <tr><td>EPSG:5714</td> <td>{@link CommonCRS.Vertical#MEAN_SEA_LEVEL MEAN_SEA_LEVEL}</td> <td>Vertical</td> <td>Mean Sea Level height</td></tr>
* </table></blockquote>