001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/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 05:30:32 -0800 (Thu, 27 Dec 2007) $
070: */
071:
072: public class CompoundGridCoverageReader extends
073: AbstractGridCoverageReader {
074:
075: private static final ILogger LOGGER = LoggerFactory
076: .getLogger(CompoundGridCoverageReader.class);
077:
078: /**
079: * @param source
080: * @param description
081: * @param envelope
082: * @param format
083: */
084: public CompoundGridCoverageReader(File[] source,
085: CoverageOffering description, Envelope envelope,
086: Format format) {
087: super (source, description, envelope, format);
088: }
089:
090: /**
091: * Read the grid coverage from the current stream position, and move to the next grid coverage.
092: *
093: * @param parameters
094: * An optional set of parameters. Should be any or all of the parameters returned by
095: * {@link "org.opengis.coverage.grid.Format#getReadParameters"}.
096: * @return A new {@linkplain GridCoverage grid coverage} from the input source.
097: * @throws InvalidParameterNameException
098: * if a parameter in <code>parameters</code> doesn't have a recognized name.
099: * @throws InvalidParameterValueException
100: * if a parameter in <code>parameters</code> doesn't have a valid value.
101: * @throws ParameterNotFoundException
102: * if a parameter was required for the operation but was not provided in the
103: * <code>parameters</code> list.
104: * @throws IOException
105: * if a read operation failed for some other input/output reason, including
106: * {@link java.io.FileNotFoundException} if no file with the given <code>name</code>
107: * can be found, or {@link javax.imageio.IIOException} if an error was thrown by the
108: * underlying image library.
109: */
110: public GridCoverage read(GeneralParameterValueIm[] parameters)
111: throws InvalidParameterNameException,
112: InvalidParameterValueException, ParameterNotFoundException,
113: IOException {
114:
115: File[] files = (File[]) source;
116: List<GridCoverage> list = new ArrayList<GridCoverage>(
117: files.length);
118: for (int i = 0; i < files.length; i++) {
119: GridCoverageReader gcr = createGridCoverageReader(files[i]);
120: if (gcr != null) {
121: GridCoverage gc = gcr.read(parameters);
122: if (gc != null) {
123: list.add(gc);
124: }
125: }
126: }
127: return createGridCoverage(list);
128: }
129:
130: /**
131: * creates a GridCoverage compound from the GridCoverages contained in the passed List. It is
132: * assumed that all GridCoverages in the List are of the same type and that the list contains at
133: * least one GridCoverage
134: *
135: * @param list
136: * @return a GridCoverage compound from the GridCoverages contained in the passed List.
137: */
138: private GridCoverage createGridCoverage(List<GridCoverage> list) {
139:
140: GridCoverage gc = null;
141: if (list != null && list.size() > 0) {
142: gc = list.get(0);
143: if (gc instanceof ImageGridCoverage) {
144: ImageGridCoverage[] tmp = new ImageGridCoverage[list
145: .size()];
146: tmp = list.toArray(tmp);
147: gc = new ImageGridCoverage(description, envelope, tmp);
148: } else if (gc instanceof ByteGridCoverage) {
149: ByteGridCoverage[] tmp = new ByteGridCoverage[list
150: .size()];
151: tmp = list.toArray(tmp);
152: gc = new ByteGridCoverage(description, envelope, tmp);
153: } else if (gc instanceof ShortGridCoverage) {
154: ShortGridCoverage[] tmp = new ShortGridCoverage[list
155: .size()];
156: tmp = list.toArray(tmp);
157: gc = new ShortGridCoverage(description, envelope, tmp);
158: } else if (gc instanceof FloatGridCoverage) {
159: FloatGridCoverage[] tmp = new FloatGridCoverage[list
160: .size()];
161: tmp = list.toArray(tmp);
162: gc = new FloatGridCoverage(description, envelope, tmp);
163: }
164: }
165:
166: return gc;
167: }
168:
169: /**
170: * creates a GridCoverageReader depending on the native format of the data source
171: *
172: * @param file
173: * @return a GridCoverageReader depending on the native format of the data source
174: * @throws IOException
175: */
176: private GridCoverageReader createGridCoverageReader(File file)
177: throws IOException, InvalidParameterValueException {
178:
179: // calculate and set LonLatBoundingBox for the GC CoverageOffering
180: // as source of the returned GridCoverage
181: LonLatEnvelope lle = calcLonLatEnvelope(file.getEnvelope(),
182: file.getCrs().getName());
183: CoverageOffering desc = (CoverageOffering) description.clone();
184: desc.setLonLatEnvelope(lle);
185:
186: Envelope env = envelope.createIntersection(file.getEnvelope());
187: GridCoverageReader gcr = null;
188: if (env != null) {
189: if (format.getName().equalsIgnoreCase("GEOTIFF")) {
190: gcr = new GeoTIFFGridCoverageReader(file, desc, env,
191: format);
192: } else if (isImageFormat(format)) {
193: gcr = new ImageGridCoverageReader(file, desc, env,
194: format);
195: } else {
196: throw new IOException("not supported file format: "
197: + format.getName());
198: }
199: } else {
200: LOGGER.logInfo("no data available for BBOX: ", file
201: .getEnvelope());
202: }
203:
204: return gcr;
205: }
206:
207: /**
208: * returns true if the passed format is an image format
209: *
210: * @param format
211: * @return <code>true</code> if the passed format is an image format
212: */
213: private boolean isImageFormat(Format format) {
214: String frmt = format.getName().toUpperCase();
215: return frmt.equalsIgnoreCase("png")
216: || frmt.equalsIgnoreCase("bmp")
217: || frmt.equalsIgnoreCase("tif")
218: || frmt.equalsIgnoreCase("tiff")
219: || frmt.equalsIgnoreCase("gif")
220: || frmt.equalsIgnoreCase("jpg")
221: || frmt.equalsIgnoreCase("jpeg")
222: || frmt.indexOf("ECW") > -1;
223: }
224:
225: /**
226: * This method is an implementation dummy, it doensn't actually do anything.
227: */
228: public void dispose() throws IOException {
229: // throwin nottin
230: }
231:
232: }
|