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 @ 1355

History | View | Annotate | Download (40.1 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.TaskStatus;
80
/**
81
 * Clase que representa al driver de acceso a datos de wcs.
82
 *
83
 * @author Nacho Brodin (nachobrodin@gmail.com)
84
 */
85
public class WCSProvider extends DefaultRasterProvider implements RemoteRasterProvider {
86
        public static String                NAME                     = "Wcs Store";
87
        public static String                DESCRIPTION              = "Wcs Raster file";
88
        public static final String          METADATA_DEFINITION_NAME = "WcsStore";
89
        
90
        private Extent                      viewRequest              = null;
91
        private static Hashtable<URL, WCSConnector>    
92
                                            drivers                  = new Hashtable<URL, WCSConnector> ();
93
        private boolean                     open                     = false;
94
        private DataStoreTransparency       fileTransparency         = null;
95
        private File                        lastRequest              = null;
96
        private DefaultRasterProvider       lastRequestProvider      = null; 
97
        
98
        public static void register() {
99
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
100
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
101
                        dataman.registerStoreProvider(NAME,
102
                                        WCSProvider.class, WCSDataParametersImpl.class);
103
                }
104

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

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

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

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

    
303
        /*
304
         * (non-Javadoc)
305
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
306
         */
307
        public String translateFileName(String fileName) {
308
                return fileName;
309
        }
310

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

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

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

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

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

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

    
506

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

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

    
652
                Buffer raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, 3, true);
653
                getWindow(ex, bufWidth, bufHeight, bandList, raster, true, null);
654
                raster.setDataExtent(ex.toRectangle2D());
655

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

    
669
                //listener.nextBuffer(raster, null, new ExtentImpl(minX, minY, maxX, maxY), getAffineTransform(), null, false);
670
                listener.endReading();
671

    
672
        }
673

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

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

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

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

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

    
939
        /*
940
         * (non-Javadoc)
941
         * @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)
942
         */
943
        public Buffer getWindow(int x, int y, int w, int h, 
944
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
945
                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
946
                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
947
                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
948
                WCSStatus wcsStatus = loadWCSStatus(bBox);
949
                
950
                lastRequest = downloadFile(wcsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
951
                
952
                if (lastRequest == null) {
953
                        return rasterBuf;
954
                }
955

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

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

    
987
        /*
988
         * (non-Javadoc)
989
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
990
         */
991
        public int getBlockSize() {
992
                return 0;
993
        }
994

    
995
        /*
996
         * (non-Javadoc)
997
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
998
         */
999
        public void setAffineTransform(AffineTransform t){
1000
                
1001
        }
1002

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

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

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

    
1027
        /*
1028
         * (non-Javadoc)
1029
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
1030
         */
1031
        public boolean isOverviewsSupported() {
1032
                return false;
1033
        }
1034

    
1035
        /*
1036
         * (non-Javadoc)
1037
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
1038
         */
1039
        public boolean isReproyectable() {
1040
                return false;
1041
        }
1042

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

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