001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/model/coverage/grid/oracle/OracleGeoRasterGridCoverageReader.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: 53177 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: package org.deegree.model.coverage.grid.oracle;
044:
045: import java.awt.image.BufferedImage;
046: import java.awt.image.RenderedImage;
047: import java.awt.image.renderable.ParameterBlock;
048: import java.io.IOException;
049:
050: import javax.media.jai.InterpolationNearest;
051: import javax.media.jai.JAI;
052: import javax.media.jai.RenderedOp;
053:
054: import org.deegree.datatypes.CodeList;
055: import org.deegree.datatypes.parameter.GeneralParameterValueIm;
056: import org.deegree.datatypes.parameter.InvalidParameterNameException;
057: import org.deegree.datatypes.parameter.InvalidParameterValueException;
058: import org.deegree.datatypes.parameter.OperationParameterIm;
059: import org.deegree.datatypes.parameter.ParameterNotFoundException;
060: import org.deegree.framework.log.ILogger;
061: import org.deegree.framework.log.LoggerFactory;
062: import org.deegree.framework.util.StringTools;
063: import org.deegree.io.oraclegeoraster.GeoRasterDescription;
064: import org.deegree.io.oraclegeoraster.GeoRasterReader;
065: import org.deegree.model.coverage.grid.AbstractGridCoverageReader;
066: import org.deegree.model.coverage.grid.Format;
067: import org.deegree.model.coverage.grid.GridCoverage;
068: import org.deegree.model.coverage.grid.ImageGridCoverage;
069: import org.deegree.model.crs.GeoTransformer;
070: import org.deegree.model.spatialschema.Envelope;
071: import org.deegree.model.spatialschema.GeometryFactory;
072: import org.deegree.ogcwebservices.LonLatEnvelope;
073: import org.deegree.ogcwebservices.wcs.describecoverage.CoverageOffering;
074:
075: /**
076: * Reader for Coverages stored in Oracle 10g GeoRaster format
077: *
078: *
079: * @version $Revision: 9436 $
080: * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
081: * @author last edited by: $Author: rbezema $
082: *
083: * @version 1.0. $Revision: 9436 $, $Date: 2008-01-08 02:50:19 -0800 (Tue, 08 Jan 2008) $
084: *
085: * @since 2.0
086: */
087: public class OracleGeoRasterGridCoverageReader extends
088: AbstractGridCoverageReader {
089:
090: private static final ILogger LOG = LoggerFactory
091: .getLogger(OracleGeoRasterGridCoverageReader.class);
092:
093: /**
094: *
095: * @param jdbc
096: * description of the JDBC connection to a Orable DB
097: * @param table
098: * name of the table storing the GeoRaster
099: * @param column
100: * name of the column the target GeoRaster is stored
101: * @param identification
102: * a SQL where clause that identifies the target georaster
103: * @param description
104: * @param envelope
105: * @param format
106: */
107: public OracleGeoRasterGridCoverageReader(
108: GeoRasterDescription grDesc, CoverageOffering description,
109: Envelope envelope, Format format) {
110: super (grDesc, description, envelope, format);
111: }
112:
113: public void dispose() throws IOException {
114:
115: }
116:
117: /**
118: * reads a GridCoverage from a Oracle 10g GeoRaster
119: *
120: * @param parameters -
121: */
122: public GridCoverage read(GeneralParameterValueIm[] parameters)
123: throws InvalidParameterNameException,
124: InvalidParameterValueException, ParameterNotFoundException,
125: IOException {
126:
127: float width = -1;
128: float height = -1;
129: for (int i = 0; i < parameters.length; i++) {
130: OperationParameterIm op = (OperationParameterIm) parameters[i]
131: .getDescriptor();
132: String name = op.getName();
133: if (name.equalsIgnoreCase("WIDTH")) {
134: Object o = op.getDefaultValue();
135: width = ((Integer) o).intValue();
136: } else if (name.equalsIgnoreCase("HEIGHT")) {
137: Object o = op.getDefaultValue();
138: height = ((Integer) o).intValue();
139: }
140: }
141:
142: // get the region of the georaster that intersects with the requested
143: // envelope. First field of the returned array contains the intersection
144: // envelope in the rasters native CRS; second field contains the
145: // corresponding LonLatEnvelope
146: Object[] o = getImageRegion();
147:
148: GeoRasterDescription grDesc = (GeoRasterDescription) getSource();
149: RenderedImage img = null;
150: try {
151: LOG.logDebug("reading GeoRaster from Oracle DB");
152: img = GeoRasterReader.exportRaster(grDesc, (Envelope) o[0]);
153: } catch (Exception e) {
154: LOG.logError("could not read GeoRaster: ", e);
155: throw new IOException("could not read GeoRaster: "
156: + e.getMessage());
157: }
158:
159: ParameterBlock pb = new ParameterBlock();
160: pb.addSource(img);
161: pb.add(width / img.getWidth()); // The xScale
162: pb.add(height / img.getHeight()); // The yScale
163: pb.add(0.0F); // The x translation
164: pb.add(0.0F); // The y translation
165: pb.add(new InterpolationNearest()); // The interpolation
166: // Create the scale operation
167: RenderedOp ro = JAI.create("scale", pb, null);
168: try {
169: img = ro.getAsBufferedImage();
170: } catch (Exception e) {
171: LOG.logError("could not rescale image", e);
172: throw new IOException("could not rescale image"
173: + e.getMessage());
174: }
175:
176: CoverageOffering co = (CoverageOffering) description.clone();
177: co.setLonLatEnvelope((LonLatEnvelope) o[1]);
178:
179: return new ImageGridCoverage(co, (Envelope) o[0],
180: (BufferedImage) img);
181:
182: }
183:
184: /**
185: * returns the region of the source image that intersects with the GridCoverage to be created as
186: * Rectange as well as the Envelope of the region in the native CRS and the LonLatEnvelope of
187: * this region.
188: *
189: * @return the region of the source image that intersects with the GridCoverage to be created as
190: * Rectange as well as the Envelope of the region in the native CRS and the
191: * LonLatEnvelope of this region.
192: */
193: private Object[] getImageRegion() {
194:
195: CodeList[] cl = description.getSupportedCRSs().getNativeSRSs();
196: String code = cl[0].getCodes()[0];
197:
198: LonLatEnvelope lle = description.getLonLatEnvelope();
199: Envelope tmp = GeometryFactory.createEnvelope(lle.getMin()
200: .getX(), lle.getMin().getY(), lle.getMax().getX(), lle
201: .getMax().getY(), null);
202: try {
203: if (!code.equals("EPSG:4326")) {
204: GeoTransformer trans = new GeoTransformer(code);
205: tmp = trans.transform(tmp, "EPSG:4326");
206: }
207: } catch (Exception e) {
208: LOG.logError(StringTools.stackTraceToString(e));
209: }
210:
211: // calculate envelope of the part of the grid coverage that intersects
212: // within the image
213: Envelope env = envelope.createIntersection(tmp);
214: LonLatEnvelope lonLatEnvelope = calcLonLatEnvelope(env, code);
215:
216: return new Object[] { env, lonLatEnvelope };
217: }
218:
219: }
|