Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / lib3DMap / src / com / iver / ai2 / gvsig3d / cacheservices / FLayerCacheService.java @ 15727

History | View | Annotate | Download (12.3 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.Rectangle2D;
8
import java.awt.image.BufferedImage;
9
import java.io.File;
10
import java.io.IOException;
11
import java.net.URL;
12
import java.util.HashMap;
13
import java.util.Hashtable;
14
import java.util.Vector;
15

    
16
import org.cresques.cts.IProjection;
17
import org.cresques.px.Extent;
18
import org.gvsig.cacheservice.CacheService;
19
import org.gvsig.cacheservice.CacheServiceException;
20
import org.gvsig.cacheservice.RasterCacheService;
21
import org.gvsig.cacheservice.TileNum;
22
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
23
import org.gvsig.remoteClient.utils.Utilities;
24
import org.gvsig.remoteClient.wcs.WCSStatus;
25
import org.gvsig.remoteClient.wms.ICancellable;
26
import org.gvsig.remoteClient.wms.WMSStatus;
27

    
28
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
29
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
30
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
31
import com.iver.cit.gvsig.fmap.ViewPort;
32
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriver;
33
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriverFactory;
34
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriver;
35
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriverFactory;
36
import com.iver.cit.gvsig.fmap.layers.FLayer;
37
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
38
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
39
import com.iver.cit.gvsig.fmap.layers.FLyrWMS;
40
import com.iver.utiles.FileUtils;
41
import com.iver.utiles.swing.threads.Cancellable;
42

    
43
import es.upv.ai2.libjosg.planets.Planet;
44

    
45
public class FLayerCacheService extends RasterCacheService {
46
        private boolean     _loadFailed = true;
47
        private Extent      _extent;
48
        private Rectangle2D _lyrExtentRect;
49
        private FLayer      _layer;
50
        private IProjection _viewProj;
51
        private int         _dataType;
52

    
53
        // WMS terrain
54
        // TODO Un toggle this comment to use WMS and WCS extensions.
55
        FMapWMSDriver _wmsDriver = null;
56
        FMapWCSDriver _wcsDriver = null;
57
        
58
        WMSStatus     _wmsStatus = null;
59
        WCSStatus     _wcsStatus = null;
60

    
61
        public FLayerCacheService(Planet planet, String name, FLayer layer, IProjection viewProj) {
62
                super(planet.getPlanetName(), name);
63

    
64
                _layer = layer;
65
                _viewProj = viewProj;
66
                _loadFailed = true;
67

    
68
                int cacheType = CacheService.GLOBAL;
69
                if (planet.getCoordinateSystemType()==Planet.CoordinateSystemType.GEOCENTRIC)
70
                    cacheType += SPHERIC;
71
                else
72
                     cacheType += PLANE;
73
                setCacheType(cacheType);
74

    
75
                try {
76
                        _lyrExtentRect = _layer.getFullExtent();
77
                } catch (ExpansionFileReadException e) {
78
                        e.printStackTrace();
79
                } catch (ReadDriverException e) {
80
                        e.printStackTrace();
81
                }
82

    
83
                _extent = new Extent(_lyrExtentRect);
84

    
85
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
86
                _dataType = props3D.getType();
87
                if (_dataType==Layer3DProps.layer3DImage)
88
                        setFileExtension(".png");
89
                else
90
                        setFileExtension(".tif");
91

    
92
                _loadFailed = false;
93

    
94
        }
95

    
96
    protected class MyCancel implements Cancellable, ICancellable {
97

    
98
                public boolean isCanceled() {
99
                        return false;
100
                }
101

    
102
                public void setCanceled(boolean canceled) {
103

    
104
                }
105

    
106
                public Object getID() {
107
                        return null;
108
                }
109

    
110
    }
111

    
112
        private Image getTileFromLayer(String fName, Rectangle2D tileExtent)
113
        {
114
                BufferedImage image;
115

    
116
                if (_dataType==Layer3DProps.layer3DImage) {
117
                        int size = getTileSize();
118
                        image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
119

    
120
                        ViewPort vp = new ViewPort(_viewProj);
121
                        vp.setExtent(tileExtent); // the real extent of the tile
122
                        vp.setAdjustable(false);
123
                vp.setImageSize(new Dimension(size, size));
124

    
125
                Graphics2D graphics = image.createGraphics();
126
                Color backgColor = new Color(255, 255, 255, 0); // transparent background
127
                graphics.setColor(backgColor);
128
                graphics.fillRect(0, 0, size, size);
129

    
130
        //        CancelDraw canceldraw = new MapControl.CancelDraw();
131
        //        canceldraw.setCanceled(false);
132
                // For now we'll use a trick to make sure the layer is drawn
133
                // even if it has scale dependency
134
                // In the future, a scale corresponding to the tile should be passed
135
                double scale = 0.5*(_layer.getMaxScale()+_layer.getMinScale());
136
                                        // Generate layers 3D properties
137
                        Layer3DProps props3D = Layer3DProps.getLayer3DProps(_layer);
138
                        // Getting layer transparency
139
                        int trans = ((FLyrDefault)_layer).getTransparency();
140
                        // Casting to float
141
                        float transFloat = (float) ((float) (255-trans)/255.0);
142
                        // Setting in the layers 3D props
143
                        props3D.setOpacity(transFloat);
144
                        // fix opaque the layer to save in disk 
145
                        ((FLyrDefault)_layer).setTransparency(255);
146

    
147
                try {
148
                                _layer.draw(image, graphics, vp, new MyCancel(), scale);
149
                        } catch (ReadDriverException e) {
150
                                e.printStackTrace();
151
                        }
152

    
153
                        // fix the real transparency to the layer
154
                        ((FLyrDefault)_layer).setTransparency(trans);
155

    
156
                try {
157
                                File file = new File(fName);
158
                                String format = getFileExtension().substring(1);
159
                                saveCachedFile(image, format, file);
160
                        } catch (IOException e1) {
161
                                e1.printStackTrace();
162
                                return null;
163
                        }
164
                        return image;
165
                }
166
                else { // Elevation data
167
                        // RASTER_GRID
168
            if (_layer instanceof FLyrRasterSE) {
169
                    //Grid grid = null;
170
                            FLyrRasterSE rasterLayer = (FLyrRasterSE)_layer;
171
                                        
172
                            
173
                            //grid = rasterLayer.getSource().getGrid();
174
                    //if (grid == null)
175
                            //return null;
176
                                
177
                            /*BufferFactory bufferFactory = rasterLayer.getDatasource();
178
                            
179
                                int bands[] = {0};
180
                                bufferFactory.setDrawableBands(bands);
181
                                bufferFactory.setNoDataValue(0.0);
182

183
                                bufferFactory.setAreaOfInterest(tileExtent.getMinX(),
184
                                                tileExtent.getMinY(), tileExtent.getMaxX(), tileExtent
185
                                                                .getMaxY(), 32, 32);
186

187
                                RasterBuffer raster = (RasterBuffer) bufferFactory
188
                                                .getRasterBuf();
189
                                try {
190
                                        // raster.save(fName, new Extent(tileExtent));
191
                                        WriterBufferServer bufferServer = new WriterBufferServer(
192
                                                        raster);
193
                                        Params p = GeoRasterWriter.getWriter(fName).getParams();
194
                                        AffineTransform at = new AffineTransform(tileExtent
195
                                                        .getWidth() / 32, 0, 0,
196
                                                        -(tileExtent.getHeight() / 32), tileExtent
197
                                                                        .getMinX(), tileExtent.getMaxY());
198

199
                                        GeoRasterWriter grw = GeoRasterWriter.getWriter(
200
                                                        bufferServer, fName, 1, at, raster.getWidth(),
201
                                                        raster.getHeight(), raster.getDataType(), p, null);
202
                                        // grw.setWkt(d.getWktProjection());
203
                                        grw.dataWrite();
204
                                        grw.writeClose();
205
                                } catch (NotSupportedExtensionException e) {
206
                                        e.printStackTrace();
207
                                } catch (RasterDriverException e) {
208
                                        e.printStackTrace();
209
                                } catch (IOException e) {
210
                                        e.printStackTrace();
211
                                }
212
*/
213
                                
214
                        }
215
                        // TODO  Un toggle this comment to use WCS and WMS extensions.
216
                        else
217
                        if (_layer instanceof FLyrWMS) { // WMS Elevation
218
                                try {  
219
                                        FLyrWMS wmsLayer = (FLyrWMS)_layer;
220
                                        if (_wmsDriver == null) {
221
        
222
                                            URL host = wmsLayer.getHost();
223
                                          _wmsDriver = FMapWMSDriverFactory.getFMapDriverForURL(host);
224
                                        }
225
                                        if (_wmsStatus == null) {
226
                                              _wmsStatus = new WMSStatus();
227
                                              _wmsStatus.setFormat(wmsLayer.getFormat());
228
                                              _wmsStatus.setHeight(32);
229
                                              _wmsStatus.setWidth(32);
230
                                              _wmsStatus.setLayerNames(Utilities.createVector(wmsLayer.getLayerQuery(),","));
231
                                              _wmsStatus.setSrs(wmsLayer.getSRS());
232
        
233
                                              HashMap props = wmsLayer.getProperties();
234
                                              Vector styles;
235
                                              Vector dimensions;
236
                                              styles = (Vector)(props.get("styles"));
237
                                              dimensions = (Vector)(props.get("dimensions"));
238
                                              _wmsStatus.setStyles(styles);
239
                                              _wmsStatus.setDimensions(dimensions);
240
                                              _wmsStatus.setTransparency(false);
241
                                              String getMapStr = wmsLayer.getOnlineResource("GetMap");
242
                                              _wmsStatus.setOnlineResource(getMapStr);
243
                                        }
244
                                        _wmsStatus.setExtent(tileExtent);
245
        
246
                                      File f = _wmsDriver.getMap(_wmsStatus, new MyCancel());
247
                                          if (f == null)
248
                                                  return null;
249
                                          FileUtils.copy(f, new File(fName));
250
        
251
                                          String fileName = f.getPath();
252
//                                          System.out.println(fileName);
253
        
254
                                } catch (Exception e) {
255
                                        return null;
256
                                }
257
                        }
258
                        else
259
                                if (_layer instanceof FLyrWCS) { // WCS Elevation
260
                                        try { 
261
                                                FLyrWCS wcsLayer = (FLyrWCS)_layer;
262
                                                if (_wcsDriver == null) {
263
                
264
                                                    URL host = wcsLayer.getHost();
265
                                                  _wcsDriver = FMapWCSDriverFactory.getFMapDriverForURL(host);
266
                                                }
267
                                                if (_wcsStatus == null) {
268
                                                      _wcsStatus = new WCSStatus();
269
                                                      
270
                                                      Hashtable props = wcsLayer.getProperties();
271

    
272
                                                      _wcsStatus.setCoveraName((String)props.get("name"));
273
                                                      _wcsStatus.setFormat((String)props.get("format"));
274
                                                      _wcsStatus.setHeight(32);
275
                                                      _wcsStatus.setWidth(32);
276
                                                      _wcsStatus.setSrs((String)props.get("crs"));
277
                                                      _wcsStatus.setParameters((String)props.get("parameter"));
278
                                                      String time = (String)props.get("time");
279
                                                      if (time.length()>0)
280
                                                          _wcsStatus.setTime(time);
281
//                                                      _wcsStatus.setOnlineResource(wcsLayer.getOnlineResource("GetCoverage"));
282
                                                }
283
                                                _wcsStatus.setExtent(tileExtent);
284

    
285
                                                  File f = _wcsDriver.getCoverage(_wcsStatus, new MyCancel());
286
                                                  if (f == null)
287
                                                          return null;
288
                
289
                                                  FileUtils.copy(f, new File(fName));
290
                
291
                                                  String fileName = f.getPath();
292
//                                                  System.out.println(fileName);
293
                
294
                                        } catch (Exception e) {
295
                                                return null;
296
                                        }
297
                                }/**/
298
                        return null; // no image
299
                }
300

    
301
        }
302

    
303
        public String getTileAsFName(TileNum t) throws CacheServiceException {
304
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
305
                String tileId = t.numToOpTileId();
306
                String fName = getTileFileName(t);
307
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
308
                if (!new File(fName).exists()) {
309
                        Rectangle2D tileExtent = computeBBox(t);
310
                        getTileFromLayer(fName, tileExtent);
311
                }
312
                return fName;
313
        }
314
        
315
        public String getTileAsFName(TileNum t,Rectangle2D extent) throws CacheServiceException {
316
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
317
                String tileId = t.numToOpTileId();
318
                String fName = getTileFileName(t);
319
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
320
                if (!new File(fName).exists()) {
321
                        Rectangle2D tileExtent = extent;
322
                        getTileFromLayer(fName, tileExtent);
323
                }
324
                return fName;
325
        }
326

    
327
        public Image getTileAsImage(TileNum tileNum) throws CacheServiceException {
328
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
329
                String tileId = tileNum.numToOpTileId();
330
                String fName = getTileFileName(tileNum);
331
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
332
                Rectangle2D tileExtent = computeBBox(tileNum);
333
                return getTileFromLayer(fName, tileExtent);
334
        }
335

    
336
        public boolean intersectsLayer(TileNum tileNum) {
337
                Rectangle2D tileExtent = computeBBox(tileNum);
338
                // TODO: use a reprojected layer extent !!!
339
//                System.err.println("TILE: ("+tileExtent.getMinX()+","+tileExtent.getMinY()+"),("+
340
//                                tileExtent.getMaxX()+","+tileExtent.getMaxY()+")");
341
//                System.err.println("CAPA: ("+_lyrExtentRect.getMinX()+","+_lyrExtentRect.getMinY()+"),("+
342
//                                _lyrExtentRect.getMaxX()+","+_lyrExtentRect.getMaxY()+")");
343
//                System.err.println("INTERSECTA LA CAPAAAAAA??????????:"+_lyrExtentRect.intersects(tileExtent));
344
//                return (_lyrExtentRect.intersects(tileExtent));
345
                return Math.max(_lyrExtentRect.getMinX(),tileExtent.getMinX()) <= Math.min(_lyrExtentRect.getMaxX(),tileExtent.getMaxX()) &&
346
                Math.max(Math.min(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMinY()) <= Math.min(Math.max(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMaxY());
347
        }
348
        public boolean intersectsLayer(Rectangle2D extent) {
349
                Rectangle2D tileExtent = extent;
350
        
351
                return _lyrExtentRect.intersects(extent);
352
//                return Math.max(_lyrExtentRect.getMinX(),tileExtent.getMinX()) <= Math.min(_lyrExtentRect.getMaxX(),tileExtent.getMaxX()) &&
353
//                Math.max(Math.min(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMinY()) <= Math.min(Math.max(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMaxY());
354
        }
355

    
356
}