001    /*
002     *    GeoAPI - Java interfaces for OGC/ISO standards
003     *    http://www.geoapi.org
004     *
005     *    Copyright (C) 2004-2012 Open Geospatial Consortium, Inc.
006     *    All Rights Reserved. http://www.opengeospatial.org/ogc/legal
007     *
008     *    Permission to use, copy, and modify this software and its documentation, with
009     *    or without modification, for any purpose and without fee or royalty is hereby
010     *    granted, provided that you include the following on ALL copies of the software
011     *    and documentation or portions thereof, including modifications, that you make:
012     *
013     *    1. The full text of this NOTICE in a location viewable to users of the
014     *       redistributed or derivative work.
015     *    2. Notice of any changes or modifications to the OGC files, including the
016     *       date changes were made.
017     *
018     *    THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
019     *    NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
020     *    TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
021     *    THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
022     *    PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
023     *
024     *    COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
025     *    CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
026     *
027     *    The name and trademarks of copyright holders may NOT be used in advertising or
028     *    publicity pertaining to the software without specific, written prior permission.
029     *    Title to copyright in this software and any associated documentation will at all
030     *    times remain with copyright holders.
031     */
032    package org.opengis.referencing.crs;
033    
034    import java.util.Map;
035    import java.util.List;
036    import org.opengis.annotation.UML;
037    
038    import static org.opengis.annotation.Obligation.*;
039    import static org.opengis.annotation.Specification.*;
040    
041    
042    /**
043     * A coordinate reference system describing the position of points through two or more
044     * independent coordinate reference systems. Thus it is associated with two or more
045     * {@linkplain org.opengis.referencing.cs.CoordinateSystem Coordinate Systems} and
046     * {@linkplain org.opengis.referencing.datum.Datum Datums} by defining the compound CRS
047     * as an ordered set of two or more instances of {@link CoordinateReferenceSystem}.
048     * <p>
049     * In general, a Compound CRS may contain any number of axes. The Compound CRS contains an
050     * ordered set of coordinate reference systems and the tuple order of a compound coordinate
051     * set shall follow that order, while the subsets of the tuple, described by each of the
052     * composing coordinate reference systems, follow the tuple order valid for their respective
053     * coordinate reference systems.
054     * <p>
055     * For spatial coordinates, a number of constraints exist for the construction of Compound CRSs.
056     * For example, the coordinate reference systems that are combined should not contain any duplicate
057     * or redundant axes. Valid combinations include:
058     * <p>
059     * <UL>
060     *   <LI>Geographic 2D + Vertical</LI>
061     *   <LI>Geographic 2D + Engineering 1D (near vertical)</LI>
062     *   <LI>Projected + Vertical</LI>
063     *   <LI>Projected + Engineering 1D (near vertical)</LI>
064     *   <LI>Engineering (horizontal 2D or 1D linear) + Vertical</LI>
065     * </UL>
066     * <p>
067     * Any coordinate reference system, or any of the above listed combinations of coordinate
068     * reference systems, can have a Temporal CRS added. More than one Temporal CRS may be added
069     * if these axes represent different time quantities. For example, the oil industry sometimes
070     * uses "4D seismic", by which is meant seismic data with the vertical axis expressed in
071     * milliseconds (signal travel time). A second time axis indicates how it changes with time
072     * (years), e.g. as a reservoir is gradually exhausted of its recoverable oil or gas).
073     *
074     * @author  Martin Desruisseaux (IRD)
075     * @version 3.0
076     * @since   1.0
077     *
078     * @navassoc - - - CoordinateReferenceSystem
079     *
080     * @see CRSAuthorityFactory#createCompoundCRS(String)
081     * @see CRSFactory#createCompoundCRS(Map, CoordinateReferenceSystem[])
082     */
083    @UML(identifier="SC_CompoundCRS", specification=ISO_19111)
084    public interface CompoundCRS extends CoordinateReferenceSystem {
085        /**
086         * The ordered list of coordinate reference systems.
087         *
088         * @return The ordered list of coordinate reference systems.
089         *
090         * @departure generalization
091         *    According ISO 19111, "<cite>A Compound CRS is a coordinate reference system that combines
092         *    two or more coordinate reference systems, <u>none of which can itself be compound</u></cite>".
093         *    However this constraint greatly increases the cost of extracting metadata (especially the CRS
094         *    identifier) of the three-dimensional part of a spatio-temporal CRS. Note also that in
095         *    "<u>Coordinate Transformation Services</u>" (OGC document 01-009), a compound CRS was
096         *    specified as a pair of arbitrary CRS ("head" and "tail") where each could be another
097         *    compound CRS, allowing the creation of a tree. GeoAPI follows that more general strategy.
098         *
099         * @since 2.3
100         */
101        @UML(identifier="componentReferenceSystem", obligation=MANDATORY, specification=ISO_19111)
102        List<CoordinateReferenceSystem> getComponents();
103    }