Statistics
| Revision:

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

History | View | Annotate | Download (14.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.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.io.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.andami.messages.NotificationManager;
40
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
41
import com.iver.cit.gvsig.fmap.ViewPort;
42
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriver;
43
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriverFactory;
44
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriver;
45
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriverFactory;
46
import com.iver.cit.gvsig.fmap.layers.FLayer;
47
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
48
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
49
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
50
import com.iver.cit.gvsig.fmap.layers.FLyrWMS;
51
import com.iver.utiles.FileUtils;
52
import com.iver.utiles.swing.threads.Cancellable;
53

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

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

    
64
        // WMS terrain
65
        // TODO Un toggle this comment to use WMS and WCS extensions.
66
        FMapWMSDriver _wmsDriver = null;
67
        FMapWCSDriver _wcsDriver = null;
68

    
69
        WMSStatus _wmsStatus = null;
70
        WCSStatus _wcsStatus = null;
71

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

    
76
                _layer = layer;
77
                _viewProj = viewProj;
78
                _loadFailed = true;
79

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

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

    
95
                _extent = new Extent(_lyrExtentRect);
96

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

    
104
                _loadFailed = false;
105

    
106
        }
107

    
108
        protected class MyCancel implements Cancellable, ICancellable {
109

    
110
                public boolean isCanceled() {
111
                        return false;
112
                }
113

    
114
                public void setCanceled(boolean canceled) {
115

    
116
                }
117

    
118
                /* if you don?t put and ID the wms donwload will be fail */
119
                public Object getID() {
120
                        return this;
121
                }
122

    
123
        }
124

    
125
        private Image getTileFromLayer(String fName, Rectangle2D tileExtent) {
126
                BufferedImage image;
127

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

    
132
                        ViewPort vp = new ViewPort(_viewProj);
133
                        vp.setExtent(tileExtent); // the real extent of the tile
134
                        // NotificationManager.addInfo("Extent solicitado--> "
135
                        // + tileExtent.getMinX() + " " + tileExtent.getMinY() + " "
136
                        // + tileExtent.getMaxX() + " " + tileExtent.getMaxY());
137
                        vp.setAdjustable(false);
138
                        vp.setImageSize(new Dimension(size, size));
139
                        vp.setDist1pixel(1 / 15000);
140
                        // vp.setDist1pixel(1/100000000);
141

    
142
                        Graphics2D graphics = image.createGraphics();
143
                        Color backgColor = new Color(255, 255, 255, 0); // transparent
144
                                                                                                                        // background
145
                        graphics.setColor(backgColor);
146
                        graphics.fillRect(0, 0, size, size);
147

    
148
                        // CancelDraw canceldraw = new MapControl.CancelDraw();
149
                        // canceldraw.setCanceled(false);
150
                        // For now we'll use a trick to make sure the layer is drawn
151
                        // even if it has scale dependency
152
                        // In the future, a scale corresponding to the tile should be passed
153
                        double scale = 0.5 * (_layer.getMaxScale() + _layer.getMinScale());
154
                        int trans = 255;
155

    
156
                        // The layers of remote services don?t have transparency.
157
                        if (_layer.getClass().equals(FLyrVect.class)) {
158
                                // Generate layers 3D properties
159
                                Layer3DProps props3D = Layer3DProps.getLayer3DProps(_layer);
160
                                // Getting layer transparency
161
                                trans = ((FLyrDefault) _layer).getTransparency();
162
                                // Casting to float
163
                                float transFloat = (float) ((float) (255) / 255.0);
164
                                // Setting in the layers 3D props
165
                                props3D.setOpacity(transFloat);
166
                                // fix opaque the layer to save in disk
167
                                ((FLyrDefault) _layer).setTransparency(255);
168
                        }
169

    
170
                        try {
171
                                // disabling the iterator
172
                                // if (_layer instanceof FLyrVect) {
173
                                // FLyrVect layerVect = (FLyrVect) _layer;
174
                                // boolean strategyUse = layerVect.isUseStrategy();
175
                                // layerVect.setUseStrategy(true);
176
                                // layerVect.draw(image, graphics, vp, new MyCancel(), scale);
177
                                // layerVect.setUseStrategy(strategyUse);
178
                                // } else
179
                                _layer.draw(image, graphics, vp, new MyCancel(), scale);
180
                        } catch (ReadDriverException e) {
181
                                e.printStackTrace();
182
                        }
183
                        // Restoring the real value of transparency
184
                        if (_layer.getClass().equals(FLyrVect.class)) {
185
                                // fix the real transparency to the layer
186
                                ((FLyrDefault) _layer).setTransparency(trans);
187
                        }
188

    
189
                        try {
190
                                File file = new File(fName);
191
                                String format = getFileExtension().substring(1);
192
                                saveCachedFile(image, format, file);
193
                        } catch (IOException e1) {
194
                                e1.printStackTrace();
195
                                return null;
196
                        }
197
                        return image;
198
                } else { // Elevation data
199
                        // TODO Un toggle this comment to use WCS and WMS extensions.
200
                        if (_layer instanceof FLyrWMS) { // WMS Elevation
201
                                try {
202
                                        FLyrWMS wmsLayer = (FLyrWMS) _layer;
203
                                        if (_wmsDriver == null) {
204

    
205
                                                URL host = wmsLayer.getHost();
206
                                                _wmsDriver = FMapWMSDriverFactory
207
                                                                .getFMapDriverForURL(host);
208
                                        }
209
                                        if (_wmsStatus == null) {
210
                                                _wmsStatus = new WMSStatus();
211
                                                _wmsStatus.setFormat(wmsLayer.getFormat());
212
                                                _wmsStatus.setHeight(32);
213
                                                _wmsStatus.setWidth(32);
214
                                                _wmsStatus.setLayerNames(Utilities.createVector(
215
                                                                wmsLayer.getLayerQuery(), ","));
216
                                                _wmsStatus.setSrs(wmsLayer.getSRS());
217

    
218
                                                HashMap props = wmsLayer.getProperties();
219
                                                Vector styles;
220
                                                Vector dimensions;
221
                                                styles = (Vector) (props.get("styles"));
222
                                                dimensions = (Vector) (props.get("dimensions"));
223
                                                _wmsStatus.setStyles(styles);
224
                                                _wmsStatus.setDimensions(dimensions);
225
                                                _wmsStatus.setTransparency(false);
226
                                                String getMapStr = wmsLayer.getOnlineResource("GetMap");
227
                                                _wmsStatus.setOnlineResource(getMapStr);
228
                                        }
229
                                        _wmsStatus.setExtent(tileExtent);
230
                                        File f = _wmsDriver.getMap(_wmsStatus, new MyCancel());
231
                                        if (f == null)
232
                                                return null;
233
                                        FileUtils.copy(f, new File(fName));
234

    
235
                                        String fileName = f.getPath();
236
                                        // System.out.println(fileName);
237

    
238
                                } catch (Exception e) {
239
                                        return null;
240
                                }
241
                        } else if (_layer instanceof FLyrWCS) { // WCS Elevation
242
                                try {
243
                                        FLyrWCS wcsLayer = (FLyrWCS) _layer;
244
                                        if (_wcsDriver == null) {
245

    
246
                                                URL host = wcsLayer.getHost();
247
                                                _wcsDriver = FMapWCSDriverFactory
248
                                                                .getFMapDriverForURL(host);
249
                                        }
250
                                        if (_wcsStatus == null) {
251
                                                _wcsStatus = new WCSStatus();
252

    
253
                                                Hashtable props = wcsLayer.getProperties();
254

    
255
                                                _wcsStatus.setCoveraName((String) props.get("name"));
256
                                                _wcsStatus.setFormat((String) props.get("format"));
257
                                                _wcsStatus.setHeight(32);
258
                                                _wcsStatus.setWidth(32);
259
                                                _wcsStatus.setSrs((String) props.get("crs"));
260
                                                _wcsStatus.setParameters((String) props
261
                                                                .get("parameter"));
262
                                                String time = (String) props.get("time");
263
                                                if (time.length() > 0)
264
                                                        _wcsStatus.setTime(time);
265
                                                // _wcsStatus.setOnlineResource(wcsLayer.getOnlineResource("GetCoverage"));
266
                                        }
267
                                        _wcsStatus.setExtent(tileExtent);
268

    
269
                                        File f = _wcsDriver.getCoverage(_wcsStatus, new MyCancel());
270
                                        if (f == null)
271
                                                return null;
272

    
273
                                        FileUtils.copy(f, new File(fName));
274

    
275
                                        String fileName = f.getPath();
276
                                        // System.out.println(fileName);
277

    
278
                                } catch (Exception e) {
279
                                        return null;
280
                                }
281
                        }
282
                        // RASTER_GRID
283
                        if (_layer instanceof FLyrRasterSE) {
284
                                // Grid grid = null;
285
                                FLyrRasterSE rasterLayer = (FLyrRasterSE) _layer;
286

    
287
                                // grid = rasterLayer.getSource().getGrid();
288
                                // if (grid == null)
289
                                // return null;
290

    
291
                                BufferFactory bufferFactory = new BufferFactory(rasterLayer
292
                                                .getDataSource());
293

    
294
                                int bands[] = { 0 };
295
                                bufferFactory.setDrawableBands(bands);
296
                                bufferFactory.setNoDataValue(0.0);
297

    
298
                                try {
299
                                        bufferFactory.setAreaOfInterest(tileExtent.getMinX(),
300
                                                        tileExtent.getMinY(), tileExtent.getWidth(),
301
                                                        tileExtent.getHeight(), 32, 32);
302
                                } catch (ArrayIndexOutOfBoundsException e1) {
303
                                        // TODO Auto-generated catch block
304
                                        e1.printStackTrace();
305
                                } catch (InvalidSetViewException e1) {
306
                                        // // TODO Auto-generated catch block
307
                                        e1.printStackTrace();
308
                                } catch (InterruptedException e1) {
309
                                        // // TODO Auto-generated catch block
310
                                        e1.printStackTrace();
311
                                } catch (RasterDriverException e) {
312
                                        // TODO Auto-generated catch block
313
                                        e.printStackTrace();
314
                                }
315

    
316
                                RasterBuffer raster = (RasterBuffer) bufferFactory
317
                                                .getRasterBuf();
318
                                try {
319
                                        // raster.save(fName, new Extent(tileExtent));
320
                                        WriterBufferServer bufferServer = new WriterBufferServer(
321
                                                        raster);
322
                                        Params p = GeoRasterWriter.getWriter(fName).getParams();
323
                                        AffineTransform at = new AffineTransform(tileExtent
324
                                                        .getWidth() / 32, 0, 0,
325
                                                        -(tileExtent.getHeight() / 32), tileExtent
326
                                                                        .getMinX(), tileExtent.getMaxY());
327
                                        GeoRasterWriter grw = GeoRasterWriter.getWriter(
328
                                                        bufferServer, fName, 1, at, raster.getWidth(),
329
                                                        raster.getHeight(), raster.getDataType(), p, null);
330
                                        // grw.setWkt(d.getWktProjection());
331
                                        try {
332
                                                grw.dataWrite();
333
                                        } catch (InterruptedException e) {
334
                                                // TODO Auto-generated catch block
335
                                                e.printStackTrace();
336
                                        }
337
                                        grw.writeClose();
338
                                } catch (NotSupportedExtensionException e) {
339
                                        e.printStackTrace();
340
                                } catch (RasterDriverException e) {
341
                                        e.printStackTrace();
342
                                } catch (IOException e) {
343
                                        e.printStackTrace();
344
                                }
345

    
346
                        }
347
                        return null; // no image
348
                }
349

    
350
        }
351

    
352
        public String getTileAsFName(TileNum t) throws CacheServiceException {
353

    
354
                if (_loadFailed) {
355
                        throw new CacheServiceException(new Exception());
356
                }
357
                String tileId = t.numToOpTileId();
358
                String fName = getTileFileName(t);
359
                // System.out.println("CMTexture2D: requestTexture: "+tileId);
360
                if (!new File(fName).exists()) {
361
                        Rectangle2D tileExtent = computeBBox(t);
362
                        // System.out.println("Extent calculado del tilenum "+ t +
363
                        // tileExtent.getMinX() + " "
364
                        // + tileExtent.getMinY() + " " + tileExtent.getHeight() + " " +
365
                        // tileExtent.getWidth());
366
                        getTileFromLayer(fName, tileExtent);
367
                }
368
                return fName;
369
        }
370

    
371
        public String getTileAsFName(TileNum t, Rectangle2D extent)
372
                        throws CacheServiceException {
373
                if (_loadFailed) {
374
                        throw new CacheServiceException(new Exception());
375
                }
376
                String tileId = t.numToOpTileId();
377
                String fName = getTileFileName(t);
378
                // System.out.println("CMTexture2D: requestTexture: "+tileId);
379
                if (!new File(fName).exists()) {
380
                        Rectangle2D tileExtent = extent;
381
                        getTileFromLayer(fName, tileExtent);
382
                }
383
                return fName;
384
        }
385

    
386
        public Image getTileAsImage(TileNum tileNum) throws CacheServiceException {
387
                if ((tileNum.getLevel() == 5)) {// && (tileNum.getX())==29 &&
388
                                                                                // (tileNum.getY()==9)){
389
                        System.err.println("pillado");
390
                }
391

    
392
                if (_loadFailed) {
393
                        throw new CacheServiceException(new Exception());
394
                }
395
                String tileId = tileNum.numToOpTileId();
396
                String fName = getTileFileName(tileNum);
397
                // System.out.println("CMTexture2D: requestTexture: "+tileId);
398
                Rectangle2D tileExtent = computeBBox(tileNum);
399
                return getTileFromLayer(fName, tileExtent);
400
        }
401

    
402
        public boolean intersectsLayer(TileNum tileNum) {
403
                Rectangle2D tileExtent = computeBBox(tileNum);
404
                // TODO: use a reprojected layer extent !!!
405
                // System.err.println("TILE:
406
                // ("+tileExtent.getMinX()+","+tileExtent.getMinY()+"),("+
407
                // tileExtent.getMaxX()+","+tileExtent.getMaxY()+")");
408
                // System.err.println("CAPA:
409
                // ("+_lyrExtentRect.getMinX()+","+_lyrExtentRect.getMinY()+"),("+
410
                // _lyrExtentRect.getMaxX()+","+_lyrExtentRect.getMaxY()+")");
411
                // System.err.println("INTERSECTA LA
412
                // CAPAAAAAA??????????:"+_lyrExtentRect.intersects(tileExtent));
413
                // return (_lyrExtentRect.intersects(tileExtent));
414
                return Math.max(_lyrExtentRect.getMinX(), tileExtent.getMinX()) <= Math
415
                                .min(_lyrExtentRect.getMaxX(), tileExtent.getMaxX())
416
                                && Math.max(Math.min(_lyrExtentRect.getMinY(), _lyrExtentRect
417
                                                .getMaxY()), tileExtent.getMinY()) <= Math.min(
418
                                                Math.max(_lyrExtentRect.getMinY(), _lyrExtentRect
419
                                                                .getMaxY()), tileExtent.getMaxY());
420
        }
421

    
422
        public boolean intersectsLayer(Rectangle2D extent) {
423
                Rectangle2D tileExtent = extent;
424

    
425
                return _lyrExtentRect.intersects(extent);
426
                // return Math.max(_lyrExtentRect.getMinX(),tileExtent.getMinX()) <=
427
                // Math.min(_lyrExtentRect.getMaxX(),tileExtent.getMaxX()) &&
428
                // Math.max(Math.min(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMinY())
429
                // <=
430
                // Math.min(Math.max(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMaxY());
431
        }
432

    
433
}