Statistics
| Revision:

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

History | View | Annotate | Download (11.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.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.NotSupportedExtensionException;
29
import org.gvsig.raster.dataset.Params;
30
import org.gvsig.raster.dataset.RasterDriverException;
31
import org.gvsig.remoteClient.utils.Utilities;
32
import org.gvsig.remoteClient.wcs.WCSStatus;
33
import org.gvsig.remoteClient.wms.ICancellable;
34
import org.gvsig.remoteClient.wms.WMSStatus;
35

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

    
50
import es.upv.ai2.libjosg.planets.Planet;
51
import es.upv.ai2.libjosg.planets.Planet.PlanetType;
52

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

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

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

    
72
                _layer = layer;
73
                _viewProj = viewProj;
74
                _loadFailed = true;
75

    
76
                int cacheType = CacheService.GLOBAL;
77
                if (planet.getType()==PlanetType.SPHERICAL_MODE)
78
                    cacheType += SPHERIC;
79
                else
80
                     cacheType += PLANE;
81
                setCacheType(cacheType);
82

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

    
91
                _extent = new Extent(_lyrExtentRect);
92

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

    
100
                _loadFailed = false;
101

    
102
        }
103

    
104
    protected class MyCancel implements Cancellable, ICancellable {
105

    
106
                public boolean isCanceled() {
107
                        return false;
108
                }
109

    
110
                public void setCanceled(boolean canceled) {
111

    
112
                }
113

    
114
                public Object getID() {
115
                        return null;
116
                }
117

    
118
    }
119

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

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

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

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

    
138
        //        CancelDraw canceldraw = new MapControl.CancelDraw();
139
        //        canceldraw.setCanceled(false);
140

    
141
                // For now we'll use a trick to make sure the layer is drawn
142
                // even if it has scale dependency
143
                // In the future, a scale corresponding to the tile should be passed
144
                double scale = 0.5*(_layer.getMaxScale()+_layer.getMinScale());
145
                try {
146
                                _layer.draw(image, graphics, vp, new MyCancel(), scale);
147
                        } catch (ReadDriverException e) {
148
                                e.printStackTrace();
149
                        }
150

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

    
178
                                bufferFactory.setAreaOfInterest(tileExtent.getMinX(),
179
                                                tileExtent.getMinY(), tileExtent.getMaxX(), tileExtent
180
                                                                .getMaxY(), 32, 32);
181

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

    
194
                                        GeoRasterWriter grw = GeoRasterWriter.getWriter(
195
                                                        bufferServer, fName, 1, at, raster.getWidth(),
196
                                                        raster.getHeight(), raster.getDataType(), p, null);
197
                                        // grw.setWkt(d.getWktProjection());
198
                                        grw.dataWrite();
199
                                        grw.writeClose();
200
                                } catch (NotSupportedExtensionException e) {
201
                                        e.printStackTrace();
202
                                } catch (RasterDriverException e) {
203
                                        e.printStackTrace();
204
                                } catch (IOException e) {
205
                                        e.printStackTrace();
206
                                }
207

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

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

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

    
296
        }
297

    
298
        public String getTileAsFName(TileNum t) throws CacheServiceException {
299
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
300
                String tileId = t.numToOpTileId();
301
                String fName = getTileFileName(t);
302
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
303
                if (!new File(fName).exists()) {
304
                        Rectangle2D tileExtent = computeBBox(t);
305
                        getTileFromLayer(fName, tileExtent);
306
                }
307
                return fName;
308
        }
309

    
310
        public Image getTileAsImage(TileNum tileNum) throws CacheServiceException {
311
                if(_loadFailed) { throw new CacheServiceException(new Exception()); }
312
                String tileId = tileNum.numToOpTileId();
313
                String fName = getTileFileName(tileNum);
314
//                System.out.println("CMTexture2D: requestTexture: "+tileId);
315
                Rectangle2D tileExtent = computeBBox(tileNum);
316
                return getTileFromLayer(fName, tileExtent);
317
        }
318

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

    
332
}