001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/coverage/Coverage.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2008 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53115 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     
043     ---------------------------------------------------------------------------*/
044    package org.deegree.model.coverage;
045    
046    import java.awt.image.renderable.RenderableImage;
047    
048    import org.deegree.model.crs.CoordinateSystem;
049    import org.opengis.pt.PT_Envelope;
050    
051    /**
052     * Provides access to a coverage. The essential property of coverage is to be able to generate a
053     * value for any point within its domain. How coverage is represented internally is not a concern.
054     * 
055     * For example consider the following different internal representations of coverage:<br>
056     * <UL>
057     * <li>A coverage may be represented by a set of polygons which exhaustively tile a plane (that is
058     * each point on the plane falls in precisely one polygon). The value returned by the coverage for a
059     * point is the value of an attribute of the polygon that contains the point.</li>
060     * <li>A coverage may be represented by a grid of values. The value returned by the coverage for a
061     * point is that of the grid value whose location is nearest the point.</li>
062     * <li>Coverage may be represented by a mathematical function. The value returned by the coverage
063     * for a point is just the return value of the function when supplied the coordinates of the point
064     * as arguments.</li>
065     * <li>Coverage may be represented by combination of these. For example, coverage may be
066     * represented by a combination of mathematical functions valid over a set of polynomials.</LI>
067     * </UL>
068     * 
069     * A coverage has a corresponding {@link SampleDimension} for each sample dimension in the coverage.
070     * <br>
071     * <br>
072     * <STRONG>Implementation note:</STRONG><BR>
073     * We expect that many implementations of {@link "org.opengis.coverage.grid.GridCoverage"} will want
074     * to leverage the rich set of <A HREF="http://java.sun.com/products/java-media/jai/">Java Advanced
075     * Imaging (JAI)</A> features. For those implementations, it is recommended (but not required) to
076     * implement the {@link javax.media.jai.PropertySource} interface as well. In this case,
077     * implementation of {@link javax.media.jai.PropertySource} methods must be consistent with
078     * {@link #getMetadataNames} and {@link #getMetadataValue} methods.
079     * 
080     * @UML abstract CV_Coverage
081     * @author <A HREF="http://www.opengis.org">OpenGIS&reg; consortium</A>
082     * @version <A HREF="http://www.opengis.org/docs/01-004.pdf">Grid Coverage specification 1.0</A>
083     * 
084     * @author last edited by: $Author: apoth $
085     * 
086     * @version $Revision: 9343 $, $Date: 2007-12-27 14:30:32 +0100 (Do, 27 Dez 2007) $
087     * 
088     * @see RenderableImage
089     * @see javax.media.jai.ImageFunction
090     */
091    public interface Coverage {
092        /**
093         * Specifies the coordinate reference system used when accessing a coverage or grid coverage
094         * with the <code>evaluate(...)</code> methods. It is also the coordinate reference system of
095         * the coordinates used with the math transform
096         * 
097         * This coordinate reference system is usually different than coordinate system of the grid.
098         * Grid coverage can be accessed (re-projected) with new coordinate reference system with the
099         * {@link "org.opengis.coverage.processing.GridCoverageProcessor"} component. In this case, a
100         * new instance of a grid coverage is created. <br>
101         * <br>
102         * Note: If a coverage does not have an associated coordinate reference system, the returned
103         * value will be <code>null</code>.
104         * 
105         * @return The coordinate reference system used when accessing a coverage or grid coverage with
106         *         the <code>evaluate(...)</code> methods, or <code>null</code>.
107         * @UML mandatory coordinateSystem
108         */
109        CoordinateSystem getCoordinateReferenceSystem();
110    
111        /**
112         * The bounding box for the coverage domain in
113         * {@linkplain #getCoordinateReferenceSystem coordinate reference system} coordinates. For grid
114         * coverages, the grid cells are centered on each grid coordinate. The envelope for a 2-D grid
115         * coverage includes the following corner positions.
116         * 
117         * <blockquote>
118         * 
119         * <pre>
120         *  (Minimum row - 0.5, Minimum column - 0.5) for the minimum coordinates
121         *  (Maximum row - 0.5, Maximum column - 0.5) for the maximum coordinates
122         * </pre>
123         * 
124         * </blockquote>
125         * 
126         * If a grid coverage does not have any associated coordinate reference system, the minimum and
127         * maximum coordinate points for the envelope will be empty sequences.
128         * 
129         * @return The bounding box for the coverage domain in coordinate system coordinates.
130         * @UML mandatory envelope
131         */
132        PT_Envelope getEnvelope();
133    
134        /**
135         * The names of each dimension in the coverage. Typically these names are <var>x</var>, <var>y</var>,
136         * <var>z</var> and <var>t</var>. The number of items in the sequence is the number of
137         * dimensions in the coverage. Grid coverages are typically 2D (<var>x</var>, <var>y</var>)
138         * while other coverages may be 3D (<var>x</var>, <var>y</var>, <var>z</var>) or 4D (<var>x</var>,
139         * <var>y</var>, <var>z</var>, <var>t</var>). The number of dimensions of the coverage is the
140         * number of entries in the list of dimension names.
141         * 
142         * @return The names of each dimension in the coverage.
143         * @UML mandatory dimensionNames
144         */
145        String[] getDimensionNames();
146    
147        /**
148         * The number of sample dimensions in the coverage. For grid coverages, a sample dimension is a
149         * band.
150         * 
151         * @return The number of sample dimensions in the coverage.
152         * @UML mandatory numSampleDimensions
153         */
154        int getNumSampleDimensions();
155    
156        /**
157         * Retrieve sample dimension information for the coverage. For a grid coverage a sample
158         * dimension is a band. The sample dimension information include such things as description,
159         * data type of the value (bit, byte, integer...), the no data values, minimum and maximum
160         * values and a color table if one is associated with the dimension. A coverage must have at
161         * least one sample dimension.
162         * 
163         * @param index
164         *            Index for sample dimension to retrieve. Indices are numbered 0 to (<var>{@linkplain #getNumSampleDimensions n}</var>-1).
165         * @return Sample dimension information for the coverage.
166         * @throws IndexOutOfBoundsException
167         *             if <code>index</code> is out of bounds.
168         * @UML operation getSampleDimension
169         */
170        SampleDimension getSampleDimension( int index )
171                                throws IndexOutOfBoundsException;
172    
173        /**
174         * Number of grid coverages which the grid coverage was derived from. This implementation
175         * specification does not include interfaces for creating collections of coverages therefore
176         * this value will usually be one indicating an adapted grid coverage, or zero indicating a raw
177         * grid coverage.
178         * 
179         * @return The number of grid coverages which the grid coverage was derived from.
180         * @UML mandatory numSource
181         */
182        int getNumSources();
183    
184        /**
185         * Returns the source data for a coverage. This is intended to allow applications to establish
186         * what <code>Coverage</code>s will be affected when others are updated, as well as to trace
187         * back to the "raw data".
188         * 
189         * @param sourceDataIndex
190         *            Source coverage index. Indexes start at 0.
191         * @return The source data for a coverage.
192         * @throws IndexOutOfBoundsException
193         *             if <code>sourceDataIndex</code> is out of bounds.
194         * @UML operation getSource
195         * 
196         * @see #getNumSources
197         * @see "org.opengis.coverage.grid.GridCoverage#getSource"
198         */
199        Coverage getSource( int sourceDataIndex )
200                                throws IndexOutOfBoundsException;
201    
202        /**
203         * List of metadata keywords for a coverage. If no metadata is available, the sequence will be
204         * empty.
205         * 
206         * @return the list of metadata keywords for a coverage.
207         * @UML mandatory metadataNames
208         * 
209         * @see #getMetadataValue
210         * @see javax.media.jai.PropertySource#getPropertyNames()
211         */
212        String[] getMetadataNames();
213    
214        /**
215         * Retrieve the metadata value for a given metadata name.
216         * 
217         * @param name
218         *            Metadata keyword for which to retrieve data.
219         * @return the metadata value for a given metadata name.
220         * @throws MetadataNameNotFoundException
221         *             if there is no value for the specified metadata name.
222         * @UML operation getMetadataValue
223         * 
224         * @see #getMetadataNames
225         * @see javax.media.jai.PropertySource#getProperty
226         */
227        String getMetadataValue( String name )
228                                throws MetadataNameNotFoundException;
229    
230        /**
231         * Returns 2D view of this coverage as a renderable image. This optional operation allows
232         * interoperability with <A HREF="http://java.sun.com/products/java-media/2D/">Java2D</A>. If
233         * this coverage is a {@link "org.opengis.coverage.grid.GridCoverage"} backed by a
234         * {@link java.awt.image.RenderedImage}, the underlying image can be obtained with:
235         * 
236         * <code>getRenderableImage(0,1).{@linkplain RenderableImage#createDefaultRendering()
237         * createDefaultRendering()}</code>
238         * 
239         * @param xAxis
240         *            Dimension to use for the <var>x</var> axis.
241         * @param yAxis
242         *            Dimension to use for the <var>y</var> axis.
243         * @return A 2D view of this coverage as a renderable image.
244         * @throws UnsupportedOperationException
245         *             if this optional operation is not supported.
246         * @throws IndexOutOfBoundsException
247         *             if <code>xAxis</code> or <code>yAxis</code> is out of bounds.
248         */
249        RenderableImage getRenderableImage( int xAxis, int yAxis )
250                                throws UnsupportedOperationException, IndexOutOfBoundsException;
251    
252    }