001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/graphics/LazyRasterLayer.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2006 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.graphics;
044
045 import java.io.IOException;
046 import java.util.ArrayList;
047 import java.util.List;
048
049 import org.deegree.framework.log.ILogger;
050 import org.deegree.framework.log.LoggerFactory;
051 import org.deegree.io.JDBCConnection;
052 import org.deegree.io.oraclegeoraster.GeoRasterDescription;
053 import org.deegree.model.coverage.grid.Format;
054 import org.deegree.model.coverage.grid.GridCoverage;
055 import org.deegree.model.coverage.grid.GridCoverageExchange;
056 import org.deegree.model.coverage.grid.GridCoverageReader;
057 import org.deegree.model.crs.CRSFactory;
058 import org.deegree.model.crs.CoordinateSystem;
059 import org.deegree.model.crs.UnknownCRSException;
060 import org.deegree.model.spatialschema.Envelope;
061 import org.deegree.model.spatialschema.GeometryFactory;
062 import org.deegree.ogcwebservices.InvalidParameterValueException;
063 import org.deegree.ogcwebservices.wcs.configuration.Directory;
064 import org.deegree.ogcwebservices.wcs.configuration.DirectoryResolution;
065 import org.deegree.ogcwebservices.wcs.configuration.Extension;
066 import org.deegree.ogcwebservices.wcs.configuration.File;
067 import org.deegree.ogcwebservices.wcs.configuration.FileResolution;
068 import org.deegree.ogcwebservices.wcs.configuration.OracleGeoRasterResolution;
069 import org.deegree.ogcwebservices.wcs.configuration.Resolution;
070 import org.deegree.ogcwebservices.wcs.configuration.Shape;
071 import org.deegree.ogcwebservices.wcs.configuration.ShapeResolution;
072 import org.deegree.ogcwebservices.wcs.describecoverage.CoverageOffering;
073
074 /**
075 *
076 *
077 *
078 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
079 * @author last edited by: $Author: bezema $
080 *
081 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $
082 */
083 public class LazyRasterLayer extends AbstractLayer {
084
085 private ILogger LOG = LoggerFactory.getLogger( LazyRasterLayer.class );
086
087 private Extension resource;
088
089 private CoverageOffering coverageOffering;
090
091 /**
092 *
093 * @param name
094 * @param coverageOffering
095 * @throws Exception
096 */
097 public LazyRasterLayer( String name, CoverageOffering coverageOffering ) throws Exception {
098 super( name );
099 this.coverageOffering = coverageOffering;
100 resource = coverageOffering.getExtension();
101 }
102
103 /**
104 *
105 * @param name
106 * @param crs
107 * @param coverageOffering
108 * @throws Exception
109 */
110 public LazyRasterLayer( String name, CoordinateSystem crs, CoverageOffering coverageOffering )
111 throws Exception {
112 super( name, crs );
113 this.coverageOffering = coverageOffering;
114 resource = coverageOffering.getExtension();
115 }
116
117 /**
118 * @param crs
119 * @throws Exception
120 *
121 */
122 public void setCoordinatesSystem( CoordinateSystem crs )
123 throws Exception {
124 // not supported yet
125 }
126
127
128
129 /* (non-Javadoc)
130 * @see org.deegree.graphics.AbstractLayer#getBoundingBox()
131 */
132 @Override
133 public Envelope getBoundingBox() {
134 return coverageOffering.getDomainSet().getSpatialDomain().getEnvelops()[0];
135 }
136
137 /**
138 *
139 * @param envelope
140 * @param resolution
141 * @return
142 * @throws IOException
143 * @throws InvalidParameterValueException
144 */
145 public GridCoverage getRaster( Envelope envelope, double resolution )
146 throws InvalidParameterValueException, IOException {
147
148 Resolution[] resolutions = resource.getResolutions( resolution );
149
150 String nativeCRS = coverageOffering.getSupportedCRSs().getNativeSRSs()[0].getCodes()[0];
151 CoordinateSystem crs;
152 try {
153 crs = CRSFactory.create( nativeCRS );
154 } catch ( UnknownCRSException e ) {
155 throw new InvalidParameterValueException( e );
156 }
157 envelope = GeometryFactory.createEnvelope( envelope.getMin(), envelope.getMax(), crs );
158
159 GridCoverageReader reader = null;
160 if ( resolutions[0] instanceof FileResolution ) {
161 reader = getFileReader( resolutions, envelope );
162 } else if ( resolutions[0] instanceof ShapeResolution ) {
163 reader = getShapeReader( resolutions, envelope );
164 } else if ( resolutions[0] instanceof DirectoryResolution ) {
165 reader = getDirectoryReader( resolutions, envelope );
166 } else if ( resolutions[0] instanceof OracleGeoRasterResolution ) {
167 reader = getOracleGeoRasterReader( resolutions, envelope );
168 } else {
169 throw new InvalidParameterValueException( "not supported coverage resolution: " +
170 resolutions[0].getClass().getName() );
171 }
172 return reader.read( null );
173 }
174
175 /**
176 *
177 * @param resolutions
178 * @param env
179 * @return
180 * @throws IOException
181 * @throws InvalidParameterValueException
182 */
183 private GridCoverageReader getDirectoryReader( Resolution[] resolutions, Envelope env )
184 throws IOException, InvalidParameterValueException {
185
186 LOG.logInfo( "reading coverage from directories" );
187
188 Directory[] dirs = ( (DirectoryResolution) resolutions[0] ).getDirectories( env );
189
190 GridCoverageExchange gce = new GridCoverageExchange( null );
191 Format format = new Format( coverageOffering.getSupportedFormats().getNativeFormat() );
192
193 return gce.getReader( dirs, coverageOffering, env, format );
194 }
195
196 /**
197 *
198 * @param resolutions
199 * @param env
200 * @return
201 * @throws IOException
202 * @throws InvalidParameterValueException
203 */
204 private GridCoverageReader getFileReader( Resolution[] resolutions, Envelope env )
205 throws IOException, InvalidParameterValueException {
206
207 LOG.logInfo( "reading coverage from files" );
208
209 File[] files = ( (FileResolution) resolutions[0] ).getFiles();
210 List list = new ArrayList();
211 for ( int i = 0; i < files.length; i++ ) {
212 Envelope fileEnv = files[i].getEnvelope();
213 if ( fileEnv.intersects( env ) ) {
214 list.add( files[i] );
215 }
216 }
217 files = (File[]) list.toArray( new File[list.size()] );
218
219 GridCoverageExchange gce = new GridCoverageExchange( null );
220 Format format = new Format( coverageOffering.getSupportedFormats().getNativeFormat() );
221
222 return gce.getReader( files, coverageOffering, env, format );
223 }
224
225 /**
226 *
227 * @param resolutions
228 * @param env
229 * @return
230 * @throws InvalidParameterValueException
231 * @throws IOException
232 */
233 private GridCoverageReader getOracleGeoRasterReader( Resolution[] resolutions, Envelope env )
234 throws InvalidParameterValueException, IOException {
235
236 LOG.logInfo( "reading coverage from oracle georaster" );
237
238 JDBCConnection jdbc = ( (OracleGeoRasterResolution) resolutions[0] ).getJDBCConnection();
239 String table = ( (OracleGeoRasterResolution) resolutions[0] ).getTable();
240 String rdtTable = ( (OracleGeoRasterResolution) resolutions[0] ).getRdtTable();
241 String column = ( (OracleGeoRasterResolution) resolutions[0] ).getColumn();
242 String identification = ( (OracleGeoRasterResolution) resolutions[0] ).getIdentification();
243 int level = ( (OracleGeoRasterResolution) resolutions[0] ).getLevel();
244 GeoRasterDescription grd = new GeoRasterDescription( jdbc, table, rdtTable, column,
245 identification, level );
246
247 GridCoverageExchange gce = new GridCoverageExchange( null );
248 Format format = new Format( coverageOffering.getSupportedFormats().getNativeFormat() );
249
250 return gce.getReader( grd, coverageOffering, env, format );
251
252 }
253
254 /**
255 *
256 * @param resolutions
257 * @param env
258 * @return
259 * @throws IOException
260 * @throws InvalidParameterValueException
261 */
262 private GridCoverageReader getShapeReader( Resolution[] resolutions, Envelope env )
263 throws IOException, InvalidParameterValueException {
264
265 LOG.logInfo( "reading coverage from shapes" );
266
267 Shape shape = ( (ShapeResolution) resolutions[0] ).getShape();
268
269 GridCoverageExchange gce = new GridCoverageExchange( null );
270 Format format = new Format( coverageOffering.getSupportedFormats().getNativeFormat() );
271 return gce.getReader( shape, coverageOffering, env, format );
272
273 }
274
275 }
276
277 /*********************************************************************
278 <code>
279 Changes to this class. What the people have been up to:
280 $Log$
281 Revision 1.6 2007/03/06 11:22:15 wanhoff
282 Fixed Javadoc (@param)
283
284 Revision 1.5 2007/02/09 17:28:00 poth
285 *** empty log message ***
286
287 Revision 1.4 2006/11/27 09:07:52 poth
288 JNI integration of proj4 has been removed. The CRS functionality now will be done by native deegree code.
289
290 Revision 1.3 2006/05/31 17:53:33 poth
291 bug fix
292
293 Revision 1.2 2006/05/31 17:23:59 poth
294 first implementation of LazyRasterLayer
295
296 Revision 1.1 2006/05/24 08:05:03 poth
297 initial load up
298 </code>
299
300 ********************************************************************** */