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

History | View | Annotate | Download (39.5 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.Cancellable;
82
import org.gvsig.tools.task.TaskStatus;
83
/**
84
 * Clase que representa al driver de acceso a datos de wms.
85
 *
86
 * @author Nacho Brodin (nachobrodin@gmail.com)
87
 */
88
public class WMSProvider extends DefaultRasterProvider implements RemoteRasterProvider {
89
        public static String                NAME                     = "Wms Store";
90
        public static String                DESCRIPTION              = "Wms Raster file";
91
        public static final String          METADATA_DEFINITION_NAME = "WmsStore";
92
        private static final int            FIXED_SIZE               = 800;
93
        private Extent                      viewRequest              = null;
94
        private static Hashtable<String, WMSConnector>    
95
                                            drivers                  = new Hashtable<String, WMSConnector> ();
96
        private boolean                     open                     = false;
97
        private DataStoreTransparency       fileTransparency         = null;
98
        private final int                                        minTilePrintWidth        = 12;
99
        private final int                                        minTilePrintHeight       = 12;
100
        //The out size depends on the last request
101
        private int                         lastWidthRequest         = 0;
102
        private int                         lastHeightRequest        = 0;
103
        private Rectangle2D                 lastExtent               = null;
104
        //Only for fixed size. Complete extent and FIXED_SIZE in long side
105
        private File                        fileLayerPixelSize       = null;
106
        private File                        lastRequest              = null;
107
        private DefaultRasterProvider       lastRequestProvider      = null; 
108
        
109
        public static void register() {
110
                DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager();
111
                if (dataman != null && !dataman.getStoreProviders().contains(NAME)) {
112
                        dataman.registerStoreProvider(NAME,
113
                                        WMSProvider.class, WMSDataParametersImpl.class);
114
                }
115

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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