/*
 * 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.
 */

/**
 * Relationship of a {@code CoordinateSystem} (an abstract mathematical entity) to the earth or other system.
 * An explanation for this package is provided in the {@linkplain org.opengis.referencing.datum OpenGIS® javadoc}.
 * The remaining discussion on this page is specific to the SIS implementation.
 *
 * <p>The root class in this package is {@link org.apache.sis.referencing.datum.AbstractDatum}.
 * Various subclasses are defined for various kinds of relationship to the Earth or time
 * ({@linkplain org.apache.sis.referencing.datum.DefaultGeodeticDatum geodetic},
 *  {@linkplain org.apache.sis.referencing.datum.DefaultVerticalDatum vertical},
 *  {@linkplain org.apache.sis.referencing.datum.DefaultTemporalDatum temporal}),
 * or to platforms (mobile or not)
 * ({@linkplain org.apache.sis.referencing.datum.DefaultEngineeringDatum engineering},
 *  {@linkplain org.apache.sis.referencing.datum.DefaultImageDatum image}).
 * Some of those SIS subclasses provide additional methods that are not part of OGC/ISO specifications:</p>
 * <ul>
 *   <li>{@link org.apache.sis.referencing.datum.DefaultEllipsoid#getAuthalicRadius()}</li>
 *   <li>{@link org.apache.sis.referencing.datum.DefaultEllipsoid#getEccentricity()}</li>
 *   <li>{@link org.apache.sis.referencing.datum.DefaultPrimeMeridian#getGreenwichLongitude(javax.measure.Unit)
 *       DefaultPrimeMeridian.getGreenwichLongitude(Unit)}</li>
 *   <li>{@link org.apache.sis.referencing.datum.DefaultGeodeticDatum#getBursaWolfParameters()}</li>
 *   <li>{@link org.apache.sis.referencing.datum.DefaultGeodeticDatum#getPositionVectorTransformation
 *       DefaultGeodeticDatum.getPositionVectorTransformation(GeodeticDatum, Extent)}</li>
 * </ul>
 *
 * <h2>Datum shifts</h2>
 * Three classes are provided in support of coordinate transformations between different datums:
 * <ul>
 *   <li>{@link org.apache.sis.referencing.datum.BursaWolfParameters} performs an approximation
 *       based on a translation, rotation and scale of geocentric coordinates.</li>
 *   <li>{@link org.apache.sis.referencing.datum.TimeDependentBWP} is like {@code BursaWolfParameters},
 *       but varies with time for taking in account the motion of plate tectonic.</li>
 *   <li>{@link org.apache.sis.referencing.datum.DatumShiftGrid} is used for more accurate transformations
 *       than what {@code BursaWolfParameters} allows, by interpolating the geographic or geocentric translations
 *       in a grid (e.g. NADCON or NTv2) instead of apply the same transformation for every points.</li>
 * </ul>
 *
 * @author  Martin Desruisseaux (IRD, Geomatys)
 * @author  Cédric Briançon (Geomatys)
 * @version 1.4
 * @since   0.4
 */
@XmlSchema(location = "http://schemas.opengis.net/gml/3.2.1/datums.xsd",
           elementFormDefault = XmlNsForm.QUALIFIED, namespace = Namespaces.GML, xmlns =
{
    @XmlNs(prefix = "gml", namespaceURI = Namespaces.GML),
    @XmlNs(prefix = "gmd", namespaceURI = LegacyNamespaces.GMD),
    @XmlNs(prefix = "gco", namespaceURI = Namespaces.GCO),
    @XmlNs(prefix = "xsi", namespaceURI = Namespaces.XSI)
})
@XmlAccessorType(XmlAccessType.NONE)
@XmlJavaTypeAdapters({
    @XmlJavaTypeAdapter(EX_Extent.class),
    @XmlJavaTypeAdapter(CD_Ellipsoid.class),
    @XmlJavaTypeAdapter(CD_PrimeMeridian.class),
    @XmlJavaTypeAdapter(CD_VerticalDatumType.class),
    @XmlJavaTypeAdapter(CD_PixelInCell.class),
    @XmlJavaTypeAdapter(StringAdapter.class),
    @XmlJavaTypeAdapter(InternationalStringConverter.class),
    @XmlJavaTypeAdapter(DateAdapter.class),
})
package org.apache.sis.referencing.datum;

import jakarta.xml.bind.annotation.XmlNs;
import jakarta.xml.bind.annotation.XmlNsForm;
import jakarta.xml.bind.annotation.XmlSchema;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
import org.apache.sis.xml.Namespaces;
import org.apache.sis.xml.privy.LegacyNamespaces;
import org.apache.sis.xml.bind.gco.*;
import org.apache.sis.xml.bind.gml.DateAdapter;
import org.apache.sis.xml.bind.metadata.*;
import org.apache.sis.xml.bind.referencing.*;
