001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/coverage/SampleDimension.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.io.Serializable;
047 import java.util.HashMap;
048 import java.util.Iterator;
049
050 import org.deegree.datatypes.parameter.ParameterValueIm;
051
052 /**
053 * Contains information for an individual sample dimension of coverage. This interface is applicable
054 * to any coverage type. For grid coverages, the sample dimension refers to an individual band.
055 *
056 *
057 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
058 * @author last edited by: $Author: apoth $
059 *
060 * @version $Revision: 9343 $, $Date: 2007-12-27 14:30:32 +0100 (Do, 27 Dez 2007) $
061 */
062 public class SampleDimension implements Serializable {
063
064 private ColorInterpretation colorInterpretation = null;
065
066 private String[] categoryNames = null;
067
068 private String description = null;
069
070 private double maximumValue = 0;
071
072 private double minimumValue = 0;
073
074 private HashMap<String, Object> metadata = null;
075
076 private double[] noData = null;
077
078 private int offset = -1;
079
080 private int[][] colorPalette = null;
081
082 private PaletteInterpretation paletteInterpretation = null;
083
084 private SampleDimensionType sampleDimensionType = null;
085
086 private double scale = -1;
087
088 private String units = null;
089
090 /**
091 * @param categoryNames
092 * @param description
093 * @param minimumValue
094 * @param maximumValue
095 * @param metadata
096 * @param noData
097 * @param offset
098 * @param colorPalette
099 * @param scale
100 * @param units
101 * @param colorInterpretation
102 * @param paletteInterpretation
103 * @param sampleDimensionType
104 */
105 public SampleDimension( String[] categoryNames, String description, double minimumValue, double maximumValue,
106 ParameterValueIm[] metadata, double[] noData, int offset, int[][] colorPalette,
107 double scale, String units, ColorInterpretation colorInterpretation,
108 PaletteInterpretation paletteInterpretation, SampleDimensionType sampleDimensionType ) {
109 this.categoryNames = categoryNames;
110 this.maximumValue = maximumValue;
111 this.minimumValue = minimumValue;
112 this.scale = scale;
113 this.noData = noData;
114 this.offset = offset;
115 this.colorPalette = colorPalette;
116 this.description = description;
117 this.metadata = new HashMap<String, Object>();
118 if ( metadata != null ) {
119 for ( int i = 0; i < metadata.length; i++ ) {
120 this.metadata.put( metadata[i].getDescriptor().getName(), metadata[i].getValue() );
121 }
122 }
123 this.units = units;
124 if ( colorInterpretation == null ) {
125 this.colorInterpretation = ColorInterpretation.UNDEFINED;
126 } else {
127 this.colorInterpretation = colorInterpretation;
128 }
129 if ( paletteInterpretation == null ) {
130 this.paletteInterpretation = PaletteInterpretation.GRAY;
131 } else {
132 this.paletteInterpretation = paletteInterpretation;
133 }
134 this.sampleDimensionType = sampleDimensionType;
135
136 }
137
138 /**
139 * Sequence of category names for the values contained in a sample dimension. This allows for
140 * names to be assigned to numerical values. The first entry in the sequence relates to a cell
141 * value of zero. For grid coverages, category names are only valid for a classified grid data.
142 *
143 * For example:<br>
144 * <UL>
145 * <li>0 Background</li>
146 * <li>1 Water</li>
147 * <li>2 Forest</li>
148 * <li>3 Urban</li>
149 * </UL>
150 * Note: If no category names exist, an empty sequence is returned.
151 *
152 * @return the sequence of category names for the values contained in a sample dimension.
153 *
154 */
155 public String[] getCategoryNames() {
156 return categoryNames;
157 }
158
159 /**
160 * Color interpretation of the sample dimension. A sample dimension can be an index into a color
161 * palette or be a color model component. If the sample dimension is not assigned a color
162 * interpretation the value is {@link ColorInterpretation#UNDEFINED Undefined}.
163 *
164 * @return the color interpretation of the sample dimension.
165 *
166 */
167 public ColorInterpretation getColorInterpretation() {
168 return colorInterpretation;
169 }
170
171 /**
172 * Sample dimension title or description. This string may be null or empty if no description is
173 * present.
174 *
175 * @return the sample dimension title or description.
176 *
177 */
178 public String getDescription() {
179 return description;
180 }
181
182 /**
183 * The maximum value occurring in the sample dimension. If this value is not available, this
184 * value can be determined from the {@link "org.opengis"} operation. This value can be empty if
185 * this value is not provided by the implementation.
186 *
187 * @return the maximum value occurring in the sample dimension.
188 *
189 */
190 public double getMaximumValue() {
191 return maximumValue;
192 }
193
194 /**
195 * The list of metadata keywords for a sample dimension. If no metadata is available, the
196 * sequence will be empty.
197 *
198 * @return the list of metadata keywords for a sample dimension.
199 *
200 */
201 public String[] getMetaDataNames() {
202 Iterator iterator = metadata.keySet().iterator();
203 String[] names = new String[metadata.size()];
204 int i = 0;
205 while ( iterator.hasNext() ) {
206 names[i++] = (String) iterator.next();
207 }
208 return names;
209 }
210
211 /**
212 * Retrieve the metadata value for a given metadata name.
213 *
214 * @param name
215 * Metadata keyword for which to retrieve metadata.
216 * @return the metadata value for a given metadata name.
217 *
218 */
219 public String getMetadataValue( String name ) {
220 return (String) metadata.get( name );
221 }
222
223 /**
224 * The minimum value occurring in the sample dimension. This value can be empty if this value is
225 * not provided by the implementation.
226 *
227 * @return the minimum value occurring in the sample dimension.
228 *
229 */
230 public double getMinimumValue() {
231 return minimumValue;
232 }
233
234 /**
235 * Values to indicate no data values for the sample dimension. For low precision sample
236 * dimensions, this will often be no data values.
237 *
238 * @return the values to indicate no data values for the sample dimension.
239 *
240 */
241 public double[] getNoDataValues() {
242 return noData;
243 }
244
245 /**
246 * Offset is the value to add to grid values for this sample dimension. This attribute is
247 * typically used when the sample dimension represents elevation data. The default for this
248 * value is 0.
249 *
250 * @return the offset is the value to add to grid values for this sample dimension.
251 *
252 */
253 public double getOffset() {
254 return offset;
255 }
256
257 /**
258 * Color palette associated with the sample dimension. A color palette can have any number of
259 * colors. See palette interpretation for meaning of the palette entries. If the grid coverage
260 * has no color palette, an empty sequence will be returned.
261 *
262 * @return the color palette associated with the sample dimension.
263 *
264 */
265 public int[][] getPalette() {
266 return colorPalette;
267 }
268
269 /**
270 * Indicates the type of color palette entry for sample dimensions which have a palette. If a
271 * sample dimension has a palette, the color interpretation must be
272 * {@link ColorInterpretation#GRAY_INDEX GrayIndex} or
273 * {@link ColorInterpretation#PALETTE_INDEX PaletteIndex}. A palette entry type can be Gray,
274 * RGB, CMYK or HLS.
275 *
276 * @return the type of color palette entry for sample dimensions which have a palette.
277 *
278 */
279 public PaletteInterpretation getPaletteInterpretation() {
280 return paletteInterpretation;
281 }
282
283 /**
284 * A code value indicating grid value data type. This will also indicate the number of bits for
285 * the data type.
286 *
287 * @return a code value indicating grid value data type.
288 *
289 */
290 public SampleDimensionType getSampleDimensionType() {
291 return sampleDimensionType;
292 }
293
294 /**
295 * Scale is the value which is multiplied to grid values for this sample dimension. This
296 * attribute is typically used when the sample dimension represents elevation data. The default
297 * for this value is 1.
298 *
299 * @return the scale.
300 *
301 */
302 public double getScale() {
303 return scale;
304 }
305
306 /**
307 * The unit information for this sample dimension. This interface typically is provided with
308 * grid coverages which represent digital elevation data. This value will be <code>null</code>
309 * if no unit information is available.
310 *
311 * @return the unit information for this sample dimension.
312 *
313 */
314 public String getUnits() {
315 return units;
316 }
317
318 }