Statistics
| Revision:

root / trunk / libraries / lib3DMap / src / com / iver / ai2 / gvsig3d / cacheservices / FLayerCacheService.java @ 16362

History | View | Annotate | Download (14.2 KB)

1
package com.iver.ai2.gvsig3d.cacheservices;
2

    
3
import java.awt.Color;
4
import java.awt.Dimension;
5
import java.awt.Graphics2D;
6
import java.awt.Image;
7
import java.awt.geom.AffineTransform;
8
import java.awt.geom.Rectangle2D;
9
import java.awt.image.BufferedImage;
10
import java.io.File;
11
import java.io.IOException;
12
import java.net.URL;
13
import java.util.HashMap;
14
import java.util.Hashtable;
15
import java.util.Vector;
16

    
17
import org.cresques.cts.IProjection;
18
import org.cresques.px.Extent;
19
import org.gvsig.cacheservice.CacheService;
20
import org.gvsig.cacheservice.CacheServiceException;
21
import org.gvsig.cacheservice.RasterCacheService;
22
import org.gvsig.cacheservice.TileNum;
23
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
24
import org.gvsig.raster.buffer.BufferFactory;
25
import org.gvsig.raster.buffer.RasterBuffer;
26
import org.gvsig.raster.buffer.cache.WriterBufferServer;
27
import org.gvsig.raster.dataset.GeoRasterWriter;
28
import org.gvsig.raster.dataset.InvalidSetViewException;
29
import org.gvsig.raster.dataset.NotSupportedExtensionException;
30
import org.gvsig.raster.dataset.Params;
31
import org.gvsig.raster.dataset.RasterDriverException;
32
import org.gvsig.remoteClient.utils.Utilities;
33
import org.gvsig.remoteClient.wcs.WCSStatus;
34
import org.gvsig.remoteClient.wms.ICancellable;
35
import org.gvsig.remoteClient.wms.WMSStatus;
36

    
37
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
38
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
39
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
40
import com.iver.cit.gvsig.fmap.ViewPort;
41
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriver;
42
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriverFactory;
43
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriver;
44
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriverFactory;
45
import com.iver.cit.gvsig.fmap.layers.FLayer;
46
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
47
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
48
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
49
import com.iver.cit.gvsig.fmap.layers.FLyrWMS;
50
import com.iver.utiles.FileUtils;
51
import com.iver.utiles.swing.threads.Cancellable;
52

    
53
import es.upv.ai2.libjosg.planets.Planet;
54

    
55
public class FLayerCacheService extends RasterCacheService {
56
        private boolean     _loadFailed = true;
57
        private Extent      _extent;
58
        private Rectangle2D _lyrExtentRect;
59
        private FLayer      _layer;
60
        private IProjection _viewProj;
61
        private int         _dataType;
62

    
63
        // WMS terrain
64
        // TODO Un toggle this comment to use WMS and WCS extensions.
65
        FMapWMSDriver _wmsDriver = null;
66
        FMapWCSDriver _wcsDriver = null;
67
        
68
        WMSStatus     _wmsStatus = null;
69
        WCSStatus     _wcsStatus = null;
70

    
71
        public FLayerCacheService(Planet planet, String name, FLayer layer, IProjection viewProj) {
72
                super(planet.getPlanetName(), name);
73

    
74
                _layer = layer;
75
                _viewProj = viewProj;
76
                _loadFailed = true;
77

    
78
                int cacheType = CacheService.GLOBAL;
79
                if (planet.getCoordinateSystemType()==Planet.CoordinateSystemType.GEOCENTRIC)
80
                    cacheType += SPHERIC;
81
                else
82
                     cacheType += PLANE;
83
                setCacheType(cacheType);
84

    
85
                try {
86
                        _lyrExtentRect = _layer.getFullExtent();
87
                } catch (ExpansionFileReadException e) {
88
                        e.printStackTrace();
89
                } catch (ReadDriverException e) {
90
                        e.printStackTrace();
91
                }
92

    
93
                _extent = new Extent(_lyrExtentRect);
94

    
95
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
96
                _dataType = props3D.getType();
97
                if (_dataType==Layer3DProps.layer3DImage)
98
                        setFileExtension(".png");
99
                else
100
                        setFileExtension(".tif");
101

    
102
                _loadFailed = false;
103

    
104
        }
105

    
106
    protected class MyCancel implements Cancellable, ICancellable {
107

    
108
                public boolean isCanceled() {
109
                        return false;
110
                }
111

    
112
                public void setCanceled(boolean canceled) {
113

    
114
                }
115

    
116
                public Object getID() {
117
                        return null;
118
                }
119

    
120
    }
121

    
122
        private Image getTileFromLayer(String fName, Rectangle2D tileExtent)
123
        {
124
                BufferedImage image;
125

    
126
                if (_dataType==Layer3DProps.layer3DImage) {
127
                        int size = getTileSize();
128
                        image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
129

    
130
                        ViewPort vp = new ViewPort(_viewProj);
131
                        vp.setExtent(tileExtent); // the real extent of the tile
132
                        vp.setAdjustable(false);
133
                vp.setImageSize(new Dimension(size, size));
134

    
135
                Graphics2D graphics = image.createGraphics();
136
                Color backgColor = new Color(255, 255, 255, 0); // transparent background
137
                graphics.setColor(backgColor);
138
                graphics.fillRect(0, 0, size, size);
139

    
140
        //        CancelDraw canceldraw = new MapControl.CancelDraw();
141
        //        canceldraw.setCanceled(false);
142
                // For now we'll use a trick to make sure the layer is drawn
143
                // even if it has scale dependency
144
                // In the future, a scale corresponding to the tile should be passed
145
                double scale = 0.5*(_layer.getMaxScale()+_layer.getMinScale());
146
                int trans = 255;
147
                
148
                // The layers of remote services don?t have transparency.
149
                if (_layer.getClass().equals(FLyrVect.class)){
150
                        // Generate layers 3D properties
151
                                Layer3DProps props3D = Layer3DProps.getLayer3DProps(_layer);
152
                                // Getting layer transparency
153
                                trans = ((FLyrDefault) _layer).getTransparency();
154
                                // Casting to float
155
                                float transFloat = (float) ((float) (255) / 255.0);
156
                                // Setting in the layers 3D props
157
                                props3D.setOpacity(transFloat);
158
                                // fix opaque the layer to save in disk
159
                                ((FLyrDefault) _layer).setTransparency(255);
160
                        }
161
        
162
                try {
163
                        // disabling the iterator
164
                                if (_layer instanceof FLyrVect) {
165
                                        FLyrVect layerVect = (FLyrVect) _layer;
166
                                        layerVect.setUseStrategy(true);
167
                                        layerVect.draw(image, graphics, vp, new MyCancel(), scale);
168
                                } else
169
                                        _layer.draw(image, graphics, vp, new MyCancel(), scale);
170
                        } catch (ReadDriverException e) {
171
                                e.printStackTrace();
172
                        }
173
                        // Restoring the real value of transparency
174
                         if (_layer.getClass().equals(FLyrVect.class)){
175
                                // fix the real transparency to the layer
176
                                ((FLyrDefault) _layer).setTransparency(trans);
177
                        }
178

    
179
                try {
180
                                File file = new File(fName);
181
                                String format = getFileExtension().substring(1);
182
                                saveCachedFile(image, format, file);
183
                        } catch (IOException e1) {
184
                                e1.printStackTrace();
185
                                return null;
186
                        }
187
                        return image;
188
                }
189
                else { // Elevation data
190
                        // RASTER_GRID
191
            if (_layer instanceof FLyrRasterSE) {
192
                    //Grid grid = null;
193
                            FLyrRasterSE rasterLayer = (FLyrRasterSE)_layer;
194
                                        
195
                            //grid = rasterLayer.getSource().getGrid();
196
                    //if (grid == null)
197
                            //return null;
198
                                
199
                            BufferFactory bufferFactory = new BufferFactory(rasterLayer.getDataSource());
200
                            
201
                                int bands[] = {0};
202
                                bufferFactory.setDrawableBands(bands);
203
                                bufferFactory.setNoDataValue(0.0);
204

    
205
                                try {
206
                                        bufferFactory.setAreaOfInterest(tileExtent.getMinX(),
207
                                                        tileExtent.getMinY(), tileExtent.getMaxX(), tileExtent
208
                                                                        .getMaxY(), 32, 32);
209
                                } catch (ArrayIndexOutOfBoundsException e1) {
210
                                        // TODO Auto-generated catch block
211
                                        e1.printStackTrace();
212
                                } catch (InvalidSetViewException e1) {
213
//                                        // TODO Auto-generated catch block
214
                                        e1.printStackTrace();
215
                                } catch (InterruptedException e1) {
216
//                                        // TODO Auto-generated catch block
217
                                        e1.printStackTrace();
218
                                }
219

    
220
                                RasterBuffer raster = (RasterBuffer) bufferFactory
221
                                                .getRasterBuf();
222
                                try {
223
                                        // raster.save(fName, new Extent(tileExtent));
224
                                        WriterBufferServer bufferServer = new WriterBufferServer(
225
                                                        raster);
226
                                        Params p = GeoRasterWriter.getWriter(fName).getParams();
227
                                        AffineTransform at = new AffineTransform(tileExtent
228
                                                        .getWidth() / 32, 0, 0,
229
                                                        -(tileExtent.getHeight() / 32), tileExtent
230
                                                                        .getMinX(), tileExtent.getMaxY());
231

    
232
                                        GeoRasterWriter grw = GeoRasterWriter.getWriter(
233
                                                        bufferServer, fName, 1, at, raster.getWidth(),
234
                                                        raster.getHeight(), raster.getDataType(), p, null);
235
                                        // grw.setWkt(d.getWktProjection());
236
                                        try {
237
                                                grw.dataWrite();
238
                                        } catch (InterruptedException e) {
239
                                                // TODO Auto-generated catch block
240
                                                e.printStackTrace();
241
                                        }
242
                                        grw.writeClose();
243
                                } catch (NotSupportedExtensionException e) {
244
                                        e.printStackTrace();
245
                                } catch (RasterDriverException e) {
246
                                        e.printStackTrace();
247
                                } catch (IOException e) {
248
                                        e.printStackTrace();
249
                                }
250

    
251
                                
252
                        }
253
                        // TODO  Un toggle this comment to use WCS and WMS extensions.
254
                        else
255
                        if (_layer instanceof FLyrWMS) { // WMS Elevation
256
                                try {  
257
                                        FLyrWMS wmsLayer = (FLyrWMS)_layer;
258
                                        if (_wmsDriver == null) {
259
        
260
                                            URL host = wmsLayer.getHost();
261
                                          _wmsDriver = FMapWMSDriverFactory.getFMapDriverForURL(host);
262
                                        }
263
                                        if (_wmsStatus == null) {
264
                                              _wmsStatus = new WMSStatus();
265
                                              _wmsStatus.setFormat(wmsLayer.getFormat());
266
                                              _wmsStatus.setHeight(32);
267
                                              _wmsStatus.setWidth(32);
268
                                              _wmsStatus.setLayerNames(Utilities.createVector(wmsLayer.getLayerQuery(),","));
269
                                              _wmsStatus.setSrs(wmsLayer.getSRS());
270
        
271
                                              HashMap props = wmsLayer.getProperties();
272
                                              Vector styles;
273
                                              Vector dimensions;
274
                                              styles = (Vector)(props.get("styles"));
275
                                              dimensions = (Vector)(props.get("dimensions"));
276
                                              _wmsStatus.setStyles(styles);
277
                                              _wmsStatus.setDimensions(dimensions);
278
                                              _wmsStatus.setTransparency(false);
279
                                              String getMapStr = wmsLayer.getOnlineResource("GetMap");
280
                                              _wmsStatus.setOnlineResource(getMapStr);
281
                                        }
282
                                        _wmsStatus.setExtent(tileExtent);
283
        
284
                                      File f = _wmsDriver.getMap(_wmsStatus, new MyCancel());
285
                                          if (f == null)
286
                                                  return null;
287
                                          FileUtils.copy(f, new File(fName));
288
        
289
                                          String fileName = f.getPath();
290
//                                          System.out.println(fileName);
291
        
292
                                } catch (Exception e) {
293
                                        return null;
294
                                }
295
                        }
296
                        else
297
                                if (_layer instanceof FLyrWCS) { // WCS Elevation
298
                                        try { 
299
                                                FLyrWCS wcsLayer = (FLyrWCS)_layer;
300
                                                if (_wcsDriver == null) {
301
                
302
                                                    URL host = wcsLayer.getHost();
303
                                                  _wcsDriver = FMapWCSDriverFactory.getFMapDriverForURL(host);
304
                                                }
305
                                                if (_wcsStatus == null) {
306
                                                      _wcsStatus = new WCSStatus();
307
                                                      
308
                                                      Hashtable props = wcsLayer.getProperties();
309

    
310
                                                      _wcsStatus.setCoveraName((String)props.get("name"));
311
                                                      _wcsStatus.setFormat((String)props.get("format"));
312
                                                      _wcsStatus.setHeight(32);
313
                                                      _wcsStatus.setWidth(32);
314
                                                      _wcsStatus.setSrs((String)props.get("crs"));
315
                                                      _wcsStatus.setParameters((String)props.get("parameter"));
316
                                                      String time = (String)props.get("time");
317
                                                      if (time.length()>0)
318
                                                          _wcsStatus.setTime(time);
319
//                                                      _wcsStatus.setOnlineResource(wcsLayer.getOnlineResource("GetCoverage"));
320
                                                }
321
                                                _wcsStatus.setExtent(tileExtent);
322

    
323
                                                  File f = _wcsDriver.getCoverage(_wcsStatus, new MyCancel());
324
                                                  if (f == null)
325
                                                          return null;
326
                
327
                                                  FileUtils.copy(f, new File(fName));
328
                
329
                                                  String fileName = f.getPath();
330
//                                                  System.out.println(fileName);
331
                
332
                                        } catch (Exception e) {
333
                                                return null;
334
                                        }
335
                                }/**/
336
                        return null; // no image
337
                }
338

    
339
        }
340

    
341
        public String getTileAsFName(TileNum t) throws CacheServiceException {
342
                if ((t.getLevel()==5) && (t.getX())==29 && (t.getY()==9)){
343
                        System.err.println("pillado");
344
                }
345
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
346
                String tileId = t.numToOpTileId();
347
                String fName = getTileFileName(t);
348
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
349
                if (!new File(fName).exists()) {
350
                        Rectangle2D tileExtent = computeBBox(t);
351
//                        System.out.println("Extent calculado del tilenum "+ t + tileExtent.getMinX() + " "
352
//                                        + tileExtent.getMinY() + " " + tileExtent.getHeight() + " " + tileExtent.getWidth());
353
                        getTileFromLayer(fName, tileExtent);
354
                }
355
                return fName;
356
        }
357
        
358
        public String getTileAsFName(TileNum t,Rectangle2D extent) throws CacheServiceException {
359
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
360
                String tileId = t.numToOpTileId();
361
                String fName = getTileFileName(t);
362
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
363
                if (!new File(fName).exists()) {
364
                        Rectangle2D tileExtent = extent;
365
                        getTileFromLayer(fName, tileExtent);
366
                }
367
                return fName;
368
        }
369

    
370
        public Image getTileAsImage(TileNum tileNum) throws CacheServiceException {
371
                if ((tileNum.getLevel()==5) ){//&& (tileNum.getX())==29 && (tileNum.getY()==9)){
372
                        System.err.println("pillado");
373
                }
374
                
375
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
376
                String tileId = tileNum.numToOpTileId();
377
                String fName = getTileFileName(tileNum);
378
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
379
                Rectangle2D tileExtent = computeBBox(tileNum);
380
                return getTileFromLayer(fName, tileExtent);
381
        }
382

    
383
        public boolean intersectsLayer(TileNum tileNum) {
384
                Rectangle2D tileExtent = computeBBox(tileNum);
385
                // TODO: use a reprojected layer extent !!!
386
//                System.err.println("TILE: ("+tileExtent.getMinX()+","+tileExtent.getMinY()+"),("+
387
//                                tileExtent.getMaxX()+","+tileExtent.getMaxY()+")");
388
//                System.err.println("CAPA: ("+_lyrExtentRect.getMinX()+","+_lyrExtentRect.getMinY()+"),("+
389
//                                _lyrExtentRect.getMaxX()+","+_lyrExtentRect.getMaxY()+")");
390
//                System.err.println("INTERSECTA LA CAPAAAAAA??????????:"+_lyrExtentRect.intersects(tileExtent));
391
//                return (_lyrExtentRect.intersects(tileExtent));
392
                return Math.max(_lyrExtentRect.getMinX(),tileExtent.getMinX()) <= Math.min(_lyrExtentRect.getMaxX(),tileExtent.getMaxX()) &&
393
                Math.max(Math.min(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMinY()) <= Math.min(Math.max(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMaxY());
394
        }
395
        public boolean intersectsLayer(Rectangle2D extent) {
396
                Rectangle2D tileExtent = extent;
397
        
398
                return _lyrExtentRect.intersects(extent);
399
//                return Math.max(_lyrExtentRect.getMinX(),tileExtent.getMinX()) <= Math.min(_lyrExtentRect.getMaxX(),tileExtent.getMaxX()) &&
400
//                Math.max(Math.min(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMinY()) <= Math.min(Math.max(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMaxY());
401
        }
402

    
403
}