Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wcs / trunk / org.gvsig.raster.wcs / org.gvsig.raster.wcs.io / src / main / java / org / gvsig / raster / wcs / io / WCSProvider.java @ 1083

History | View | Annotate | Download (40.3 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.wcs.io;
23

    
24
import java.awt.geom.AffineTransform;
25
import java.awt.geom.NoninvertibleTransformException;
26
import java.awt.geom.Point2D;
27
import java.awt.geom.Rectangle2D;
28
import java.io.File;
29
import java.io.IOException;
30
import java.net.URL;
31
import java.util.Hashtable;
32

    
33
import org.gvsig.compat.net.ICancellable;
34
import org.gvsig.fmap.dal.DALLocator;
35
import org.gvsig.fmap.dal.DataStore;
36
import org.gvsig.fmap.dal.DataStoreParameters;
37
import org.gvsig.fmap.dal.coverage.RasterLocator;
38
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
39
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
40
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
41
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
42
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
43
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
44
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
45
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
46
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
47
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
48
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
49
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
50
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
51
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
52
import org.gvsig.fmap.dal.exception.InitializeException;
53
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
54
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
55
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
56
import org.gvsig.metadata.MetadataLocator;
57
import org.gvsig.raster.cache.tile.TileCacheLocator;
58
import org.gvsig.raster.cache.tile.TileCacheManager;
59
import org.gvsig.raster.cache.tile.exception.TileGettingException;
60
import org.gvsig.raster.cache.tile.provider.TileListener;
61
import org.gvsig.raster.cache.tile.provider.TileServer;
62
import org.gvsig.raster.impl.DefaultRasterManager;
63
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
64
import org.gvsig.raster.impl.datastruct.BandListImpl;
65
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
66
import org.gvsig.raster.impl.datastruct.ExtentImpl;
67
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
68
import org.gvsig.raster.impl.provider.RasterProvider;
69
import org.gvsig.raster.impl.provider.RemoteRasterProvider;
70
import org.gvsig.raster.impl.store.DefaultStoreFactory;
71
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
72
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
73
import org.gvsig.raster.impl.store.properties.RemoteDataStoreStatistics;
74
import org.gvsig.raster.impl.store.properties.RemoteStoreHistogram;
75
import org.gvsig.raster.util.DefaultProviderServices;
76
import org.gvsig.raster.wcs.io.downloader.WCSTileServer;
77
import org.gvsig.remoteclient.wcs.WCSStatus;
78
import org.gvsig.tools.ToolsLocator;
79
import org.gvsig.tools.task.Cancellable;
80
import org.gvsig.tools.task.TaskStatus;
81
import org.slf4j.Logger;
82
import org.slf4j.LoggerFactory;
83
/**
84
 * Clase que representa al driver de acceso a datos de wcs.
85
 *
86
 * @author Nacho Brodin (nachobrodin@gmail.com)
87
 */
88
@SuppressWarnings("deprecation")
89
public class WCSProvider extends DefaultRasterProvider implements RemoteRasterProvider {
90
        public static String                NAME                     = "Wcs Store";
91
        public static String                DESCRIPTION              = "Wcs Raster file";
92
        public static final String          METADATA_DEFINITION_NAME = "WcsStore";
93
        
94
        private static final Logger         logger                   = LoggerFactory.getLogger(WCSProvider.class);
95
        private Extent                      viewRequest              = null;
96
        private static Hashtable<URL, WCSConnector>    
97
                                            drivers                  = new Hashtable<URL, WCSConnector> ();
98
        private boolean                     open                     = false;
99
        private DataStoreTransparency       fileTransparency         = null;
100
        private File                        lastRequest              = null;
101
        private DefaultRasterProvider       lastRequestProvider      = null; 
102
        
103
        public static void register() {
104
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
105
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
106
                        dataman.registerStoreProvider(NAME,
107
                                        WCSProvider.class, WCSDataParametersImpl.class);
108
                }
109

    
110
                if (!dataman.getExplorerProviders().contains(WCSServerExplorer.NAME)) {
111
                        dataman.registerExplorerProvider(WCSServerExplorer.NAME, WCSServerExplorer.class, WCSServerExplorerParameters.class);
112
                }
113
                dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
114
        }
115
        
116
        public WCSProvider() throws NotSupportedExtensionException {
117
                super();
118
        }
119
        
120
        /**
121
         * Constructor. Abre el dataset.
122
         * @param proj Proyecci?n
123
         * @param fName Nombre del fichero
124
         * @throws NotSupportedExtensionException
125
         */
126
        public WCSProvider(String params) throws NotSupportedExtensionException {
127
                super(params);
128
                if(params instanceof String) {
129
                        WCSDataParametersImpl p = new WCSDataParametersImpl();
130
                        p.setURI((String)params);
131
                        super.init(p, null, ToolsLocator.getDynObjectManager()
132
                                        .createDynObject(
133
                                                        MetadataLocator.getMetadataManager().getDefinition(
134
                                                                        DataStore.METADATA_DEFINITION_NAME)));
135
                        init(p, null);
136
                }
137
        }
138
        
139
        public WCSProvider(WCSDataParametersImpl params,
140
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
141
                super(params, storeServices, ToolsLocator.getDynObjectManager()
142
                                .createDynObject(
143
                                                MetadataLocator.getMetadataManager().getDefinition(
144
                                                                DataStore.METADATA_DEFINITION_NAME)));
145
                init(params, storeServices);
146
        }
147
        
148
        /**
149
         * Gets the connector from the URL
150
         * @return
151
         * @throws RemoteServiceException
152
         */
153
        public WCSConnector getConnector() throws RemoteServiceException {
154
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
155
                URL url = null;
156
                try {
157
                        url = new URL(p.getURI());
158
                } catch (Exception e) {
159
                        throw new RemoteServiceException("Malformed URL",e);
160
                }
161
                try {
162
                        return WCSProvider.getConnectorFromURL(url);
163
                } catch (IOException e) {
164
                        throw new RemoteServiceException("Error getting the connector",e);
165
                }
166
        }
167
        
168
        /**
169
         * Crea las referencias al fichero y carga
170
         * las estructuras con la informaci?n y los metadatos.
171
         * @param proj Proyecci?n
172
         * @param param Parametros de carga
173
         * @throws NotSupportedExtensionException
174
         */
175
        public void init (DataStoreParameters params,
176
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
177
                setParam(storeServices, params);
178
                open = true;
179
                try {
180
                        loadInitialInfo();
181
                } catch (RasterDriverException e) {
182
                        logger.info("Loaded default values in WCS provider", e);
183
                }
184
                
185
                stats = new RemoteDataStoreStatistics(this);
186
        }
187
        
188
        public static final WCSConnector getConnectorFromURL(URL url) throws IOException {
189
                WCSConnector drv = (WCSConnector) drivers.get(url);
190
                if (drv == null) {
191
                        drv = new WCSConnector(url);
192
                        drivers.put(url, drv);
193
                }
194
                return drv;
195
        }
196
        
197
        /**
198
         * Obtiene el objeto que contiene que contiene la interpretaci?n de
199
         * color por banda
200
         * @return
201
         */
202
        public ColorInterpretation getColorInterpretation() {
203
                if(super.getColorInterpretation() == null) {
204
                        ColorInterpretation colorInterpretation = new DataStoreColorInterpretation();
205
                        colorInterpretation.initColorInterpretation(getBandCount());
206
                        if(getBandCount() == 3) {
207
                                colorInterpretation.setColorInterpValue(0, DataStoreColorInterpretation.RED_BAND);
208
                                colorInterpretation.setColorInterpValue(1, DataStoreColorInterpretation.GREEN_BAND);
209
                                colorInterpretation.setColorInterpValue(2, DataStoreColorInterpretation.BLUE_BAND);
210
                        } else {
211
                                for (int i = 0; i < getBandCount(); i++) {
212
                                        colorInterpretation.setColorInterpValue(i, DataStoreColorInterpretation.GRAY_BAND);
213
                                }
214
                        }
215
                        setColorInterpretation(colorInterpretation);
216
                }
217
                return super.getColorInterpretation();
218
        }
219
        
220
        /**
221
         * Gets WCS parameters
222
         * @return
223
         */
224
        public WCSDataParameters getParameters() {
225
                return (WCSDataParameters)parameters;
226
        }
227
        
228
        /*
229
         * (non-Javadoc)
230
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#getAffineTransform()
231
         */
232
        public AffineTransform getAffineTransform() {
233
                Extent e = getExtent();
234
                double resolutionX = e.width() / getWidth();
235
                double resolutionY = e.height() / getHeight();
236
                ownTransformation = new AffineTransform(
237
                                resolutionX, 
238
                                0, 
239
                                0, 
240
                                -resolutionY, 
241
                                e.getULX() - (resolutionX / 2),
242
                                e.getULY() - (resolutionY / 2));
243
                externalTransformation = (AffineTransform) ownTransformation.clone();
244
                return ownTransformation;
245
        }
246
        
247
        /**
248
         * Calcula el extent en coordenadas del mundo real
249
         * @return Extent
250
         */
251
        public Extent getExtent() {
252
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
253
                try {
254
                        Rectangle2D r = getConnector().getFullExtent(p.getCoverageName(), p.getSRSCode());
255
                        return new ExtentImpl(r.getX(),  r.getY() + r.getHeight(), r.getX() + r.getWidth(), r.getY());
256
                } catch (RemoteServiceException e1) {
257
                        e1.printStackTrace();
258
                } catch (IOException e) {
259
                        e.printStackTrace();
260
                }
261
                return null;
262
        }
263

    
264
        
265
        /*
266
         * (non-Javadoc)
267
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLayerExtent(java.lang.String, java.lang.String)
268
         */
269
        public Rectangle2D getLayerExtent(String layerName, String srs) throws RemoteServiceException {
270
                return null;
271
        }
272

    
273
        /*
274
         * (non-Javadoc)
275
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
276
         */
277
        public RasterProvider load() {
278
                return this;
279
        }
280
        
281
        /*
282
         * (non-Javadoc)
283
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
284
         */
285
        public boolean isOpen() {
286
                return open;
287
        }
288

    
289
        /*
290
         * (non-Javadoc)
291
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
292
         */
293
        public void close() {
294
                open = false;
295
        }
296
        
297
        /*
298
         * (non-Javadoc)
299
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
300
         */
301
        public Transparency getTransparency() {
302
                if(fileTransparency == null)
303
                        fileTransparency = new DataStoreTransparency();
304
                return fileTransparency;
305
        }
306

    
307
        /*
308
         * (non-Javadoc)
309
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
310
         */
311
        public String translateFileName(String fileName) {
312
                return fileName;
313
        }
314

    
315
        /*
316
         * (non-Javadoc)
317
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
318
         */
319
        public void setView(Extent e) {
320
                viewRequest = e;
321
        }
322

    
323
        /*
324
         * (non-Javadoc)
325
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
326
         */
327
        public Extent getView() {
328
                return viewRequest;
329
        }
330
        
331
        /*
332
         * (non-Javadoc)
333
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
334
         */
335
        public double getWidth() {
336
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
337
                try {
338
                        return getConnector().getWidth(p.getCoverageName());
339
                } catch (RemoteServiceException e) {
340
                        e.printStackTrace();
341
                }
342
                return 0;
343
        }
344

    
345
        /*
346
         * (non-Javadoc)
347
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
348
         */
349
        public double getHeight() {
350
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
351
                try {
352
                        return getConnector().getHeight(p.getCoverageName());
353
                } catch (RemoteServiceException e) {
354
                        e.printStackTrace();
355
                }
356
                return 0;
357
        }
358

    
359
        /*
360
         * (non-Javadoc)
361
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
362
         */
363
        public Object readCompleteLine(int line, int band)
364
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
365
                return null;
366
        }
367
        
368
        /**
369
         * When the remote layer has fixed size this method downloads the file and return its reference. 
370
         * File layer has in the long side FIXED_SIZE pixels and the bounding box is complete. This file could be
371
         * useful to build an histogram or calculate statistics. This represents a sample of data.
372
         * @return
373
         * @throws RasterDriverException
374
         */
375
        public File getFileLayer() throws RasterDriverException {
376
                Extent e = getExtent();
377
                Rectangle2D bBox = new Rectangle2D.Double(e.getULX(), e.getLRY(), e.width(), e.height());
378
                WCSStatus wcsStatus = loadWCSStatus(bBox);
379
                
380
                return downloadFile(wcsStatus, e.getULX(), e.getULY(), e.getLRX(), e.getLRY(), 
381
                                (int)getWidth(), (int)getHeight());
382
        }
383

    
384
        /**
385
         * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
386
         * to read a file very fast without setting a view. In a WCS service when the size is fixed then it will read the
387
         * entire image but when the source hasn't pixel size it will read a sample of data. This set of data will have
388
         * the size defined in FIXED_SIZE. 
389
         * 
390
         * @param pos Posici?n donde se empieza  a leer
391
         * @param blockHeight Altura m?xima del bloque leido
392
         * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
393
         * @throws InvalidSetViewException
394
         * @throws FileNotOpenException
395
         * @throws RasterDriverException
396
         */
397
        public Object readBlock(int pos, int blockHeight, double scale) 
398
        throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
399
                File lastFile = getFileLayer();
400
                BandList bandList = new BandListImpl();
401
                for (int i = 0; i < 3; i++) {
402
                        try {
403
                                bandList.addBand(new DatasetBandImpl(lastFile.getPath(), pos, Buffer.TYPE_BYTE, 3), pos);
404
                        } catch (BandNotFoundInListException e1) {
405
                        }
406
                }
407
                bandList.setDrawableBands(new int[]{0, 1, 2});
408

    
409
                try {
410
                        lastRequestProvider = openLastRequest();
411
                        return lastRequestProvider.readBlock(pos, blockHeight, scale);
412
                } catch (ProviderNotRegisteredException exc) {
413
                        throw new RasterDriverException("Error building GdalDriver", exc);
414
                } catch (InitializeException exc) {
415
                        throw new RasterDriverException("Error building GdalDriver", exc);
416
                }
417
        }
418
        
419
        /*
420
         * (non-Javadoc)
421
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequestHeight()
422
         */
423
        public double getLastRequestHeight() throws RasterDriverException {
424
                if(lastRequestProvider == null) {
425
                        try {
426
                                lastRequestProvider = openLastRequest();
427
                        } catch (ProviderNotRegisteredException e) {
428
                                throw new RasterDriverException("Error building GdalDriver", e);
429
                        } catch (InitializeException e) {
430
                                throw new RasterDriverException("Error building GdalDriver", e);
431
                        }
432
                }
433
                return lastRequestProvider.getHeight();
434
        }
435
        
436
        /*
437
         * (non-Javadoc)
438
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequestWidth()
439
         */
440
        public double getLastRequestWidth() throws RasterDriverException {
441
                if(lastRequestProvider == null) {
442
                        try {
443
                                lastRequestProvider = openLastRequest();
444
                        } catch (ProviderNotRegisteredException e) {
445
                                throw new RasterDriverException("Error building GdalDriver", e);
446
                        } catch (InitializeException e) {
447
                                throw new RasterDriverException("Error building GdalDriver", e);
448
                        }
449
                }
450
                return lastRequestProvider.getWidth();
451
        }
452
        
453
        /*
454
         * (non-Javadoc)
455
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequest()
456
         */
457
        public File getLastRequest() {
458
                return lastRequest;
459
        }
460
        
461
        /*
462
         * (non-Javadoc)
463
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getBufferLastRequest()
464
         */
465
        public Buffer getBufferLastRequest() throws ProcessInterruptedException, RasterDriverException {
466
                try {
467
                        lastRequestProvider = openLastRequest();
468
                        
469
                        BandList bandList = new BandListImpl();
470
                        for (int i = 0; i < lastRequestProvider.getBandCount(); i++) {
471
                                try {
472
                                        bandList.addBand(new DatasetBandImpl(lastRequest.getPath(), i, Buffer.TYPE_BYTE, 3), i);
473
                                } catch (BandNotFoundInListException e1) {
474
                                }
475
                        }
476
                        bandList.setDrawableBands(new int[]{0, 1, 2});
477
                        Buffer newBuffer = DefaultRasterManager.getInstance().createBuffer(lastRequestProvider.getDataType()[0], (int)lastRequestProvider.getWidth(), (int)lastRequestProvider.getHeight(), lastRequestProvider.getBandCount(), true);
478
                        
479
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
480
                        q.setAreaOfInterest(lastRequestProvider.getExtent(), 
481
                                        (int)lastRequestProvider.getWidth(), 
482
                                        (int)lastRequestProvider.getHeight());
483
                        q.setBandList(bandList);
484
                        q.setBuffer(newBuffer);
485
                        q.setAdjustToExtent(true);
486
                        
487
                        return lastRequestProvider.getDataSet(q);
488
                } catch (ProviderNotRegisteredException e) {
489
                        throw new RasterDriverException("Error building GdalDriver", e);
490
                } catch (InitializeException e) {
491
                        throw new RasterDriverException("Error building GdalDriver", e);
492
                }
493
        }
494
        
495
        /**
496
         * Opens the last request downloaded
497
         * @return
498
         * @throws ProviderNotRegisteredException
499
         * @throws InitializeException
500
         * @throws RasterDriverException
501
         */
502
        private DefaultRasterProvider openLastRequest() throws ProviderNotRegisteredException, InitializeException, RasterDriverException {
503
                if(lastRequestProvider != null)
504
                        lastRequestProvider.close();
505
                File lastFile = getFileLayer();
506
                lastRequestProvider = DefaultProviderServices.loadProvider(new File(lastFile.getPath()));
507
                return lastRequestProvider;
508
        }
509

    
510

    
511
        /*
512
         * (non-Javadoc)
513
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
514
         */
515
        public Object getData(int x, int y, int band)
516
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
517
                return null;
518
        }
519
        
520
        /**
521
         * Gets the georeferencing file name form a raster file
522
         * @param file
523
         * a raster file
524
         * @return
525
         * a georeferencing file
526
         */
527
        private String getWorldFile(String file){                
528
                String worldFile = file;
529
                int index = file.lastIndexOf(".");
530
                if (index > 0) {                        
531
                        worldFile = file.substring(0, index) + getExtensionWorldFile();
532
                } else {
533
                        worldFile = file + getExtensionWorldFile();
534
                }
535
                return worldFile;
536
        }
537
        
538
        /**
539
         * Obtiene la extensi?n del fichero de georreferenciaci?n
540
         * @return String con la extensi?n del fichero de georreferenciaci?n dependiendo
541
         * del valor del formato obtenido del servidor. Por defecto asignaremos un .wld
542
         */
543
        private String getExtensionWorldFile() {
544
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
545
                String extWorldFile = ".wld";
546
                if(p.getFormat().equals("image/tif") || p.getFormat().equals("image/tiff")) {
547
                        extWorldFile = ".tfw";
548
                }
549
                return extWorldFile;
550
        }
551
        
552
        private WCSStatus loadWCSStatus(Rectangle2D bBox) {
553
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
554
                WCSStatus wcsStatus = new WCSStatus();
555
                wcsStatus.setCoveraName(p.getCoverageName());
556
                wcsStatus.setSrs(p.getSRSCode());
557
                wcsStatus.setFormat(p.getFormat());
558
                wcsStatus.setOnlineResource(p.getOnlineResource() != null ? (String) p.getOnlineResource().get("GetCoverage") : null);
559
                wcsStatus.setExtent(bBox);
560
                wcsStatus.setHeight(p.getHeight());
561
                wcsStatus.setWidth(p.getWidth());
562
                wcsStatus.setDepth(p.getDepth());
563
                wcsStatus.setParameters(p.getParameter());
564
                wcsStatus.setTime(p.getTime());
565
                return wcsStatus;
566
        }
567
        
568
        /*
569
         * (non-Javadoc)
570
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#needEnhanced()
571
         */
572
        public boolean needEnhanced() {
573
                return (getDataType()[0] != Buffer.TYPE_BYTE || 
574
                                (getBandCount() == 1 && getDataType()[0] == Buffer.TYPE_BYTE));
575
        }
576
        
577
        /**
578
         * This function downloads the file and creates the georeferencing file
579
         * @param wcsStatus
580
         * @param ulx
581
         * @param uly
582
         * @param lrx
583
         * @param lry
584
         * @param w
585
         * @param h
586
         * @return
587
         * @throws RasterDriverException
588
         */
589
        private File downloadFile(WCSStatus wcsStatus, double ulx, double uly, double lrx, double lry, int w, int h) throws RasterDriverException {
590
                try {
591
                        lastRequest = getConnector().getCoverage(wcsStatus, ((WCSDataParametersImpl)parameters).getCancellable());
592
                } catch (RemoteServiceException e) {
593
                        throw new RasterDriverException(e.getMessage(), e);
594
                }
595
                
596
                String nameWorldFile = getWorldFile(lastRequest.getPath());
597
                try {
598
                        fileUtil.createWorldFile(nameWorldFile, new ExtentImpl(ulx, uly, lrx, lry), w, h);
599
                } catch (IOException e) {
600
                        throw new RasterDriverException("Error downloading file", e);
601
                }
602

    
603
                return lastRequest;
604
        }
605
        
606
        /**
607
         * Assigns the list of bands RGB and read a window of data
608
         * @param rasterBuf
609
         * @param bandList
610
         * @param lastFile
611
         * @param ulx
612
         * @param uly
613
         * @param lrx
614
         * @param lry
615
         * @return
616
         * @throws RasterDriverException
617
         * @throws ProcessInterruptedException
618
         */
619
        public Buffer getBuffer(Buffer rasterBuf, BandList bandList, File lastFile, 
620
                        double ulx, double uly, double lrx, double lry) throws RasterDriverException, ProcessInterruptedException {
621
                try {
622
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
623
                        String serverName = bandList.getBand(0).getFileName();
624
                        for (int i = 0; i < bandList.getBandCount(); i++) {
625
                                bandList.getBand(i).setFileName(lastFile.getPath());
626
                        }
627
                        
628
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastFile.getPath()));
629
                        
630
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
631
                        q.setAreaOfInterest(new ExtentImpl(ulx, uly, lrx, lry));
632
                        q.setBandList(bandList);
633
                        q.setBuffer(rasterBuf);
634
                        
635
                        Buffer buf = driver.getDataSet(q);
636
                        
637
                        for (int i = 0; i < bandList.getBandCount(); i++) {
638
                                bandList.getBand(i).setFileName(serverName);
639
                        }
640
                        
641
                        return buf;
642
                } catch (ProviderNotRegisteredException e) {
643
                        throw new RasterDriverException("Error building GdalDriver", e);
644
                } catch (InitializeException e) {
645
                        throw new RasterDriverException("Error building GdalDriver", e);
646
                }
647
        }
648
        
649
        /*
650
         * (non-Javadoc)
651
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener)
652
         */
653
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
654
                        BandList bandList, TileListener listener, Cancellable status) throws ProcessInterruptedException, RasterDriverException {
655

    
656
                Buffer raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, 3, true);
657
                getWindow(ex, bufWidth, bufHeight, bandList, raster, true, null);
658
                raster.setDataExtent(ex.toRectangle2D());
659

    
660
                TileCacheManager m = TileCacheLocator.getManager();
661
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
662
                t.setData(new Object[]{raster});
663
                t.setUl(new Point2D.Double(ex.getULX(), ex.getULY()));
664
                t.setLr(new Point2D.Double(ex.getLRX(), ex.getLRY()));
665
                t.setDownloaderParams("AffineTransform", getAffineTransform());
666
                t.setDownloaderParams("Tiling", new Boolean(false));
667
                try {
668
                        listener.tileReady(t);
669
                } catch (TileGettingException e) {
670
                        throw new RasterDriverException("Error throwing a tile", e);
671
                }
672

    
673
                //listener.nextBuffer(raster, null, new ExtentImpl(minX, minY, maxX, maxY), getAffineTransform(), null, false);
674
                listener.endReading();
675

    
676
        }
677

    
678
        /*
679
         * (non-Javadoc)
680
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
681
         */
682
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
683
                throws ProcessInterruptedException, RasterDriverException {
684
                Rectangle2D bBox = ex.toRectangle2D();
685
                WCSStatus wcsStatus = loadWCSStatus(bBox);
686
                
687
                lastRequest = downloadFile(wcsStatus, ex.getULX(), ex.getULY(), ex.getLRX(), ex.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
688
                
689
                if (lastRequest == null) {
690
                        return rasterBuf;
691
                }
692
                
693
                try {
694
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
695
                        /*bandCount = driver.getBandCount();
696
                        setDataType(driver.getDataType());
697
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf, bandList);*/
698
                        
699
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
700
                        String serverName = bandList.getBand(0).getFileName();
701
                        for (int i = 0; i < bandList.getBandCount(); i++) {
702
                                bandList.getBand(i).setFileName(lastRequest.getPath());
703
                        }
704
                        
705
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
706
                        q.setAreaOfInterest(ex);
707
                        q.setBandList(bandList);
708
                        q.setBuffer(rasterBuf);
709
                        Buffer buf = driver.getDataSet(q);
710
                        
711
                        for (int i = 0; i < bandList.getBandCount(); i++) {
712
                                bandList.getBand(i).setFileName(serverName);
713
                        }
714
                        driver.close();
715
                        return buf;
716
                } catch (ProviderNotRegisteredException e) {
717
                        throw new RasterDriverException("Error building GdalDriver", e);
718
                } catch (InitializeException e) {
719
                        throw new RasterDriverException("Error building GdalDriver", e);
720
                }
721
        }
722

    
723
        /*
724
         * (non-Javadoc)
725
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
726
         */
727
        public Buffer getWindow(double ulx, double uly, double w, double h, 
728
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
729
                Rectangle2D bBox = new Rectangle2D.Double(ulx, uly, w, h);
730
                WCSStatus wcsStatus = loadWCSStatus(bBox);
731
                
732
                lastRequest = downloadFile(wcsStatus, ulx, uly, ulx + w, uly - h, rasterBuf.getWidth(), rasterBuf.getHeight());
733
                
734
                if (lastRequest == null) {
735
                        return rasterBuf;
736
                }
737
                
738
                try {
739
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
740
                        /*bandCount = driver.getBandCount();
741
                        setDataType(driver.getDataType());
742
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf, bandList);*/
743
                        
744
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
745
                        String serverName = bandList.getBand(0).getFileName();
746
                        for (int i = 0; i < bandList.getBandCount(); i++) {
747
                                bandList.getBand(i).setFileName(lastRequest.getPath());
748
                        }
749
                        
750
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
751
                        q.setAreaOfInterest(ulx, uly, w, h);
752
                        q.setBandList(bandList);
753
                        q.setBuffer(rasterBuf);
754
                        q.setAdjustToExtent(adjustToExtent);
755
                        
756
                        Buffer buf = driver.getDataSet(q);
757
                        
758
                        for (int i = 0; i < bandList.getBandCount(); i++) {
759
                                bandList.getBand(i).setFileName(serverName);
760
                        }
761
                        driver.close();
762
                        return buf;
763
                } catch (ProviderNotRegisteredException e) {
764
                        throw new RasterDriverException("Error building GdalDriver", e);
765
                } catch (InitializeException e) {
766
                        throw new RasterDriverException("Error building GdalDriver", e);
767
                }
768
        }
769

    
770
        /*
771
         * (non-Javadoc)
772
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
773
         */
774
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
775
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
776
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
777
                Rectangle2D bBox = null;
778
                p.setWidth(bufWidth);
779
                p.setHeight(bufHeight);
780
                
781
                /*if(p.getExtent() != null) {
782
                        bBox = p.getExtent();
783
                        extent = new ExtentImpl(p.getExtent());
784
                } else {*/
785
                        bBox = extent.toRectangle2D();
786
                //}
787
                
788
                //extent.toRectangle2D();//new Rectangle2D.Double(ulx, lry, Math.abs(lrx - ulx), Math.abs(lry - uly));
789
                WCSStatus wcsStatus = loadWCSStatus(bBox);
790
                lastRequest = downloadFile(wcsStatus, extent.getULX(), extent.getULY(), extent.getLRX(), extent.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
791
                
792
                if (lastRequest == null) {
793
                        return rasterBuf;
794
                }
795
                
796
                try {
797
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
798
                        /*bandCount = driver.getBandCount();
799
                        setDataType(driver.getDataType());
800
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf, bandList);*/
801
                        
802
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
803
                        String serverName = bandList.getBand(0).getFileName();
804
                        for (int i = 0; i < bandList.getBandCount(); i++) {
805
                                bandList.getBand(i).setFileName(lastRequest.getPath());
806
                        }
807
                        
808
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
809
                        q.setAreaOfInterest(extent, bufWidth, bufHeight);
810
                        q.setBandList(bandList);
811
                        q.setBuffer(rasterBuf);
812
                        q.setAdjustToExtent(adjustToExtent);
813
                        
814
                        Buffer buf = driver.getDataSet(q);
815

    
816
                        for (int i = 0; i < bandList.getBandCount(); i++) {
817
                                bandList.getBand(i).setFileName(serverName);
818
                        }
819
                        driver.close();
820
                        return buf;
821
                } catch (ProviderNotRegisteredException e) {
822
                        throw new RasterDriverException("Error building GdalDriver", e);
823
                } catch (InitializeException e) {
824
                        throw new RasterDriverException("Error building GdalDriver", e);
825
                }
826
        }
827

    
828
        /*
829
         * (non-Javadoc)
830
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
831
         */
832
//        public Buffer getWindow(int x, int y, 
833
//                        BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
834
//                int w = rasterBuf.getWidth();
835
//                int h = rasterBuf.getHeight();
836
//                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
837
//                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
838
//                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
839
//                WCSStatus wcsStatus = loadWCSStatus(bBox);
840
//                
841
//                lastRequest = downloadFile(wcsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
842
//                
843
//                if (lastRequest == null) {
844
//                        return rasterBuf;
845
//                }
846
//
847
//                DefaultRasterProvider driver = null;
848
//                try {
849
//                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
850
//                        /*bandCount = driver.getBandCount();
851
//                        setDataType(driver.getDataType());
852
//                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf,bandList);*/
853
//                        
854
//                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
855
//                        String serverName = bandList.getBand(0).getFileName();
856
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
857
//                                bandList.getBand(i).setFileName(lastRequest.getPath());
858
//                        }
859
//                        
860
//                        Buffer buf = driver.getWindow(0, 0, w, h, rasterBuf.getWidth(), rasterBuf.getHeight(), bandList, rasterBuf);
861
//
862
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
863
//                                bandList.getBand(i).setFileName(serverName);
864
//                        }
865
//                        driver.close();
866
//                        return buf;
867
//                } catch (ProviderNotRegisteredException e) {
868
//                        throw new RasterDriverException("Error building GdalDriver", e);
869
//                } catch (InitializeException e) {
870
//                        throw new RasterDriverException("Error building GdalDriver", e);
871
//                }
872
//        }
873
        
874
        /**
875
         * When a WCS provider is opened the information of data type and number of bands is not
876
         * available. Only after the first time a raster has been downloaded it can be know.
877
         * @param newDataType
878
         * @param buf
879
         * @param bandList
880
         * @return
881
         * @throws RasterDriverException 
882
         */
883
        private void loadInitialInfo() throws RasterDriverException {
884
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
885
                Extent ext = getExtent();
886
                Rectangle2D bBox = ext.toRectangle2D();
887
                int w = 0;
888
                int h = 0;
889
                if(ext.width() > ext.height()) {
890
                        w = 200;
891
                        h = (int)((ext.height() * w) / ext.width());
892
                } else {
893
                        h = 200;
894
                        w = (int)((ext.width() * h) / ext.height());
895
                }
896
                p.setWidth(w);
897
                p.setHeight(h);
898
                p.setExtent(bBox);
899
                WCSStatus wcsStatus = loadWCSStatus(bBox);
900
                
901
                lastRequest = downloadFile(wcsStatus, ext.getULX(), ext.getULY(), ext.getLRX(), ext.getLRY(), w, h);
902
                DefaultRasterProvider driver;
903
                try {
904
                        driver = DefaultProviderServices.loadProvider(lastRequest);
905
                        setDataType(driver.getDataType());
906
                        bandCount = driver.getBandCount();
907
                        driver.close();
908
                } catch (ProviderNotRegisteredException e) {
909
                        throw new RasterDriverException("", e);
910
                } catch (InitializeException e) {
911
                        throw new RasterDriverException("", e);
912
                }
913
        }
914
        
915
        /**
916
         * When a WCS provider is opened the information of data type and number of bands is not
917
         * available. Only after the first time a raster has been downloaded it can be know.
918
         * @param newDataType
919
         * @param buf
920
         * @param bandList
921
         * @return
922
         */
923
        /*private Buffer changeBufferDataType(int newDataType, Buffer buf, BandList bandList) {
924
                Buffer newBuffer = null;
925
                if(buf.getDataType() != newDataType) {
926
                        newBuffer = DefaultRasterManager.getInstance().createReadOnlyBuffer(newDataType, buf.getWidth(), buf.getHeight(), buf.getBandCount()); 
927
                        buf.free();
928
                } else 
929
                        return buf;
930
                
931
                bandList.clear();
932
                for(int i = 0; i < getBandCount(); i++)
933
                        try {
934
                                int dataType = getDataType()[i];
935
                                DatasetBand band = new DatasetBandImpl(getFName(), i, dataType, getBandCount());
936
                                bandList.addBand(band, i);
937
                        } catch(BandNotFoundInListException ex) {
938
                                //No a?adimos la banda
939
                        }
940
                return newBuffer;
941
        }*/
942

    
943
        /*
944
         * (non-Javadoc)
945
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
946
         */
947
        public Buffer getWindow(int x, int y, int w, int h, 
948
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
949
                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
950
                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
951
                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
952
                WCSStatus wcsStatus = loadWCSStatus(bBox);
953
                
954
                lastRequest = downloadFile(wcsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
955
                
956
                if (lastRequest == null) {
957
                        return rasterBuf;
958
                }
959

    
960
                DefaultRasterProvider driver = null;
961
                try {
962
                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
963
                        /*bandCount = driver.getBandCount();
964
                        setDataType(driver.getDataType());
965
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf,bandList);*/
966
                        
967
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
968
                        String serverName = bandList.getBand(0).getFileName();
969
                        for (int i = 0; i < bandList.getBandCount(); i++) {
970
                                bandList.getBand(i).setFileName(lastRequest.getPath());
971
                        }
972
                        
973
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
974
                        q.setAreaOfInterest(0, 0, w, h);
975
                        q.setBandList(bandList);
976
                        q.setBuffer(rasterBuf);
977
                        Buffer buf = driver.getDataSet(q);
978

    
979
                        for (int i = 0; i < bandList.getBandCount(); i++) {
980
                                bandList.getBand(i).setFileName(serverName);
981
                        }
982
                        driver.close();
983
                        return buf;
984
                } catch (ProviderNotRegisteredException e) {
985
                        throw new RasterDriverException("Error building GdalDriver", e);
986
                } catch (InitializeException e) {
987
                        throw new RasterDriverException("Error building GdalDriver", e);
988
                }
989
        }
990

    
991
        /*
992
         * (non-Javadoc)
993
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
994
         */
995
        public int getBlockSize() {
996
                return 0;
997
        }
998

    
999
        /*
1000
         * (non-Javadoc)
1001
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
1002
         */
1003
        public void setAffineTransform(AffineTransform t){
1004
                
1005
        }
1006

    
1007
        /*
1008
         * (non-Javadoc)
1009
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
1010
         */
1011
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
1012
                return 0;
1013
        }
1014

    
1015
        /*
1016
         * (non-Javadoc)
1017
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
1018
         */
1019
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
1020
                return 0;
1021
        }
1022

    
1023
        /*
1024
         * (non-Javadoc)
1025
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
1026
         */
1027
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1028
                return 0;
1029
        }
1030

    
1031
        /*
1032
         * (non-Javadoc)
1033
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
1034
         */
1035
        public boolean isOverviewsSupported() {
1036
                return false;
1037
        }
1038

    
1039
        /*
1040
         * (non-Javadoc)
1041
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
1042
         */
1043
        public boolean isReproyectable() {
1044
                return false;
1045
        }
1046

    
1047
        /*
1048
         * (non-Javadoc)
1049
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
1050
         */
1051
        public String getName() {
1052
                return NAME;
1053
        }
1054
        
1055
        /**
1056
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
1057
         * @param pt Punto a transformar
1058
         * @return punto transformado en coordenadas del mundo
1059
         */
1060
        public Point2D rasterToWorld(Point2D pt) {
1061
                Point2D p = new Point2D.Double();
1062
                getAffineTransform().transform(pt, p);
1063
                return p;
1064
        }
1065

    
1066
        /**
1067
         * Convierte un punto desde del mundo a coordenadas pixel.
1068
         * @param pt Punto a transformar
1069
         * @return punto transformado en coordenadas pixel
1070
         */
1071
        public Point2D worldToRaster(Point2D pt) {
1072
                Point2D p = new Point2D.Double();
1073
                try {
1074
                        getAffineTransform().inverseTransform(pt, p);
1075
                } catch (NoninvertibleTransformException e) {
1076
                        return pt;
1077
                }
1078
                return p;
1079
        }
1080
        
1081
        /*
1082
         * (non-Javadoc)
1083
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
1084
         */
1085
        public void setStatus(RasterProvider provider) {
1086
                if(provider instanceof WCSProvider) {
1087
                }
1088
        }
1089
        
1090
        
1091
        /**
1092
         * ASigna el par?metro de inicializaci?n del driver.
1093
         */
1094
        public void setParam(DataStoreProviderServices storeServices, DataStoreParameters param) {
1095
                if(param instanceof WCSDataParametersImpl)
1096
                        this.uri = ((WCSDataParametersImpl)param).getURI();
1097
                this.param = param;
1098
        }
1099
        
1100
        /**
1101
         * 
1102
         * @param i
1103
         * @param j
1104
         * @param max_value
1105
         * @param cancellable
1106
         * @return
1107
         * @throws RemoteServiceException
1108
         */
1109
    public String getFeatureInfo(int i, int j, int max_value, ICancellable cancellable) throws RemoteServiceException {
1110
            /*WCSStatus wcsStatus = loadWCSStatus(lastExtent);
1111
            return getConnector().getFeatureInfo(wcsStatus, i, j, max_value, cancellable);*/
1112
            return null;
1113
    }
1114
    
1115
    /*
1116
         * (non-Javadoc)
1117
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInfoByPoint(double, double)
1118
         */
1119
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
1120
                return getFeatureInfo((int) x, (int) y, Integer.MAX_VALUE, cancellable);
1121
        }
1122
        
1123
        /**
1124
         * Gets the suffix of the downloaded image
1125
         * @return
1126
         */
1127
        public String getFileSuffix() {
1128
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
1129
                String format = p.getFormat().toLowerCase();
1130
                if (format == null) {
1131
                        return "xml";
1132
                }
1133
                if (format.indexOf("png") >= 0){
1134
                return "png";
1135
                }        
1136
            if (format.indexOf("xml") >= 0){
1137
                return "xml";
1138
            }        
1139
            if (format.indexOf("gif") >= 0){
1140
                return "gif";
1141
            }
1142
            if (format.indexOf("tif") >= 0){
1143
                return "tif";
1144
            }
1145
            if (format.indexOf("bmp") >= 0){
1146
                return "bmp";
1147
            }
1148
            if (format.indexOf("jpg") >= 0
1149
                || format.indexOf("jpeg") >= 0){
1150
                return "jpg";                         
1151
            }
1152
                return "xml";
1153
        }
1154
        
1155
        /*
1156
         * (non-Javadoc)
1157
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
1158
         */
1159
        public TileServer getTileServer() {
1160
                if(tileServer == null) {
1161
                        tileServer = new WCSTileServer(this);
1162
                }
1163
                return tileServer;
1164
        }
1165
        
1166
        /*
1167
         * (non-Javadoc)
1168
         * @see org.gvsig.raster.impl.provider.RasterProvider#isRasterEnclosed()
1169
         */
1170
        public boolean isRasterEnclosed() {
1171
                return true;
1172
        }
1173
        
1174
        /*
1175
         * (non-Javadoc)
1176
         * @see org.gvsig.raster.impl.provider.RasterProvider#getRMFFile()
1177
         */
1178
        public String getRMFFile() {
1179
                if(lastRequest != null)
1180
                        return fileUtil.getNameWithoutExtension(lastRequest.getAbsolutePath()) + ".rmf";
1181
                return null;
1182
        }
1183
        
1184
        /*
1185
         * (non-Javadoc)
1186
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#getHistogramComputer()
1187
         */
1188
        public HistogramComputer getHistogramComputer() {
1189
                if (histogram == null)
1190
                        histogram = new RemoteStoreHistogram(this);
1191
                return histogram;
1192
        }
1193
}