Statistics
| Revision:

gvsig-raster / org.gvsig.raster.wms / trunk / org.gvsig.raster.wms / org.gvsig.raster.wms.io / src / main / java / org / gvsig / raster / wms / io / WMSProvider.java @ 1356

History | View | Annotate | Download (42.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.wms.io;
23

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

    
35
import javax.swing.ImageIcon;
36

    
37
import org.gvsig.compat.net.ICancellable;
38
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataStore;
40
import org.gvsig.fmap.dal.DataStoreParameters;
41
import org.gvsig.fmap.dal.coverage.RasterLocator;
42
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
43
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
44
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
45
import org.gvsig.fmap.dal.coverage.exception.BandAccessException;
46
import org.gvsig.fmap.dal.coverage.exception.BandNotFoundInListException;
47
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
48
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
49
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
50
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
51
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
52
import org.gvsig.fmap.dal.coverage.exception.RemoteServiceException;
53
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
54
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
55
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
56
import org.gvsig.fmap.dal.exception.InitializeException;
57
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
58
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
59
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
60
import org.gvsig.metadata.MetadataLocator;
61
import org.gvsig.raster.cache.tile.TileCacheLocator;
62
import org.gvsig.raster.cache.tile.TileCacheManager;
63
import org.gvsig.raster.cache.tile.exception.TileGettingException;
64
import org.gvsig.raster.cache.tile.provider.TileListener;
65
import org.gvsig.raster.cache.tile.provider.TileServer;
66
import org.gvsig.raster.impl.DefaultRasterManager;
67
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
68
import org.gvsig.raster.impl.datastruct.BandListImpl;
69
import org.gvsig.raster.impl.datastruct.DatasetBandImpl;
70
import org.gvsig.raster.impl.datastruct.ExtentImpl;
71
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
72
import org.gvsig.raster.impl.provider.RasterProvider;
73
import org.gvsig.raster.impl.provider.RemoteRasterProvider;
74
import org.gvsig.raster.impl.store.DefaultStoreFactory;
75
import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation;
76
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
77
import org.gvsig.raster.impl.store.properties.RemoteStoreHistogram;
78
import org.gvsig.raster.util.DefaultProviderServices;
79
import org.gvsig.raster.wms.io.downloader.WMSTileServer;
80
import org.gvsig.remoteclient.utils.Utilities;
81
import org.gvsig.remoteclient.wms.WMSStatus;
82
import org.gvsig.tools.ToolsLocator;
83
import org.gvsig.tools.task.TaskStatus;
84
import org.slf4j.Logger;
85
import org.slf4j.LoggerFactory;
86
/**
87
 * Clase que representa al driver de acceso a datos de wms.
88
 *
89
 * @author Nacho Brodin (nachobrodin@gmail.com)
90
 */
91
public class WMSProvider extends DefaultRasterProvider implements RemoteRasterProvider {
92
        public static String                NAME                     = "Wms Store";
93
        public static String                DESCRIPTION              = "Wms Raster file";
94
        public static final String          METADATA_DEFINITION_NAME = "WmsStore";
95
        private static final Logger         logger                    = LoggerFactory.getLogger(WMSProvider.class);
96
        private static final int            FIXED_SIZE               = 800;
97
        private Extent                      viewRequest              = null;
98
        private static Hashtable<String, WMSConnector>    
99
                                            drivers                  = new Hashtable<String, WMSConnector> ();
100
        private boolean                     open                     = false;
101
        private DataStoreTransparency       fileTransparency         = null;
102
        private final int                                        minTilePrintWidth        = 12;
103
        private final int                                        minTilePrintHeight       = 12;
104
        //The out size depends on the last request
105
        private int                         lastWidthRequest         = 0;
106
        private int                         lastHeightRequest        = 0;
107
        private Rectangle2D                 lastExtent               = null;
108
        //Only for fixed size. Complete extent and FIXED_SIZE in long side
109
        private File                        fileLayerPixelSize       = null;
110
        private File                        lastRequest              = null;
111
        private DefaultRasterProvider       lastRequestProvider      = null; 
112
        
113
        public static void register() {
114
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
115
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
116
                        dataman.registerStoreProvider(NAME,
117
                                        WMSProvider.class, WMSDataParametersImpl.class);
118
                }
119

    
120
                if (!dataman.getExplorerProviders().contains(WMSServerExplorer.NAME)) {
121
                        dataman.registerExplorerProvider(WMSServerExplorer.NAME, WMSServerExplorer.class, WMSServerExplorerParameters.class);
122
                }
123
                dataman.registerStoreFactory(NAME, DefaultStoreFactory.class);
124
        }
125
        
126
        public WMSProvider() throws NotSupportedExtensionException {
127
                super();
128
        }
129
        
130
        /*
131
         * (non-Javadoc)
132
         * @see org.gvsig.raster.impl.provider.RasterProvider#registerTileProviderFormats(java.lang.Class)
133
         */
134
        public void registerTileProviderFormats(Class<RasterProvider> c) {
135

    
136
        }
137
        
138
        /**
139
         * Constructor. Abre el dataset.
140
         * @param proj Proyecci?n
141
         * @param fName Nombre del fichero
142
         * @throws NotSupportedExtensionException
143
         */
144
        public WMSProvider(String params) throws InitializeException {
145
                super(params);
146
                if(params instanceof String) {
147
                        WMSDataParameters p = new WMSDataParametersImpl();
148
                        p.setURI((String)params);
149
                        super.init(p, null, ToolsLocator.getDynObjectManager()
150
                                        .createDynObject(
151
                                                        MetadataLocator.getMetadataManager().getDefinition(
152
                                                                        DataStore.METADATA_DEFINITION_NAME)));
153
                        init(p, null);
154
                }
155
        }
156
        
157
        public WMSProvider(WMSDataParameters params,
158
                        DataStoreProviderServices storeServices) throws InitializeException {
159
                super(params, storeServices, ToolsLocator.getDynObjectManager()
160
                                .createDynObject(
161
                                                MetadataLocator.getMetadataManager().getDefinition(
162
                                                                DataStore.METADATA_DEFINITION_NAME)));
163
                init(params, storeServices);
164
        }
165
        
166
        /**
167
         * Gets the connector from the URL
168
         * @return
169
         * @throws RemoteServiceException
170
         */
171
        public WMSConnector getConnector() throws RemoteServiceException {
172
                WMSDataParameters p = (WMSDataParameters)parameters;
173
                URL url = null;
174
                try {
175
                        url = new URL(p.getURI());
176
                } catch (Exception e) {
177
                        throw new RemoteServiceException("Malformed URL",e);
178
                }
179
                try {
180
                        return WMSProvider.getConnectorFromURL(url, false);
181
                } catch (IOException e) {
182
                        throw new RemoteServiceException("Error getting the connector",e);
183
                }
184
        }
185
        
186
        /**
187
         * Crea las referencias al fichero y carga
188
         * las estructuras con la informaci?n y los metadatos.
189
         * @param proj Proyecci?n
190
         * @param param Parametros de carga
191
         * @throws NotSupportedExtensionException
192
         */
193
        public void init (DataStoreParameters params,
194
                        DataStoreProviderServices storeServices) throws InitializeException {
195
                setParam(storeServices, params);
196
                setDataType(new int[]{Buffer.TYPE_BYTE, Buffer.TYPE_BYTE, Buffer.TYPE_BYTE});
197
                bandCount = 3;
198
                open = true;
199
                try {
200
                        loadInitialInfo();
201
                } catch (RasterDriverException e) {
202
                        throw new InitializeException(e.getMessage(), e);
203
                }
204
        }
205
        
206
        /**
207
         * When a WMS provider is opened the information of data type, number of bands and transparency 
208
         * is not available. Only after the first time a raster has been downloaded it can be know.
209
         * @param newDataType
210
         * @param buf
211
         * @param bandList
212
         * @return
213
         * @throws RasterDriverException 
214
         */
215
        private void loadInitialInfo() throws RasterDriverException {
216
                WMSDataParametersImpl p = (WMSDataParametersImpl)parameters;
217
                Extent ext = getExtent();
218
                Rectangle2D bBox = ext.toRectangle2D();
219
                int w = 0;
220
                int h = 0;
221
                if(ext.width() > ext.height()) {
222
                        w = 200;
223
                        h = (int)((ext.height() * w) / ext.width());
224
                } else {
225
                        h = 200;
226
                        w = (int)((ext.width() * h) / ext.height());
227
                }
228
                p.setWidth(w);
229
                p.setHeight(h);
230
                p.setExtent(bBox);
231
                WMSStatus wmsStatus = loadWMSStatus(bBox);
232
                
233
                lastRequest = downloadFile(wmsStatus, ext.getULX(), ext.getULY(), ext.getLRX(), ext.getLRY(), w, h);
234
                DefaultRasterProvider driver;
235
                try {
236
                        driver = DefaultProviderServices.loadProvider(lastRequest);
237
                        setDataType(driver.getDataType());
238
                        bandCount = driver.getBandCount();
239
                        if(bandCount > 3) {
240
                                getColorInterpretation().setColorInterpValue(3, DataStoreColorInterpretation.ALPHA_BAND);
241
                                getTransparency().setTransparencyBand(3);
242
                        }
243
                        setColorTable(driver.getColorTable());
244
                        driver.close();
245
                } catch (ProviderNotRegisteredException e) {
246
                        throw new RasterDriverException("", e);
247
                } catch (InitializeException e) {
248
                        throw new RasterDriverException("", e);
249
                }
250
        }
251
        
252
        public static final WMSConnector getConnectorFromURL(URL url, boolean updating) throws IOException {
253
                WMSConnector drv = null;
254
                if(!updating) {
255
                        drv = (WMSConnector) drivers.get(url.toString());
256
                } else {
257
                        if(drivers.get(url.toString()) != null)
258
                                drivers.remove(url.toString());
259
                }
260
                
261
                if (drv == null) {
262
                        drv = new WMSConnector(url);
263
                        drivers.put(url.toString(), drv);
264
                }
265
                
266
                return drv;
267
        }
268
        
269
        /**
270
         * Obtiene el objeto que contiene que contiene la interpretaci?n de
271
         * color por banda
272
         * @return
273
         */
274
        public ColorInterpretation getColorInterpretation() {
275
                if(super.getColorInterpretation() == null) {
276
                        ColorInterpretation colorInterpretation = new DataStoreColorInterpretation();
277
                        colorInterpretation.initColorInterpretation(getBandCount());
278
                        colorInterpretation.setColorInterpValue(0, DataStoreColorInterpretation.RED_BAND);
279
                        colorInterpretation.setColorInterpValue(1, DataStoreColorInterpretation.GREEN_BAND);
280
                        colorInterpretation.setColorInterpValue(2, DataStoreColorInterpretation.BLUE_BAND);
281
                        setColorInterpretation(colorInterpretation);
282
                }
283
                return super.getColorInterpretation();
284
        }
285
        
286
        /*
287
         * (non-Javadoc)
288
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#getAffineTransform()
289
         */
290
        public AffineTransform getAffineTransform() {
291
                WMSDataParameters p = (WMSDataParameters)parameters;
292
                Extent e = getExtent();
293
                if(p.isSizeFixed()) {
294
                        double psX = e.width() / (p.getWidth() - 1);
295
                        double psY = -(e.height() / (p.getHeight() - 1));
296
                        ownTransformation = new AffineTransform(
297
                                        psX , 
298
                                        0, 
299
                                        0, 
300
                                        psY, 
301
                                        e.getULX() - (psX / 2),
302
                                        e.getULY() - (psY / 2));
303
                } else {
304
                        double psX = e.width() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest);
305
                        double psY = -(e.height() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest));
306
                        ownTransformation = new AffineTransform(
307
                                        psX, 
308
                                        0, 
309
                                        0, 
310
                                        psY, 
311
                                        e.getULX() - (psX / 2),
312
                                        e.getULY() - (psY / 2));
313
                        /*ownTransformation = new AffineTransform(
314
                                        p.getExtent().getWidth() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest) , 
315
                                        0, 
316
                                        0, 
317
                                        -(p.getExtent().getHeight() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest)), 
318
                                        p.getExtent().getMinX(),
319
                                        p.getExtent().getMinY());*/
320
                }
321
                externalTransformation = (AffineTransform) ownTransformation.clone();
322
                return ownTransformation;
323
        }
324
        
325
        /**
326
         * Calcula el extent en coordenadas del mundo real
327
         * @return Extent
328
         */
329
        public Extent getExtent() {
330
                WMSDataParameters p = (WMSDataParameters)parameters;
331
                Vector<?> layerNames = Utilities.createVector(p.getLayerQuery(), ",");
332
                
333
                String[] ln = new String[layerNames.size()];
334
                for (int i = 0; i < ln.length; i++) {
335
                        ln[i] = (String)layerNames.get(i);
336
                }
337
                Rectangle2D r = null;
338
                try {
339
                        r = getConnector().getLayersExtent(ln, p.getSRSCode());
340
                } catch (RemoteServiceException e) {
341
                }
342
                return new ExtentImpl(r.getMinX(), r.getMaxY(), r.getMaxX(), r.getMinY());
343
        }
344

    
345
        
346
        /*
347
         * (non-Javadoc)
348
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLayerExtent(java.lang.String, java.lang.String)
349
         */
350
        public Rectangle2D getLayerExtent(String layerName, String srs) throws RemoteServiceException {
351
                return getConnector().getLayersExtent(new String[]{layerName}, srs);
352
        }
353

    
354
        /*
355
         * (non-Javadoc)
356
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
357
         */
358
        public RasterProvider load() {
359
                return this;
360
        }
361
        
362
        /*
363
         * (non-Javadoc)
364
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
365
         */
366
        public boolean isOpen() {
367
                return open;
368
        }
369

    
370
        /*
371
         * (non-Javadoc)
372
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
373
         */
374
        public void close() {
375
                open = false;
376
        }
377
        
378
        /*
379
         * (non-Javadoc)
380
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
381
         */
382
        public Transparency getTransparency() {
383
                if(fileTransparency == null)
384
                        fileTransparency = new DataStoreTransparency();
385
                return fileTransparency;
386
        }
387

    
388
        /*
389
         * (non-Javadoc)
390
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
391
         */
392
        public String translateFileName(String fileName) {
393
                return fileName;
394
        }
395

    
396
        /*
397
         * (non-Javadoc)
398
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
399
         */
400
        public void setView(Extent e) {
401
                viewRequest = e;
402
        }
403

    
404
        /*
405
         * (non-Javadoc)
406
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
407
         */
408
        public Extent getView() {
409
                return viewRequest;
410
        }
411
        
412
        /*
413
         * (non-Javadoc)
414
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
415
         */
416
        public double getWidth() {
417
                WMSDataParameters p = (WMSDataParameters)parameters;
418
                if(p.isSizeFixed()) {
419
                        return p.getWidth();
420
                }
421
                if (lastWidthRequest <= 0) 
422
                        return p.getWidth();
423
                if (lastWidthRequest < minTilePrintWidth) 
424
                        return minTilePrintWidth;
425
                return lastWidthRequest;
426
        }
427

    
428
        /*
429
         * (non-Javadoc)
430
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
431
         */
432
        public double getHeight() {
433
                WMSDataParameters p = (WMSDataParameters)parameters;
434
                if(p.isSizeFixed()) {
435
                        return p.getHeight();
436
                }
437
                if (lastHeightRequest <= 0) 
438
                        return p.getHeight();
439
                if (lastHeightRequest < minTilePrintHeight) 
440
                        return minTilePrintHeight;
441
                return lastHeightRequest;
442
        }
443
        
444
        /**
445
         * Gets WMS parameters
446
         * @return
447
         */
448
        public WMSDataParameters getParameters() {
449
                return (WMSDataParameters)parameters;
450
        }
451

    
452
        /*
453
         * (non-Javadoc)
454
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
455
         */
456
        public Object readCompleteLine(int line, int band)
457
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
458
                return null;
459
        }
460
        
461
        /**
462
         * When the remote layer has fixed size this method downloads the file and return its reference. 
463
         * File layer has in the long side FIXED_SIZE pixels and the bounding box is complete. This file could be
464
         * useful to build an histogram or calculate statistics. This represents a sample of data.
465
         * @return
466
         * @throws RasterDriverException
467
         */
468
        public File getFileLayer() throws RasterDriverException {
469
                if(fileLayerPixelSize != null)
470
                        return fileLayerPixelSize;
471
                
472
                WMSDataParameters p = (WMSDataParameters)parameters;
473
                Extent e = getExtent();
474
                Rectangle2D bBox = new Rectangle2D.Double(e.getULX(), e.getLRY(), e.width(), e.height());
475
                WMSStatus wmsStatus = loadWMSStatus(bBox);
476
                
477
                if(!p.isSizeFixed()) {
478
                        int w = 0;
479
                        int h = 0;
480
                        if(e.width() > e.height()) {
481
                                w = FIXED_SIZE;
482
                                h = (int)((e.height() * FIXED_SIZE) / e.width());
483
                        } else {
484
                                h = FIXED_SIZE;
485
                                w = (int)((e.width() * FIXED_SIZE) / e.height());
486
                        }
487
                        wmsStatus.setWidth(w);
488
                        wmsStatus.setHeight(h);
489
                        fileLayerPixelSize = downloadFile(wmsStatus, e.getULX(), e.getULY(), e.getLRX(), e.getLRY(), w, h);
490
                } else {
491
                        fileLayerPixelSize = downloadFile(wmsStatus, e.getULX(), e.getULY(), e.getLRX(), e.getLRY(), 
492
                                        p.getFixedSize().width, p.getFixedSize().height);
493
                }
494
                return fileLayerPixelSize;
495
        }
496

    
497
        /**
498
         * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
499
         * to read a file very fast without setting a view. In a WMS service when the size is fixed then it will read the
500
         * entire image but when the source hasn't pixel size it will read a sample of data. This set of data will have
501
         * the size defined in FIXED_SIZE. 
502
         * 
503
         * @param pos Posici?n donde se empieza  a leer
504
         * @param blockHeight Altura m?xima del bloque leido
505
         * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
506
         * @throws InvalidSetViewException
507
         * @throws FileNotOpenException
508
         * @throws RasterDriverException
509
         */
510
        public Object readBlock(int pos, int blockHeight, double scale) 
511
        throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
512
                File lastFile = getFileLayer();
513
                BandList bandList = new BandListImpl();
514
                for (int i = 0; i < 3; i++) {
515
                        try {
516
                                bandList.addBand(new DatasetBandImpl(lastFile.getPath(), pos, Buffer.TYPE_BYTE, 3), pos);
517
                        } catch (BandNotFoundInListException e1) {
518
                        }
519
                }
520
                bandList.setDrawableBands(new int[]{0, 1, 2});
521

    
522
                try {
523
                        lastRequestProvider = openLastRequest();
524
                        return lastRequestProvider.readBlock(pos, blockHeight, scale);
525
                } catch (ProviderNotRegisteredException exc) {
526
                        throw new RasterDriverException("Error building GdalDriver", exc);
527
                } catch (InitializeException exc) {
528
                        throw new RasterDriverException("Error building GdalDriver", exc);
529
                }
530
        }
531
        
532
        /*
533
         * (non-Javadoc)
534
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequestHeight()
535
         */
536
        public double getLastRequestHeight() throws RasterDriverException {
537
                if(lastRequestProvider == null) {
538
                        try {
539
                                lastRequestProvider = openLastRequest();
540
                        } catch (ProviderNotRegisteredException e) {
541
                                throw new RasterDriverException("Error building GdalDriver", e);
542
                        } catch (InitializeException e) {
543
                                throw new RasterDriverException("Error building GdalDriver", e);
544
                        }
545
                }
546
                return lastRequestProvider.getHeight();
547
        }
548
        
549
        /*
550
         * (non-Javadoc)
551
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequestWidth()
552
         */
553
        public double getLastRequestWidth() throws RasterDriverException {
554
                if(lastRequestProvider == null) {
555
                        try {
556
                                lastRequestProvider = openLastRequest();
557
                        } catch (ProviderNotRegisteredException e) {
558
                                throw new RasterDriverException("Error building GdalDriver", e);
559
                        } catch (InitializeException e) {
560
                                throw new RasterDriverException("Error building GdalDriver", e);
561
                        }
562
                }
563
                return lastRequestProvider.getWidth();
564
        }
565
        
566
        /*
567
         * (non-Javadoc)
568
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequest()
569
         */
570
        public File getLastRequest() {
571
                return lastRequest;
572
        }
573
        
574
        /*
575
         * (non-Javadoc)
576
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getBufferLastRequest()
577
         */
578
        public Buffer getBufferLastRequest() throws ProcessInterruptedException, RasterDriverException {
579
                try {
580
                        lastRequestProvider = openLastRequest();
581
                        
582
                        BandList bandList = new BandListImpl();
583
                        for (int i = 0; i < lastRequestProvider.getBandCount(); i++) {
584
                                try {
585
                                        bandList.addBand(new DatasetBandImpl(lastRequest.getPath(), i, Buffer.TYPE_BYTE, 3), i);
586
                                } catch (BandNotFoundInListException e1) {
587
                                }
588
                        }
589
                        bandList.setDrawableBands(new int[]{0, 1, 2});
590
                        Buffer newBuffer = DefaultRasterManager.getInstance().createBuffer(lastRequestProvider.getDataType()[0], (int)lastRequestProvider.getWidth(), (int)lastRequestProvider.getHeight(), lastRequestProvider.getBandCount(), true);
591
                        
592
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
593
                        q.setAreaOfInterest(lastRequestProvider.getExtent(), 
594
                                        (int)lastRequestProvider.getWidth(), 
595
                                        (int)lastRequestProvider.getHeight());
596
                        q.setBandList(bandList);
597
                        q.setBuffer(newBuffer);
598
                        q.setAdjustToExtent(true);
599
                        
600
                        return lastRequestProvider.getDataSet(q);
601
                } catch (ProviderNotRegisteredException e) {
602
                        throw new RasterDriverException("Error building GdalDriver", e);
603
                } catch (InitializeException e) {
604
                        throw new RasterDriverException("Error building GdalDriver", e);
605
                }
606
        }
607
        
608
        /**
609
         * Opens the last request downloaded
610
         * @return
611
         * @throws ProviderNotRegisteredException
612
         * @throws InitializeException
613
         * @throws RasterDriverException
614
         */
615
        private DefaultRasterProvider openLastRequest() throws ProviderNotRegisteredException, InitializeException, RasterDriverException {
616
                if(lastRequestProvider != null)
617
                        lastRequestProvider.close();
618
                File lastFile = getFileLayer();
619
                lastRequestProvider = DefaultProviderServices.loadProvider(new File(lastFile.getPath()));
620
                setColorTable(lastRequestProvider.getColorTable());
621
                return lastRequestProvider;
622
        }
623

    
624
        /*
625
         * (non-Javadoc)
626
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
627
         */
628
        public Object getData(int x, int y, int band)
629
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
630
                return null;
631
        }
632
        
633
        /**
634
         * Gets the georeferencing file name form a raster file
635
         * @param file
636
         * a raster file
637
         * @return
638
         * a georeferencing file
639
         */
640
        private String getWorldFile(String file){                
641
                String worldFile = file;
642
                int index = file.lastIndexOf(".");
643
                if (index > 0){                        
644
                        worldFile = file.substring(0, index) + getExtensionWorldFile();
645
                }
646
                return worldFile;
647
        }
648
        
649
        /**
650
         * Obtiene la extensi?n del fichero de georreferenciaci?n
651
         * @return String con la extensi?n del fichero de georreferenciaci?n dependiendo
652
         * del valor del formato obtenido del servidor. Por defecto asignaremos un .wld
653
         */
654
        private String getExtensionWorldFile() {
655
                WMSDataParameters p = (WMSDataParameters)parameters;
656
                String extWorldFile = ".wld";
657
                if(p.getFormat().equals("image/tif") || p.getFormat().equals("image/tiff")) {
658
                        extWorldFile = ".tfw";
659
                }
660
                return extWorldFile;
661
        }
662
        
663
        public WMSStatus loadWMSStatus(Rectangle2D bBox) {
664
                lastExtent = bBox;
665
                WMSDataParameters p = (WMSDataParameters)parameters;
666
                WMSStatus wmsStatus = new WMSStatus();
667
                wmsStatus.setLayerNames(Utilities.createVector(p.getLayerQuery(), ","));
668
                wmsStatus.setSrs(p.getSRSCode());
669
                wmsStatus.setFormat(p.getFormat());
670
                wmsStatus.setInfoFormat(p.getInfoFormat());
671
                wmsStatus.setStyles(p.getStyles());
672
                wmsStatus.setDimensions(p.getDimensions());
673
                wmsStatus.setTransparency(p.isWmsTransparent());
674
                wmsStatus.setOnlineResource((String) p.getOnlineResource().get("GetMap"));
675
                if(p.isSizeFixed()) {
676
                        wmsStatus.setExtent(getExtent().toRectangle2D());
677
                } else
678
                        wmsStatus.setExtent(bBox);
679
                wmsStatus.setHeight(p.getHeight());
680
                wmsStatus.setWidth(p.getWidth());
681
                return wmsStatus;
682
        }
683
        
684
        /**
685
         * This function downloads the file and creates the georeferencing file
686
         * @param wmsStatus
687
         * @param ulx
688
         * @param uly
689
         * @param lrx
690
         * @param lry
691
         * @param w
692
         * @param h
693
         * @return
694
         * @throws RasterDriverException
695
         */
696
        private File downloadFile(WMSStatus wmsStatus, double ulx, double uly, double lrx, double lry, int w, int h) throws RasterDriverException {
697
                WMSDataParameters p = (WMSDataParameters)parameters;
698
                try {
699
                        lastRequest = getConnector().getMap(wmsStatus, ((WMSDataParameters)parameters).getCancellable());
700
                } catch (RemoteServiceException e) {
701
                        throw new RasterDriverException(e.getMessage(), e);
702
                }
703
                
704
                if(lastRequest == null)
705
                        return null;
706
                
707
                String nameWorldFile = getWorldFile(lastRequest.getPath());
708
                try {
709
                        if(p.isSizeFixed()) {
710
                                Extent e = getExtent();
711
                                fileUtil.createWorldFile(nameWorldFile, e, p.getWidth(), p.getHeight());
712
                        } else {
713
                                fileUtil.createWorldFile(nameWorldFile, new ExtentImpl(ulx, uly, lrx, lry), w, h);
714
                        }
715
                } catch (IOException e) {
716
                        throw new RasterDriverException("Error creating world file", e);
717
                }
718

    
719
                return lastRequest;
720
        }
721
        
722
        /**
723
         * Assigns the list of bands RGB and read a window of data
724
         * @param rasterBuf
725
         * @param bandList
726
         * @param lastFile
727
         * @param ulx
728
         * @param uly
729
         * @param lrx
730
         * @param lry
731
         * @return
732
         * @throws RasterDriverException
733
         * @throws ProcessInterruptedException
734
         */
735
        public Buffer getBuffer(Buffer rasterBuf, BandList bandList, File lastFile, 
736
                        double ulx, double uly, double lrx, double lry) throws RasterDriverException, ProcessInterruptedException {
737
                try {
738
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
739
                        String serverName = bandList.getBand(0).getFileName();
740
                        for (int i = 0; i < bandList.getBandCount(); i++) {
741
                                bandList.getBand(i).setFileName(lastFile.getPath());
742
                        }
743
                        
744
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastFile.getPath()));
745
                        setColorTable(driver.getColorTable());
746
                        
747
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
748
                        q.setAreaOfInterest(new ExtentImpl(ulx, uly, lrx, lry));
749
                        q.setBandList(bandList);
750
                        q.setBuffer(rasterBuf);
751
                        Buffer buf = driver.getDataSet(q);
752
                        
753
                        for (int i = 0; i < bandList.getBandCount(); i++) {
754
                                bandList.getBand(i).setFileName(serverName);
755
                        }
756
                        
757
                        return buf;
758
                } catch (ProviderNotRegisteredException e) {
759
                        throw new RasterDriverException("Error building GdalDriver", e);
760
                } catch (InitializeException e) {
761
                        throw new RasterDriverException("Error building GdalDriver", e);
762
                }
763
        }
764
        
765
        /*
766
         * (non-Javadoc)
767
         * @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)
768
         */
769
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
770
                        BandList bandList, TileListener listener, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
771

    
772
                Buffer raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, 3, true);
773
                getWindow(ex, bufWidth, bufHeight, bandList, raster, true, null);
774
                raster.setDataExtent(ex.toRectangle2D());
775

    
776
                TileCacheManager m = TileCacheLocator.getManager();
777
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
778
                t.setData(new Object[]{raster});
779
                t.setUl(new Point2D.Double(ex.getULX(), ex.getULY()));
780
                t.setLr(new Point2D.Double(ex.getLRX(), ex.getLRY()));
781
                t.setDownloaderParams("AffineTransform", getAffineTransform());
782
                t.setDownloaderParams("Tiling", new Boolean(false));
783
                try {
784
                        listener.tileReady(t);
785
                } catch (TileGettingException e) {
786
                        throw new RasterDriverException("Error throwing a tile", e);
787
                }
788

    
789
                //listener.nextBuffer(raster, null, new ExtentImpl(minX, minY, maxX, maxY), getAffineTransform(), null, false);
790
                listener.endReading();
791
        }
792

    
793
        /*
794
         * (non-Javadoc)
795
         * @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)
796
         */
797
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
798
                throws ProcessInterruptedException, RasterDriverException {
799
                Rectangle2D bBox = ex.toRectangle2D();
800
                lastWidthRequest = rasterBuf.getWidth();
801
                lastHeightRequest = rasterBuf.getHeight();
802
                WMSStatus wmsStatus = loadWMSStatus(bBox);
803
                
804
                lastRequest = downloadFile(wmsStatus, ex.getULX(), ex.getULY(), ex.getLRX(), ex.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
805
                
806
                if (lastRequest == null) {
807
                        return rasterBuf;
808
                }
809
                
810
                try {
811
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
812
                        String serverName = bandList.getBand(0).getFileName();
813
                        for (int i = 0; i < bandList.getBandCount(); i++) {
814
                                bandList.getBand(i).setFileName(lastRequest.getPath());
815
                        }
816
                        
817
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
818
                        setColorTable(driver.getColorTable());
819
                        
820
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
821
                        q.setAreaOfInterest(ex);
822
                        q.setBandList(bandList);
823
                        q.setBuffer(rasterBuf);
824
                        Buffer buf = driver.getDataSet(q);
825
                        
826
                        for (int i = 0; i < bandList.getBandCount(); i++) {
827
                                bandList.getBand(i).setFileName(serverName);
828
                        }
829
                        driver.close();
830
                        return buf;
831
                } catch (ProviderNotRegisteredException e) {
832
                        throw new RasterDriverException("Error building GdalDriver", e);
833
                } catch (InitializeException e) {
834
                        throw new RasterDriverException("Error building GdalDriver", e);
835
                }
836
        }
837

    
838
        /*
839
         * (non-Javadoc)
840
         * @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)
841
         */
842
        public Buffer getWindow(double ulx, double uly, double w, double h, 
843
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
844
                Rectangle2D bBox = new Rectangle2D.Double(ulx, uly, w, h);
845
                lastWidthRequest = rasterBuf.getWidth();
846
                lastHeightRequest = rasterBuf.getHeight();
847
                WMSStatus wmsStatus = loadWMSStatus(bBox);
848
                
849
                lastRequest = downloadFile(wmsStatus, ulx, uly, ulx + w, uly - h, rasterBuf.getWidth(), rasterBuf.getHeight());
850
                
851
                if (lastRequest == null) {
852
                        return rasterBuf;
853
                }
854
                
855
                try {
856
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
857
                        String serverName = bandList.getBand(0).getFileName();
858
                        for (int i = 0; i < bandList.getBandCount(); i++) {
859
                                bandList.getBand(i).setFileName(lastRequest.getPath());
860
                        }
861
                        
862
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
863
                        setColorTable(driver.getColorTable());
864
                        
865
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
866
                        q.setAreaOfInterest(ulx, uly, w, h);
867
                        q.setBandList(bandList);
868
                        q.setBuffer(rasterBuf);
869
                        q.setAdjustToExtent(adjustToExtent);
870
                        
871
                        Buffer buf = driver.getDataSet(q);
872
                        
873
                        for (int i = 0; i < bandList.getBandCount(); i++) {
874
                                bandList.getBand(i).setFileName(serverName);
875
                        }
876
                        
877
                        return buf;
878
                } catch (ProviderNotRegisteredException e) {
879
                        throw new RasterDriverException("Error building GdalDriver", e);
880
                } catch (InitializeException e) {
881
                        throw new RasterDriverException("Error building GdalDriver", e);
882
                }
883
        }
884

    
885
        /*
886
         * (non-Javadoc)
887
         * @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)
888
         */
889
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
890
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
891
                Rectangle2D bBox = extent.toRectangle2D();//new Rectangle2D.Double(ulx, lry, Math.abs(lrx - ulx), Math.abs(lry - uly));
892
                lastWidthRequest = rasterBuf.getWidth();
893
                lastHeightRequest = rasterBuf.getHeight();
894
                WMSStatus wmsStatus = loadWMSStatus(bBox);
895
                lastRequest = downloadFile(wmsStatus, extent.getULX(), extent.getULY(), extent.getLRX(), extent.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
896
                
897
                if (lastRequest == null) {
898
                        return rasterBuf;
899
                }
900
                
901
                try {
902
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
903
                        String serverName = bandList.getBand(0).getFileName();
904
                        for (int i = 0; i < bandList.getBandCount(); i++) {
905
                                bandList.getBand(i).setFileName(lastRequest.getPath());
906
                        }
907
                        
908
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
909
                        setColorTable(driver.getColorTable());
910
                        
911
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
912
                        q.setAreaOfInterest(extent, bufWidth, bufHeight);
913
                        q.setBandList(bandList);
914
                        q.setBuffer(rasterBuf);
915
                        q.setAdjustToExtent(adjustToExtent);
916
                        Buffer buf = driver.getDataSet(q);
917

    
918
                        for (int i = 0; i < bandList.getBandCount(); i++) {
919
                                bandList.getBand(i).setFileName(serverName);
920
                        }
921
                        
922
                        return buf;
923
                } catch (ProviderNotRegisteredException e) {
924
                        throw new RasterDriverException("Error building GdalDriver", e);
925
                } catch (InitializeException e) {
926
                        throw new RasterDriverException("Error building GdalDriver", e);
927
                }
928
        }
929

    
930
        /*
931
         * (non-Javadoc)
932
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
933
         */
934
//        public Buffer getWindow(int x, int y, 
935
//                        BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
936
//                int w = rasterBuf.getWidth();
937
//                int h = rasterBuf.getHeight();
938
//                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
939
//                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
940
//                lastWidthRequest = rasterBuf.getWidth();
941
//                lastHeightRequest = rasterBuf.getHeight();
942
//                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
943
//                WMSStatus wmsStatus = loadWMSStatus(bBox);
944
//                
945
//                lastRequest = downloadFile(wmsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
946
//                
947
//                if (lastRequest == null) {
948
//                        return rasterBuf;
949
//                }
950
//
951
//                DefaultRasterProvider driver = null;
952
//                try {
953
//                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
954
//                        String serverName = bandList.getBand(0).getFileName();
955
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
956
//                                bandList.getBand(i).setFileName(lastRequest.getPath());
957
//                        }
958
//                        
959
//                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
960
//                        Buffer buf = driver.getWindow(0, 0, w, h, bandList, rasterBuf);
961
//
962
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
963
//                                bandList.getBand(i).setFileName(serverName);
964
//                        }
965
//                        
966
//                        return buf;
967
//                } catch (ProviderNotRegisteredException e) {
968
//                        throw new RasterDriverException("Error building GdalDriver", e);
969
//                } catch (InitializeException e) {
970
//                        throw new RasterDriverException("Error building GdalDriver", e);
971
//                }
972
//        }
973

    
974
        /*
975
         * (non-Javadoc)
976
         * @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)
977
         */
978
        public Buffer getWindow(int x, int y, int w, int h, 
979
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
980
                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
981
                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
982
                lastWidthRequest = rasterBuf.getWidth();
983
                lastHeightRequest = rasterBuf.getHeight();
984
                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
985
                WMSStatus wmsStatus = loadWMSStatus(bBox);
986
                
987
                lastRequest = downloadFile(wmsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
988
                
989
                if (lastRequest == null) {
990
                        return rasterBuf;
991
                }
992

    
993
                DefaultRasterProvider driver = null;
994
                try {
995
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
996
                        String serverName = bandList.getBand(0).getFileName();
997
                        for (int i = 0; i < bandList.getBandCount(); i++) {
998
                                bandList.getBand(i).setFileName(lastRequest.getPath());
999
                        }
1000
                        
1001
                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
1002
                        setColorTable(driver.getColorTable());
1003
                        
1004
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
1005
                        q.setAreaOfInterest(0, 0, w, h);
1006
                        q.setBandList(bandList);
1007
                        q.setBuffer(rasterBuf);
1008
                        Buffer buf = driver.getDataSet(q);
1009

    
1010
                        for (int i = 0; i < bandList.getBandCount(); i++) {
1011
                                bandList.getBand(i).setFileName(serverName);
1012
                        }
1013
                        
1014
                        return buf;
1015
                } catch (ProviderNotRegisteredException e) {
1016
                        throw new RasterDriverException("Error building GdalDriver", e);
1017
                } catch (InitializeException e) {
1018
                        throw new RasterDriverException("Error building GdalDriver", e);
1019
                }
1020
        }
1021

    
1022
        public Image getImageLegend() {
1023
                try {
1024
                        if (getConnector().hasLegendGraphic()) {
1025
                                WMSStatus wmsStatus = loadWMSStatus(getExtent().toRectangle2D());
1026
                                wmsStatus.setOnlineResource((String) getParameters().getOnlineResource().get("GetLegendGraphic"));
1027
                                File file = getConnector().getLegendGraphic(wmsStatus, getParameters().getLayerQuery(), null);
1028
                                Image img = null;
1029
                                if ((file != null) && (file.length() > 0)) {
1030
                                        img = new ImageIcon(file.getAbsolutePath()).getImage();
1031
                                }
1032
                                return img;
1033
                        }
1034
                } catch (Exception e) {
1035
                        logger.info("Problems in GetLegendGraphic", e);
1036
                }
1037
                return null;
1038
        }
1039

    
1040
        /*
1041
         * (non-Javadoc)
1042
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
1043
         */
1044
        public int getBlockSize() {
1045
                return 0;
1046
        }
1047

    
1048
        /*
1049
         * (non-Javadoc)
1050
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
1051
         */
1052
        public void setAffineTransform(AffineTransform t){
1053
                
1054
        }
1055

    
1056
        /*
1057
         * (non-Javadoc)
1058
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
1059
         */
1060
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
1061
                return 0;
1062
        }
1063

    
1064
        /*
1065
         * (non-Javadoc)
1066
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
1067
         */
1068
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
1069
                return 0;
1070
        }
1071

    
1072
        /*
1073
         * (non-Javadoc)
1074
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
1075
         */
1076
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1077
                return 0;
1078
        }
1079

    
1080
        /*
1081
         * (non-Javadoc)
1082
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isOverviewsSupported()
1083
         */
1084
        public boolean isOverviewsSupported() {
1085
                return false;
1086
        }
1087

    
1088
        /*
1089
         * (non-Javadoc)
1090
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
1091
         */
1092
        public boolean isReproyectable() {
1093
                return false;
1094
        }
1095

    
1096
        /*
1097
         * (non-Javadoc)
1098
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
1099
         */
1100
        public String getName() {
1101
                return NAME;
1102
        }
1103
        
1104
        /**
1105
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
1106
         * @param pt Punto a transformar
1107
         * @return punto transformado en coordenadas del mundo
1108
         */
1109
        public Point2D rasterToWorld(Point2D pt) {
1110
                Point2D p = new Point2D.Double();
1111
                getAffineTransform().transform(pt, p);
1112
                return p;
1113
        }
1114

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