001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/model/coverage/SampleDimension.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.model.coverage;
037
038 import java.io.Serializable;
039 import java.util.HashMap;
040 import java.util.Iterator;
041
042 import org.deegree.datatypes.parameter.ParameterValueIm;
043
044 /**
045 * Contains information for an individual sample dimension of coverage. This interface is applicable
046 * to any coverage type. For grid coverages, the sample dimension refers to an individual band.
047 *
048 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
049 * @author last edited by: $Author: mschneider $
050 *
051 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
052 */
053 public class SampleDimension implements Serializable {
054
055 private static final long serialVersionUID = 6130760380289685594L;
056
057 private ColorInterpretation colorInterpretation = null;
058
059 private String[] categoryNames = null;
060
061 private String description = null;
062
063 private double maximumValue = 0;
064
065 private double minimumValue = 0;
066
067 private HashMap<String, Object> metadata = null;
068
069 private double[] noData = null;
070
071 private int offset = -1;
072
073 private int[][] colorPalette = null;
074
075 private PaletteInterpretation paletteInterpretation = null;
076
077 private SampleDimensionType sampleDimensionType = null;
078
079 private double scale = -1;
080
081 private String units = null;
082
083 /**
084 * @param categoryNames
085 * @param description
086 * @param minimumValue
087 * @param maximumValue
088 * @param metadata
089 * @param noData
090 * @param offset
091 * @param colorPalette
092 * @param scale
093 * @param units
094 * @param colorInterpretation
095 * @param paletteInterpretation
096 * @param sampleDimensionType
097 */
098 public SampleDimension( String[] categoryNames, String description, double minimumValue, double maximumValue,
099 ParameterValueIm[] metadata, double[] noData, int offset, int[][] colorPalette,
100 double scale, String units, ColorInterpretation colorInterpretation,
101 PaletteInterpretation paletteInterpretation, SampleDimensionType sampleDimensionType ) {
102 this.categoryNames = categoryNames;
103 this.maximumValue = maximumValue;
104 this.minimumValue = minimumValue;
105 this.scale = scale;
106 this.noData = noData;
107 this.offset = offset;
108 this.colorPalette = colorPalette;
109 this.description = description;
110 this.metadata = new HashMap<String, Object>();
111 if ( metadata != null ) {
112 for ( int i = 0; i < metadata.length; i++ ) {
113 this.metadata.put( metadata[i].getDescriptor().getName(), metadata[i].getValue() );
114 }
115 }
116 this.units = units;
117 if ( colorInterpretation == null ) {
118 this.colorInterpretation = ColorInterpretation.UNDEFINED;
119 } else {
120 this.colorInterpretation = colorInterpretation;
121 }
122 if ( paletteInterpretation == null ) {
123 this.paletteInterpretation = PaletteInterpretation.GRAY;
124 } else {
125 this.paletteInterpretation = paletteInterpretation;
126 }
127 this.sampleDimensionType = sampleDimensionType;
128
129 }
130
131 /**
132 * Sequence of category names for the values contained in a sample dimension. This allows for
133 * names to be assigned to numerical values. The first entry in the sequence relates to a cell
134 * value of zero. For grid coverages, category names are only valid for a classified grid data.
135 *
136 * For example:<br>
137 * <UL>
138 * <li>0 Background</li>
139 * <li>1 Water</li>
140 * <li>2 Forest</li>
141 * <li>3 Urban</li>
142 * </UL>
143 * Note: If no category names exist, an empty sequence is returned.
144 *
145 * @return the sequence of category names for the values contained in a sample dimension.
146 *
147 */
148 public String[] getCategoryNames() {
149 return categoryNames;
150 }
151
152 /**
153 * Color interpretation of the sample dimension. A sample dimension can be an index into a color
154 * palette or be a color model component. If the sample dimension is not assigned a color
155 * interpretation the value is {@link ColorInterpretation#UNDEFINED Undefined}.
156 *
157 * @return the color interpretation of the sample dimension.
158 *
159 */
160 public ColorInterpretation getColorInterpretation() {
161 return colorInterpretation;
162 }
163
164 /**
165 * Sample dimension title or description. This string may be null or empty if no description is
166 * present.
167 *
168 * @return the sample dimension title or description.
169 *
170 */
171 public String getDescription() {
172 return description;
173 }
174
175 /**
176 * The maximum value occurring in the sample dimension. If this value is not available, this
177 * value can be determined from the {@link "org.opengis"} operation. This value can be empty if
178 * this value is not provided by the implementation.
179 *
180 * @return the maximum value occurring in the sample dimension.
181 *
182 */
183 public double getMaximumValue() {
184 return maximumValue;
185 }
186
187 /**
188 * The list of metadata keywords for a sample dimension. If no metadata is available, the
189 * sequence will be empty.
190 *
191 * @return the list of metadata keywords for a sample dimension.
192 *
193 */
194 public String[] getMetaDataNames() {
195 Iterator<String> iterator = metadata.keySet().iterator();
196 String[] names = new String[metadata.size()];
197 int i = 0;
198 while ( iterator.hasNext() ) {
199 names[i++] = iterator.next();
200 }
201 return names;
202 }
203
204 /**
205 * Retrieve the metadata value for a given metadata name.
206 *
207 * @param name
208 * Metadata keyword for which to retrieve metadata.
209 * @return the metadata value for a given metadata name.
210 *
211 */
212 public String getMetadataValue( String name ) {
213 return (String) metadata.get( name );
214 }
215
216 /**
217 * The minimum value occurring in the sample dimension. This value can be empty if this value is
218 * not provided by the implementation.
219 *
220 * @return the minimum value occurring in the sample dimension.
221 *
222 */
223 public double getMinimumValue() {
224 return minimumValue;
225 }
226
227 /**
228 * Values to indicate no data values for the sample dimension. For low precision sample
229 * dimensions, this will often be no data values.
230 *
231 * @return the values to indicate no data values for the sample dimension.
232 *
233 */
234 public double[] getNoDataValues() {
235 return noData;
236 }
237
238 /**
239 * Offset is the value to add to grid values for this sample dimension. This attribute is
240 * typically used when the sample dimension represents elevation data. The default for this
241 * value is 0.
242 *
243 * @return the offset is the value to add to grid values for this sample dimension.
244 *
245 */
246 public double getOffset() {
247 return offset;
248 }
249
250 /**
251 * Color palette associated with the sample dimension. A color palette can have any number of
252 * colors. See palette interpretation for meaning of the palette entries. If the grid coverage
253 * has no color palette, an empty sequence will be returned.
254 *
255 * @return the color palette associated with the sample dimension.
256 *
257 */
258 public int[][] getPalette() {
259 return colorPalette;
260 }
261
262 /**
263 * Indicates the type of color palette entry for sample dimensions which have a palette. If a
264 * sample dimension has a palette, the color interpretation must be
265 * {@link ColorInterpretation#GRAY_INDEX GrayIndex} or
266 * {@link ColorInterpretation#PALETTE_INDEX PaletteIndex}. A palette entry type can be Gray,
267 * RGB, CMYK or HLS.
268 *
269 * @return the type of color palette entry for sample dimensions which have a palette.
270 *
271 */
272 public PaletteInterpretation getPaletteInterpretation() {
273 return paletteInterpretation;
274 }
275
276 /**
277 * A code value indicating grid value data type. This will also indicate the number of bits for
278 * the data type.
279 *
280 * @return a code value indicating grid value data type.
281 *
282 */
283 public SampleDimensionType getSampleDimensionType() {
284 return sampleDimensionType;
285 }
286
287 /**
288 * Scale is the value which is multiplied to grid values for this sample dimension. This
289 * attribute is typically used when the sample dimension represents elevation data. The default
290 * for this value is 1.
291 *
292 * @return the scale.
293 *
294 */
295 public double getScale() {
296 return scale;
297 }
298
299 /**
300 * The unit information for this sample dimension. This interface typically is provided with
301 * grid coverages which represent digital elevation data. This value will be <code>null</code>
302 * if no unit information is available.
303 *
304 * @return the unit information for this sample dimension.
305 *
306 */
307 public String getUnits() {
308 return units;
309 }
310
311 }