001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_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 }