001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/coverage/grid/CompoundGridCoverageReader.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 Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: klaus.greve@uni-bonn.de
041
042
043 ---------------------------------------------------------------------------*/
044 package org.deegree.model.coverage.grid;
045
046 import java.io.IOException;
047 import java.util.ArrayList;
048 import java.util.List;
049
050 import org.deegree.datatypes.parameter.GeneralParameterValueIm;
051 import org.deegree.datatypes.parameter.InvalidParameterNameException;
052 import org.deegree.datatypes.parameter.InvalidParameterValueException;
053 import org.deegree.datatypes.parameter.ParameterNotFoundException;
054 import org.deegree.framework.log.ILogger;
055 import org.deegree.framework.log.LoggerFactory;
056 import org.deegree.model.spatialschema.Envelope;
057 import org.deegree.ogcwebservices.LonLatEnvelope;
058 import org.deegree.ogcwebservices.wcs.configuration.File;
059 import org.deegree.ogcwebservices.wcs.describecoverage.CoverageOffering;
060
061 /**
062 * This reader enables creation of <tt>GridCoverage</tt>s from more than one source. This will be
063 * used for example for tiled images.
064 *
065 *
066 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
067 * @author last edited by: $Author: apoth $
068 *
069 * @version $Revision: 9343 $, $Date: 2007-12-27 14:30:32 +0100 (Do, 27 Dez 2007) $
070 */
071
072 public class CompoundGridCoverageReader extends AbstractGridCoverageReader {
073
074 private static final ILogger LOGGER = LoggerFactory.getLogger( CompoundGridCoverageReader.class );
075
076 /**
077 * @param source
078 * @param description
079 * @param envelope
080 * @param format
081 */
082 public CompoundGridCoverageReader( File[] source, CoverageOffering description, Envelope envelope, Format format ) {
083 super( source, description, envelope, format );
084 }
085
086 /**
087 * Read the grid coverage from the current stream position, and move to the next grid coverage.
088 *
089 * @param parameters
090 * An optional set of parameters. Should be any or all of the parameters returned by
091 * {@link "org.opengis.coverage.grid.Format#getReadParameters"}.
092 * @return A new {@linkplain GridCoverage grid coverage} from the input source.
093 * @throws InvalidParameterNameException
094 * if a parameter in <code>parameters</code> doesn't have a recognized name.
095 * @throws InvalidParameterValueException
096 * if a parameter in <code>parameters</code> doesn't have a valid value.
097 * @throws ParameterNotFoundException
098 * if a parameter was required for the operation but was not provided in the
099 * <code>parameters</code> list.
100 * @throws IOException
101 * if a read operation failed for some other input/output reason, including
102 * {@link java.io.FileNotFoundException} if no file with the given <code>name</code>
103 * can be found, or {@link javax.imageio.IIOException} if an error was thrown by the
104 * underlying image library.
105 */
106 public GridCoverage read( GeneralParameterValueIm[] parameters )
107 throws InvalidParameterNameException, InvalidParameterValueException,
108 ParameterNotFoundException, IOException {
109
110 File[] files = (File[]) source;
111 List<GridCoverage> list = new ArrayList<GridCoverage>( files.length );
112 for ( int i = 0; i < files.length; i++ ) {
113 GridCoverageReader gcr = createGridCoverageReader( files[i] );
114 if ( gcr != null ) {
115 GridCoverage gc = gcr.read( parameters );
116 if ( gc != null ) {
117 list.add( gc );
118 }
119 }
120 }
121 return createGridCoverage( list );
122 }
123
124 /**
125 * creates a GridCoverage compound from the GridCoverages contained in the passed List. It is
126 * assumed that all GridCoverages in the List are of the same type and that the list contains at
127 * least one GridCoverage
128 *
129 * @param list
130 * @return a GridCoverage compound from the GridCoverages contained in the passed List.
131 */
132 private GridCoverage createGridCoverage( List<GridCoverage> list ) {
133
134 GridCoverage gc = null;
135 if ( list != null && list.size() > 0 ) {
136 gc = list.get( 0 );
137 if ( gc instanceof ImageGridCoverage ) {
138 ImageGridCoverage[] tmp = new ImageGridCoverage[list.size()];
139 tmp = list.toArray( tmp );
140 gc = new ImageGridCoverage( description, envelope, tmp );
141 } else if ( gc instanceof ByteGridCoverage ) {
142 ByteGridCoverage[] tmp = new ByteGridCoverage[list.size()];
143 tmp = list.toArray( tmp );
144 gc = new ByteGridCoverage( description, envelope, tmp );
145 } else if ( gc instanceof ShortGridCoverage ) {
146 ShortGridCoverage[] tmp = new ShortGridCoverage[list.size()];
147 tmp = list.toArray( tmp );
148 gc = new ShortGridCoverage( description, envelope, tmp );
149 } else if ( gc instanceof FloatGridCoverage ) {
150 FloatGridCoverage[] tmp = new FloatGridCoverage[list.size()];
151 tmp = list.toArray( tmp );
152 gc = new FloatGridCoverage( description, envelope, tmp );
153 }
154 }
155
156 return gc;
157 }
158
159 /**
160 * creates a GridCoverageReader depending on the native format of the data source
161 *
162 * @param file
163 * @return a GridCoverageReader depending on the native format of the data source
164 * @throws IOException
165 */
166 private GridCoverageReader createGridCoverageReader( File file )
167 throws IOException, InvalidParameterValueException {
168
169 // calculate and set LonLatBoundingBox for the GC CoverageOffering
170 // as source of the returned GridCoverage
171 LonLatEnvelope lle = calcLonLatEnvelope( file.getEnvelope(), file.getCrs().getName() );
172 CoverageOffering desc = (CoverageOffering) description.clone();
173 desc.setLonLatEnvelope( lle );
174
175 Envelope env = envelope.createIntersection( file.getEnvelope() );
176 GridCoverageReader gcr = null;
177 if ( env != null ) {
178 if ( format.getName().equalsIgnoreCase( "GEOTIFF" ) ) {
179 gcr = new GeoTIFFGridCoverageReader( file, desc, env, format );
180 } else if ( isImageFormat( format ) ) {
181 gcr = new ImageGridCoverageReader( file, desc, env, format );
182 } else {
183 throw new IOException( "not supported file format: " + format.getName() );
184 }
185 } else {
186 LOGGER.logInfo( "no data available for BBOX: ", file.getEnvelope() );
187 }
188
189 return gcr;
190 }
191
192 /**
193 * returns true if the passed format is an image format
194 *
195 * @param format
196 * @return <code>true</code> if the passed format is an image format
197 */
198 private boolean isImageFormat( Format format ) {
199 String frmt = format.getName().toUpperCase();
200 return frmt.equalsIgnoreCase( "png" ) || frmt.equalsIgnoreCase( "bmp" ) || frmt.equalsIgnoreCase( "tif" )
201 || frmt.equalsIgnoreCase( "tiff" ) || frmt.equalsIgnoreCase( "gif" ) || frmt.equalsIgnoreCase( "jpg" )
202 || frmt.equalsIgnoreCase( "jpeg" ) || frmt.indexOf( "ECW" ) > -1;
203 }
204
205 /**
206 * This method is an implementation dummy, it doensn't actually do anything.
207 */
208 public void dispose()
209 throws IOException {
210 // throwin nottin
211 }
212
213 }