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

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

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

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

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

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

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

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

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

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

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

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

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

    
507

    
508
        /*
509
         * (non-Javadoc)
510
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
511
         */
512
        public Object getData(int x, int y, int band)
513
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
514
                int w = 25;
515
                int h = 25;
516
                
517
                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
518
                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
519
                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p2.getX()), Math.abs(p1.getY() - p2.getY()));
520
                
521
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
522
                WCSStatus wcsStatus = new WCSStatus();
523
                wcsStatus.setCoveraName(p.getCoverageName());
524
                wcsStatus.setSrs(p.getSRSCode());
525
                wcsStatus.setFormat(p.getFormat());
526
                wcsStatus.setOnlineResource(p.getOnlineResource() != null ? (String) p.getOnlineResource().get("GetCoverage") : null);
527
                wcsStatus.setExtent(bBox);
528
                wcsStatus.setHeight(h);
529
                wcsStatus.setWidth(w);
530
                wcsStatus.setDepth(p.getDepth());
531
                wcsStatus.setParameters(p.getParameter());
532
                wcsStatus.setTime(p.getTime());
533
                
534
                lastRequest = downloadFile(wcsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), w, h);
535
                
536
                DefaultRasterProvider driver = null;
537
                try {
538
                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
539
                        Buffer buf = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], w, h, getBandCount(), true);
540
                        BandList bandList = new BandListImpl();
541
                        int[] drawable = new int[getBandCount()];
542
                        for (int i = 0; i < getBandCount(); i++) {
543
                                try {
544
                                        bandList.addBand(new DatasetBandImpl(lastRequest.getPath(), i, getDataType()[i], getBandCount()), i);
545
                                        drawable[i] = i;
546
                                } catch (BandNotFoundInListException e1) {
547
                                }
548
                        }
549
                        bandList.setDrawableBands(drawable);
550
                        
551
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
552
                        q.setAreaOfInterest(0, 0, 25, 25);
553
                        q.setBandList(bandList);
554
                        q.setBuffer(buf);
555
                        buf = driver.getDataSet(q);
556
                        driver.close();
557
                        if(buf.getDataType() == Buffer.TYPE_BYTE) {
558
                                return new Integer(buf.getElemByte(0, 0, band));
559
                        }
560
                        if(buf.getDataType() == Buffer.TYPE_SHORT) {
561
                                return new Integer(buf.getElemShort(0, 0, band));
562
                        }
563
                        if(buf.getDataType() == Buffer.TYPE_INT) {
564
                                return new Integer(buf.getElemInt(0, 0, band));
565
                        }
566
                        if(buf.getDataType() == Buffer.TYPE_FLOAT) {
567
                                return new Float(buf.getElemFloat(0, 0, band));
568
                        }
569
                        if(buf.getDataType() == Buffer.TYPE_DOUBLE) {
570
                                return new Double(buf.getElemDouble(0, 0, band));
571
                        }
572
                } catch(InitializeException e) {
573
                        throw new RasterDriverException("", e);
574
                } catch (ProviderNotRegisteredException e) {
575
                        throw new RasterDriverException("", e);
576
                } catch (ProcessInterruptedException e) {
577
                }
578
                return null;
579
        }
580
        
581
        /**
582
         * Gets the georeferencing file name form a raster file
583
         * @param file
584
         * a raster file
585
         * @return
586
         * a georeferencing file
587
         */
588
        private String getWorldFile(String file){                
589
                String worldFile = file;
590
                int index = file.lastIndexOf(".");
591
                if (index > 0) {                        
592
                        worldFile = file.substring(0, index) + getExtensionWorldFile();
593
                } else {
594
                        worldFile = file + getExtensionWorldFile();
595
                }
596
                return worldFile;
597
        }
598
        
599
        /**
600
         * Obtiene la extensi?n del fichero de georreferenciaci?n
601
         * @return String con la extensi?n del fichero de georreferenciaci?n dependiendo
602
         * del valor del formato obtenido del servidor. Por defecto asignaremos un .wld
603
         */
604
        private String getExtensionWorldFile() {
605
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
606
                String extWorldFile = ".wld";
607
                if(p.getFormat().equals("image/tif") || p.getFormat().equals("image/tiff")) {
608
                        extWorldFile = ".tfw";
609
                }
610
                return extWorldFile;
611
        }
612
        
613
        private WCSStatus loadWCSStatus(Rectangle2D bBox) {
614
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
615
                WCSStatus wcsStatus = new WCSStatus();
616
                wcsStatus.setCoveraName(p.getCoverageName());
617
                wcsStatus.setSrs(p.getSRSCode());
618
                wcsStatus.setFormat(p.getFormat());
619
                wcsStatus.setOnlineResource(p.getOnlineResource() != null ? (String) p.getOnlineResource().get("GetCoverage") : null);
620
                wcsStatus.setExtent(bBox);
621
                wcsStatus.setHeight(p.getHeight());
622
                wcsStatus.setWidth(p.getWidth());
623
                wcsStatus.setDepth(p.getDepth());
624
                wcsStatus.setParameters(p.getParameter());
625
                wcsStatus.setTime(p.getTime());
626
                return wcsStatus;
627
        }
628
        
629
        /*
630
         * (non-Javadoc)
631
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#needEnhanced()
632
         */
633
        public boolean needEnhanced() {
634
                return (getDataType()[0] != Buffer.TYPE_BYTE || 
635
                                (getBandCount() == 1 && getDataType()[0] == Buffer.TYPE_BYTE));
636
        }
637
        
638
        /**
639
         * This function downloads the file and creates the georeferencing file
640
         * @param wcsStatus
641
         * @param ulx
642
         * @param uly
643
         * @param lrx
644
         * @param lry
645
         * @param w
646
         * @param h
647
         * @return
648
         * @throws RasterDriverException
649
         */
650
        private File downloadFile(WCSStatus wcsStatus, double ulx, double uly, double lrx, double lry, int w, int h) throws RasterDriverException {
651
                try {
652
                        lastRequest = getConnector().getCoverage(wcsStatus, ((WCSDataParametersImpl)parameters).getCancellable());
653
                } catch (RemoteServiceException e) {
654
                        throw new RasterDriverException(e.getMessage(), e);
655
                }
656
                
657
                String nameWorldFile = getWorldFile(lastRequest.getPath());
658
                try {
659
                        fileUtil.createWorldFile(nameWorldFile, new ExtentImpl(ulx, uly, lrx, lry), w, h);
660
                } catch (IOException e) {
661
                        throw new RasterDriverException("Error downloading file", e);
662
                }
663

    
664
                return lastRequest;
665
        }
666
        
667
        /**
668
         * Assigns the list of bands RGB and read a window of data
669
         * @param rasterBuf
670
         * @param bandList
671
         * @param lastFile
672
         * @param ulx
673
         * @param uly
674
         * @param lrx
675
         * @param lry
676
         * @return
677
         * @throws RasterDriverException
678
         * @throws ProcessInterruptedException
679
         */
680
        public Buffer getBuffer(Buffer rasterBuf, BandList bandList, File lastFile, 
681
                        double ulx, double uly, double lrx, double lry) throws RasterDriverException, ProcessInterruptedException {
682
                try {
683
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
684
                        String serverName = bandList.getBand(0).getFileName();
685
                        for (int i = 0; i < bandList.getBandCount(); i++) {
686
                                bandList.getBand(i).setFileName(lastFile.getPath());
687
                        }
688
                        
689
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastFile.getPath()));
690
                        
691
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
692
                        q.setAreaOfInterest(new ExtentImpl(ulx, uly, lrx, lry));
693
                        q.setBandList(bandList);
694
                        q.setBuffer(rasterBuf);
695
                        
696
                        Buffer buf = driver.getDataSet(q);
697
                        
698
                        for (int i = 0; i < bandList.getBandCount(); i++) {
699
                                bandList.getBand(i).setFileName(serverName);
700
                        }
701
                        
702
                        return buf;
703
                } catch (ProviderNotRegisteredException e) {
704
                        throw new RasterDriverException("Error building GdalDriver", e);
705
                } catch (InitializeException e) {
706
                        throw new RasterDriverException("Error building GdalDriver", e);
707
                }
708
        }
709
        
710
        /*
711
         * (non-Javadoc)
712
         * @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)
713
         */
714
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
715
                        BandList bandList, TileListener listener, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
716

    
717
                Buffer raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, 3, true);
718
                getWindow(ex, bufWidth, bufHeight, bandList, raster, true, null);
719
                raster.setDataExtent(ex.toRectangle2D());
720

    
721
                TileCacheManager m = TileCacheLocator.getManager();
722
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
723
                t.setData(new Object[]{raster});
724
                t.setUl(new Point2D.Double(ex.getULX(), ex.getULY()));
725
                t.setLr(new Point2D.Double(ex.getLRX(), ex.getLRY()));
726
                t.setDownloaderParams("AffineTransform", getAffineTransform());
727
                t.setDownloaderParams("Tiling", new Boolean(false));
728
                try {
729
                        listener.tileReady(t);
730
                } catch (TileGettingException e) {
731
                        throw new RasterDriverException("Error throwing a tile", e);
732
                }
733

    
734
                //listener.nextBuffer(raster, null, new ExtentImpl(minX, minY, maxX, maxY), getAffineTransform(), null, false);
735
                listener.endReading();
736

    
737
        }
738

    
739
        /*
740
         * (non-Javadoc)
741
         * @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)
742
         */
743
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
744
                throws ProcessInterruptedException, RasterDriverException {
745
                Rectangle2D bBox = ex.toRectangle2D();
746
                WCSStatus wcsStatus = loadWCSStatus(bBox);
747
                
748
                lastRequest = downloadFile(wcsStatus, ex.getULX(), ex.getULY(), ex.getLRX(), ex.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
749
                
750
                if (lastRequest == null) {
751
                        return rasterBuf;
752
                }
753
                
754
                try {
755
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
756
                        /*bandCount = driver.getBandCount();
757
                        setDataType(driver.getDataType());
758
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf, bandList);*/
759
                        
760
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
761
                        String serverName = bandList.getBand(0).getFileName();
762
                        for (int i = 0; i < bandList.getBandCount(); i++) {
763
                                bandList.getBand(i).setFileName(lastRequest.getPath());
764
                        }
765
                        
766
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
767
                        q.setAreaOfInterest(ex);
768
                        q.setBandList(bandList);
769
                        q.setBuffer(rasterBuf);
770
                        Buffer buf = driver.getDataSet(q);
771
                        
772
                        for (int i = 0; i < bandList.getBandCount(); i++) {
773
                                bandList.getBand(i).setFileName(serverName);
774
                        }
775
                        driver.close();
776
                        return buf;
777
                } catch (ProviderNotRegisteredException e) {
778
                        throw new RasterDriverException("Error building GdalDriver", e);
779
                } catch (InitializeException e) {
780
                        throw new RasterDriverException("Error building GdalDriver", e);
781
                }
782
        }
783

    
784
        /*
785
         * (non-Javadoc)
786
         * @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)
787
         */
788
        public Buffer getWindow(double ulx, double uly, double w, double h, 
789
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
790
                Rectangle2D bBox = new Rectangle2D.Double(ulx, uly, w, h);
791
                WCSStatus wcsStatus = loadWCSStatus(bBox);
792
                
793
                lastRequest = downloadFile(wcsStatus, ulx, uly, ulx + w, uly - h, rasterBuf.getWidth(), rasterBuf.getHeight());
794
                
795
                if (lastRequest == null) {
796
                        return rasterBuf;
797
                }
798
                
799
                try {
800
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
801
                        /*bandCount = driver.getBandCount();
802
                        setDataType(driver.getDataType());
803
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf, bandList);*/
804
                        
805
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
806
                        String serverName = bandList.getBand(0).getFileName();
807
                        for (int i = 0; i < bandList.getBandCount(); i++) {
808
                                bandList.getBand(i).setFileName(lastRequest.getPath());
809
                        }
810
                        
811
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
812
                        q.setAreaOfInterest(ulx, uly, w, h);
813
                        q.setBandList(bandList);
814
                        q.setBuffer(rasterBuf);
815
                        q.setAdjustToExtent(adjustToExtent);
816
                        
817
                        Buffer buf = driver.getDataSet(q);
818
                        
819
                        for (int i = 0; i < bandList.getBandCount(); i++) {
820
                                bandList.getBand(i).setFileName(serverName);
821
                        }
822
                        driver.close();
823
                        return buf;
824
                } catch (ProviderNotRegisteredException e) {
825
                        throw new RasterDriverException("Error building GdalDriver", e);
826
                } catch (InitializeException e) {
827
                        throw new RasterDriverException("Error building GdalDriver", e);
828
                }
829
        }
830

    
831
        /*
832
         * (non-Javadoc)
833
         * @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)
834
         */
835
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
836
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
837
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
838
                Rectangle2D bBox = null;
839
                p.setWidth(bufWidth);
840
                p.setHeight(bufHeight);
841
                
842
                /*if(p.getExtent() != null) {
843
                        bBox = p.getExtent();
844
                        extent = new ExtentImpl(p.getExtent());
845
                } else {*/
846
                        bBox = extent.toRectangle2D();
847
                //}
848
                
849
                //extent.toRectangle2D();//new Rectangle2D.Double(ulx, lry, Math.abs(lrx - ulx), Math.abs(lry - uly));
850
                WCSStatus wcsStatus = loadWCSStatus(bBox);
851
                lastRequest = downloadFile(wcsStatus, extent.getULX(), extent.getULY(), extent.getLRX(), extent.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
852
                
853
                if (lastRequest == null) {
854
                        return rasterBuf;
855
                }
856
                
857
                try {
858
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
859
                        /*bandCount = driver.getBandCount();
860
                        setDataType(driver.getDataType());
861
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf, bandList);*/
862
                        
863
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
864
                        String serverName = bandList.getBand(0).getFileName();
865
                        for (int i = 0; i < bandList.getBandCount(); i++) {
866
                                bandList.getBand(i).setFileName(lastRequest.getPath());
867
                        }
868
                        
869
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
870
                        q.setAreaOfInterest(extent, bufWidth, bufHeight);
871
                        q.setBandList(bandList);
872
                        q.setBuffer(rasterBuf);
873
                        q.setAdjustToExtent(adjustToExtent);
874
                        
875
                        Buffer buf = driver.getDataSet(q);
876

    
877
                        for (int i = 0; i < bandList.getBandCount(); i++) {
878
                                bandList.getBand(i).setFileName(serverName);
879
                        }
880
                        driver.close();
881
                        return buf;
882
                } catch (ProviderNotRegisteredException e) {
883
                        throw new RasterDriverException("Error building GdalDriver", e);
884
                } catch (InitializeException e) {
885
                        throw new RasterDriverException("Error building GdalDriver", e);
886
                }
887
        }
888

    
889
        /*
890
         * (non-Javadoc)
891
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
892
         */
893
//        public Buffer getWindow(int x, int y, 
894
//                        BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
895
//                int w = rasterBuf.getWidth();
896
//                int h = rasterBuf.getHeight();
897
//                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
898
//                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
899
//                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
900
//                WCSStatus wcsStatus = loadWCSStatus(bBox);
901
//                
902
//                lastRequest = downloadFile(wcsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
903
//                
904
//                if (lastRequest == null) {
905
//                        return rasterBuf;
906
//                }
907
//
908
//                DefaultRasterProvider driver = null;
909
//                try {
910
//                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
911
//                        /*bandCount = driver.getBandCount();
912
//                        setDataType(driver.getDataType());
913
//                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf,bandList);*/
914
//                        
915
//                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
916
//                        String serverName = bandList.getBand(0).getFileName();
917
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
918
//                                bandList.getBand(i).setFileName(lastRequest.getPath());
919
//                        }
920
//                        
921
//                        Buffer buf = driver.getWindow(0, 0, w, h, rasterBuf.getWidth(), rasterBuf.getHeight(), bandList, rasterBuf);
922
//
923
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
924
//                                bandList.getBand(i).setFileName(serverName);
925
//                        }
926
//                        driver.close();
927
//                        return buf;
928
//                } catch (ProviderNotRegisteredException e) {
929
//                        throw new RasterDriverException("Error building GdalDriver", e);
930
//                } catch (InitializeException e) {
931
//                        throw new RasterDriverException("Error building GdalDriver", e);
932
//                }
933
//        }
934
        
935
        /**
936
         * When a WCS provider is opened the information of data type and number of bands is not
937
         * available. Only after the first time a raster has been downloaded it can be know.
938
         * @param newDataType
939
         * @param buf
940
         * @param bandList
941
         * @return
942
         * @throws RasterDriverException 
943
         */
944
        private void loadInitialInfo() throws RasterDriverException {
945
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
946
                Extent ext = getExtent();
947
                Rectangle2D bBox = ext.toRectangle2D();
948
                int w = 0;
949
                int h = 0;
950
                if(ext.width() > ext.height()) {
951
                        w = 200;
952
                        h = (int)((ext.height() * w) / ext.width());
953
                } else {
954
                        h = 200;
955
                        w = (int)((ext.width() * h) / ext.height());
956
                }
957
                p.setWidth(w);
958
                p.setHeight(h);
959
                p.setExtent(bBox);
960
                WCSStatus wcsStatus = loadWCSStatus(bBox);
961
                
962
                lastRequest = downloadFile(wcsStatus, ext.getULX(), ext.getULY(), ext.getLRX(), ext.getLRY(), w, h);
963
                DefaultRasterProvider driver;
964
                try {
965
                        driver = DefaultProviderServices.loadProvider(lastRequest);
966
                        setDataType(driver.getDataType());
967
                        bandCount = driver.getBandCount();
968
                        driver.close();
969
                } catch (ProviderNotRegisteredException e) {
970
                        throw new RasterDriverException("", e);
971
                } catch (InitializeException e) {
972
                        throw new RasterDriverException("", e);
973
                }
974
        }
975
        
976
        /**
977
         * When a WCS provider is opened the information of data type and number of bands is not
978
         * available. Only after the first time a raster has been downloaded it can be know.
979
         * @param newDataType
980
         * @param buf
981
         * @param bandList
982
         * @return
983
         */
984
        /*private Buffer changeBufferDataType(int newDataType, Buffer buf, BandList bandList) {
985
                Buffer newBuffer = null;
986
                if(buf.getDataType() != newDataType) {
987
                        newBuffer = DefaultRasterManager.getInstance().createReadOnlyBuffer(newDataType, buf.getWidth(), buf.getHeight(), buf.getBandCount()); 
988
                        buf.free();
989
                } else 
990
                        return buf;
991
                
992
                bandList.clear();
993
                for(int i = 0; i < getBandCount(); i++)
994
                        try {
995
                                int dataType = getDataType()[i];
996
                                DatasetBand band = new DatasetBandImpl(getFName(), i, dataType, getBandCount());
997
                                bandList.addBand(band, i);
998
                        } catch(BandNotFoundInListException ex) {
999
                                //No a?adimos la banda
1000
                        }
1001
                return newBuffer;
1002
        }*/
1003

    
1004
        /*
1005
         * (non-Javadoc)
1006
         * @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)
1007
         */
1008
        public Buffer getWindow(int x, int y, int w, int h, 
1009
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
1010
                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
1011
                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
1012
                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p2.getX()), Math.abs(p1.getY() - p2.getY()));
1013
                WCSStatus wcsStatus = loadWCSStatus(bBox);
1014
                
1015
                lastRequest = downloadFile(wcsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
1016
                
1017
                if (lastRequest == null) {
1018
                        return rasterBuf;
1019
                }
1020

    
1021
                DefaultRasterProvider driver = null;
1022
                try {
1023
                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
1024
                        /*bandCount = driver.getBandCount();
1025
                        setDataType(driver.getDataType());
1026
                        rasterBuf = changeBufferDataType(getDataType()[0], rasterBuf,bandList);*/
1027
                        
1028
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
1029
                        String serverName = bandList.getBand(0).getFileName();
1030
                        for (int i = 0; i < bandList.getBandCount(); i++) {
1031
                                bandList.getBand(i).setFileName(lastRequest.getPath());
1032
                        }
1033
                        
1034
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
1035
                        q.setAreaOfInterest(0, 0, w, h);
1036
                        q.setBandList(bandList);
1037
                        q.setBuffer(rasterBuf);
1038
                        Buffer buf = driver.getDataSet(q);
1039

    
1040
                        for (int i = 0; i < bandList.getBandCount(); i++) {
1041
                                bandList.getBand(i).setFileName(serverName);
1042
                        }
1043
                        driver.close();
1044
                        return buf;
1045
                } catch (ProviderNotRegisteredException e) {
1046
                        throw new RasterDriverException("Error building GdalDriver", e);
1047
                } catch (InitializeException e) {
1048
                        throw new RasterDriverException("Error building GdalDriver", e);
1049
                }
1050
        }
1051

    
1052
        /*
1053
         * (non-Javadoc)
1054
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
1055
         */
1056
        public int getBlockSize() {
1057
                return 0;
1058
        }
1059

    
1060
        /*
1061
         * (non-Javadoc)
1062
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
1063
         */
1064
        public void setAffineTransform(AffineTransform t){
1065
                
1066
        }
1067

    
1068
        /*
1069
         * (non-Javadoc)
1070
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
1071
         */
1072
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
1073
                return 0;
1074
        }
1075

    
1076
        /*
1077
         * (non-Javadoc)
1078
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
1079
         */
1080
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
1081
                return 0;
1082
        }
1083

    
1084
        /*
1085
         * (non-Javadoc)
1086
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
1087
         */
1088
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1089
                return 0;
1090
        }
1091

    
1092
        /*
1093
         * (non-Javadoc)
1094
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
1095
         */
1096
        public boolean isOverviewsSupported() {
1097
                return false;
1098
        }
1099

    
1100
        /*
1101
         * (non-Javadoc)
1102
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
1103
         */
1104
        public boolean isReproyectable() {
1105
                return false;
1106
        }
1107

    
1108
        /*
1109
         * (non-Javadoc)
1110
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
1111
         */
1112
        public String getName() {
1113
                return NAME;
1114
        }
1115
        
1116
        /**
1117
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
1118
         * @param pt Punto a transformar
1119
         * @return punto transformado en coordenadas del mundo
1120
         */
1121
        public Point2D rasterToWorld(Point2D pt) {
1122
                Point2D p = new Point2D.Double();
1123
                getAffineTransform().transform(pt, p);
1124
                return p;
1125
        }
1126

    
1127
        /**
1128
         * Convierte un punto desde del mundo a coordenadas pixel.
1129
         * @param pt Punto a transformar
1130
         * @return punto transformado en coordenadas pixel
1131
         */
1132
        public Point2D worldToRaster(Point2D pt) {
1133
                Point2D p = new Point2D.Double();
1134
                try {
1135
                        getAffineTransform().inverseTransform(pt, p);
1136
                } catch (NoninvertibleTransformException e) {
1137
                        return pt;
1138
                }
1139
                return p;
1140
        }
1141
        
1142
        /*
1143
         * (non-Javadoc)
1144
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
1145
         */
1146
        public void setStatus(RasterProvider provider) {
1147
                if(provider instanceof WCSProvider) {
1148
                }
1149
        }
1150
        
1151
        
1152
        /**
1153
         * ASigna el par?metro de inicializaci?n del driver.
1154
         */
1155
        public void setParam(DataStoreProviderServices storeServices, DataStoreParameters param) {
1156
                if(param instanceof WCSDataParametersImpl)
1157
                        this.uri = ((WCSDataParametersImpl)param).getURI();
1158
                this.param = param;
1159
        }
1160
        
1161
        /**
1162
         * Gets the suffix of the downloaded image
1163
         * @return
1164
         */
1165
        public String getFileSuffix() {
1166
                WCSDataParametersImpl p = (WCSDataParametersImpl)parameters;
1167
                String format = p.getFormat().toLowerCase();
1168
                if (format == null) {
1169
                        return "xml";
1170
                }
1171
                if (format.indexOf("png") >= 0){
1172
                return "png";
1173
                }        
1174
            if (format.indexOf("xml") >= 0){
1175
                return "xml";
1176
            }        
1177
            if (format.indexOf("gif") >= 0){
1178
                return "gif";
1179
            }
1180
            if (format.indexOf("tif") >= 0){
1181
                return "tif";
1182
            }
1183
            if (format.indexOf("bmp") >= 0){
1184
                return "bmp";
1185
            }
1186
            if (format.indexOf("jpg") >= 0
1187
                || format.indexOf("jpeg") >= 0){
1188
                return "jpg";                         
1189
            }
1190
                return "xml";
1191
        }
1192
        
1193
        /*
1194
         * (non-Javadoc)
1195
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
1196
         */
1197
        public TileServer getTileServer() {
1198
                if(tileServer == null) {
1199
                        tileServer = new WCSTileServer(this);
1200
                }
1201
                return tileServer;
1202
        }
1203
        
1204
        /*
1205
         * (non-Javadoc)
1206
         * @see org.gvsig.raster.impl.provider.RasterProvider#isRasterEnclosed()
1207
         */
1208
        public boolean isRasterEnclosed() {
1209
                return true;
1210
        }
1211
        
1212
        /*
1213
         * (non-Javadoc)
1214
         * @see org.gvsig.raster.impl.provider.RasterProvider#getRMFFile()
1215
         */
1216
        public String getRMFFile() {
1217
                if(lastRequest != null)
1218
                        return fileUtil.getNameWithoutExtension(lastRequest.getAbsolutePath()) + ".rmf";
1219
                return null;
1220
        }
1221
        
1222
        /*
1223
         * (non-Javadoc)
1224
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#getHistogramComputer()
1225
         */
1226
        public HistogramComputer getHistogramComputer() {
1227
                if (histogram == null)
1228
                        histogram = new RemoteStoreHistogram(this);
1229
                return histogram;
1230
        }
1231
}