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

History | View | Annotate | Download (43.6 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.wms.io;
23

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

    
35
import javax.swing.ImageIcon;
36

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

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

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

    
365
        
366
        /*
367
         * (non-Javadoc)
368
         * @see org.gvsig.raster.impl.provider.RemoteRasterProvider#getLayerExtent(java.lang.String, java.lang.String)
369
         */
370
        public Rectangle2D getLayerExtent(String layerName, String srs) throws RemoteServiceException {
371
                return getConnector().getLayersExtent(new String[]{layerName}, srs);
372
        }
373

    
374
        /*
375
         * (non-Javadoc)
376
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load()
377
         */
378
        public RasterProvider load() {
379
                return this;
380
        }
381
        
382
        /*
383
         * (non-Javadoc)
384
         * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen()
385
         */
386
        public boolean isOpen() {
387
                return open;
388
        }
389

    
390
        /*
391
         * (non-Javadoc)
392
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close()
393
         */
394
        public void close() {
395
                open = false;
396
        }
397
        
398
        /*
399
         * (non-Javadoc)
400
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency()
401
         */
402
        public Transparency getTransparency() {
403
                if(fileTransparency == null)
404
                        fileTransparency = new DataStoreTransparency();
405
                return fileTransparency;
406
        }
407

    
408
        /*
409
         * (non-Javadoc)
410
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String)
411
         */
412
        public String translateFileName(String fileName) {
413
                return fileName;
414
        }
415

    
416
        /*
417
         * (non-Javadoc)
418
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setView(org.gvsig.fmap.dal.coverage.datastruct.Extent)
419
         */
420
        public void setView(Extent e) {
421
                viewRequest = e;
422
        }
423

    
424
        /*
425
         * (non-Javadoc)
426
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView()
427
         */
428
        public Extent getView() {
429
                return viewRequest;
430
        }
431
        
432
        /*
433
         * (non-Javadoc)
434
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth()
435
         */
436
        public double getWidth() {
437
                WMSDataParameters p = (WMSDataParameters)parameters;
438
                if(p.isSizeFixed()) {
439
                        return p.getWidth();
440
                }
441
                if (lastWidthRequest <= 0) 
442
                        return p.getWidth();
443
                if (lastWidthRequest < minTilePrintWidth) 
444
                        return minTilePrintWidth;
445
                return lastWidthRequest;
446
        }
447

    
448
        /*
449
         * (non-Javadoc)
450
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight()
451
         */
452
        public double getHeight() {
453
                WMSDataParameters p = (WMSDataParameters)parameters;
454
                if(p.isSizeFixed()) {
455
                        return p.getHeight();
456
                }
457
                if (lastHeightRequest <= 0) 
458
                        return p.getHeight();
459
                if (lastHeightRequest < minTilePrintHeight) 
460
                        return minTilePrintHeight;
461
                return lastHeightRequest;
462
        }
463
        
464
        /**
465
         * Gets WMS parameters
466
         * @return
467
         */
468
        public WMSDataParameters getParameters() {
469
                return (WMSDataParameters)parameters;
470
        }
471

    
472
        /*
473
         * (non-Javadoc)
474
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#readCompleteLine(int, int)
475
         */
476
        public Object readCompleteLine(int line, int band)
477
                throws InvalidSetViewException, FileNotOpenException, RasterDriverException {
478
                return null;
479
        }
480
        
481
        /**
482
         * When the remote layer has fixed size this method downloads the file and return its reference. 
483
         * File layer has in the long side FIXED_SIZE pixels and the bounding box is complete. This file could be
484
         * useful to build an histogram or calculate statistics. This represents a sample of data.
485
         * @return
486
         * @throws RasterDriverException
487
         */
488
        public File getFileLayer() throws RasterDriverException {
489
                if(fileLayerPixelSize != null)
490
                        return fileLayerPixelSize;
491
                
492
                WMSDataParameters p = (WMSDataParameters)parameters;
493
                Extent e = getExtent();
494
                Rectangle2D bBox = new Rectangle2D.Double(e.getULX(), e.getLRY(), e.width(), e.height());
495
                WMSStatus wmsStatus = loadWMSStatus(bBox);
496
                
497
                if(!p.isSizeFixed()) {
498
                        int w = 0;
499
                        int h = 0;
500
                        if(e.width() > e.height()) {
501
                                w = FIXED_SIZE;
502
                                h = (int)((e.height() * FIXED_SIZE) / e.width());
503
                        } else {
504
                                h = FIXED_SIZE;
505
                                w = (int)((e.width() * FIXED_SIZE) / e.height());
506
                        }
507
                        wmsStatus.setWidth(w);
508
                        wmsStatus.setHeight(h);
509
                        fileLayerPixelSize = downloadFile(wmsStatus, e.getULX(), e.getULY(), e.getLRX(), e.getLRY(), w, h);
510
                } else {
511
                        fileLayerPixelSize = downloadFile(wmsStatus, e.getULX(), e.getULY(), e.getLRX(), e.getLRY(), 
512
                                        p.getFixedSize().width, p.getFixedSize().height);
513
                }
514
                return fileLayerPixelSize;
515
        }
516

    
517
        /**
518
         * Reads a complete block of data and returns an tridimensional array of the right type. This function is useful
519
         * to read a file very fast without setting a view. In a WMS service when the size is fixed then it will read the
520
         * entire image but when the source hasn't pixel size it will read a sample of data. This set of data will have
521
         * the size defined in FIXED_SIZE. 
522
         * 
523
         * @param pos Posici?n donde se empieza  a leer
524
         * @param blockHeight Altura m?xima del bloque leido
525
         * @return Object que es un array tridimendional del tipo de datos del raster. (Bandas X Filas X Columnas)
526
         * @throws InvalidSetViewException
527
         * @throws FileNotOpenException
528
         * @throws RasterDriverException
529
         */
530
        public Object readBlock(int pos, int blockHeight, double scale) 
531
        throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException {
532
                File lastFile = getFileLayer();
533
                BandList bandList = new BandListImpl();
534
                for (int i = 0; i < 3; i++) {
535
                        try {
536
                                bandList.addBand(new DatasetBandImpl(lastFile.getPath(), pos, Buffer.TYPE_BYTE, 3), pos);
537
                        } catch (BandNotFoundInListException e1) {
538
                        }
539
                }
540
                bandList.setDrawableBands(new int[]{0, 1, 2});
541

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

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

    
739
                return lastRequest;
740
        }
741
        
742
        /**
743
         * Assigns the list of bands RGB and read a window of data
744
         * @param rasterBuf
745
         * @param bandList
746
         * @param lastFile
747
         * @param ulx
748
         * @param uly
749
         * @param lrx
750
         * @param lry
751
         * @return
752
         * @throws RasterDriverException
753
         * @throws ProcessInterruptedException
754
         */
755
        public Buffer getBuffer(Buffer rasterBuf, BandList bandList, File lastFile, 
756
                        double ulx, double uly, double lrx, double lry) throws RasterDriverException, ProcessInterruptedException {
757
                try {
758
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
759
                        String serverName = bandList.getBand(0).getFileName();
760
                        for (int i = 0; i < bandList.getBandCount(); i++) {
761
                                bandList.getBand(i).setFileName(lastFile.getPath());
762
                        }
763
                        
764
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastFile.getPath()));
765
                        setColorTable(driver.getColorTable());
766
                        
767
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
768
                        q.setAreaOfInterest(new ExtentImpl(ulx, uly, lrx, lry));
769
                        q.setBandList(bandList);
770
                        q.setBuffer(rasterBuf);
771
                        Buffer buf = driver.getDataSet(q);
772
                        
773
                        for (int i = 0; i < bandList.getBandCount(); i++) {
774
                                bandList.getBand(i).setFileName(serverName);
775
                        }
776
                        
777
                        return buf;
778
                } catch (ProviderNotRegisteredException e) {
779
                        throw new RasterDriverException("Error building GdalDriver", e);
780
                } catch (InitializeException e) {
781
                        throw new RasterDriverException("Error building GdalDriver", e);
782
                }
783
        }
784
        
785
        /*
786
         * (non-Javadoc)
787
         * @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)
788
         */
789
        public void getWindow(Extent ex, int bufWidth, int bufHeight, 
790
                        BandList bandList, TileListener listener, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
791

    
792
                Buffer raster = DefaultRasterManager.getInstance().createBuffer(getDataType()[0], bufWidth, bufHeight, 3, true);
793
                getWindow(ex, bufWidth, bufHeight, bandList, raster, true, null);
794
                raster.setDataExtent(ex.toRectangle2D());
795

    
796
                TileCacheManager m = TileCacheLocator.getManager();
797
                org.gvsig.raster.cache.tile.Tile t = m.createTile(-1, 0, 0);
798
                t.setData(new Object[]{raster});
799
                t.setUl(new Point2D.Double(ex.getULX(), ex.getULY()));
800
                t.setLr(new Point2D.Double(ex.getLRX(), ex.getLRY()));
801
                t.setDownloaderParams("AffineTransform", getAffineTransform());
802
                t.setDownloaderParams("Tiling", new Boolean(false));
803
                try {
804
                        listener.tileReady(t);
805
                } catch (TileGettingException e) {
806
                        throw new RasterDriverException("Error throwing a tile", e);
807
                }
808

    
809
                //listener.nextBuffer(raster, null, new ExtentImpl(minX, minY, maxX, maxY), getAffineTransform(), null, false);
810
                listener.endReading();
811
        }
812

    
813
        /*
814
         * (non-Javadoc)
815
         * @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)
816
         */
817
        public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf, TaskStatus status) 
818
                throws ProcessInterruptedException, RasterDriverException {
819
                Rectangle2D bBox = ex.toRectangle2D();
820
                lastWidthRequest = rasterBuf.getWidth();
821
                lastHeightRequest = rasterBuf.getHeight();
822
                WMSStatus wmsStatus = loadWMSStatus(bBox);
823
                
824
                lastRequest = downloadFile(wmsStatus, ex.getULX(), ex.getULY(), ex.getLRX(), ex.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
825
                
826
                if (lastRequest == null) {
827
                        return rasterBuf;
828
                }
829
                
830
                try {
831
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
832
                        String serverName = bandList.getBand(0).getFileName();
833
                        for (int i = 0; i < bandList.getBandCount(); i++) {
834
                                bandList.getBand(i).setFileName(lastRequest.getPath());
835
                        }
836
                        
837
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
838
                        setColorTable(driver.getColorTable());
839
                        
840
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
841
                        q.setAreaOfInterest(ex);
842
                        q.setBandList(bandList);
843
                        q.setBuffer(rasterBuf);
844
                        Buffer buf = driver.getDataSet(q);
845
                        
846
                        for (int i = 0; i < bandList.getBandCount(); i++) {
847
                                bandList.getBand(i).setFileName(serverName);
848
                        }
849
                        driver.close();
850
                        return buf;
851
                } catch (ProviderNotRegisteredException e) {
852
                        throw new RasterDriverException("Error building GdalDriver", e);
853
                } catch (InitializeException e) {
854
                        throw new RasterDriverException("Error building GdalDriver", e);
855
                }
856
        }
857

    
858
        /*
859
         * (non-Javadoc)
860
         * @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)
861
         */
862
        public Buffer getWindow(double ulx, double uly, double w, double h, 
863
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
864
                Rectangle2D bBox = new Rectangle2D.Double(ulx, uly, w, h);
865
                lastWidthRequest = rasterBuf.getWidth();
866
                lastHeightRequest = rasterBuf.getHeight();
867
                WMSStatus wmsStatus = loadWMSStatus(bBox);
868
                
869
                lastRequest = downloadFile(wmsStatus, ulx, uly, ulx + w, uly - h, rasterBuf.getWidth(), rasterBuf.getHeight());
870
                
871
                if (lastRequest == null) {
872
                        return rasterBuf;
873
                }
874
                
875
                try {
876
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
877
                        String serverName = bandList.getBand(0).getFileName();
878
                        for (int i = 0; i < bandList.getBandCount(); i++) {
879
                                bandList.getBand(i).setFileName(lastRequest.getPath());
880
                        }
881
                        
882
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
883
                        setColorTable(driver.getColorTable());
884
                        
885
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
886
                        q.setAreaOfInterest(ulx, uly, w, h);
887
                        q.setBandList(bandList);
888
                        q.setBuffer(rasterBuf);
889
                        q.setAdjustToExtent(adjustToExtent);
890
                        
891
                        Buffer buf = driver.getDataSet(q);
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(org.gvsig.fmap.dal.coverage.datastruct.Extent, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean)
908
         */
909
        public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, 
910
                        BandList bandList, Buffer rasterBuf, boolean adjustToExtent, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
911
                Rectangle2D bBox = extent.toRectangle2D();//new Rectangle2D.Double(ulx, lry, Math.abs(lrx - ulx), Math.abs(lry - uly));
912
                lastWidthRequest = rasterBuf.getWidth();
913
                lastHeightRequest = rasterBuf.getHeight();
914
                WMSStatus wmsStatus = loadWMSStatus(bBox);
915
                lastRequest = downloadFile(wmsStatus, extent.getULX(), extent.getULY(), extent.getLRX(), extent.getLRY(), rasterBuf.getWidth(), rasterBuf.getHeight());
916
                
917
                if (lastRequest == null) {
918
                        return rasterBuf;
919
                }
920
                
921
                try {
922
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
923
                        String serverName = bandList.getBand(0).getFileName();
924
                        for (int i = 0; i < bandList.getBandCount(); i++) {
925
                                bandList.getBand(i).setFileName(lastRequest.getPath());
926
                        }
927
                        
928
                        DefaultRasterProvider driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
929
                        setColorTable(driver.getColorTable());
930
                        
931
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
932
                        q.setAreaOfInterest(extent, bufWidth, bufHeight);
933
                        q.setBandList(bandList);
934
                        q.setBuffer(rasterBuf);
935
                        q.setAdjustToExtent(adjustToExtent);
936
                        Buffer buf = driver.getDataSet(q);
937

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

    
950
        /*
951
         * (non-Javadoc)
952
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer)
953
         */
954
//        public Buffer getWindow(int x, int y, 
955
//                        BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException {
956
//                int w = rasterBuf.getWidth();
957
//                int h = rasterBuf.getHeight();
958
//                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
959
//                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
960
//                lastWidthRequest = rasterBuf.getWidth();
961
//                lastHeightRequest = rasterBuf.getHeight();
962
//                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
963
//                WMSStatus wmsStatus = loadWMSStatus(bBox);
964
//                
965
//                lastRequest = downloadFile(wmsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
966
//                
967
//                if (lastRequest == null) {
968
//                        return rasterBuf;
969
//                }
970
//
971
//                DefaultRasterProvider driver = null;
972
//                try {
973
//                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
974
//                        String serverName = bandList.getBand(0).getFileName();
975
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
976
//                                bandList.getBand(i).setFileName(lastRequest.getPath());
977
//                        }
978
//                        
979
//                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
980
//                        Buffer buf = driver.getWindow(0, 0, w, h, bandList, rasterBuf);
981
//
982
//                        for (int i = 0; i < bandList.getBandCount(); i++) {
983
//                                bandList.getBand(i).setFileName(serverName);
984
//                        }
985
//                        
986
//                        return buf;
987
//                } catch (ProviderNotRegisteredException e) {
988
//                        throw new RasterDriverException("Error building GdalDriver", e);
989
//                } catch (InitializeException e) {
990
//                        throw new RasterDriverException("Error building GdalDriver", e);
991
//                }
992
//        }
993

    
994
        /*
995
         * (non-Javadoc)
996
         * @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)
997
         */
998
        public Buffer getWindow(int x, int y, int w, int h, 
999
                        BandList bandList, Buffer rasterBuf, TaskStatus status) throws ProcessInterruptedException, RasterDriverException {
1000
                Point2D p1 = rasterToWorld(new Point2D.Double(x, y));
1001
                Point2D p2 = rasterToWorld(new Point2D.Double(x + w, y + h));
1002
                lastWidthRequest = rasterBuf.getWidth();
1003
                lastHeightRequest = rasterBuf.getHeight();
1004
                Rectangle2D bBox = new Rectangle2D.Double(p1.getX(), p1.getY(), Math.abs(p1.getX() - p1.getX()), Math.abs(p1.getY() - p2.getY()));
1005
                WMSStatus wmsStatus = loadWMSStatus(bBox);
1006
                
1007
                lastRequest = downloadFile(wmsStatus, p1.getX(), p1.getY(), p2.getX(), p2.getY(), rasterBuf.getWidth(), rasterBuf.getHeight());
1008
                
1009
                if (lastRequest == null) {
1010
                        return rasterBuf;
1011
                }
1012

    
1013
                DefaultRasterProvider driver = null;
1014
                try {
1015
                        //El nombre de fichero que ha puesto en el bandList es el del servidor y no el del fichero en disco
1016
                        String serverName = bandList.getBand(0).getFileName();
1017
                        for (int i = 0; i < bandList.getBandCount(); i++) {
1018
                                bandList.getBand(i).setFileName(lastRequest.getPath());
1019
                        }
1020
                        
1021
                        driver = DefaultProviderServices.loadProvider(new File(lastRequest.getPath()));
1022
                        setColorTable(driver.getColorTable());
1023
                        
1024
                        DefaultRasterQuery q = (DefaultRasterQuery)RasterLocator.getManager().createQuery();
1025
                        q.setAreaOfInterest(0, 0, w, h);
1026
                        q.setBandList(bandList);
1027
                        q.setBuffer(rasterBuf);
1028
                        Buffer buf = driver.getDataSet(q);
1029

    
1030
                        for (int i = 0; i < bandList.getBandCount(); i++) {
1031
                                bandList.getBand(i).setFileName(serverName);
1032
                        }
1033
                        
1034
                        return buf;
1035
                } catch (ProviderNotRegisteredException e) {
1036
                        throw new RasterDriverException("Error building GdalDriver", e);
1037
                } catch (InitializeException e) {
1038
                        throw new RasterDriverException("Error building GdalDriver", e);
1039
                }
1040
        }
1041

    
1042
        public Image getImageLegend() {
1043
                try {
1044
                        if (getConnector().hasLegendGraphic()) {
1045
                                WMSStatus wmsStatus = loadWMSStatus(getExtent().toRectangle2D());
1046
                                wmsStatus.setOnlineResource((String) getParameters().getOnlineResource().get("GetLegendGraphic"));
1047
                                File file = getConnector().getLegendGraphic(wmsStatus, getParameters().getLayerQuery(), null);
1048
                                Image img = null;
1049
                                if ((file != null) && (file.length() > 0)) {
1050
                                        img = new ImageIcon(file.getAbsolutePath()).getImage();
1051
                                }
1052
                                return img;
1053
                        }
1054
                } catch (Exception e) {
1055
                        logger.info("Problems in GetLegendGraphic", e);
1056
                }
1057
                return null;
1058
        }
1059

    
1060
        /*
1061
         * (non-Javadoc)
1062
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize()
1063
         */
1064
        public int getBlockSize() {
1065
                return 0;
1066
        }
1067

    
1068
        /*
1069
         * (non-Javadoc)
1070
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform)
1071
         */
1072
        public void setAffineTransform(AffineTransform t){
1073
                
1074
        }
1075

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

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

    
1092
        /*
1093
         * (non-Javadoc)
1094
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int)
1095
         */
1096
        public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException {
1097
                return 0;
1098
        }
1099

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

    
1108
        /*
1109
         * (non-Javadoc)
1110
         * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable()
1111
         */
1112
        public boolean isReproyectable() {
1113
                return false;
1114
        }
1115

    
1116
        /*
1117
         * (non-Javadoc)
1118
         * @see org.gvsig.fmap.dal.raster.spi.CoverageStoreProvider#getName()
1119
         */
1120
        public String getName() {
1121
                return NAME;
1122
        }
1123
        
1124
        /**
1125
         * Convierte un punto desde coordenadas pixel a coordenadas del mundo.
1126
         * @param pt Punto a transformar
1127
         * @return punto transformado en coordenadas del mundo
1128
         */
1129
        public Point2D rasterToWorld(Point2D pt) {
1130
                Point2D p = new Point2D.Double();
1131
                getAffineTransform().transform(pt, p);
1132
                return p;
1133
        }
1134

    
1135
        /**
1136
         * Convierte un punto desde del mundo a coordenadas pixel.
1137
         * @param pt Punto a transformar
1138
         * @return punto transformado en coordenadas pixel
1139
         */
1140
        public Point2D worldToRaster(Point2D pt) {
1141
                Point2D p = new Point2D.Double();
1142
                try {
1143
                        getAffineTransform().inverseTransform(pt, p);
1144
                } catch (NoninvertibleTransformException e) {
1145
                        return pt;
1146
                }
1147
                return p;
1148
        }
1149
        
1150
        /*
1151
         * (non-Javadoc)
1152
         * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider)
1153
         */
1154
        public void setStatus(RasterProvider provider) {
1155
                if(provider instanceof WMSProvider) {
1156
                }
1157
        }
1158
        
1159
        /**
1160
         * ASigna el par?metro de inicializaci?n del driver.
1161
         */
1162
        public void setParam(DataStoreProviderServices storeServices, DataStoreParameters param) {
1163
                if(param instanceof WMSDataParameters)
1164
                        this.uri = ((WMSDataParameters)param).getURI();
1165
                this.param = param;
1166
        }
1167
        
1168
        /**
1169
     * @param wmsStatus
1170
     * @param i
1171
     * @param j
1172
     * @param max_value
1173
     * @return
1174
     * @throws RemoteServiceException
1175
     */
1176
    public String getFeatureInfo(int i, int j, int max_value, ICancellable cancellable) throws RemoteServiceException {
1177
            WMSStatus wmsStatus = loadWMSStatus(lastExtent);
1178
            return getConnector().getFeatureInfo(wmsStatus, i, j, max_value, cancellable);
1179
    }
1180
    
1181
    /*
1182
         * (non-Javadoc)
1183
         * @see org.gvsig.raster.impl.provider.RasterProvider#getInfoByPoint(double, double)
1184
         */
1185
        public String getInfoByPoint(double x, double y, ICancellable cancellable) throws RemoteServiceException {
1186
                return getFeatureInfo((int) x, (int) y, Integer.MAX_VALUE, cancellable);
1187
        }
1188
        
1189
        public String getInfoByPoint(int x, int y, Extent bbox, int w, int h, ICancellable cancellable) throws RemoteServiceException {
1190
                WMSDataParameters p = (WMSDataParameters)parameters;
1191
                WMSStatus wmsStatus = new WMSStatus();
1192
                wmsStatus.setLayerNames(Utilities.createVector(p.getLayerQuery(), ","));
1193
                wmsStatus.setSrs(p.getSRSCode());
1194
                wmsStatus.setFormat(p.getFormat());
1195
                wmsStatus.setInfoFormat(p.getInfoFormat());
1196
                wmsStatus.setStyles(p.getStyles());
1197
                wmsStatus.setDimensions(p.getDimensions());
1198
                wmsStatus.setTransparency(p.isWmsTransparent());
1199
                wmsStatus.setOnlineResource((String) p.getOnlineResource().get("GetMap"));
1200
                wmsStatus.setExtent(bbox.toRectangle2D());
1201
                wmsStatus.setHeight(h);
1202
                wmsStatus.setWidth(w);
1203
                return getConnector().getFeatureInfo(wmsStatus, x, y, Integer.MAX_VALUE, cancellable);
1204
        }
1205
        
1206
        /**
1207
         * Gets the suffix of the downloaded image
1208
         * @return
1209
         */
1210
        public String getFileSuffix() {
1211
                WMSDataParameters p = (WMSDataParameters)parameters;
1212
                String format = p.getFormat();
1213
                if (format == null){
1214
                        return "xml";
1215
                }
1216
                if (format.indexOf("png") >= 0){
1217
                return "png";
1218
                }        
1219
            if (format.indexOf("xml") >= 0){
1220
                return "xml";
1221
            }        
1222
            if (format.indexOf("gif") >= 0){
1223
                return "gif";
1224
            }
1225
            if (format.indexOf("tif") >= 0){
1226
                return "tif";
1227
            }
1228
            if (format.indexOf("bmp") >= 0){
1229
                return "bmp";
1230
            }
1231
            if (format.indexOf("jpg") >= 0
1232
                || format.indexOf("jpeg") >= 0){
1233
                return "jpg";                         
1234
            }
1235
                return "xml";
1236
        }
1237
        
1238
        /*
1239
         * (non-Javadoc)
1240
         * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer()
1241
         */
1242
        public TileServer getTileServer() {
1243
                if(tileServer == null) {
1244
                        tileServer = new WMSTileServer(this);
1245
                }
1246
                return tileServer;
1247
        }
1248
        
1249
        /*
1250
         * (non-Javadoc)
1251
         * @see org.gvsig.raster.impl.provider.RasterProvider#isRasterEnclosed()
1252
         */
1253
        public boolean isRasterEnclosed() {
1254
                WMSDataParameters p = (WMSDataParameters)parameters;
1255
                if(p.isSizeFixed()) {
1256
                        return false;
1257
                }
1258
                return true;
1259
        }
1260
        
1261
        /*
1262
         * (non-Javadoc)
1263
         * @see org.gvsig.raster.impl.provider.RasterProvider#getRMFFile()
1264
         */
1265
        public String getRMFFile() {
1266
                if(lastRequest != null)
1267
                        return fileUtil.getNameWithoutExtension(lastRequest.getAbsolutePath()) + ".rmf";
1268
                return null;
1269
        }
1270
        
1271
        /*
1272
         * (non-Javadoc)
1273
         * @see org.gvsig.fmap.dal.coverage.store.props.Histogramable#getHistogramComputer()
1274
         */
1275
        public HistogramComputer getHistogramComputer() {
1276
                if (histogram == null)
1277
                        histogram = new RemoteStoreHistogram(this);
1278
                return histogram;
1279
        }
1280
}