Statistics
| Revision:

svn-gvsig-desktop / import / ext3D / trunk / ext3D / src / com / iver / ai2 / gvsig3d / cacheservices / FLayerCacheService.java @ 15486

History | View | Annotate | Download (9.6 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.io.data.Grid;
18
import org.cresques.io.data.RasterBuf;
19
import org.cresques.px.Extent;
20
import org.gvsig.cacheservice.CacheService;
21
import org.gvsig.cacheservice.CacheServiceException;
22
import org.gvsig.cacheservice.RasterCacheService;
23
import org.gvsig.cacheservice.TileNum;
24
import org.gvsig.remoteClient.utils.Utilities;
25
import org.gvsig.remoteClient.wcs.WCSStatus;
26
import org.gvsig.remoteClient.wms.ICancellable;
27
import org.gvsig.remoteClient.wms.WMSStatus;
28

    
29
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
30
import com.iver.cit.gvsig.fmap.DriverException;
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.FLyrRaster;
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
        FMapWMSDriver _wmsDriver = null;
56
        FMapWCSDriver _wcsDriver = null;
57
        WMSStatus _wmsStatus = null;
58
        WCSStatus _wcsStatus = null;
59

    
60
        public FLayerCacheService(Planet planet, String name, FLayer layer,
61
                        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.getType() == PlanetType.SPHERICAL_MODE)
70
                        cacheType += SPHERIC;
71
                else
72
                        cacheType += PLANE;
73
                setCacheType(cacheType);
74

    
75
                try {
76
                        _lyrExtentRect = _layer.getFullExtent();
77
                } catch (DriverException e) {
78
                        return;
79
                }
80

    
81
                _extent = new Extent(_lyrExtentRect);
82

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

    
90
                _loadFailed = false;
91

    
92
        }
93

    
94
        protected class MyCancel implements Cancellable, ICancellable {
95

    
96
                public boolean isCanceled() {
97
                        // TODO Auto-generated method stub
98
                        return false;
99
                }
100

    
101
                public void setCanceled(boolean canceled) {
102
                        // TODO Auto-generated method stub
103

    
104
                }
105

    
106
                public Object getID() {
107
                        // TODO Auto-generated method stub
108
                        return null;
109
                }
110

    
111
        }
112

    
113
        private Image getTileFromLayer(String fName, Rectangle2D tileExtent) {
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
127
                                                                                                                        // background
128
                        graphics.setColor(backgColor);
129
                        graphics.fillRect(0, 0, size, size);
130

    
131
                        // CancelDraw canceldraw = new MapControl.CancelDraw();
132
                        // canceldraw.setCanceled(false);
133

    
134
                        // For now we'll use a trick to make sure the layer is drawn
135
                        // even if it has scale dependency
136
                        // In the future, a scale corresponding to the tile should be passed
137
                        double scale = 0.5 * (_layer.getMaxScale() + _layer.getMinScale());
138
                        try {
139
                                _layer.draw(image, graphics, vp, new MyCancel(), scale);
140
                        } catch (DriverException e) {
141
                                return null;
142
                        }
143

    
144
                        try {
145
                                File file = new File(fName);
146
                                String format = getFileExtension().substring(1);
147
                                saveCachedFile(image, format, file);
148
                        } catch (IOException e1) {
149
                                e1.printStackTrace();
150
                                return null;
151
                        }
152
                        return image;
153
                } else { // Elevation data
154
                        // RASTER_GRID
155
                        if (_layer instanceof FLyrRaster) {
156
                                Grid grid = null;
157
                                FLyrRaster rasterLayer = (FLyrRaster) _layer;
158
                                grid = rasterLayer.getSource().getGrid();
159
                                if (grid == null)
160
                                        return null;
161

    
162
                                grid.clearDrawableBand();
163
                                int bands[] = { 0 };
164
                                grid.addDrawableBands(bands);
165
                                grid.setNoDataValue(0.0);
166

    
167
                                grid.setAreaOfInterest(tileExtent.getMinX(), tileExtent
168
                                                .getMinY(), tileExtent.getMaxX(), tileExtent.getMaxY(),
169
                                                32, 32);
170

    
171
                                RasterBuf raster = grid.getRasterBuf();
172
                                try {
173
                                        raster.save(fName, new Extent(tileExtent));
174
                                } catch (Exception e) {
175
                                        return null;
176
                                }
177
                        } else if (_layer instanceof FLyrWMS) { // WMS Elevation
178
                                try {
179
                                        FLyrWMS wmsLayer = (FLyrWMS) _layer;
180
                                        if (_wmsDriver == null) {
181

    
182
                                                URL host = wmsLayer.getHost();
183
                                                _wmsDriver = FMapWMSDriverFactory
184
                                                                .getFMapDriverForURL(host);
185
                                        }
186
                                        if (_wmsStatus == null) {
187
                                                _wmsStatus = new WMSStatus();
188
                                                _wmsStatus.setFormat(wmsLayer.getFormat());
189
                                                _wmsStatus.setHeight(32);
190
                                                _wmsStatus.setWidth(32);
191
                                                _wmsStatus.setLayerNames(Utilities.createVector(
192
                                                                wmsLayer.getLayerQuery(), ","));
193
                                                _wmsStatus.setSrs(wmsLayer.getSRS());
194

    
195
                                                HashMap props = wmsLayer.getProperties();
196
                                                Vector styles;
197
                                                Vector dimensions;
198
                                                styles = (Vector) (props.get("styles"));
199
                                                dimensions = (Vector) (props.get("dimensions"));
200
                                                _wmsStatus.setStyles(styles);
201
                                                _wmsStatus.setDimensions(dimensions);
202
                                                _wmsStatus.setTransparency(false);
203
                                                String getMapStr = wmsLayer.getOnlineResource("GetMap");
204
                                                _wmsStatus.setOnlineResource(getMapStr);
205
                                        }
206
                                        _wmsStatus.setExtent(tileExtent);
207

    
208
                                        File f = _wmsDriver.getMap(_wmsStatus, new MyCancel());
209
                                        if (f == null)
210
                                                return null;
211
                                        FileUtils.copy(f, new File(fName));
212

    
213
                                        String fileName = f.getPath();
214
                                        // System.out.println(fileName);
215

    
216
                                } catch (Exception e) {
217
                                        return null;
218
                                }
219
                        } else if (_layer instanceof FLyrWCS) { // WCS Elevation
220
                                try {
221
                                        FLyrWCS wcsLayer = (FLyrWCS) _layer;
222
                                        if (_wcsDriver == null) {
223

    
224
                                                URL host = wcsLayer.getHost();
225
                                                _wcsDriver = FMapWCSDriverFactory
226
                                                                .getFMapDriverForURL(host);
227
                                        }
228
                                        if (_wcsStatus == null) {
229
                                                _wcsStatus = new WCSStatus();
230

    
231
                                                Hashtable props = wcsLayer.getProperties();
232

    
233
                                                _wcsStatus.setCoveraName((String) props.get("name"));
234
                                                _wcsStatus.setFormat((String) props.get("format"));
235
                                                _wcsStatus.setHeight(32);
236
                                                _wcsStatus.setWidth(32);
237
                                                _wcsStatus.setSrs((String) props.get("crs"));
238
                                                _wcsStatus.setParameters((String) props
239
                                                                .get("parameter"));
240
                                                String time = (String) props.get("time");
241
                                                if (time.length() > 0)
242
                                                        _wcsStatus.setTime(time);
243
                                                _wcsStatus.setOnlineResource(wcsLayer
244
                                                                .getOnlineResource("GetCoverage"));
245
                                        }
246
                                        _wcsStatus.setExtent(tileExtent);
247

    
248
                                        File f = _wcsDriver.getCoverage(_wcsStatus, new MyCancel());
249
                                        if (f == null)
250
                                                return null;
251

    
252
                                        FileUtils.copy(f, new File(fName));
253

    
254
                                        String fileName = f.getPath();
255
                                        // System.out.println(fileName);
256

    
257
                                } catch (Exception e) {
258
                                        return null;
259
                                }
260
                        }
261
                        return null; // no image
262
                }
263

    
264
        }
265

    
266
        public String getTileAsFName(TileNum t) throws CacheServiceException {
267
                if (_loadFailed) {
268
                        throw new CacheServiceException(new Exception());
269
                }
270
                String tileId = t.numToOpTileId();
271
                String fName = getTileFileName(t);
272
                // System.out.println("CMTexture2D: requestTexture: "+tileId);
273
                if (!new File(fName).exists()) {
274
                        Rectangle2D tileExtent = computeBBox(t);
275
                        getTileFromLayer(fName, tileExtent);
276
                }
277
                return fName;
278
        }
279

    
280
        public Image getTileAsImage(TileNum tileNum) throws CacheServiceException {
281
                if (_loadFailed) {
282
                        throw new CacheServiceException(new Exception());
283
                }
284
                String tileId = tileNum.numToOpTileId();
285
                String fName = getTileFileName(tileNum);
286
                // System.out.println("CMTexture2D: requestTexture: "+tileId);
287
                Rectangle2D tileExtent = computeBBox(tileNum);
288
                return getTileFromLayer(fName, tileExtent);
289
        }
290

    
291
        public boolean intersectsLayer(TileNum tileNum) {
292
                Rectangle2D tileExtent = computeBBox(tileNum);
293
                // TODO: use a reprojected layer extent !!!
294
                /*
295
                 * System.err.println("TILE:
296
                 * ("+tileExtent.getMinX()+","+tileExtent.getMinY()+"),("+
297
                 * tileExtent.getMaxX()+","+tileExtent.getMaxY()+")");
298
                 * System.err.println("CAPA:
299
                 * ("+_lyrExtentRect.getMinX()+","+_lyrExtentRect.getMinY()+"),("+
300
                 * _lyrExtentRect.getMaxX()+","+_lyrExtentRect.getMaxY()+")");
301
                 * System.err.println("INTERSECTA LA
302
                 * CAPAAAAAA??????????:"+_lyrExtentRect.intersects(tileExtent)); return
303
                 * (_lyrExtentRect.intersects(tileExtent));
304
                 */
305
                return Math.max(_lyrExtentRect.getMinX(), tileExtent.getMinX()) <= Math
306
                                .min(_lyrExtentRect.getMaxX(), tileExtent.getMaxX())
307
                                && Math.max(Math.min(_lyrExtentRect.getMinY(), _lyrExtentRect
308
                                                .getMaxY()), tileExtent.getMinY()) <= Math.min(
309
                                                Math.max(_lyrExtentRect.getMinY(), _lyrExtentRect
310
                                                                .getMaxY()), tileExtent.getMaxY());
311
        }
312

    
313
}