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.cs;
033    
034    import java.util.Map;
035    import javax.measure.unit.Unit;
036    import org.opengis.referencing.ObjectFactory;
037    import org.opengis.util.FactoryException;
038    
039    
040    /**
041     * Builds up complex {@linkplain CoordinateSystem coordinate systems} from simpler
042     * objects or values. {@code CSFactory} allows applications to make {@linkplain
043     * CoordinateSystem coordinate systems} that cannot be created by a {@link CSAuthorityFactory}.
044     * This factory is very flexible, whereas the authority factory is easier to use.
045     *
046     * So {@link CSAuthorityFactory} can be used to make "standard" coordinate systems,
047     * and {@code CSFactory} can be used to make "special" coordinate systems.
048     *
049     * @author  Martin Desruisseaux (IRD)
050     * @version 3.0
051     * @since   1.0
052     *
053     * @departure historic
054     *   Added for consistency with CRS and datum factories. This CS factory was not defined in the
055     *   OGC specification because OGC 01-009 was created before ISO 19111 and had no equivalent of
056     *   the ISO <cite>Coordinate System</cite> types.
057     *
058     * @see org.opengis.referencing.crs.CRSFactory
059     * @see org.opengis.referencing.datum.DatumFactory
060     */
061    public interface CSFactory extends ObjectFactory {
062        /**
063         * Creates a coordinate system axis from an abbreviation and a unit.
064         *
065         * @param  properties Name and other properties to give to the new object.
066         *         Available properties are {@linkplain ObjectFactory listed there}.
067         * @param  abbreviation The coordinate axis abbreviation.
068         * @param  direction The axis direction.
069         * @param  unit The coordinate axis unit.
070         * @return The axis for the given properties.
071         * @throws FactoryException if the object creation failed.
072         */
073        CoordinateSystemAxis createCoordinateSystemAxis(Map<String,?> properties,
074                                                        String        abbreviation,
075                                                        AxisDirection direction,
076                                                        Unit<?>       unit) throws FactoryException;
077    
078        /**
079         * Creates a two dimensional cartesian coordinate system from the given pair of axis.
080         *
081         * @param  properties Name and other properties to give to the new object.
082         *         Available properties are {@linkplain ObjectFactory listed there}.
083         * @param  axis0 The first  axis.
084         * @param  axis1 The second axis.
085         * @return The coordinate system for the given properties and axes.
086         * @throws FactoryException if the object creation failed.
087         */
088        CartesianCS createCartesianCS(Map<String, ?>  properties,
089                                      CoordinateSystemAxis axis0,
090                                      CoordinateSystemAxis axis1) throws FactoryException;
091    
092        /**
093         * Creates a three dimensional cartesian coordinate system from the given set of axis.
094         *
095         * @param  properties Name and other properties to give to the new object.
096         *         Available properties are {@linkplain ObjectFactory listed there}.
097         * @param  axis0 The first  axis.
098         * @param  axis1 The second axis.
099         * @param  axis2 The third  axis.
100         * @return The coordinate system for the given properties and axes.
101         * @throws FactoryException if the object creation failed.
102         */
103        CartesianCS createCartesianCS(Map<String, ?>  properties,
104                                      CoordinateSystemAxis axis0,
105                                      CoordinateSystemAxis axis1,
106                                      CoordinateSystemAxis axis2) throws FactoryException;
107    
108        /**
109         * Creates a two dimensional coordinate system from the given pair of axis.
110         *
111         * @param  properties Name and other properties to give to the new object.
112         *         Available properties are {@linkplain ObjectFactory listed there}.
113         * @param  axis0 The first  axis.
114         * @param  axis1 The second axis.
115         * @return The coordinate system for the given properties and axes.
116         * @throws FactoryException if the object creation failed.
117         */
118        AffineCS createAffineCS(Map<String, ?>  properties,
119                                CoordinateSystemAxis axis0,
120                                CoordinateSystemAxis axis1) throws FactoryException;
121    
122        /**
123         * Creates a three dimensional coordinate system from the given set of axis.
124         *
125         * @param  properties Name and other properties to give to the new object.
126         *         Available properties are {@linkplain ObjectFactory listed there}.
127         * @param  axis0 The first  axis.
128         * @param  axis1 The second axis.
129         * @param  axis2 The third  axis.
130         * @return The coordinate system for the given properties and axes.
131         * @throws FactoryException if the object creation failed.
132         */
133        AffineCS createAffineCS(Map<String, ?>  properties,
134                                CoordinateSystemAxis axis0,
135                                CoordinateSystemAxis axis1,
136                                CoordinateSystemAxis axis2) throws FactoryException;
137    
138        /**
139         * Creates a polar coordinate system from the given pair of axis.
140         *
141         * @param  properties Name and other properties to give to the new object.
142         *         Available properties are {@linkplain ObjectFactory listed there}.
143         * @param  axis0 The first  axis.
144         * @param  axis1 The second axis.
145         * @return The coordinate system for the given properties and axes.
146         * @throws FactoryException if the object creation failed.
147         */
148        PolarCS createPolarCS(Map<String, ?>  properties,
149                              CoordinateSystemAxis axis0,
150                              CoordinateSystemAxis axis1) throws FactoryException;
151    
152        /**
153         * Creates a cylindrical coordinate system from the given set of axis.
154         *
155         * @param  properties Name and other properties to give to the new object.
156         *         Available properties are {@linkplain ObjectFactory listed there}.
157         * @param  axis0 The first  axis.
158         * @param  axis1 The second axis.
159         * @param  axis2 The third  axis.
160         * @return The coordinate system for the given properties and axes.
161         * @throws FactoryException if the object creation failed.
162         */
163        CylindricalCS createCylindricalCS(Map<String, ?>  properties,
164                                          CoordinateSystemAxis axis0,
165                                          CoordinateSystemAxis axis1,
166                                          CoordinateSystemAxis axis2) throws FactoryException;
167    
168        /**
169         * Creates a spherical coordinate system from the given set of axis.
170         *
171         * @param  properties Name and other properties to give to the new object.
172         *         Available properties are {@linkplain ObjectFactory listed there}.
173         * @param  axis0 The first  axis.
174         * @param  axis1 The second axis.
175         * @param  axis2 The third  axis.
176         * @return The coordinate system for the given properties and axes.
177         * @throws FactoryException if the object creation failed.
178         */
179        SphericalCS createSphericalCS(Map<String, ?>  properties,
180                                      CoordinateSystemAxis axis0,
181                                      CoordinateSystemAxis axis1,
182                                      CoordinateSystemAxis axis2) throws FactoryException;
183    
184        /**
185         * Creates an ellipsoidal coordinate system without ellipsoidal height.
186         *
187         * @param  properties Name and other properties to give to the new object.
188         *         Available properties are {@linkplain ObjectFactory listed there}.
189         * @param  axis0 The first  axis.
190         * @param  axis1 The second axis.
191         * @return The coordinate system for the given properties and axes.
192         * @throws FactoryException if the object creation failed.
193         */
194        EllipsoidalCS createEllipsoidalCS(Map<String, ?>  properties,
195                                          CoordinateSystemAxis axis0,
196                                          CoordinateSystemAxis axis1) throws FactoryException;
197    
198        /**
199         * Creates an ellipsoidal coordinate system with ellipsoidal height.
200         *
201         * @param  properties Name and other properties to give to the new object.
202         *         Available properties are {@linkplain ObjectFactory listed there}.
203         * @param  axis0 The first  axis.
204         * @param  axis1 The second axis.
205         * @param  axis2 The third  axis.
206         * @return The coordinate system for the given properties and axes.
207         * @throws FactoryException if the object creation failed.
208         */
209        EllipsoidalCS createEllipsoidalCS(Map<String, ?>  properties,
210                                          CoordinateSystemAxis axis0,
211                                          CoordinateSystemAxis axis1,
212                                          CoordinateSystemAxis axis2) throws FactoryException;
213    
214        /**
215         * Creates a vertical coordinate system.
216         *
217         * @param  properties Name and other properties to give to the new object.
218         *         Available properties are {@linkplain ObjectFactory listed there}.
219         * @param  axis The axis.
220         * @return The coordinate system for the given properties and axes.
221         * @throws FactoryException if the object creation failed.
222         */
223        VerticalCS createVerticalCS(Map<String, ?> properties,
224                                    CoordinateSystemAxis axis) throws FactoryException;
225    
226        /**
227         * Creates a time coordinate system.
228         *
229         * @param  properties Name and other properties to give to the new object.
230         *         Available properties are {@linkplain ObjectFactory listed there}.
231         * @param  axis The axis.
232         * @return The coordinate system for the given properties and axes.
233         * @throws FactoryException if the object creation failed.
234         */
235        TimeCS createTimeCS(Map<String, ?> properties,
236                            CoordinateSystemAxis axis) throws FactoryException;
237    
238        /**
239         * Creates a linear coordinate system.
240         *
241         * @param  properties Name and other properties to give to the new object.
242         *         Available properties are {@linkplain ObjectFactory listed there}.
243         * @param  axis The axis.
244         * @return The coordinate system for the given properties and axes.
245         * @throws FactoryException if the object creation failed.
246         */
247        LinearCS createLinearCS(Map<String, ?> properties,
248                                CoordinateSystemAxis axis) throws FactoryException;
249    
250        /**
251         * Creates a two-dimensional user defined coordinate system.
252         *
253         * @param  properties Name and other properties to give to the new object.
254         *         Available properties are {@linkplain ObjectFactory listed there}.
255         * @param  axis0 The first  axis.
256         * @param  axis1 The second axis.
257         * @return The coordinate system for the given properties and axes.
258         * @throws FactoryException if the object creation failed.
259         */
260        UserDefinedCS createUserDefinedCS(Map<String, ?>  properties,
261                                          CoordinateSystemAxis axis0,
262                                          CoordinateSystemAxis axis1) throws FactoryException;
263    
264        /**
265         * Creates a three-dimensional user defined coordinate system.
266         *
267         * @param  properties Name and other properties to give to the new object.
268         *         Available properties are {@linkplain ObjectFactory listed there}.
269         * @param  axis0 The first  axis.
270         * @param  axis1 The second axis.
271         * @param  axis2 The third  axis.
272         * @return The coordinate system for the given properties and axes.
273         * @throws FactoryException if the object creation failed.
274         */
275        UserDefinedCS createUserDefinedCS(Map<String, ?>  properties,
276                                          CoordinateSystemAxis axis0,
277                                          CoordinateSystemAxis axis1,
278                                          CoordinateSystemAxis axis2) throws FactoryException;
279    }