Statistics
| Revision:

svn-gvsig-desktop / import / ext3D / branches / ext3D_v1.1 / lib3DMap / src / com / iver / ai2 / gvsig3d / cacheservices / FLayerCacheService.java @ 15490

History | View | Annotate | Download (11.4 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
import es.upv.ai2.libjosg.planets.Planet.PlanetType;
45

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

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

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

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

    
69
                int cacheType = CacheService.GLOBAL;
70
                if (planet.getType()==PlanetType.GEOCENTRIC)
71
                    cacheType += SPHERIC;
72
                else
73
                     cacheType += PLANE;
74
                setCacheType(cacheType);
75

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

    
84
                _extent = new Extent(_lyrExtentRect);
85

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

    
93
                _loadFailed = false;
94

    
95
        }
96

    
97
    protected class MyCancel implements Cancellable, ICancellable {
98

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

    
103
                public void setCanceled(boolean canceled) {
104

    
105
                }
106

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

    
111
    }
112

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

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

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

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

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

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

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

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

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

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

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

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

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

    
302
        }
303

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

    
316
        public Image getTileAsImage(TileNum tileNum) throws CacheServiceException {
317
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
318
                String tileId = tileNum.numToOpTileId();
319
                String fName = getTileFileName(tileNum);
320
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
321
                Rectangle2D tileExtent = computeBBox(tileNum);
322
                return getTileFromLayer(fName, tileExtent);
323
        }
324

    
325
        public boolean intersectsLayer(TileNum tileNum) {
326
                Rectangle2D tileExtent = computeBBox(tileNum);
327
                // TODO: use a reprojected layer extent !!!
328
                /*System.err.println("TILE: ("+tileExtent.getMinX()+","+tileExtent.getMinY()+"),("+
329
                                tileExtent.getMaxX()+","+tileExtent.getMaxY()+")");
330
                System.err.println("CAPA: ("+_lyrExtentRect.getMinX()+","+_lyrExtentRect.getMinY()+"),("+
331
                                _lyrExtentRect.getMaxX()+","+_lyrExtentRect.getMaxY()+")");
332
                System.err.println("INTERSECTA LA CAPAAAAAA??????????:"+_lyrExtentRect.intersects(tileExtent));
333
                return (_lyrExtentRect.intersects(tileExtent));*/
334
                return Math.max(_lyrExtentRect.getMinX(),tileExtent.getMinX()) <= Math.min(_lyrExtentRect.getMaxX(),tileExtent.getMaxX()) &&
335
                Math.max(Math.min(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMinY()) <= Math.min(Math.max(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMaxY());
336
        }
337

    
338
}