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 2022/11/30 19:10:37 UTC

[sis] 01/02: Clarify that the hard-coded CRS used as fallback in absence of EPSG geodetic dataset can be found in public sources. EPSG metadata such as scope and aliases other than abbreviations are omitted, except the identifier (code) which is interpreted as a reference telling where to find the full definition. A notice is added as a remark in CRS objects.

This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit fa9360b0a9db070f46fb47f5b10303f6169ff863
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Wed Nov 30 19:58:25 2022 +0100

    Clarify that the hard-coded CRS used as fallback in absence of EPSG geodetic dataset can be found in public sources.
    EPSG metadata such as scope and aliases other than abbreviations are omitted, except the identifier (code) which is
    interpreted as a reference telling where to find the full definition. A notice is added as a remark in CRS objects.
---
 .../sis/openoffice/ReferencingFunctionsTest.java   |   6 +-
 .../apache/sis/internal/referencing/Resources.java |   6 +
 .../sis/internal/referencing/Resources.properties  |   1 +
 .../internal/referencing/Resources_fr.properties   |   1 +
 .../main/java/org/apache/sis/referencing/CRS.java  |  20 ++-
 .../java/org/apache/sis/referencing/CommonCRS.java | 160 ++++++++++-----------
 .../sis/referencing/EPSGFactoryFallback.java       |  41 ++----
 .../apache/sis/referencing/IdentifiedObjects.java  |  14 +-
 .../sis/referencing/StandardDefinitions.java       |  90 ++++++++----
 .../sis/referencing/StandardDefinitionsTest.java   |   2 +-
 10 files changed, 192 insertions(+), 149 deletions(-)

diff --git a/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingFunctionsTest.java b/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingFunctionsTest.java
index ccb26f307b..736161e96f 100644
--- a/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingFunctionsTest.java
+++ b/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingFunctionsTest.java
@@ -33,7 +33,7 @@ import static org.junit.Assume.assumeFalse;
  * Tests {@link ReferencingFunctions}.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 0.8
+ * @version 1.3
  * @since   0.8
  * @module
  */
@@ -85,11 +85,13 @@ public final strictfp class ReferencingFunctionsTest extends TestCase {
 
     /**
      * Tests {@link ReferencingFunctions#getScope(String)}.
+     * The scope text depends on the availability of an EPSG database,
+     * so this method tests only that the function returns a non-null value which may be "unknown".
      */
     @Test
     public void testGetScope() {
         final String scope = instance.getScope("EPSG:4326");
-        assertTrue(scope, scope.contains("Horizontal component of 3D system"));
+        assertNotNull(scope);
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
index 9611d5544f..f469d3d014 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.java
@@ -225,6 +225,12 @@ public final class Resources extends IndexedResourceBundle {
          */
         public static final short EllipsoidalHeightNotAllowed_1 = 77;
 
+        /**
+         * Definitions from public sources. When a definition corresponds to an EPSG object (ignoring
+         * metadata), the EPSG code is provided as a reference where to find the complete definition.
+         */
+        public static final short FallbackAuthorityNotice = 103;
+
         /**
          * There is no local registry for version {1} of “{0}” authority. Fallback on default version
          * for objects creation.
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
index 0ede410af7..8ad76eb3a2 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources.properties
@@ -74,6 +74,7 @@ DuplicatedSpatialComponents_1     = Compound coordinate reference systems cannot
 EllipsoidalHeightNotAllowed_1     = Compound coordinate reference systems should not contain ellipsoidal height. Use a three-dimensional {0,choice,0#geographic|1#projected} system instead.
 FileNotFound_2                    = Cannot find {0} file named \u201c{1}\u201d.
 FileNotReadable_2                 = Cannot parse \u201c{1}\u201d as a file in the {0} format.
+FallbackAuthorityNotice           = Definitions from public sources. When a definition corresponds to an EPSG object (ignoring metadata), the EPSG code is provided as a reference where to find the complete definition.
 GridLongitudeSpanTooWide_2        = The grid spans {0}\u00b0 of longitude, which may be too wide for the \u201c{1}\u201d domain.
 IllegalAxisDirection_2            = Coordinate system of class \u2018{0}\u2019 cannot have axis in the {1} direction.
 IllegalOperationDimension_3       = Dimensions of \u201c{0}\u201d operation cannot be ({1} \u2192 {2}).
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
index 48044061cc..9d82487e4a 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Resources_fr.properties
@@ -79,6 +79,7 @@ DuplicatedSpatialComponents_1     = Un syst\u00e8me de r\u00e9f\u00e9rence des c
 EllipsoidalHeightNotAllowed_1     = Un syst\u00e8me de r\u00e9f\u00e9rence des coordonn\u00e9es ne devrait pas contenir une hauteur ellipso\u00efdale. Utilisez plut\u00f4t un syst\u00e8me {0,choice,0#g\u00e9ographique|1#projet\u00e9} \u00e0 trois dimensions.
 FileNotFound_2                    = Ne peut pas trouver le fichier {0} nomm\u00e9 \u00ab\u202f{1}\u202f\u00bb.
 FileNotReadable_2                 = Ne peut pas lire \u00ab\u202f{1}\u202f\u00bb comme un fichier au format {0}.
+FallbackAuthorityNotice           = D\u00e9finitions de sources publiques. Quand une d\u00e9finition correspond \u00e0 un objet EPSG (en ignorant les m\u00e9ta-donn\u00e9es), le code EPSG est fournit comme r\u00e9f\u00e9rence o\u00f9 trouver une d\u00e9finition compl\u00e8te.
 GridLongitudeSpanTooWide_2        = La grille s\u2019\u00e9tend sur {0}\u00b0 de longitude, ce qui peut \u00eatre trop pour le domaine de \u00ab\u202f{1}\u202f\u00bb.
 IllegalAxisDirection_2            = Les syst\u00e8mes de coordonn\u00e9es de classe \u2018{0}\u2019 ne peuvent pas avoir d\u2019axe dans la direction \u00ab\u202f{1}\u202f\u00bb.
 IllegalOperationDimension_3       = Les dimensions de l\u2019op\u00e9ration \u00ab\u202f{0}\u202f\u00bb ne peuvent pas \u00eatre ({1} \u2192 {2}).
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
index 23086c8719..6d50ab6fff 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
@@ -155,9 +155,10 @@ public final class CRS extends Static {
 
     /**
      * Returns the Coordinate Reference System for the given authority code.
-     * The set of available codes depends on the {@link CRSAuthorityFactory} instances available on the classpath.
-     * There is many thousands of <a href="https://sis.apache.org/tables/CoordinateReferenceSystems.html">CRS
-     * defined by EPSG authority or by other authorities</a>.
+     * There is <a href="https://sis.apache.org/tables/CoordinateReferenceSystems.html">many thousands
+     * of reference systems</a> defined by the EPSG authority or by other authorities.
+     * Whether those codes are recognized or not depends on whether the
+     * <a href="https://sis.apache.org/epsg.html">EPSG dataset is installed</a>.
      * The following table lists a small subset of codes which are guaranteed to be available
      * on any installation of Apache SIS:
      *
@@ -167,14 +168,15 @@ public final class CRS extends Static {
      *   <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>CRS:88</td>        <td>{@link CommonCRS.Vertical#NAVD88 NAVD88}</td><td>Vertical</td><td>North American Vertical Datum 1988 height</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:4258</td>     <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geographic</td>      <td>European Terrestrial Reference System 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:4936</td>     <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geocentric</td>      <td>European Terrestrial Reference System 1989</td></tr>
+     *   <tr><td>EPSG:4937</td>     <td>{@link CommonCRS#ETRS89 ETRS89}</td> <td>Geographic 3D</td>   <td>European Terrestrial Reference System 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>
@@ -188,9 +190,15 @@ public final class CRS extends Static {
      *   <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>
      *   <tr><td>EPSG:5715</td>     <td>{@link CommonCRS.Vertical#DEPTH  DEPTH}</td>  <td>Vertical</td> <td>Mean Sea Level depth</td></tr>
      *   <tr><td>OGC:JulianDate</td><td>{@link CommonCRS.Temporal#JULIAN JULIAN}</td> <td>Temporal</td> <td>Julian date (days)</td></tr>
+     *   <tr><td>OGC:TruncatedJulianDate</td><td>{@link CommonCRS.Temporal#TRUNCATED_JULIAN TRUNCATED_JULIAN}</td> <td>Temporal</td> <td>Truncated Julian date (days)</td></tr>
      *   <tr><td>OGC:UnixTime</td>  <td>{@link CommonCRS.Temporal#UNIX   UNIX}</td>   <td>Unix</td>     <td>Unix time (seconds)</td></tr>
      * </table></blockquote>
      *
+     * For codes in above table, the EPSG geodetic database is used when available,
+     * otherwise Apache SIS fallbacks on definitions from public sources with no EPSG metadata except the identifiers.
+     * If the EPSG geodetic dataset has been used, the {@linkplain NamedIdentifier#getAuthority() authority} title
+     * will be something like <cite>"EPSG geodetic dataset"</cite>, otherwise it will be <cite>"Subset of EPSG"</cite>.
+     *
      * <h4>URI forms</h4>
      * This method accepts also the URN and URL syntaxes.
      * For example, the following codes are considered equivalent to {@code "EPSG:4326"}:
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
index 8bf54a8ca4..a8e33e6ddd 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CommonCRS.java
@@ -95,20 +95,35 @@ import static org.apache.sis.internal.util.StandardDateFormat.MILLISECONDS_PER_D
 
 /**
  * Frequently-used geodetic CRS and datum that are guaranteed to be available in SIS.
- * Methods in this enumeration are shortcuts for object definitions in the EPSG database.
- * If there is no EPSG database available, or if the query failed, or if there is no EPSG definition for an object,
- * then {@code CommonCRS} fallback on hard-coded values. Consequently, those methods never return {@code null}.
+ * Some (not all) objects defined in this enumeration are equivalent to objects defined
+ * in the EPSG geodetic dataset. In such case there is a choice:
+ *
+ * <ul class="verbose">
+ *   <li>If the <a href="https://sis.apache.org/epsg.html">EPSG dataset is installed</a>, then the methods
+ *       in this enumeration are effectively shortcuts for object definitions in the EPSG database.</li>
+ *   <li>If there is no EPSG database available, or if the query failed, or if there is no EPSG definition
+ *       for an object, then {@code CommonCRS} fallbacks on hard-coded values with minimal information.
+ *       The {@linkplain AbstractIdentifiedObject#getIdentifiers() identifier} associated to the returned
+ *       object should be interpreted as "see that EPSG code for more complete definition".</li>
+ * </ul>
+ *
+ * Consequently, the methods in this enumeration never return {@code null}.
+ * The definitions used as fallbacks are available in public sources
+ * and do not include EPSG metadata except the identifier.
+ * If the EPSG geodetic dataset has been used, the {@linkplain NamedIdentifier#getAuthority() authority} title
+ * will be something like <cite>"EPSG geodetic dataset"</cite>, otherwise it will be <cite>"Subset of EPSG"</cite>.
  *
  * <p>Referencing objects are cached after creation. Invoking the same method on the same {@code CommonCRS}
  * instance twice will return the same {@link IdentifiedObject} instance, unless the internal cache has been cleared
  * (e.g. the application is running in a container environment and some modules have been installed or uninstalled).</p>
  *
- * <p><b>Example:</b> the following code fetches a geographic Coordinate Reference System using
- * (<var>longitude</var>, <var>latitude</var>) axis order on the {@link #WGS84} geodetic datum:</p>
+ * <div class="note"><b>Example:</b> the following code fetches a geographic Coordinate Reference System
+ * using (<var>longitude</var>, <var>latitude</var>) axis order on the {@link #WGS84} geodetic datum:
  *
  * {@preformat java
  *   GeographicCRS crs = CommonCRS.WGS84.normalizedGeographic();
  * }
+ * </div>
  *
  * For each enumeration value, the name of the CRS, datum and ellipsoid objects may or may not be the same.
  * Below is an alphabetical list of object names available in this enumeration:
@@ -118,23 +133,19 @@ import static org.apache.sis.internal.util.StandardDateFormat.MILLISECONDS_PER_D
  *   <tr><th>Name or alias</th>                                     <th>Object type</th>           <th>Enumeration value</th></tr>
  *   <tr><td>Clarke 1866</td>                                       <td>Ellipsoid</td>             <td>{@link #NAD27}</td></tr>
  *   <tr><td>European Datum 1950 (ED50)</td>                        <td>CRS, datum</td>            <td>{@link #ED50}</td></tr>
- *   <tr><td>European Terrestrial Reference Frame (ETRS) 1989</td>  <td>CRS, datum</td>            <td>{@link #ETRS89}</td></tr>
- *   <tr><td>European Terrestrial Reference System (ETRF) 1989</td> <td>CRS, datum</td>            <td>{@link #ETRS89}</td></tr>
- *   <tr><td>Greenwich</td>                                         <td>Prime meridian</td>        <td>{@link #WGS84}, {@link #WGS72}, {@link #ETRS89}, {@link #NAD83}, {@link #NAD27}, {@link #ED50}, {@link #SPHERE}</td></tr>
+ *   <tr><td>European Terrestrial Reference System (ETRS) 1989</td> <td>CRS, datum</td>            <td>{@link #ETRS89}</td></tr>
+ *   <tr><td>Greenwich</td>                                         <td>Prime meridian</td>        <td>Any enumeration value</td></tr>
  *   <tr><td>GRS 1980</td>                                          <td>Ellipsoid</td>             <td>{@link #GRS1980}, {@link #ETRS89}, {@link #NAD83}</td></tr>
  *   <tr><td>GRS 1980 Authalic Sphere</td>                          <td>Ellipsoid</td>             <td>{@link #SPHERE}</td></tr>
- *   <tr><td>Hayford 1909</td>                                      <td>Ellipsoid</td>             <td>{@link #ED50}</td></tr>
  *   <tr><td>International 1924</td>                                <td>Ellipsoid</td>             <td>{@link #ED50}</td></tr>
- *   <tr><td>International 1979</td>                                <td>Ellipsoid</td>             <td>{@link #ETRS89}, {@link #NAD83}</td></tr>
  *   <tr><td>North American Datum 1927</td>                         <td>CRS, datum</td>            <td>{@link #NAD27}</td></tr>
  *   <tr><td>North American Datum 1983</td>                         <td>CRS, datum</td>            <td>{@link #NAD83}</td></tr>
- *   <tr><td>NWL 10D</td>                                           <td>Ellipsoid</td>             <td>{@link #WGS72}</td></tr>
  *   <tr><td>World Geodetic System (WGS) 1972</td>                  <td>CRS, datum, ellipsoid</td> <td>{@link #WGS72}</td></tr>
  *   <tr><td>World Geodetic System (WGS) 1984</td>                  <td>CRS, datum, ellipsoid</td> <td>{@link #WGS84}</td></tr>
  * </table></blockquote>
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.3
  *
  * @see org.apache.sis.referencing.factory.CommonAuthorityFactory
  *
@@ -149,15 +160,12 @@ public enum CommonCRS {
      *
      * <blockquote><table class="compact">
      * <caption>WGS84 properties</caption>
-     *   <tr><th>WMS identifier:</th>          <td>CRS:84</td></tr>
-     *   <tr><th>EPSG identifiers:</th>        <td>4326 &nbsp;(<i>datum:</i> 6326, &nbsp;<i>ellipsoid:</i> 7030)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"WGS 84" &nbsp;(<i>datum:</i> "World Geodetic System 1984")</td></tr>
-     *   <tr><th>Abbreviations or aliases:</th><td>(<i>datum:</i> "WGS 84", &nbsp;<i>ellipsoid:</i> "WGS84")</td></tr>
+     *   <tr><th>CRS identifiers:</th>         <td>CRS:84, EPSG:4326</td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>World Geodetic System 1984 (WGS 84)</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6378137</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 <i>(approximated)</i></td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6378137 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 metres <i>(approximated)</i></td></tr>
      *   <tr><th>Inverse flattening:</th>      <td>298.257223563 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
      *   <tr><th>UTM zones:</th>               <td>1 to 60 in North and South hemispheres</td></tr>
      * </table></blockquote>
      */
@@ -169,14 +177,12 @@ public enum CommonCRS {
      *
      * <blockquote><table class="compact">
      * <caption>WGS72 properties</caption>
-     *   <tr><th>EPSG identifiers:</th>        <td>4322 &nbsp;(<i>datum:</i> 6322, &nbsp;<i>ellipsoid:</i> 7043)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"WGS 72" &nbsp;(<i>datum:</i> "World Geodetic System 1972")</td></tr>
-     *   <tr><th>Abbreviations or aliases:</th><td>(<i>datum:</i> "WGS 72", &nbsp;<i>ellipsoid:</i> "NWL 10D")</td></tr>
+     *   <tr><th>CRS identifiers:</th>         <td>EPSG:4322</td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>World Geodetic System 1972 (WGS 72)</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6378135</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6356751 <i>(approximated)</i></td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6378135 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6356751 metres <i>(approximated)</i></td></tr>
      *   <tr><th>Inverse flattening:</th>      <td>298.26 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
      *   <tr><th>UTM zones:</th>               <td>1 to 60 in North and South hemispheres</td></tr>
      * </table></blockquote>
      */
@@ -185,20 +191,17 @@ public enum CommonCRS {
 
     /**
      * North American Datum 1983.
-     * The ellipsoid is <cite>"GRS 1980"</cite>, also known as <cite>"International 1979"</cite>.
+     * The ellipsoid is <cite>"GRS 1980"</cite>.
      * This ellipsoid is very close, but not identical, to the {@linkplain #WGS84} one.
      *
      * <blockquote><table class="compact">
      * <caption>NAD83 properties</caption>
-     *   <tr><th>WMS identifier:</th>          <td>CRS:83</td></tr>
-     *   <tr><th>EPSG identifiers:</th>        <td>4269 &nbsp;(<i>datum:</i> 6269, &nbsp;<i>ellipsoid:</i> 7019)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"NAD83" &nbsp;(<i>datum:</i> "North American Datum 1983", &nbsp;<i>ellipsoid:</i> "GRS 1980")</td></tr>
-     *   <tr><th>Abbreviations or aliases:</th><td>"NAD83 (1986)" &nbsp;(<i>ellipsoid:</i> "International 1979")</td></tr>
+     *   <tr><th>CRS identifier:</th>          <td>CRS:83, EPSG:4269</td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>North American Datum 1983 (NAD83)</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6378137</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 <i>(approximated)</i></td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6378137 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 metres <i>(approximated)</i></td></tr>
      *   <tr><th>Inverse flattening:</th>      <td>298.257222101 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
      *   <tr><th>UTM zones:</th>               <td>1 to 23 in the North hemisphere</td></tr>
      * </table></blockquote>
      *
@@ -215,14 +218,11 @@ public enum CommonCRS {
      *
      * <blockquote><table class="compact">
      * <caption>NAD27 properties</caption>
-     *   <tr><th>WMS identifier:</th>          <td>CRS:27</td></tr>
-     *   <tr><th>EPSG identifiers:</th>        <td>4267 &nbsp;(<i>datum:</i> 6267, &nbsp;<i>ellipsoid:</i> 7008)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"NAD27" &nbsp;(<i>datum:</i> "North American Datum 1927", &nbsp;<i>ellipsoid:</i> "Clarke 1866")</td></tr>
-     *   <tr><th>Abbreviations or aliases:</th><td>(<i>datum:</i> "NAD27")</td></tr>
+     *   <tr><th>CRS identifiers:</th>         <td>CRS:27, EPSG:4267</td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>North American Datum 1927 (NAD27)</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6378206.4</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6356583.8 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6378206.4 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6356583.8 metres <i>(definitive)</i></td></tr>
      *   <tr><th>UTM zones:</th>               <td>1 to 22 in the North hemisphere</td></tr>
      * </table></blockquote>
      */
@@ -231,19 +231,17 @@ public enum CommonCRS {
 
     /**
      * European Terrestrial Reference System 1989.
-     * The ellipsoid is <cite>"GRS 1980"</cite>, also known as <cite>"International 1979"</cite>.
+     * The ellipsoid is <cite>"GRS 1980"</cite>.
      * This ellipsoid is very close, but not identical, to the {@linkplain #WGS84} one.
      *
      * <blockquote><table class="compact">
      * <caption>ETRS89 properties</caption>
-     *   <tr><th>EPSG identifiers:</th>        <td>4258 &nbsp;(<i>datum:</i> 6258, &nbsp;<i>ellipsoid:</i> 7019)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"ETRS89" &nbsp;(<i>datum:</i> "European Terrestrial Reference System 1989", &nbsp;<i>ellipsoid:</i> "GRS 1980")</td></tr>
-     *   <tr><th>Abbreviations or aliases:</th><td>"ETRF89", "EUREF89", "ETRS89-GRS80" &nbsp;(<i>ellipsoid:</i> "International 1979")</td></tr>
+     *   <tr><th>CRS identifiers:</th>         <td>EPSG:4258</td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>European Terrestrial Reference System 1989 (ETRS89)</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6378137</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 <i>(approximated)</i></td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6378137 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 metres <i>(approximated)</i></td></tr>
      *   <tr><th>Inverse flattening:</th>      <td>298.257222101 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
      *   <tr><th>UTM zones:</th>               <td>28 to 37 in the North hemisphere</td></tr>
      * </table></blockquote>
      *
@@ -256,18 +254,16 @@ public enum CommonCRS {
            (short) 0, (short) 0, (short) 25800, (short) 0, (byte) 28, (byte) 37),           // UPS and UTM info
 
     /**
-     * European Datum 1950.
+     * European Datum 1950 (ED50).
      *
      * <blockquote><table class="compact">
      * <caption>ED50 properties</caption>
-     *   <tr><th>EPSG identifiers:</th>        <td>4230 &nbsp;(<i>datum:</i> 6230, &nbsp;<i>ellipsoid:</i> 7022)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"ED50" &nbsp;(<i>datum:</i> "European Datum 1950", &nbsp;<i>ellipsoid:</i> "International 1924")</td></tr>
-     *   <tr><th>Abbreviations or aliases:</th><td>(<i>datum:</i> "ED50", <i>ellipsoid:</i> "Hayford 1909")</td></tr>
+     *   <tr><th>CRS identifiers:</th>         <td>EPSG:4230</td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>European Datum 1950 (ED50)</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6378388</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6356912 <i>(approximated)</i></td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6378388 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6356912 metres <i>(approximated)</i></td></tr>
      *   <tr><th>Inverse flattening:</th>      <td>297 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
      *   <tr><th>UTM zones:</th>               <td>28 to 38 in the North hemisphere</td></tr>
      * </table></blockquote>
      */
@@ -280,13 +276,12 @@ public enum CommonCRS {
      *
      * <blockquote><table class="compact">
      * <caption>GRS1980 properties</caption>
-     *   <tr><th>EPSG identifiers:</th>        <td><del>4019</del> &nbsp;(<i>datum:</i> 6019, &nbsp;<i>ellipsoid:</i> 7019)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"Unknown datum based upon the GRS 1980 ellipsoid."</td></tr>
+     *   <tr><th>CRS identifiers:</th>         <td><del>EPSG:4019</del></td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>Unknown datum based upon the GRS 1980 ellipsoid</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6378137</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 <i>(approximated)</i></td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6378137 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6356752 metres <i>(approximated)</i></td></tr>
      *   <tr><th>Inverse flattening:</th>      <td>298.257222101 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
      * </table></blockquote>
      *
      * @since 1.0
@@ -299,12 +294,11 @@ public enum CommonCRS {
      *
      * <blockquote><table class="compact">
      * <caption>Sphere properties</caption>
-     *   <tr><th>EPSG identifiers:</th>        <td><del>4047</del> &nbsp;(<i>datum:</i> 6047, &nbsp;<i>ellipsoid:</i> 7048)</td></tr>
-     *   <tr><th>Primary names:</th>           <td>"Unspecified datum based upon the GRS 1980 Authalic Sphere"</td></tr>
+     *   <tr><th>CRS identifiers:</th>         <td><del>EPSG:4047</del></td></tr>
+     *   <tr><th>Name and abbreviation:</th>   <td>Unspecified datum based upon the GRS 1980 Authalic Sphere</td></tr>
      *   <tr><th>Prime meridian:</th>          <td>Greenwich</td></tr>
-     *   <tr><th>Semi-major axis length:</th>  <td>6371007</td></tr>
-     *   <tr><th>Semi-minor axis length:</th>  <td>6371007 <i>(definitive)</i></td></tr>
-     *   <tr><th>Ellipsoid axes unit:</th>     <td>{@link Units#METRE}</td></tr>
+     *   <tr><th>Semi-major axis length:</th>  <td>6371007 metres</td></tr>
+     *   <tr><th>Semi-minor axis length:</th>  <td>6371007 metres <i>(definitive)</i></td></tr>
      * </table></blockquote>
      *
      * @see org.apache.sis.referencing.datum.DefaultEllipsoid#getAuthalicRadius()
@@ -889,9 +883,9 @@ public enum CommonCRS {
      *   <caption>Commonly used ellipsoids</caption>
      *   <tr><th>Name or alias</th>                    <th>Enum</th>            <th>EPSG</th></tr>
      *   <tr><td>Clarke 1866</td>                      <td>{@link #NAD27}</td>  <td>7008</td></tr>
+     *   <tr><td>GRS 1980</td>                         <td>{@link #GRS1980}</td><td>7019</td></tr>
      *   <tr><td>GRS 1980 Authalic Sphere</td>         <td>{@link #SPHERE}</td> <td>7048</td></tr>
      *   <tr><td>International 1924</td>               <td>{@link #ED50}</td>   <td>7022</td></tr>
-     *   <tr><td>International 1979 / GRS 1980</td>    <td>{@link #ETRS89}</td> <td>7019</td></tr>
      *   <tr><td>World Geodetic System (WGS) 1972</td> <td>{@link #WGS72}</td>  <td>7043</td></tr>
      *   <tr><td>World Geodetic System (WGS) 1984</td> <td>{@link #WGS84}</td>  <td>7030</td></tr>
      * </table></blockquote>
@@ -1206,7 +1200,7 @@ public enum CommonCRS {
      *   <caption>Geodetic objects accessible by enumeration constants</caption>
      *   <tr><th>Name or alias</th>                      <th>Object type</th> <th>Enumeration value</th></tr>
      *   <tr><td>Barometric altitude</td>                <td>CRS, Datum</td>  <td>{@link #BAROMETRIC}</td></tr>
-     *   <!-- <s>Ellipsoidal height</s> intentionally omitted                 <td><s>{@link #ELLIPSOIDAL}</s></td> -->
+     *   <!-- <del>Ellipsoidal height</del> intentionally omitted             <td><del>{@link #ELLIPSOIDAL}</del></td> -->
      *   <tr><td>Mean Sea Level</td>                     <td>Datum</td>       <td>{@link #MEAN_SEA_LEVEL}</td></tr>
      *   <tr><td>Mean Sea Level depth</td>               <td>CRS</td>         <td>{@link #DEPTH}</td></tr>
      *   <tr><td>Mean Sea Level height</td>              <td>CRS</td>         <td>{@link #MEAN_SEA_LEVEL}</td></tr>
@@ -1221,7 +1215,7 @@ public enum CommonCRS {
      * The {@link #MEAN_SEA_LEVEL} value can be used instead as an approximation of geoidal heights.</div>
      *
      * @author  Martin Desruisseaux (Geomatys)
-     * @version 0.7
+     * @version 1.3
      *
      * @see org.apache.sis.referencing.factory.CommonAuthorityFactory
      *
@@ -1244,11 +1238,10 @@ public enum CommonCRS {
          *
          * <blockquote><table class="compact">
          * <caption>Mean Sea Level properties</caption>
-         *   <tr><th>EPSG identifiers:</th>         <td>5714 &nbsp;(<i>datum:</i> 5100)</td></tr>
-         *   <tr><th>Primary names:</th>            <td>"MSL height" &nbsp;(<i>datum:</i> "Mean Sea Level")</td></tr>
-         *   <tr><th>Abbreviations or aliases:</th> <td>"mean sea level height" &nbsp;(<i>datum:</i> "MSL")</td></tr>
-         *   <tr><th>Direction:</th>                <td>{@link AxisDirection#UP}</td></tr>
-         *   <tr><th>Unit:</th>                     <td>{@link Units#METRE}</td></tr>
+         *   <tr><th>CRS identifiers:</th>      <td>EPSG:5714</td></tr>
+         *   <tr><th>Name or abbreviation:</th> <td>Mean Sea Level (MSL) height</td></tr>
+         *   <tr><th>Direction:</th>            <td>{@link AxisDirection#UP}</td></tr>
+         *   <tr><th>Unit:</th>                 <td>{@link Units#METRE}</td></tr>
          * </table></blockquote>
          *
          * @see VerticalDatumType#GEOIDAL
@@ -1260,11 +1253,10 @@ public enum CommonCRS {
          *
          * <blockquote><table class="compact">
          * <caption>Depth properties</caption>
-         *   <tr><th>EPSG identifiers:</th>         <td>5715 &nbsp;(<i>datum:</i> 5100)</td></tr>
-         *   <tr><th>Primary names:</th>            <td>"MSL depth" &nbsp;(<i>datum:</i> "Mean Sea Level")</td></tr>
-         *   <tr><th>Abbreviations or aliases:</th> <td>"mean sea level depth" &nbsp;(<i>datum:</i> "MSL")</td></tr>
-         *   <tr><th>Direction:</th>                <td>{@link AxisDirection#DOWN}</td></tr>
-         *   <tr><th>Unit:</th>                     <td>{@link Units#METRE}</td></tr>
+         *   <tr><th>CRS identifiers:</th>      <td>EPSG:5715</td></tr>
+         *   <tr><th>Name or abbreviation:</th> <td>Mean Sea Level depth (MSL) depth</td></tr>
+         *   <tr><th>Direction:</th>            <td>{@link AxisDirection#DOWN}</td></tr>
+         *   <tr><th>Unit:</th>                 <td>{@link Units#METRE}</td></tr>
          * </table></blockquote>
          *
          * @see VerticalDatumType#GEOIDAL
@@ -1276,12 +1268,10 @@ public enum CommonCRS {
          *
          * <blockquote><table class="compact">
          * <caption>NAVD88 properties</caption>
-         *   <tr><th>WMS identifier:</th>           <td>CRS:88</td></tr>
-         *   <tr><th>EPSG identifiers:</th>         <td>5703 &nbsp;(<i>datum:</i> 5103)</td></tr>
-         *   <tr><th>Primary names:</th>            <td>"NAVD88 height" &nbsp;(<i>datum:</i> "North American Vertical Datum 1988")</td></tr>
-         *   <tr><th>Abbreviations or aliases:</th> <td>" North American Vertical Datum of 1988 height (m)" &nbsp;(<i>datum:</i> "NAVD88")</td></tr>
-         *   <tr><th>Direction:</th>                <td>{@link AxisDirection#UP}</td></tr>
-         *   <tr><th>Unit:</th>                     <td>{@link Units#METRE}</td></tr>
+         *   <tr><th>CRS identifier:</th>       <td>CRS:88, EPSG:5703</td></tr>
+         *   <tr><th>Name or abbreviation:</th> <td>North American Vertical Datum 1988 (NAVD88) height</td></tr>
+         *   <tr><th>Direction:</th>            <td>{@link AxisDirection#UP}</td></tr>
+         *   <tr><th>Unit:</th>                 <td>{@link Units#METRE}</td></tr>
          * </table></blockquote>
          *
          * @see CommonCRS#NAD83
@@ -1377,7 +1367,7 @@ public enum CommonCRS {
          *   <caption>Commonly used vertical CRS</caption>
          *   <tr><th>Name or alias</th>             <th>Enum</th>                        <th>EPSG</th></tr>
          *   <tr><td>Barometric altitude</td>       <td>{@link #BAROMETRIC}</td>         <td></td></tr>
-         *   <!-- <s>Ellipsoidal height</s> intentionally omitted -->
+         *   <!-- <del>Ellipsoidal height</del> intentionally omitted -->
          *   <tr><td>Mean Sea Level depth</td>      <td>{@link #DEPTH}</td>              <td>5715</td></tr>
          *   <tr><td>Mean Sea Level height</td>     <td>{@link #MEAN_SEA_LEVEL}</td>     <td>5714</td></tr>
          *   <tr><td>Other surface</td>             <td>{@link #OTHER_SURFACE}</td>      <td></td></tr>
@@ -1444,7 +1434,7 @@ public enum CommonCRS {
          *   <caption>Commonly used vertical datum</caption>
          *   <tr><th>Name or alias</th>             <th>Enum</th>                        <th>EPSG</th></tr>
          *   <tr><td>Barometric altitude</td>       <td>{@link #BAROMETRIC}</td>         <td></td></tr>
-         *   <!-- <s>Ellipsoidal height</s> intentionally omitted -->
+         *   <!-- <del>Ellipsoidal height</del> intentionally omitted -->
          *   <tr><td>Mean Sea Level</td>            <td>{@link #MEAN_SEA_LEVEL}</td>     <td>5100</td></tr>
          *   <tr><td>Other surface</td>             <td>{@link #OTHER_SURFACE}</td>      <td></td></tr>
          * </table></blockquote>
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/EPSGFactoryFallback.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/EPSGFactoryFallback.java
index af802a3bed..504a290011 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/EPSGFactoryFallback.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/EPSGFactoryFallback.java
@@ -41,8 +41,6 @@ import org.opengis.referencing.cs.EllipsoidalCS;
 import org.opengis.referencing.cs.SphericalCS;
 import org.opengis.referencing.cs.CartesianCS;
 import org.opengis.metadata.citation.Citation;
-import org.apache.sis.metadata.iso.citation.Citations;
-import org.apache.sis.metadata.iso.citation.DefaultCitation;
 import org.apache.sis.referencing.factory.GeodeticAuthorityFactory;
 import org.apache.sis.internal.referencing.provider.TransverseMercator;
 import org.apache.sis.internal.referencing.Resources;
@@ -52,8 +50,6 @@ import org.apache.sis.internal.util.MetadataServices;
 import org.apache.sis.internal.util.Constants;
 import org.apache.sis.internal.util.URLs;
 import org.apache.sis.setup.InstallationResources;
-import org.apache.sis.util.SimpleInternationalString;
-import org.apache.sis.util.resources.Vocabulary;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.Debug;
 import org.apache.sis.measure.Latitude;
@@ -64,6 +60,8 @@ import org.apache.sis.measure.Units;
  * The authority factory to use as a fallback when the real EPSG factory is not available.
  * We use this factory in order to guarantee that the minimal set of CRS codes documented
  * in the {@link CRS#forCode(String)} method javadoc is always available.
+ * This fallback uses data available in public sources, with all EPSG metadata omitted except the identifiers.
+ * The EPSG identifiers are provided as references where to find the complete definitions.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.3
@@ -87,16 +85,6 @@ final class EPSGFactoryFallback extends GeodeticAuthorityFactory
      */
     static final EPSGFactoryFallback INSTANCE = new EPSGFactoryFallback();
 
-    /**
-     * The authority to report in exceptions. Not necessarily the same than the {@link #authority} title.
-     */
-    private static final String AUTHORITY = Constants.EPSG + "-subset";
-
-    /**
-     * The authority, created when first needed.
-     */
-    private Citation authority;
-
     /**
      * URL  where users can get more information about the installation process.
      * Fetched when first needed.
@@ -113,18 +101,19 @@ final class EPSGFactoryFallback extends GeodeticAuthorityFactory
     }
 
     /**
-     * Returns the EPSG authority with only a modification in the title
-     * for emphasing that this is a subset of EPSG dataset.
+     * Returns an authority with "Subset of EPSG" title.
      */
     @Override
-    public synchronized Citation getAuthority() {
-        if (authority == null) {
-            final DefaultCitation c = new DefaultCitation(Citations.EPSG);
-            c.setTitle(Vocabulary.formatInternational(Vocabulary.Keys.SubsetOf_1, c.getTitle()));
-            c.setEdition(new SimpleInternationalString(StandardDefinitions.VERSION));
-            authority = c;
-        }
-        return authority;
+    public Citation getAuthority() {
+        return StandardDefinitions.AUTHORITY;
+    }
+
+    /**
+     * Returns the title of the authority as a string in the default locale.
+     * This is used in exceptions.
+     */
+    private String getAuthorityTitle() {
+        return getAuthority().getTitle().toString();
     }
 
     /**
@@ -363,12 +352,12 @@ final class EPSGFactoryFallback extends GeodeticAuthorityFactory
             }
         } catch (NumberFormatException cause) {
             final NoSuchAuthorityCodeException e = new NoSuchAuthorityCodeException(Resources.format(
-                    Resources.Keys.NoSuchAuthorityCode_3, Constants.EPSG, toClass(kind), code), AUTHORITY, code);
+                    Resources.Keys.NoSuchAuthorityCode_3, Constants.EPSG, toClass(kind), code), getAuthorityTitle(), code);
             e.initCause(cause);
             throw e;
         }
         throw new NoSuchAuthorityCodeException(Resources.format(Resources.Keys.NoSuchAuthorityCodeInSubset_4,
-                Constants.EPSG, toClass(kind), code, getInstallationURL()), AUTHORITY, code);
+                Constants.EPSG, toClass(kind), code, getInstallationURL()), getAuthorityTitle(), code);
     }
 
     /**
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
index 18c4ad75c6..fb058662a2 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/IdentifiedObjects.java
@@ -38,6 +38,7 @@ import org.apache.sis.util.Static;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.ArgumentChecks;
 import org.apache.sis.util.logging.Logging;
+import org.apache.sis.xml.IdentifierSpace;
 import org.apache.sis.internal.util.Strings;
 import org.apache.sis.internal.util.Constants;
 import org.apache.sis.internal.util.DefinitionURI;
@@ -59,7 +60,7 @@ import static org.apache.sis.internal.util.CollectionsExt.nonNull;
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Guilhem Legal (Geomatys)
- * @version 1.1
+ * @version 1.3
  *
  * @see CRS
  * @see org.apache.sis.geometry.Envelopes
@@ -242,6 +243,8 @@ public final class IdentifiedObjects extends Static {
      * This method checks all {@linkplain AbstractIdentifiedObject#getIdentifiers() identifiers} in their iteration
      * order and returns the first identifier with an {@linkplain NamedIdentifier#getAuthority() authority} citation
      * {@linkplain Citations#identifierMatches(Citation, Citation) matching} the specified authority.
+     * If the specified authority implements {@link IdentifierSpace}, then the authority space name
+     * is also compared to the {@linkplain NamedIdentifier#getCodeSpace() code space} of each identifier.
      *
      * @param  object     the object to get the identifier from, or {@code null}.
      * @param  authority  the authority for the identifier to return, or {@code null} for
@@ -253,10 +256,17 @@ public final class IdentifiedObjects extends Static {
      */
     public static Identifier getIdentifier(final IdentifiedObject object, final Citation authority) {
         if (object != null) {
+            String cs = null;
+            if (authority instanceof IdentifierSpace<?>) {
+                cs = ((IdentifierSpace<?>) authority).getName();
+            }
             for (final Identifier identifier : nonNull(object.getIdentifiers())) {
                 if (identifier != null) {                       // Paranoiac check.
+                    if (cs != null && cs.equalsIgnoreCase(identifier.getCodeSpace())) {
+                        return identifier;      // Match based on codespace.
+                    }
                     if (authority == null || Citations.identifierMatches(authority, identifier.getAuthority())) {
-                        return identifier;
+                        return identifier;      // Match based on citation.
                     }
                 }
             }
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/StandardDefinitions.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/StandardDefinitions.java
index 38c6e147a4..10817f94ec 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/StandardDefinitions.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/StandardDefinitions.java
@@ -20,6 +20,9 @@ import java.util.Map;
 import java.util.HashMap;
 import javax.measure.Unit;
 import javax.measure.quantity.Length;
+import org.opengis.util.InternationalString;
+import org.opengis.metadata.citation.Citation;
+import org.opengis.metadata.citation.PresentationForm;
 import org.opengis.referencing.datum.Ellipsoid;
 import org.opengis.referencing.datum.PrimeMeridian;
 import org.opengis.referencing.datum.GeodeticDatum;
@@ -39,11 +42,15 @@ import org.opengis.parameter.ParameterValueGroup;
 import org.opengis.util.NoSuchIdentifierException;
 import org.apache.sis.internal.util.Constants;
 import org.apache.sis.internal.metadata.AxisNames;
+import org.apache.sis.internal.referencing.Resources;
 import org.apache.sis.internal.referencing.CoordinateOperations;
 import org.apache.sis.internal.referencing.provider.TransverseMercator;
 import org.apache.sis.internal.referencing.provider.PolarStereographicA;
+import org.apache.sis.util.resources.Vocabulary;
+import org.apache.sis.util.SimpleInternationalString;
 import org.apache.sis.metadata.iso.extent.Extents;
 import org.apache.sis.metadata.iso.citation.Citations;
+import org.apache.sis.metadata.iso.citation.DefaultCitation;
 import org.apache.sis.referencing.datum.DefaultEllipsoid;
 import org.apache.sis.referencing.datum.DefaultPrimeMeridian;
 import org.apache.sis.referencing.datum.DefaultGeodeticDatum;
@@ -64,8 +71,8 @@ import org.apache.sis.measure.Units;
 
 import static org.opengis.referencing.IdentifiedObject.NAME_KEY;
 import static org.opengis.referencing.IdentifiedObject.ALIAS_KEY;
+import static org.opengis.referencing.IdentifiedObject.REMARKS_KEY;
 import static org.opengis.referencing.IdentifiedObject.IDENTIFIERS_KEY;
-import static org.opengis.referencing.crs.GeographicCRS.SCOPE_KEY;
 import static org.opengis.referencing.datum.Datum.DOMAIN_OF_VALIDITY_KEY;
 import static org.apache.sis.internal.metadata.ReferencingServices.AUTHALIC_RADIUS;
 
@@ -75,6 +82,9 @@ import static org.apache.sis.internal.metadata.ReferencingServices.AUTHALIC_RADI
  * This class is used only as a fallback if the objects cannot be fetched from the EPSG database.
  * This class should not be loaded when a connection to an EPSG geodetic dataset is available.
  *
+ * <p>This class uses data available in public sources, with all EPSG metadata omitted except the identifiers.
+ * The EPSG identifiers are provided as references where to find the complete definitions.</p>
+ *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.3
  * @since   0.4
@@ -95,6 +105,32 @@ final class StandardDefinitions {
      */
     static final String GREENWICH = "8901";
 
+    /**
+     * Notice about the provenance of those data.
+     * This is provided as a small clarification because EPSG data should be licensed under EPSG Terms of Use.
+     * The approach in this class is to use only the data that are available from public sources,
+     * and to add only the EPSG codes as citation references. The notice text is:
+     *
+     * <blockquote>Definitions from public sources. When a definition corresponds to an EPSG object (ignoring metadata),
+     * the EPSG code is provided as a reference where to find the complete definition.</blockquote>
+     */
+    private static final InternationalString NOTICE =
+            Resources.formatInternational(Resources.Keys.FallbackAuthorityNotice);
+
+    /**
+     * The authority for this subset of EPSG database.
+     */
+    static final Citation AUTHORITY;
+    static {
+        final DefaultCitation c = new DefaultCitation();
+        c.setTitle(Vocabulary.formatInternational(Vocabulary.Keys.SubsetOf_1, Constants.EPSG));
+        c.setEdition(new SimpleInternationalString(StandardDefinitions.VERSION));
+        c.getPresentationForms().add(PresentationForm.DOCUMENT_DIGITAL);
+        c.getOtherCitationDetails().add(NOTICE);
+        c.transitionTo(DefaultCitation.State.FINAL);
+        AUTHORITY = c;
+    }
+
     /**
      * Do not allow instantiation of this class.
      */
@@ -113,13 +149,16 @@ final class StandardDefinitions {
     private static Map<String,Object> properties(final int code, final String name, final String alias, final boolean world) {
         final Map<String,Object> map = new HashMap<>(8);
         if (code != 0) {
-            map.put(IDENTIFIERS_KEY, new NamedIdentifier(Citations.EPSG, Constants.EPSG, String.valueOf(code), VERSION, null));
+            map.put(IDENTIFIERS_KEY, new NamedIdentifier(AUTHORITY, Constants.EPSG, String.valueOf(code), VERSION, null));
+        }
+        map.put(NAME_KEY, new NamedIdentifier(AUTHORITY, null, name, null, null));
+        if (alias != null) {
+            map.put(ALIAS_KEY, alias);
         }
-        map.put(NAME_KEY, new NamedIdentifier(Citations.EPSG, name));
-        map.put(ALIAS_KEY, alias);                                      // May be null, which is okay.
         if (world) {
             map.put(DOMAIN_OF_VALIDITY_KEY, Extents.WORLD);
         }
+        map.put(REMARKS_KEY, NOTICE);
         return map;
     }
 
@@ -176,22 +215,19 @@ final class StandardDefinitions {
      */
     static GeographicCRS createGeographicCRS(final short code, final GeodeticDatum datum, final EllipsoidalCS cs) {
         final String name;
-        String  alias = null;
-        String  scope = null;
         boolean world = false;
         switch (code) {
-            case 4326: name = "WGS 84"; world = true;           scope = "Horizontal component of 3D system."; break;
-            case 4322: name = "WGS 72"; world = true;           scope = "Horizontal component of 3D system."; break;
-            case 4258: name = "ETRS89"; alias = "ETRS89-GRS80"; scope = "Horizontal component of 3D system."; break;
-            case 4269: name = "NAD83";                          scope = "Geodetic survey.";                   break;
-            case 4267: name = "NAD27";                          scope = "Geodetic survey.";                   break;
-            case 4230: name = "ED50";                           scope = "Geodetic survey.";                   break;
-            case 4019: name = "Unknown datum based upon the GRS 1980 ellipsoid";           world = true;      break;
-            case 4047: name = "Unspecified datum based upon the GRS 1980 Authalic Sphere"; world = true;      break;
+            case 4326: name = "WGS 84"; world = true; break;
+            case 4322: name = "WGS 72"; world = true; break;
+            case 4258: name = "ETRS89"; break;
+            case 4269: name = "NAD83";  break;
+            case 4267: name = "NAD27";  break;
+            case 4230: name = "ED50";   break;
+            case 4019: name = "Unknown datum based upon the GRS 1980 ellipsoid";           world = true; break;
+            case 4047: name = "Unspecified datum based upon the GRS 1980 Authalic Sphere"; world = true; break;
             default:   throw new AssertionError(code);
         }
-        final Map<String, Object> properties = properties(code, name, alias, world);
-        properties.put(SCOPE_KEY, scope);
+        final Map<String, Object> properties = properties(code, name, null, world);
         return new DefaultGeographicCRS(properties, datum, cs);
     }
 
@@ -235,12 +271,12 @@ final class StandardDefinitions {
         boolean ivfDefinitive  = true;
         Unit<Length> unit      = Units.METRE;
         switch (code) {
-            case 7030: name  = "WGS 84";                   alias = "WGS84";        semiMajorAxis = 6378137.0; other = 298.257223563; break;
-            case 7043: name  = "WGS 72";                   alias = "NWL 10D";      semiMajorAxis = 6378135.0; other = 298.26;        break;
-            case 7019: alias = "International 1979";       name  = "GRS 1980";     semiMajorAxis = 6378137.0; other = 298.257222101; break;
-            case 7022: name  = "International 1924";       alias = "Hayford 1909"; semiMajorAxis = 6378388.0; other = 297.0;         break;
-            case 7008: name  = "Clarke 1866";              ivfDefinitive = false;  semiMajorAxis = 6378206.4; other = 6356583.8;     break;
-            case 7048: name  = "GRS 1980 Authalic Sphere"; ivfDefinitive = false;  semiMajorAxis = other = AUTHALIC_RADIUS;          break;
+            case 7030: name  = "WGS 1984";                 semiMajorAxis = 6378137.0; other = 298.257223563; break;
+            case 7043: name  = "WGS 1972";                 semiMajorAxis = 6378135.0; other = 298.26;        break;
+            case 7019: name  = "GRS 1980";                 semiMajorAxis = 6378137.0; other = 298.257222101; break;
+            case 7022: name  = "International 1924";       semiMajorAxis = 6378388.0; other = 297.0;         break;
+            case 7008: name  = "Clarke 1866";              semiMajorAxis = 6378206.4; other = 6356583.8; ivfDefinitive = false; break;
+            case 7048: name  = "GRS 1980 Authalic Sphere"; semiMajorAxis = other = AUTHALIC_RADIUS; ivfDefinitive = false; break;
             default:   throw new AssertionError(code);
         }
         final Map<String,Object> map = properties(code, name, alias, false);
@@ -257,8 +293,8 @@ final class StandardDefinitions {
      */
     static PrimeMeridian primeMeridian() {
         final Map<String,Object> properties = new HashMap<>(4);
-        properties.put(NAME_KEY, new NamedIdentifier(Citations.EPSG, "Greenwich"));         // Name is fixed by ISO 19111.
-        properties.put(IDENTIFIERS_KEY, new NamedIdentifier(Citations.EPSG, GREENWICH));
+        properties.put(NAME_KEY, new NamedIdentifier(AUTHORITY, "Greenwich"));          // Name is fixed by ISO 19111.
+        properties.put(IDENTIFIERS_KEY, new NamedIdentifier(AUTHORITY, GREENWICH));
         return new DefaultPrimeMeridian(properties, 0, Units.DEGREE);
     }
 
@@ -278,13 +314,13 @@ final class StandardDefinitions {
         switch (code) {
             case 5703: wms    = "88";
                        name   = "NAVD88 height";
-                       alias  = "North American Vertical Datum of 1988 height (m)";
+                       alias  = "North American Vertical Datum 1988 height";
                        break;
             case 5714: name   = "MSL height";
-                       alias  = "mean sea level height";
+                       alias  = "Mean Sea Level height";
                        break;
             case 5715: name   = "MSL depth";
-                       alias  = "mean sea level depth";
+                       alias  = "Mean Sea Level depth";
                        csName = "Vertical CS. Axis: depth (D).";
                        csCode = 6498;
                        axis   = 113;
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/StandardDefinitionsTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/StandardDefinitionsTest.java
index 842e8da0ef..1139274215 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/StandardDefinitionsTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/StandardDefinitionsTest.java
@@ -52,7 +52,7 @@ import static org.opengis.test.Assert.*;
  * Tests the {@link StandardDefinitions} class.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.0
+ * @version 1.3
  * @since   0.4
  * @module
  */