blob: a4b48884f0196a438d05c37ac6f6664a244b5a1b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.referencing.factory;
import java.util.Set;
import java.util.Collections;
import javax.measure.Unit;
import org.opengis.referencing.*;
import org.opengis.referencing.cs.*;
import org.opengis.referencing.crs.*;
import org.opengis.referencing.datum.*;
import org.opengis.referencing.operation.*;
import org.opengis.metadata.Identifier;
import org.opengis.metadata.extent.Extent;
import org.opengis.metadata.citation.Citation;
import org.opengis.parameter.ParameterDescriptor;
import org.opengis.util.FactoryException;
import org.opengis.util.InternationalString;
import org.apache.sis.metadata.iso.citation.Citations;
import org.apache.sis.internal.util.Constants;
import org.apache.sis.internal.referencing.ReferencingUtilities;
import org.apache.sis.referencing.AbstractIdentifiedObject;
import org.apache.sis.util.iso.SimpleInternationalString;
import org.apache.sis.util.iso.AbstractFactory;
import org.apache.sis.util.resources.Errors;
import org.apache.sis.util.CharSequences;
import org.apache.sis.util.Classes;
// Branch-dependent imports
import org.apache.sis.referencing.cs.DefaultParametricCS;
import org.apache.sis.referencing.crs.DefaultParametricCRS;
import org.apache.sis.referencing.datum.DefaultParametricDatum;
/**
* Creates geodetic objects from codes defined by an authority.
* An <cite>authority</cite> is an organization that maintains definitions of authority codes.
* An <cite>authority code</cite> is a compact string defined by an authority to reference a particular spatial reference object.
* A frequently used set of authority codes is the <a href="http://www.epsg.org">EPSG geodetic dataset</a>,
* a database of coordinate systems and other spatial referencing objects where each object has a code number ID.
*
* <div class="note"><b>Example:</b>
* the EPSG code for a <cite>World Geodetic System 1984</cite> (WGS84) coordinate reference system
* with latitude and longitude axes is {@code "4326"}.</div>
*
* <p>This class defines a default implementation for most methods defined in the {@link DatumAuthorityFactory},
* {@link CSAuthorityFactory} and {@link CRSAuthorityFactory} interfaces. However, those interfaces do not appear
* in the {@code implements} clause of this class declaration. This is up to subclasses to decide which interfaces
* they declare to implement.</p>
*
* <p>The default implementation for all {@code createFoo(String)} methods ultimately invokes
* {@link #createObject(String)}, which may be the only method that a subclass need to override.
* However, other methods may be overridden as well for better performances.</p>
*
* @author Martin Desruisseaux (IRD, Geomatys)
* @author Johann Sorel (Geomatys)
* @version 0.8
* @since 0.7
* @module
*/
public abstract class GeodeticAuthorityFactory extends AbstractFactory implements AuthorityFactory {
/**
* Creates a new authority factory for geodetic objects.
*/
protected GeodeticAuthorityFactory() {
}
/**
* Returns the database or specification that defines the codes recognized by this factory.
* This method may return {@code null} if it can not obtain this information, for example because
* the connection to a database is not available.
*
* <div class="note"><b>Example:</b>
* a factory that create coordinate reference system objects from EPSG codes could return
* a citation like below:
*
* {@preformat text
* Citation
* ├─ Title ……………………………………………………… EPSG Geodetic Parameter Dataset
* ├─ Identifier ………………………………………… EPSG
* ├─ Online resource (1 of 2)
* │ ├─ Linkage ………………………………………… http://epsg-registry.org/
* │ └─ Function ……………………………………… Browse
* └─ Online resource (2 of 2)
* ├─ Linkage ………………………………………… jdbc:derby:/my/path/to/SIS_DATA/Databases/SpatialMetadata
* ├─ Description ……………………………… EPSG dataset version 9.1 on “Apache Derby Embedded JDBC Driver” version 10.14.
* └─ Function ……………………………………… Connection
* }
*
* The online resource description with a “Connection” function is a SIS extension.</div>
*
* @return the organization responsible for definition of the database, or {@code null} if unknown.
*
* @see #getVendor()
*/
@Override
public abstract Citation getAuthority();
/**
* Returns all namespaces recognized by this factory. Those namespaces can appear before codes in
* calls to {@code createFoo(String)} methods, for example {@code "EPSG"} in {@code "EPSG:4326"}.
* Namespaces are case-insensitive.
*
* <p>The namespaces are closely related to the {@linkplain #getAuthority() authority}. Often the namespace is
* the authority {@linkplain org.apache.sis.metadata.iso.citation.DefaultCitation#getIdentifiers() identifier},
* but not always.</p>
*
* <div class="note"><b>Examples:</b>
* <ul class="verbose">
* <li>The {@link org.apache.sis.referencing.factory.sql.EPSGFactory} authority identifier is {@code "EPSG"}
* and its {@code getCodeSpaces()} method returns a set containing {@code "EPSG"}. So in this example,
* authority and namespace match. That namespace value means that {@code EPSGFactory.createFoo(String)}
* methods accept both {@code "EPSG:4326"} (case-insensitive) and {@code "4326"} codes as argument.</li>
*
* <li>The {@link org.apache.sis.referencing.factory.sql.EPSGDataAccess} authority identifier is {@code "EPSG"}
* but its {@code getCodeSpaces()} method returns an empty set. This means that despite the EPSG authority,
* {@code EPSGDataAccess.createFoo(String)} methods accept only codes like {@code "4326"} without
* {@code "EPSG:"} prefix (the reason is that {@code EPSGDataAccess} is not expected to be used directly).</li>
*
* <li>The {@link CommonAuthorityFactory} authority identifiers are ISO 19128 and OGC 06-042 (the WMS specification)
* but its {@code getCodeSpaces()} method returns a set containing {@code "CRS"}, {@code "AUTO"} and {@code "AUTO2"}.
* While ISO 19128 is defined as the first authority, the namespace is actually defined by OGC.</li>
* </ul></div>
*
* The default implementation infers the namespace from the {@linkplain #getAuthority() authority}.
* Subclasses can override this method, but the set should always contain the same elements during
* all factory lifetime.
*
* @return the namespaces recognized by this factory, or an empty set if none.
*/
public Set<String> getCodeSpaces() {
final String authority = Citations.toCodeSpace(getAuthority());
return (authority != null) ? Collections.singleton(authority) : Collections.emptySet();
}
/**
* Returns a description of the object corresponding to a code.
* The description can be used for example in a combo box in a graphical user interface.
*
* <div class="section">Default implementation</div>
* The default implementation invokes {@link #createObject(String)} for the given code
* and returns the {@linkplain AbstractIdentifiedObject#getName() object name}.
* This may be costly since it involves a full object creation.
* Subclasses are encouraged to provide a more efficient implementation if they can.
*
* @param code value allocated by authority.
* @return a description of the object, or {@code null} if the object
* corresponding to the specified {@code code} has no description.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if an error occurred while fetching the description.
*/
@Override
public InternationalString getDescriptionText(final String code) throws FactoryException {
return new SimpleInternationalString(createObject(code).getName().getCode());
}
/**
* Returns an arbitrary object from a code. The returned object will typically be an instance of {@link Datum},
* {@link CoordinateSystem}, {@link CoordinateReferenceSystem} or {@link CoordinateOperation}.
* This method may be used when the type of the object to create is unknown.
* But it is recommended to invoke the most specific {@code createFoo(String)} method when
* the desired type is known, both for performance reason and for avoiding ambiguity.
*
* <div class="section">Note for subclasses</div>
* In default {@code GeodeticAuthorityFactory} implementation, all {@code createFoo(String)} methods ultimately
* delegate to this {@code createObject(String)} method and verify if the created object is of the desired type.
* Overriding this method is sufficient for supporting the more specific {@code createFoo(String)} methods,
* but subclasses are encouraged to override the later for efficiency.
*
* @param code value allocated by authority.
* @return the object for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.AbstractIdentifiedObject
*/
@Override
public abstract IdentifiedObject createObject(String code) throws NoSuchAuthorityCodeException, FactoryException;
/**
* Creates an arbitrary coordinate reference system from a code.
* The returned object will typically be an instance of {@link GeographicCRS}, {@link ProjectedCRS},
* {@link VerticalCRS} or {@link CompoundCRS}.
* If the coordinate reference system type is known at compile time,
* it is recommended to invoke the most precise method instead of this one (for example
* {@link #createGeographicCRS createGeographicCRS(String)} instead of
* <code>createCoordinateReferenceSystem(code)</code> if the caller know he is asking for a
* {@linkplain org.apache.sis.referencing.crs.DefaultGeographicCRS geographic coordinate reference system}).
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* Two frequently used authorities are "CRS" and "EPSG", which include the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Type</th> <th>Description</th></tr>
* <tr><td>CRS:84</td> <td>Geographic</td> <td>Like EPSG:4326 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
* <tr><td>EPSG:4326</td> <td>Geographic</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:4979</td> <td>Geographic 3D</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:4978</td> <td>Geocentric</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:3395</td> <td>Projected</td> <td>WGS 84 / World Mercator</td></tr>
* <tr><td>EPSG:5714</td> <td>Vertical</td> <td>Mean Sea Level height</td></tr>
* <tr><td>EPSG:6349</td> <td>Compound</td> <td>NAD83(2011) + NAVD88 height</td></tr>
* <tr><td>EPSG:5800</td> <td>Engineering</td> <td>Astra Minas Grid</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.AbstractCRS
* @see org.apache.sis.referencing.CRS#forCode(String)
*/
public CoordinateReferenceSystem createCoordinateReferenceSystem(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
return cast(CoordinateReferenceSystem.class, createObject(code), code);
}
/**
* Creates a 2- or 3-dimensional coordinate reference system based on an ellipsoidal approximation of the geoid.
* This provides an accurate representation of the geometry of geographic features
* for a large portion of the earth's surface.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* Two frequently used authorities are "CRS" and "EPSG", which include the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Type</th> <th>Description</th></tr>
* <tr><td>CRS:27</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>Geographic</td> <td>Like EPSG:4269 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
* <tr><td>CRS:84</td> <td>Geographic</td> <td>Like EPSG:4326 except for (<var>longitude</var>, <var>latitude</var>) axis order</td></tr>
* <tr><td>EPSG:4322</td> <td>Geographic</td> <td>World Geodetic System 1972</td></tr>
* <tr><td>EPSG:4985</td> <td>Geographic 3D</td> <td>World Geodetic System 1972</td></tr>
* <tr><td>EPSG:4326</td> <td>Geographic</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:4979</td> <td>Geographic 3D</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:4267</td> <td>Geographic</td> <td>North American Datum 1927</td></tr>
* <tr><td>EPSG:4269</td> <td>Geographic</td> <td>North American Datum 1983</td></tr>
* <tr><td>EPSG:4230</td> <td>Geographic</td> <td>European Datum 1950</td></tr>
* <tr><td>EPSG:4258</td> <td>Geographic</td> <td>European Terrestrial Reference Frame 1989</td></tr>
* <tr><td>EPSG:4937</td> <td>Geographic 3D</td> <td>European Terrestrial Reference Frame 1989</td></tr>
* <tr><td>EPSG:4047</td> <td>Geographic</td> <td>GRS 1980 Authalic Sphere</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultGeographicCRS
* @see org.apache.sis.referencing.CommonCRS#geographic()
* @see org.apache.sis.referencing.CommonCRS#geographic3D()
*/
public GeographicCRS createGeographicCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(GeographicCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a 3-dimensional coordinate reference system with the origin at the approximate centre of mass of the earth.
* A geocentric CRS deals with the earth's curvature by taking a 3-dimensional spatial view, which obviates
* the need to model the earth's curvature.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:4936</td> <td>European Terrestrial Reference Frame 1989</td></tr>
* <tr><td>EPSG:4978</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:4984</td> <td>World Geodetic System 1972</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed.
*
* @see org.apache.sis.referencing.crs.DefaultGeocentricCRS
* @see org.apache.sis.referencing.CommonCRS#geocentric()
*/
public GeocentricCRS createGeocentricCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(GeocentricCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a 2-dimensional coordinate reference system used to approximate the shape of the earth on a planar surface.
* It is done in such a way that the distortion that is inherent to the approximation is carefully controlled and known.
* Distortion correction is commonly applied to calculated bearings and distances to produce values
* that are a close match to actual field values.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which contains more than 4000 codes for projected CRS.
* Some of them are:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:3034</td> <td>ETRS89 / Lambert Conic Conformal Europe</td></tr>
* <tr><td>EPSG:3395</td> <td>WGS 84 / World Mercator</td></tr>
* <tr><td>EPSG:6350</td> <td>NAD83(2011) / Conus Albers Equal Area</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultProjectedCRS
*/
public ProjectedCRS createProjectedCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(ProjectedCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a 1-dimensional coordinate reference system used for recording heights or depths.
* Vertical CRSs make use of the direction of gravity to define the concept of height or depth,
* but the relationship with gravity may not be straightforward.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:5715</td> <td>Mean Sea Level depth</td></tr>
* <tr><td>EPSG:5714</td> <td>Mean Sea Level height</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultVerticalCRS
* @see org.apache.sis.referencing.CommonCRS.Vertical#crs()
*/
public VerticalCRS createVerticalCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(VerticalCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a 1-dimensional coordinate reference system used for the recording of time.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultTemporalCRS
* @see org.apache.sis.referencing.CommonCRS.Temporal#crs()
*/
public TemporalCRS createTemporalCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(TemporalCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a 1-dimensional parametric coordinate reference system.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* <div class="warning"><b>Warning:</b> in a future SIS version, the return type may be changed
* to {@code org.opengis.referencing.crs.ParametricCRS}. This change is pending GeoAPI revision.</div>
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultParametricCRS
*/
public DefaultParametricCRS createParametricCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(DefaultParametricCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a CRS describing the position of points through two or more independent coordinate reference systems.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:6349</td> <td>NAD83(2011) + NAVD88 height</td></tr>
* <tr><td>EPSG:7423</td> <td>ETRS89 + EVRF2007 height</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultCompoundCRS
*/
public CompoundCRS createCompoundCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(CompoundCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a CRS that is defined by its coordinate conversion from another CRS (not by a datum).
* {@code DerivedCRS} can not be {@code ProjectedCRS} themselves, but may be derived from a projected CRS.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultDerivedCRS
*/
public DerivedCRS createDerivedCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(DerivedCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a 1-, 2- or 3-dimensional contextually local coordinate reference system.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:5800</td> <td>Astra Minas Grid</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultEngineeringCRS
*/
public EngineeringCRS createEngineeringCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(EngineeringCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates a 2-dimensional engineering coordinate reference system applied to locations in images.
* Image coordinate reference systems are treated as a separate sub-type because a separate
* user community exists for images with its own terms of reference.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate reference system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.crs.DefaultImageCRS
*/
public ImageCRS createImageCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(ImageCRS.class, createCoordinateReferenceSystem(code), code);
}
/**
* Creates an arbitrary datum from a code. The returned object will typically be an
* instance of {@link GeodeticDatum}, {@link VerticalDatum} or {@link TemporalDatum}.
* If the datum is known at compile time, it is recommended to invoke the most precise method instead of this one.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which contains hundred of datum. Some of them are:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Type</th> <th>Description</th></tr>
* <tr><td>EPSG:6326</td> <td>Geodetic</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:6322</td> <td>Geodetic</td> <td>World Geodetic System 1972</td></tr>
* <tr><td>EPSG:1027</td> <td>Vertical</td> <td>EGM2008 geoid</td></tr>
* <tr><td>EPSG:5100</td> <td>Vertical</td> <td>Mean Sea Level</td></tr>
* <tr><td>EPSG:9315</td> <td>Engineering</td> <td>Seismic bin grid datum</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.AbstractDatum
*/
public Datum createDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(Datum.class, createObject(code), code);
}
/**
* Creates a datum defining the location and orientation of an ellipsoid that approximates the shape of the earth.
* Geodetic datum are used together with ellipsoidal coordinate system, and also with Cartesian coordinate system
* centered in the ellipsoid (or sphere).
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which contains hundred of datum. Some of them are:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:6326</td> <td>World Geodetic System 1984</td></tr>
* <tr><td>EPSG:6322</td> <td>World Geodetic System 1972</td></tr>
* <tr><td>EPSG:6269</td> <td>North American Datum 1983</td></tr>
* <tr><td>EPSG:6258</td> <td>European Terrestrial Reference System 1989</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createDatum(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultGeodeticDatum
* @see org.apache.sis.referencing.CommonCRS#datum()
*/
public GeodeticDatum createGeodeticDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(GeodeticDatum.class, createDatum(code), code);
}
/**
* Creates a datum identifying a particular reference level surface used as a zero-height surface.
* There are several types of vertical datums, and each may place constraints on the axis with which
* it is combined to create a vertical CRS.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:5100</td> <td>Mean Sea Level</td></tr>
* <tr><td>EPSG:1027</td> <td>EGM2008 geoid</td></tr>
* <tr><td>EPSG:1131</td> <td>Japanese Geodetic Datum 2011 (vertical)</td></tr>
* <tr><td>EPSG:5215</td> <td>European Vertical Reference Frame 2007</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createDatum(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultVerticalDatum
* @see org.apache.sis.referencing.CommonCRS.Vertical#datum()
*/
public VerticalDatum createVerticalDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(VerticalDatum.class, createDatum(code), code);
}
/**
* Creates a datum defining the origin of a temporal coordinate reference system.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createDatum(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultTemporalDatum
* @see org.apache.sis.referencing.CommonCRS.Temporal#datum()
*/
public TemporalDatum createTemporalDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(TemporalDatum.class, createDatum(code), code);
}
/**
* Creates a datum defining the origin of a parametric coordinate reference system.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createDatum(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* <div class="warning"><b>Warning:</b> in a future SIS version, the return type may be changed
* to {@code org.opengis.referencing.datum.ParametricDatum}. This change is pending GeoAPI revision.</div>
*
* @param code value allocated by authority.
* @return the datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultParametricDatum
*/
public DefaultParametricDatum createParametricDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(DefaultParametricDatum.class, createDatum(code), code);
}
/**
* Creates a datum defining the origin of an engineering coordinate reference system.
* An engineering datum is used in a region around that origin.
* This origin can be fixed with respect to the earth or be a defined point on a moving vehicle.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:9315</td> <td>Seismic bin grid datum</td></tr>
* <tr><td>EPSG:9300</td> <td>Astra Minas</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createDatum(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultEngineeringDatum
*/
public EngineeringDatum createEngineeringDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(EngineeringDatum.class, createDatum(code), code);
}
/**
* Creates a datum defining the origin of an image coordinate reference system.
* An image datum is used in a local context only.
* For an image datum, the anchor point is usually either the centre of the image or the corner of the image.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createDatum(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the datum for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultImageDatum
*/
public ImageDatum createImageDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(ImageDatum.class, createDatum(code), code);
}
/**
* Creates a geometric figure that can be used to describe the approximate shape of the earth.
* In mathematical terms, it is a surface formed by the rotation of an ellipse about its minor axis.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:7030</td> <td>WGS 84</td></tr>
* <tr><td>EPSG:7034</td> <td>Clarke 1880</td></tr>
* <tr><td>EPSG:7048</td> <td>GRS 1980 Authalic Sphere</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the ellipsoid for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultEllipsoid
* @see org.apache.sis.referencing.CommonCRS#ellipsoid()
*/
public Ellipsoid createEllipsoid(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(Ellipsoid.class, createObject(code), code);
}
/**
* Creates a prime meridian defining the origin from which longitude values are determined.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:8901</td> <td>Greenwich</td></tr>
* <tr><td>EPSG:8903</td> <td>Paris</td></tr>
* <tr><td>EPSG:8904</td> <td>Bogota</td></tr>
* <tr><td>EPSG:8905</td> <td>Madrid</td></tr>
* <tr><td>EPSG:8906</td> <td>Rome</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the prime meridian for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.datum.DefaultPrimeMeridian
* @see org.apache.sis.referencing.CommonCRS#primeMeridian()
*/
public PrimeMeridian createPrimeMeridian(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(PrimeMeridian.class, createObject(code), code);
}
/**
* Creates information about spatial, vertical, and temporal extent (usually a domain of validity) from a code.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:1262</td> <td>World</td></tr>
* <tr><td>EPSG:3391</td> <td>World - between 80°S and 84°N</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the extent for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.metadata.iso.extent.DefaultExtent
*/
public Extent createExtent(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(Extent.class, createObject(code), code);
}
/**
* Creates an arbitrary coordinate system from a code. The returned object will typically be an
* instance of {@link EllipsoidalCS}, {@link CartesianCS}, {@link VerticalCS} or {@link TimeCS}.
* If the coordinate system is known at compile time, it is recommended to invoke the most precise
* method instead of this one.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Type</th> <th>Axes</th> <th>Orientations</th> <th>Unit</th></tr>
* <tr><td>EPSG:4496</td> <td>Cartesian 2D CS</td> <td>easting, northing (E,N)</td> <td>east, north</td> <td>metre</td></tr>
* <tr><td>EPSG:6422</td> <td>Ellipsoidal 2D CS</td> <td>latitude, longitude</td> <td>north, east</td> <td>degree</td></tr>
* <tr><td>EPSG:6423</td> <td>Ellipsoidal 3D CS</td> <td>latitude, longitude, ellipsoidal height</td> <td>north, east, up</td> <td>degree, degree, metre</td></tr>
* <tr><td>EPSG:6404</td> <td>Spherical 3D CS</td> <td>latitude, longitude, radius</td> <td>north, east, up</td> <td>degree, degree, metre</td></tr>
* <tr><td>EPSG:6499</td> <td>Vertical CS</td> <td>height (H)</td> <td>up</td> <td>metre</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.AbstractCS
* @see org.apache.sis.referencing.cs.CoordinateSystems#getEpsgCode(Unit, AxisDirection...)
*/
public CoordinateSystem createCoordinateSystem(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(CoordinateSystem.class, createObject(code), code);
}
/**
* Creates a 2- or 3-dimensional coordinate system for geodetic latitude and longitude,
* sometime with ellipsoidal height.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Axes</th> <th>Orientations</th> <th>Unit</th></tr>
* <tr><td>EPSG:6422</td> <td>latitude, longitude</td> <td>north, east</td> <td>degree</td></tr>
* <tr><td>EPSG:6424</td> <td>longitude, latitude</td> <td>east, north</td> <td>degree</td></tr>
* <tr><td>EPSG:6429</td> <td>longitude, latitude</td> <td>east, north</td> <td>radian</td></tr>
* <tr><td>EPSG:6423</td> <td>latitude, longitude, ellipsoidal height</td> <td>north, east, up</td> <td>degree, degree, metre</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultEllipsoidalCS
*/
public EllipsoidalCS createEllipsoidalCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(EllipsoidalCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a 1-dimensional coordinate system for heights or depths of points.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Axes</th> <th>Orientations</th> <th>Unit</th></tr>
* <tr><td>EPSG:6498</td> <td>depth (D)</td> <td>down</td> <td>metre</td></tr>
* <tr><td>EPSG:6499</td> <td>height (H)</td> <td>up</td> <td>metre</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultVerticalCS
*/
public VerticalCS createVerticalCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(VerticalCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a 1-dimensional coordinate system for time elapsed in the specified time units
* from a specified time origin.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultTimeCS
*/
public TimeCS createTimeCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(TimeCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a 1-dimensional parametric coordinate system.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* <div class="warning"><b>Warning:</b> in a future SIS version, the return type may be changed
* to {@code org.opengis.referencing.cs.ParametricCS}. This change is pending GeoAPI revision.</div>
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultParametricCS
*/
public DefaultParametricCS createParametricCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(DefaultParametricCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a 2- or 3-dimensional Cartesian coordinate system made of straight orthogonal axes.
* All axes shall have the same linear unit of measure.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Axes</th> <th>Orientations</th> <th>Unit</th></tr>
* <tr><td>EPSG:4406</td> <td>easting, northing (E,N)</td> <td>east, north</td> <td>kilometre</td></tr>
* <tr><td>EPSG:4496</td> <td>easting, northing (E,N)</td> <td>east, north</td> <td>metre</td></tr>
* <tr><td>EPSG:4500</td> <td>northing, easting (N,E)</td> <td>north, east</td> <td>metre</td></tr>
* <tr><td>EPSG:4491</td> <td>westing, northing (W,N)</td> <td>west, north</td> <td>metre</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultCartesianCS
*/
public CartesianCS createCartesianCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(CartesianCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a 3-dimensional coordinate system with one distance measured from the origin and two angular coordinates.
* Not to be confused with an ellipsoidal coordinate system based on an ellipsoid "degenerated" into a sphere.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Axes</th> <th>Orientations</th> <th>Unit</th></tr>
* <tr><td>EPSG:6404</td> <td>latitude, longitude, radius</td> <td>north, east, up</td> <td>degree, degree, metre</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultSphericalCS
*/
public SphericalCS createSphericalCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(SphericalCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a 3-dimensional coordinate system made of a polar coordinate system
* extended by a straight perpendicular axis.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultCylindricalCS
*/
public CylindricalCS createCylindricalCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(CylindricalCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a 2-dimensional coordinate system for coordinates represented by a distance from the origin
* and an angle from a fixed direction.
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createCoordinateSystem(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the coordinate system for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultPolarCS
*/
public PolarCS createPolarCS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(PolarCS.class, createCoordinateSystem(code), code);
}
/**
* Creates a coordinate system axis with name, direction, unit and range of values.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th> <th>Unit</th></tr>
* <tr><td>EPSG:106</td> <td>Latitude (φ)</td> <td>degree</td></tr>
* <tr><td>EPSG:107</td> <td>Longitude (λ)</td> <td>degree</td></tr>
* <tr><td>EPSG:1</td> <td>Easting (E)</td> <td>metre</td></tr>
* <tr><td>EPSG:2</td> <td>Northing (N)</td> <td>metre</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the axis for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.cs.DefaultCoordinateSystemAxis
*/
public CoordinateSystemAxis createCoordinateSystemAxis(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
return cast(CoordinateSystemAxis.class, createObject(code), code);
}
/**
* Creates an unit of measurement from a code.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:9002</td> <td>decimal degree</td></tr>
* <tr><td>EPSG:9001</td> <td>metre</td></tr>
* <tr><td>EPSG:9030</td> <td>kilometre</td></tr>
* <tr><td>EPSG:1040</td> <td>second</td></tr>
* <tr><td>EPSG:1029</td> <td>year</td></tr>
* </table>
*
* See {@link org.apache.sis.measure.Units#valueOfEPSG(int)} for a more complete list of codes.</div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the unit of measurement for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.measure.Units#valueOfEPSG(int)
*/
public Unit<?> createUnit(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(Unit.class, createObject(code), code);
}
/**
* Creates a definition of a single parameter used by an operation method.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:8801</td> <td>Latitude of natural origin</td></tr>
* <tr><td>EPSG:8802</td> <td>Longitude of natural origin</td></tr>
* <tr><td>EPSG:8805</td> <td>Scale factor at natural origin</td></tr>
* <tr><td>EPSG:8806</td> <td>False easting</td></tr>
* <tr><td>EPSG:8807</td> <td>False northing</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the parameter descriptor for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.parameter.DefaultParameterDescriptor
* @see <a href="http://sis.apache.org/tables/CoordinateOperationMethods.html">Apache SIS™ Coordinate Operation Methods</a>
*/
public ParameterDescriptor<?> createParameterDescriptor(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
return cast(ParameterDescriptor.class, createObject(code), code);
}
/**
* Creates a description of the algorithm and parameters used to perform a coordinate operation.
* An {@code OperationMethod} is a kind of metadata: it does not perform any coordinate operation
* (e.g. map projection) by itself, but tells us what is needed in order to perform such operation.
*
* <p>Available methods depend both on the {@linkplain #getAuthorityCodes(Class) set declared by the authority} and on the
* <a href="http://sis.apache.org/tables/CoordinateOperationMethods.html">list of methods implemented in Apache SIS</a>.
* In order to be supported, an operation method must have its formulas coded in the Java programming language.
* See {@link org.apache.sis.referencing.operation.transform.MathTransformProvider} for more information.</p>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the operation method for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.operation.DefaultOperationMethod
* @see <a href="http://sis.apache.org/tables/CoordinateOperationMethods.html">Apache SIS™ Coordinate Operation Methods</a>
*/
public OperationMethod createOperationMethod(final String code) throws NoSuchAuthorityCodeException, FactoryException {
return cast(OperationMethod.class, createObject(code), code);
}
/**
* Creates an operation for transforming coordinates in the source CRS to coordinates in the target CRS.
* Coordinate operations contain a {@linkplain org.apache.sis.referencing.operation.transform.AbstractMathTransform
* math transform}, which does the actual work of transforming coordinates.
*
* <div class="note"><b>Example:</b>
* the {@linkplain #getAuthorityCodes(Class) set of available codes} depends on the defining
* {@linkplain #getAuthority() authority} and the {@code GeodeticAuthorityFactory} subclass in use.
* A frequently used authority is "EPSG", which includes the following codes:
*
* <table class="sis">
* <caption>Authority codes examples</caption>
* <tr><th>Code</th> <th>Description</th></tr>
* <tr><td>EPSG:1133</td> <td>ED50 to WGS 84 (1)</td></tr>
* <tr><td>EPSG:1241</td> <td>NAD27 to NAD83 (1)</td></tr>
* <tr><td>EPSG:1173</td> <td>NAD27 to WGS 84 (4)</td></tr>
* <tr><td>EPSG:6326</td> <td>NAD83(2011) to NAVD88 height (1)</td></tr>
* </table></div>
*
* <div class="section">Default implementation</div>
* The default implementation delegates to {@link #createObject(String)} and casts the result.
* If the result can not be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
*
* @param code value allocated by authority.
* @return the operation for the given code.
* @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
* @throws FactoryException if the object creation failed for some other reason.
*
* @see org.apache.sis.referencing.operation.AbstractCoordinateOperation
*/
public CoordinateOperation createCoordinateOperation(final String code)
throws NoSuchAuthorityCodeException, FactoryException
{
return cast(CoordinateOperation.class, createObject(code), code);
}
/**
* Creates operations from source and target coordinate reference system codes.
* This method should only extract the information explicitly declared in a database like EPSG.
* This method should not attempt to infer by itself operations that are not explicitly recorded in the database.
*
* <div class="section">Default implementation</div>
* The default implementation returns an empty set.
*
* @param sourceCRS coded value of source coordinate reference system.
* @param targetCRS coded value of target coordinate reference system.
* @return the operations from {@code sourceCRS} to {@code targetCRS}.
* @throws NoSuchAuthorityCodeException if a specified code was not found.
* @throws FactoryException if the object creation failed for some other reason.
*/
public Set<CoordinateOperation> createFromCoordinateReferenceSystemCodes(String sourceCRS, String targetCRS)
throws NoSuchAuthorityCodeException, FactoryException
{
return Collections.emptySet();
}
/**
* Creates a finder which can be used for looking up unidentified objects.
* The finder tries to fetch a fully {@linkplain AbstractIdentifiedObject identified object}
* from an incomplete one, for example from an object without "{@code ID[…]}" or
* "{@code AUTHORITY[…]}" element in <cite>Well Known Text</cite>.
*
* @return a finder to use for looking up unidentified objects.
* @throws FactoryException if the finder can not be created.
*
* @see org.apache.sis.referencing.IdentifiedObjects#newFinder(String)
*/
public IdentifiedObjectFinder newIdentifiedObjectFinder() throws FactoryException {
return new IdentifiedObjectFinder(this);
}
/**
* Returns {@code true} if the given portion of the code is equal, ignoring case, to the given namespace.
*/
static boolean regionMatches(final String namespace, final String code, final int start, final int end) {
return (namespace.length() == end - start) && code.regionMatches(true, start, namespace, 0, namespace.length());
}
/**
* Trims the namespace, if present. For example if this factory is an EPSG authority factory
* and the specified code start with the {@code "EPSG:"} prefix, then the prefix is removed.
* Otherwise, the string is returned unchanged (except for leading and trailing spaces).
*
* @param code the code to trim.
* @return the code with the namespace part removed if that part matched one of the values given by
* {@link #getCodeSpaces()}.
*
* @since 0.8
*/
protected final String trimNamespace(final String code) {
int s = code.indexOf(Constants.DEFAULT_SEPARATOR);
if (s >= 0) {
final int end = CharSequences.skipTrailingWhitespaces(code, 0, s);
final int start = CharSequences.skipLeadingWhitespaces (code, 0, end);
for (final String codespace : getCodeSpaces()) {
if (regionMatches(codespace, code, start, end)) {
final int n = code.indexOf(Constants.DEFAULT_SEPARATOR, s + 1);
if (n >= 0) {
/*
* The separator sometime appears twice, as in "EPSG::4326" or "EPSG:8.9:4326".
* The part between the two separators is the verion number, which we ignore in
* this simple version.
*/
s = n;
}
final int length = code.length();
return CharSequences.trimWhitespaces(code, s+1, length).toString();
}
}
}
return CharSequences.trimWhitespaces(code);
}
/**
* Casts the given object to the given type, or throws an exception if the object can not be casted.
* This convenience method is provided for implementation of {@code createXXX} methods.
*
* @param type the type to return (e.g. {@code CoordinateReferenceSystem.class}).
* @param object the object to cast.
* @param code the authority code, used only for formatting an error message.
* @return the object casted to the given type.
* @throws NoSuchAuthorityCodeException if the given object is not an instance of the given type.
*/
@SuppressWarnings("unchecked")
private <T> T cast(final Class<T> type, final IdentifiedObject object, final String code)
throws NoSuchAuthorityCodeException
{
if (type.isInstance(object)) {
return (T) object;
}
/*
* Get the actual type of the object. Returns the GeoAPI type if possible,
* or fallback on the implementation class otherwise.
*/
final Class<?> actual = ReferencingUtilities.getInterface(object);
/*
* Get the authority from the object if possible, in order to avoid a call
* to the potentially costly (for EPSGDataAccess) getAuthority() method.
*/
final Identifier id = object.getName();
final Citation authority = (id != null) ? id.getAuthority() : getAuthority();
throw new NoSuchAuthorityCodeException(Errors.format(Errors.Keys.UnexpectedTypeForReference_3, code, type, actual),
Citations.getIdentifier(authority), trimNamespace(code), code);
}
/**
* Returns a string representation of this factory for debugging purpose only.
* The string returned by this method may change in any future SIS version.
*
* @return a string representation for debugging purpose.
*/
@Override
public String toString() {
final StringBuilder buffer = new StringBuilder(Classes.getShortClassName(this))
.append("[“").append(Citations.getIdentifier(getAuthority())).append('”');
appendStringTo(buffer);
return buffer.append(']').toString();
}
/**
* Hook for subclasses.
*/
void appendStringTo(final StringBuilder buffer) {
}
}