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

History | View | Annotate | Download (39.4 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.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
import java.util.Vector;
33

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

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

    
131
        }
132
        
133
        /**
134
         * Constructor. Abre el dataset.
135
         * @param proj Proyecci?n
136
         * @param fName Nombre del fichero
137
         * @throws NotSupportedExtensionException
138
         */
139
        public WMSProvider(String params) throws NotSupportedExtensionException {
140
                super(params);
141
                if(params instanceof String) {
142
                        WMSDataParameters p = new WMSDataParametersImpl();
143
                        p.setURI((String)params);
144
                        super.init(p, null, ToolsLocator.getDynObjectManager()
145
                                        .createDynObject(
146
                                                        MetadataLocator.getMetadataManager().getDefinition(
147
                                                                        DataStore.METADATA_DEFINITION_NAME)));
148
                        init(p, null);
149
                }
150
        }
151
        
152
        public WMSProvider(WMSDataParameters params,
153
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
154
                super(params, storeServices, ToolsLocator.getDynObjectManager()
155
                                .createDynObject(
156
                                                MetadataLocator.getMetadataManager().getDefinition(
157
                                                                DataStore.METADATA_DEFINITION_NAME)));
158
                init(params, storeServices);
159
        }
160
        
161
        /**
162
         * Gets the connector from the URL
163
         * @return
164
         * @throws RemoteServiceException
165
         */
166
        public WMSConnector getConnector() throws RemoteServiceException {
167
                WMSDataParameters p = (WMSDataParameters)parameters;
168
                URL url = null;
169
                try {
170
                        url = new URL(p.getURI());
171
                } catch (Exception e) {
172
                        throw new RemoteServiceException("Malformed URL",e);
173
                }
174
                try {
175
                        return WMSProvider.getConnectorFromURL(url);
176
                } catch (IOException e) {
177
                        throw new RemoteServiceException("Error getting the connector",e);
178
                }
179
        }
180
        
181
        /**
182
         * Crea las referencias al fichero y carga
183
         * las estructuras con la informaci?n y los metadatos.
184
         * @param proj Proyecci?n
185
         * @param param Parametros de carga
186
         * @throws NotSupportedExtensionException
187
         */
188
        public void init (DataStoreParameters params,
189
                        DataStoreProviderServices storeServices) throws NotSupportedExtensionException {
190
                setParam(storeServices, params);
191
                setDataType(new int[]{Buffer.TYPE_BYTE, Buffer.TYPE_BYTE, Buffer.TYPE_BYTE});
192
                bandCount = 3;
193
                open = true;
194
        }
195
        
196
        public static final WMSConnector getConnectorFromURL(URL url) throws IOException {
197
                WMSConnector drv = (WMSConnector) drivers.get(url.toString());
198
                if (drv == null) {
199
                        drv = new WMSConnector(url);
200
                        drivers.put(url.toString(), drv);
201
                }
202
                return drv;
203
        }
204
        
205
        /**
206
         * Obtiene el objeto que contiene que contiene la interpretaci?n de
207
         * color por banda
208
         * @return
209
         */
210
        public ColorInterpretation getColorInterpretation() {
211
                if(super.getColorInterpretation() == null) {
212
                        ColorInterpretation colorInterpretation = new DataStoreColorInterpretation();
213
                        colorInterpretation.initColorInterpretation(getBandCount());
214
                        colorInterpretation.setColorInterpValue(0, DataStoreColorInterpretation.RED_BAND);
215
                        colorInterpretation.setColorInterpValue(1, DataStoreColorInterpretation.GREEN_BAND);
216
                        colorInterpretation.setColorInterpValue(2, DataStoreColorInterpretation.BLUE_BAND);
217
                        setColorInterpretation(colorInterpretation);
218
                }
219
                return super.getColorInterpretation();
220
        }
221
        
222
        /*
223
         * (non-Javadoc)
224
         * @see org.gvsig.fmap.dal.coverage.dataset.RasterDataSet#getAffineTransform()
225
         */
226
        public AffineTransform getAffineTransform() {
227
                WMSDataParameters p = (WMSDataParameters)parameters;
228
                Extent e = getExtent();
229
                if(p.isSizeFixed()) {
230
                        double psX = e.width() / (p.getWidth() - 1);
231
                        double psY = -(e.height() / (p.getHeight() - 1));
232
                        ownTransformation = new AffineTransform(
233
                                        psX , 
234
                                        0, 
235
                                        0, 
236
                                        psY, 
237
                                        e.getULX() - (psX / 2),
238
                                        e.getULY() - (psY / 2));
239
                } else {
240
                        double psX = e.width() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest);
241
                        double psY = -(e.height() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest));
242
                        ownTransformation = new AffineTransform(
243
                                        psX, 
244
                                        0, 
245
                                        0, 
246
                                        psY, 
247
                                        e.getULX() - (psX / 2),
248
                                        e.getULY() - (psY / 2));
249
                        /*ownTransformation = new AffineTransform(
250
                                        p.getExtent().getWidth() / (lastWidthRequest <= 0 ? p.getWidth() : lastWidthRequest) , 
251
                                        0, 
252
                                        0, 
253
                                        -(p.getExtent().getHeight() / (lastHeightRequest <= 0 ? p.getHeight() : lastHeightRequest)), 
254
                                        p.getExtent().getMinX(),
255
                                        p.getExtent().getMinY());*/
256
                }
257
                externalTransformation = (AffineTransform) ownTransformation.clone();
258
                return ownTransformation;
259
        }
260
        
261
        /**
262
         * Calcula el extent en coordenadas del mundo real
263
         * @return Extent
264
         */
265
        public Extent getExtent() {
266
                WMSDataParameters p = (WMSDataParameters)parameters;
267
                Vector<?> layerNames = Utilities.createVector(p.getLayerQuery(), ",");
268
                
269
                String[] ln = new String[layerNames.size()];
270
                for (int i = 0; i < ln.length; i++) {
271
                        ln[i] = (String)layerNames.get(i);
272
                }
273
                Rectangle2D r = null;
274
                try {
275
                        r = getConnector().getLayersExtent(ln, p.getSRSCode());
276
                } catch (RemoteServiceException e) {
277
                }
278
                return new ExtentImpl(r.getMinX(), r.getMaxY(), r.getMaxX(), r.getMinY());
279
        }
280

    
281
        
282
        /*
283
         * (non-Javadoc)
284
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLayerExtent(java.lang.String, java.lang.String)
285
         */
286
        public Rectangle2D getLayerExtent(String layerName, String srs) throws RemoteServiceException {
287
                return getConnector().getLayersExtent(new String[]{layerName}, srs);
288
        }
289

    
290
        /*
291
         * (non-Javadoc)
292
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
293
         */
294
        public RasterProvider load() {
295
                return this;
296
        }
297
        
298
        /*
299
         * (non-Javadoc)
300
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
301
         */
302
        public boolean isOpen() {
303
                return open;
304
        }
305

    
306
        /*
307
         * (non-Javadoc)
308
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
309
         */
310
        public void close() {
311
                open = false;
312
        }
313
        
314
        /*
315
         * (non-Javadoc)
316
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
317
         */
318
        public Transparency getTransparency() {
319
                if(fileTransparency == null)
320
                        fileTransparency = new DataStoreTransparency();
321
                return fileTransparency;
322
        }
323

    
324
        /*
325
         * (non-Javadoc)
326
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
327
         */
328
        public String translateFileName(String fileName) {
329
                return fileName;
330
        }
331

    
332
        /*
333
         * (non-Javadoc)
334
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
335
         */
336
        public void setView(Extent e) {
337
                viewRequest = e;
338
        }
339

    
340
        /*
341
         * (non-Javadoc)
342
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
343
         */
344
        public Extent getView() {
345
                return viewRequest;
346
        }
347
        
348
        /*
349
         * (non-Javadoc)
350
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
351
         */
352
        public double getWidth() {
353
                WMSDataParameters p = (WMSDataParameters)parameters;
354
                if(p.isSizeFixed()) {
355
                        return p.getWidth();
356
                }
357
                if (lastWidthRequest <= 0) 
358
                        return p.getWidth();
359
                if (lastWidthRequest < minTilePrintWidth) 
360
                        return minTilePrintWidth;
361
                return lastWidthRequest;
362
        }
363

    
364
        /*
365
         * (non-Javadoc)
366
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
367
         */
368
        public double getHeight() {
369
                WMSDataParameters p = (WMSDataParameters)parameters;
370
                if(p.isSizeFixed()) {
371
                        return p.getHeight();
372
                }
373
                if (lastHeightRequest <= 0) 
374
                        return p.getHeight();
375
                if (lastHeightRequest < minTilePrintHeight) 
376
                        return minTilePrintHeight;
377
                return lastHeightRequest;
378
        }
379
        
380
        /**
381
         * Gets WMS parameters
382
         * @return
383
         */
384
        public WMSDataParameters getParameters() {
385
                return (WMSDataParameters)parameters;
386
        }
387

    
388
        /*
389
         * (non-Javadoc)
390
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
391
         */
392
        public Object readCompleteLine(int line, int band)
393
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
394
                return null;
395
        }
396
        
397
        /**
398
         * When the remote layer has fixed size this method downloads the file and return its reference. 
399
         * File layer has in the long side FIXED_SIZE pixels and the bounding box is complete. This file could be
400
         * useful to build an histogram or calculate statistics. This represents a sample of data.
401
         * @return
402
         * @throws RasterDriverException
403
         */
404
        public File getFileLayer() throws RasterDriverException {
405
                if(fileLayerPixelSize != null)
406
                        return fileLayerPixelSize;
407
                
408
                WMSDataParameters p = (WMSDataParameters)parameters;
409
                Extent e = getExtent();
410
                Rectangle2D bBox = new Rectangle2D.Double(e.getULX(), e.getLRY(), e.width(), e.height());
411
                WMSStatus wmsStatus = loadWMSStatus(bBox);
412
                
413
                if(!p.isSizeFixed()) {
414
                        int w = 0;
415
                        int h = 0;
416
                        if(e.width() > e.height()) {
417
                                w = FIXED_SIZE;
418
                                h = (int)((e.height() * FIXED_SIZE) / e.width());
419
                        } else {
420
                                h = FIXED_SIZE;
421
                                w = (int)((e.width() * FIXED_SIZE) / e.height());
422
                        }
423
                        wmsStatus.setWidth(w);
424
                        wmsStatus.setHeight(h);
425
                        fileLayerPixelSize = downloadFile(wmsStatus, e.getULX(), e.getULY(), e.getLRX(), e.getLRY(), w, h);
426
                } else {
427
                        fileLayerPixelSize = downloadFile(wmsStatus, e.getULX(), e.getULY(), e.getLRX(), e.getLRY(), 
428
                                        p.getFixedSize().width, p.getFixedSize().height);
429
                }
430
                return fileLayerPixelSize;
431
        }
432

    
433
        /**
434
         * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
435
         * to read a file very fast without setting a view. In a WMS service when the size is fixed then it will read the
436
         * entire image but when the source hasn't pixel size it will read a sample of data. This set of data will have
437
         * the size defined in FIXED_SIZE. 
438
         * 
439
         * @param pos Posici?n donde se empieza  a leer
440
         * @param blockHeight Altura m?xima del bloque leido
441
         * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
442
         * @throws InvalidSetViewException
443
         * @throws FileNotOpenException
444
         * @throws RasterDriverException
445
         */
446
        public Object readBlock(int pos, int blockHeight, double scale) 
447
        throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
448
                File lastFile = getFileLayer();
449
                BandList bandList = new BandListImpl();
450
                for (int i = 0; i < 3; i++) {
451
                        try {
452
                                bandList.addBand(new DatasetBandImpl(lastFile.getPath(), pos, Buffer.TYPE_BYTE, 3), pos);
453
                        } catch (BandNotFoundInListException e1) {
454
                        }
455
                }
456
                bandList.setDrawableBands(new int[]{0, 1, 2});
457

    
458
                try {
459
                        lastRequestProvider = openLastRequest();
460
                        return lastRequestProvider.readBlock(pos, blockHeight, scale);
461
                } catch (ProviderNotRegisteredException exc) {
462
                        throw new RasterDriverException("Error building GdalDriver", exc);
463
                } catch (InitializeException exc) {
464
                        throw new RasterDriverException("Error building GdalDriver", exc);
465
                }
466
        }
467
        
468
        /*
469
         * (non-Javadoc)
470
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequestHeight()
471
         */
472
        public double getLastRequestHeight() throws RasterDriverException {
473
                if(lastRequestProvider == null) {
474
                        try {
475
                                lastRequestProvider = openLastRequest();
476
                        } catch (ProviderNotRegisteredException e) {
477
                                throw new RasterDriverException("Error building GdalDriver", e);
478
                        } catch (InitializeException e) {
479
                                throw new RasterDriverException("Error building GdalDriver", e);
480
                        }
481
                }
482
                return lastRequestProvider.getHeight();
483
        }
484
        
485
        /*
486
         * (non-Javadoc)
487
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequestWidth()
488
         */
489
        public double getLastRequestWidth() throws RasterDriverException {
490
                if(lastRequestProvider == null) {
491
                        try {
492
                                lastRequestProvider = openLastRequest();
493
                        } catch (ProviderNotRegisteredException e) {
494
                                throw new RasterDriverException("Error building GdalDriver", e);
495
                        } catch (InitializeException e) {
496
                                throw new RasterDriverException("Error building GdalDriver", e);
497
                        }
498
                }
499
                return lastRequestProvider.getWidth();
500
        }
501
        
502
        /*
503
         * (non-Javadoc)
504
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLastRequest()
505
         */
506
        public File getLastRequest() {
507
                return lastRequest;
508
        }
509
        
510
        /*
511
         * (non-Javadoc)
512
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getBufferLastRequest()
513
         */
514
        public Buffer getBufferLastRequest() throws ProcessInterruptedException, RasterDriverException {
515
                try {
516
                        lastRequestProvider = openLastRequest();
517
                        
518
                        BandList bandList = new BandListImpl();
519
                        for (int i = 0; i < lastRequestProvider.getBandCount(); i++) {
520
                                try {
521
                                        bandList.addBand(new DatasetBandImpl(lastRequest.getPath(), i, Buffer.TYPE_BYTE, 3), i);
522
                                } catch (BandNotFoundInListException e1) {
523
                                }
524
                        }
525
                        bandList.setDrawableBands(new int[]{0, 1, 2});
526
                        Buffer newBuffer = DefaultRasterManager.getInstance().createBuffer(lastRequestProvider.getDataType()[0], (int)lastRequestProvider.getWidth(), (int)lastRequestProvider.getHeight(), lastRequestProvider.getBandCount(), true);
527
                        
528
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
529
                        q.setAreaOfInterest(lastRequestProvider.getExtent(), 
530
                                        (int)lastRequestProvider.getWidth(), 
531
                                        (int)lastRequestProvider.getHeight());
532
                        q.setBandList(bandList);
533
                        q.setBuffer(newBuffer);
534
                        q.setAdjustToExtent(true);
535
                        
536
                        return lastRequestProvider.getDataSet(q);
537
                } catch (ProviderNotRegisteredException e) {
538
                        throw new RasterDriverException("Error building GdalDriver", e);
539
                } catch (InitializeException e) {
540
                        throw new RasterDriverException("Error building GdalDriver", e);
541
                }
542
        }
543
        
544
        /**
545
         * Opens the last request downloaded
546
         * @return
547
         * @throws ProviderNotRegisteredException
548
         * @throws InitializeException
549
         * @throws RasterDriverException
550
         */
551
        private DefaultRasterProvider openLastRequest() throws ProviderNotRegisteredException, InitializeException, RasterDriverException {
552
                if(lastRequestProvider != null)
553
                        lastRequestProvider.close();
554
                File lastFile = getFileLayer();
555
                lastRequestProvider = DefaultProviderServices.loadProvider(new File(lastFile.getPath()));
556
                return lastRequestProvider;
557
        }
558

    
559
        /*
560
         * (non-Javadoc)
561
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int)
562
         */
563
        public Object getData(int x, int y, int band)
564
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
565
                return null;
566
        }
567
        
568
        /**
569
         * Gets the georeferencing file name form a raster file
570
         * @param file
571
         * a raster file
572
         * @return
573
         * a georeferencing file
574
         */
575
        private String getWorldFile(String file){                
576
                String worldFile = file;
577
                int index = file.lastIndexOf(".");
578
                if (index > 0){                        
579
                        worldFile = file.substring(0, index) + getExtensionWorldFile();
580
                }
581
                return worldFile;
582
        }
583
        
584
        /**
585
         * Obtiene la extensi?n del fichero de georreferenciaci?n
586
         * @return String con la extensi?n del fichero de georreferenciaci?n dependiendo
587
         * del valor del formato obtenido del servidor. Por defecto asignaremos un .wld
588
         */
589
        private String getExtensionWorldFile() {
590
                WMSDataParameters p = (WMSDataParameters)parameters;
591
                String extWorldFile = ".wld";
592
                if(p.getFormat().equals("image/tif") || p.getFormat().equals("image/tiff")) {
593
                        extWorldFile = ".tfw";
594
                }
595
                return extWorldFile;
596
        }
597
        
598
        public WMSStatus loadWMSStatus(Rectangle2D bBox) {
599
                lastExtent = bBox;
600
                WMSDataParameters p = (WMSDataParameters)parameters;
601
                WMSStatus wmsStatus = new WMSStatus();
602
                wmsStatus.setLayerNames(Utilities.createVector(p.getLayerQuery(), ","));
603
                wmsStatus.setSrs(p.getSRSCode());
604
                wmsStatus.setFormat(p.getFormat());
605
                wmsStatus.setStyles(p.getStyles());
606
                wmsStatus.setDimensions(p.getDimensions());
607
                wmsStatus.setTransparency(p.isWmsTransparent());
608
                wmsStatus.setOnlineResource((String) p.getOnlineResource().get("GetMap"));
609
                if(p.isSizeFixed()) {
610
                        wmsStatus.setExtent(getExtent().toRectangle2D());
611
                } else
612
                        wmsStatus.setExtent(bBox);
613
                wmsStatus.setHeight(p.getHeight());
614
                wmsStatus.setWidth(p.getWidth());
615
                return wmsStatus;
616
        }
617
        
618
        /**
619
         * This function downloads the file and creates the georeferencing file
620
         * @param wmsStatus
621
         * @param ulx
622
         * @param uly
623
         * @param lrx
624
         * @param lry
625
         * @param w
626
         * @param h
627
         * @return
628
         * @throws RasterDriverException
629
         */
630
        private File downloadFile(WMSStatus wmsStatus, double ulx, double uly, double lrx, double lry, int w, int h) throws RasterDriverException {
631
                WMSDataParameters p = (WMSDataParameters)parameters;
632
                try {
633
                        lastRequest = getConnector().getMap(wmsStatus, ((WMSDataParameters)parameters).getCancellable());
634
                } catch (RemoteServiceException e) {
635
                        throw new RasterDriverException(e.getMessage(), e);
636
                }
637
                
638
                if(lastRequest == null)
639
                        return null;
640
                
641
                String nameWorldFile = getWorldFile(lastRequest.getPath());
642
                try {
643
                        if(p.isSizeFixed()) {
644
                                Extent e = getExtent();
645
                                fileUtil.createWorldFile(nameWorldFile, e, p.getWidth(), p.getHeight());
646
                        } else {
647
                                fileUtil.createWorldFile(nameWorldFile, new ExtentImpl(ulx, uly, lrx, lry), w, h);
648
                        }
649
                } catch (IOException e) {
650
                        throw new RasterDriverException("Error creating world file", e);
651
                }
652

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

    
705
                Buffer raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, 3, true);
706
                getWindow(ex, bufWidth, bufHeight, bandList, raster, true, status);
707
                raster.setDataExtent(ex.toRectangle2D());
708

    
709
                TileCacheManager m = TileCacheLocator.getManager();
710
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
711
                t.setData(new Object[]{raster});
712
                t.setUl(new Point2D.Double(ex.getULX(), ex.getULY()));
713
                t.setLr(new Point2D.Double(ex.getLRX(), ex.getLRY()));
714
                t.setDownloaderParams("AffineTransform", getAffineTransform());
715
                t.setDownloaderParams("Tiling", new Boolean(false));
716
                try {
717
                        listener.tileReady(t);
718
                } catch (TileGettingException e) {
719
                        throw new RasterDriverException("Error throwing a tile", e);
720
                }
721

    
722
                //listener.nextBuffer(raster, null, new ExtentImpl(minX, minY, maxX, maxY), getAffineTransform(), null, false);
723
                listener.endReading();
724
        }
725

    
726
        /*
727
         * (non-Javadoc)
728
         * @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)
729
         */
730
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
731
                throws ProcessInterruptedException, RasterDriverException {
732
                Rectangle2D bBox = ex.toRectangle2D();
733
                lastWidthRequest = rasterBuf.getWidth();
734
                lastHeightRequest = rasterBuf.getHeight();
735
                WMSStatus wmsStatus = loadWMSStatus(bBox);
736
                
737
                lastRequest = downloadFile(wmsStatus, ex.getULX(), ex.getULY(), ex.getLRX(), ex.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
738
                
739
                if (lastRequest == null) {
740
                        return rasterBuf;
741
                }
742
                
743
                try {
744
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
745
                        String serverName = bandList.getBand(0).getFileName();
746
                        for (int i = 0; i < bandList.getBandCount(); i++) {
747
                                bandList.getBand(i).setFileName(lastRequest.getPath());
748
                        }
749
                        
750
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
751
                        
752
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
753
                        q.setAreaOfInterest(ex);
754
                        q.setBandList(bandList);
755
                        q.setBuffer(rasterBuf);
756
                        Buffer buf = driver.getDataSet(q);
757
                        
758
                        for (int i = 0; i < bandList.getBandCount(); i++) {
759
                                bandList.getBand(i).setFileName(serverName);
760
                        }
761
                        driver.close();
762
                        return buf;
763
                } catch (ProviderNotRegisteredException e) {
764
                        throw new RasterDriverException("Error building GdalDriver", e);
765
                } catch (InitializeException e) {
766
                        throw new RasterDriverException("Error building GdalDriver", e);
767
                }
768
        }
769

    
770
        /*
771
         * (non-Javadoc)
772
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
773
         */
774
        public Buffer getWindow(double ulx, double uly, double w, double h, 
775
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
776
                Rectangle2D bBox = new Rectangle2D.Double(ulx, uly, w, h);
777
                lastWidthRequest = rasterBuf.getWidth();
778
                lastHeightRequest = rasterBuf.getHeight();
779
                WMSStatus wmsStatus = loadWMSStatus(bBox);
780
                
781
                lastRequest = downloadFile(wmsStatus, ulx, uly, ulx + w, uly - h, rasterBuf.getWidth(), rasterBuf.getHeight());
782
                
783
                if (lastRequest == null) {
784
                        return rasterBuf;
785
                }
786
                
787
                try {
788
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
789
                        String serverName = bandList.getBand(0).getFileName();
790
                        for (int i = 0; i < bandList.getBandCount(); i++) {
791
                                bandList.getBand(i).setFileName(lastRequest.getPath());
792
                        }
793
                        
794
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
795
                        
796
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
797
                        q.setAreaOfInterest(ulx, uly, w, h);
798
                        q.setBandList(bandList);
799
                        q.setBuffer(rasterBuf);
800
                        q.setAdjustToExtent(adjustToExtent);
801
                        
802
                        Buffer buf = driver.getDataSet(q);
803
                        
804
                        for (int i = 0; i < bandList.getBandCount(); i++) {
805
                                bandList.getBand(i).setFileName(serverName);
806
                        }
807
                        
808
                        return buf;
809
                } catch (ProviderNotRegisteredException e) {
810
                        throw new RasterDriverException("Error building GdalDriver", e);
811
                } catch (InitializeException e) {
812
                        throw new RasterDriverException("Error building GdalDriver", e);
813
                }
814
        }
815

    
816
        /*
817
         * (non-Javadoc)
818
         * @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)
819
         */
820
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
821
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
822
                Rectangle2D bBox = extent.toRectangle2D();//new Rectangle2D.Double(ulx, lry, Math.abs(lrx - ulx), Math.abs(lry - uly));
823
                lastWidthRequest = rasterBuf.getWidth();
824
                lastHeightRequest = rasterBuf.getHeight();
825
                WMSStatus wmsStatus = loadWMSStatus(bBox);
826
                lastRequest = downloadFile(wmsStatus, extent.getULX(), extent.getULY(), extent.getLRX(), extent.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
827
                
828
                if (lastRequest == null) {
829
                        return rasterBuf;
830
                }
831
                
832
                try {
833
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
834
                        String serverName = bandList.getBand(0).getFileName();
835
                        for (int i = 0; i < bandList.getBandCount(); i++) {
836
                                bandList.getBand(i).setFileName(lastRequest.getPath());
837
                        }
838
                        
839
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
840
                        
841
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
842
                        q.setAreaOfInterest(extent, bufWidth, bufHeight);
843
                        q.setBandList(bandList);
844
                        q.setBuffer(rasterBuf);
845
                        q.setAdjustToExtent(adjustToExtent);
846
                        Buffer buf = driver.getDataSet(q);
847

    
848
                        for (int i = 0; i < bandList.getBandCount(); i++) {
849
                                bandList.getBand(i).setFileName(serverName);
850
                        }
851
                        
852
                        return buf;
853
                } catch (ProviderNotRegisteredException e) {
854
                        throw new RasterDriverException("Error building GdalDriver", e);
855
                } catch (InitializeException e) {
856
                        throw new RasterDriverException("Error building GdalDriver", e);
857
                }
858
        }
859

    
860
        /*
861
         * (non-Javadoc)
862
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
863
         */
864
//        public Buffer getWindow(int x, int y, 
865
//                        BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
866
//                int w = rasterBuf.getWidth();
867
//                int h = rasterBuf.getHeight();
868
//                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
869
//                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
870
//                lastWidthRequest = rasterBuf.getWidth();
871
//                lastHeightRequest = rasterBuf.getHeight();
872
//                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
873
//                WMSStatus wmsStatus = loadWMSStatus(bBox);
874
//                
875
//                lastRequest = downloadFile(wmsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
876
//                
877
//                if (lastRequest == null) {
878
//                        return rasterBuf;
879
//                }
880
//
881
//                DefaultRasterProvider driver = null;
882
//                try {
883
//                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
884
//                        String serverName = bandList.getBand(0).getFileName();
885
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
886
//                                bandList.getBand(i).setFileName(lastRequest.getPath());
887
//                        }
888
//                        
889
//                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
890
//                        Buffer buf = driver.getWindow(0, 0, w, h, bandList, rasterBuf);
891
//
892
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
893
//                                bandList.getBand(i).setFileName(serverName);
894
//                        }
895
//                        
896
//                        return buf;
897
//                } catch (ProviderNotRegisteredException e) {
898
//                        throw new RasterDriverException("Error building GdalDriver", e);
899
//                } catch (InitializeException e) {
900
//                        throw new RasterDriverException("Error building GdalDriver", e);
901
//                }
902
//        }
903

    
904
        /*
905
         * (non-Javadoc)
906
         * @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)
907
         */
908
        public Buffer getWindow(int x, int y, int w, int h, 
909
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
910
                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
911
                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
912
                lastWidthRequest = rasterBuf.getWidth();
913
                lastHeightRequest = rasterBuf.getHeight();
914
                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
915
                WMSStatus wmsStatus = loadWMSStatus(bBox);
916
                
917
                lastRequest = downloadFile(wmsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
918
                
919
                if (lastRequest == null) {
920
                        return rasterBuf;
921
                }
922

    
923
                DefaultRasterProvider driver = null;
924
                try {
925
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
926
                        String serverName = bandList.getBand(0).getFileName();
927
                        for (int i = 0; i < bandList.getBandCount(); i++) {
928
                                bandList.getBand(i).setFileName(lastRequest.getPath());
929
                        }
930
                        
931
                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
932
                        
933
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
934
                        q.setAreaOfInterest(0, 0, w, h);
935
                        q.setBandList(bandList);
936
                        q.setBuffer(rasterBuf);
937
                        Buffer buf = driver.getDataSet(q);
938

    
939
                        for (int i = 0; i < bandList.getBandCount(); i++) {
940
                                bandList.getBand(i).setFileName(serverName);
941
                        }
942
                        
943
                        return buf;
944
                } catch (ProviderNotRegisteredException e) {
945
                        throw new RasterDriverException("Error building GdalDriver", e);
946
                } catch (InitializeException e) {
947
                        throw new RasterDriverException("Error building GdalDriver", e);
948
                }
949
        }
950

    
951
        /*
952
         * (non-Javadoc)
953
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
954
         */
955
        public int getBlockSize() {
956
                return 0;
957
        }
958

    
959
        /*
960
         * (non-Javadoc)
961
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
962
         */
963
        public void setAffineTransform(AffineTransform t){
964
                
965
        }
966

    
967
        /*
968
         * (non-Javadoc)
969
         * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int)
970
         */
971
        public int getOverviewCount(int band) throws BandAccessException, RasterDriverException {
972
                return 0;
973
        }
974

    
975
        /*
976
         * (non-Javadoc)
977
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int)
978
         */
979
        public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException {
980
                return 0;
981
        }
982

    
983
        /*
984
         * (non-Javadoc)
985
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
986
         */
987
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
988
                return 0;
989
        }
990

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

    
999
        /*
1000
         * (non-Javadoc)
1001
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
1002
         */
1003
        public boolean isReproyectable() {
1004
                return false;
1005
        }
1006

    
1007
        /*
1008
         * (non-Javadoc)
1009
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
1010
         */
1011
        public String getName() {
1012
                return NAME;
1013
        }
1014
        
1015
        /**
1016
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
1017
         * @param pt Punto a transformar
1018
         * @return punto transformado en coordenadas del mundo
1019
         */
1020
        public Point2D rasterToWorld(Point2D pt) {
1021
                Point2D p = new Point2D.Double();
1022
                getAffineTransform().transform(pt, p);
1023
                return p;
1024
        }
1025

    
1026
        /**
1027
         * Convierte un punto desde del mundo a coordenadas pixel.
1028
         * @param pt Punto a transformar
1029
         * @return punto transformado en coordenadas pixel
1030
         */
1031
        public Point2D worldToRaster(Point2D pt) {
1032
                Point2D p = new Point2D.Double();
1033
                try {
1034
                        getAffineTransform().inverseTransform(pt, p);
1035
                } catch (NoninvertibleTransformException e) {
1036
                        return pt;
1037
                }
1038
                return p;
1039
        }
1040
        
1041
        /*
1042
         * (non-Javadoc)
1043
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
1044
         */
1045
        public void setStatus(RasterProvider provider) {
1046
                if(provider instanceof WMSProvider) {
1047
                }
1048
        }
1049
        
1050
        /**
1051
         * ASigna el par?metro de inicializaci?n del driver.
1052
         */
1053
        public void setParam(DataStoreProviderServices storeServices, DataStoreParameters param) {
1054
                if(param instanceof WMSDataParameters)
1055
                        this.uri = ((WMSDataParameters)param).getURI();
1056
                this.param = param;
1057
        }
1058
        
1059
        /**
1060
     * @param wmsStatus
1061
     * @param i
1062
     * @param j
1063
     * @param max_value
1064
     * @return
1065
     * @throws RemoteServiceException
1066
     */
1067
    public String getFeatureInfo(int i, int j, int max_value, ICancellable cancellable) throws RemoteServiceException {
1068
            WMSStatus wmsStatus = loadWMSStatus(lastExtent);
1069
            return getConnector().getFeatureInfo(wmsStatus, i, j, max_value, cancellable);
1070
    }
1071
    
1072
    /*
1073
         * (non-Javadoc)
1074
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInfoByPoint(double, double)
1075
         */
1076
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
1077
                return getFeatureInfo((int) x, (int) y, Integer.MAX_VALUE, cancellable);
1078
        }
1079
        
1080
        /**
1081
         * Gets the suffix of the downloaded image
1082
         * @return
1083
         */
1084
        public String getFileSuffix() {
1085
                WMSDataParameters p = (WMSDataParameters)parameters;
1086
                String format = p.getFormat();
1087
                if (format == null){
1088
                        return "xml";
1089
                }
1090
                if (format.indexOf("png") >= 0){
1091
                return "png";
1092
                }        
1093
            if (format.indexOf("xml") >= 0){
1094
                return "xml";
1095
            }        
1096
            if (format.indexOf("gif") >= 0){
1097
                return "gif";
1098
            }
1099
            if (format.indexOf("tif") >= 0){
1100
                return "tif";
1101
            }
1102
            if (format.indexOf("bmp") >= 0){
1103
                return "bmp";
1104
            }
1105
            if (format.indexOf("jpg") >= 0
1106
                || format.indexOf("jpeg") >= 0){
1107
                return "jpg";                         
1108
            }
1109
                return "xml";
1110
        }
1111
        
1112
        /*
1113
         * (non-Javadoc)
1114
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
1115
         */
1116
        public TileServer getTileServer() {
1117
                if(tileServer == null) {
1118
                        tileServer = new WMSTileServer(this);
1119
                }
1120
                return tileServer;
1121
        }
1122
        
1123
        /*
1124
         * (non-Javadoc)
1125
         * @see org.gvsig.raster.impl.provider.RasterProvider#isRasterEnclosed()
1126
         */
1127
        public boolean isRasterEnclosed() {
1128
                WMSDataParameters p = (WMSDataParameters)parameters;
1129
                if(p.isSizeFixed()) {
1130
                        return false;
1131
                }
1132
                return true;
1133
        }
1134
        
1135
        /*
1136
         * (non-Javadoc)
1137
         * @see org.gvsig.raster.impl.provider.RasterProvider#getRMFFile()
1138
         */
1139
        public String getRMFFile() {
1140
                if(lastRequest != null)
1141
                        return fileUtil.getNameWithoutExtension(lastRequest.getAbsolutePath()) + ".rmf";
1142
                return null;
1143
        }
1144
        
1145
        /*
1146
         * (non-Javadoc)
1147
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#getHistogramComputer()
1148
         */
1149
        public HistogramComputer getHistogramComputer() throws HistogramException, InterruptedException {
1150
                if (histogram == null)
1151
                        histogram = new RemoteStoreHistogram(this);
1152
                return histogram;
1153
        }
1154
}