Statistics
| Revision:

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

History | View | Annotate | Download (12.9 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.osgvp.planets.Planet;
25
import org.gvsig.raster.buffer.BufferFactory;
26
import org.gvsig.raster.buffer.RasterBuffer;
27
import org.gvsig.raster.buffer.WriterBufferServer;
28
import org.gvsig.raster.dataset.GeoRasterWriter;
29
import org.gvsig.raster.dataset.InvalidSetViewException;
30
import org.gvsig.raster.dataset.NotSupportedExtensionException;
31
import org.gvsig.raster.dataset.Params;
32
import org.gvsig.raster.dataset.io.RasterDriverException;
33
import org.gvsig.remoteClient.utils.Utilities;
34
import org.gvsig.remoteClient.wcs.WCSStatus;
35
import org.gvsig.remoteClient.wms.ICancellable;
36
import org.gvsig.remoteClient.wms.WMSStatus;
37

    
38
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
39
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
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
public class FLayerCacheService extends RasterCacheService {
55
        private boolean _loadFailed = true;
56
        private Extent _extent;
57
        private Rectangle2D _lyrExtentRect;
58
        private FLayer _layer;
59
        private IProjection _viewProj;
60
        private int _dataType;
61

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

    
67
        WMSStatus _wmsStatus = null;
68
        WCSStatus _wcsStatus = null;
69

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

    
74
                _layer = layer;
75
                _viewProj = viewProj;
76
                _loadFailed = true;
77

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

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

    
93
                _extent = new Extent(_lyrExtentRect);
94

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

    
102
                _loadFailed = false;
103

    
104
        }
105

    
106
        protected class MyCancel implements Cancellable, ICancellable {
107

    
108
                public boolean isCanceled() {
109
                        return false;
110
                }
111

    
112
                public void setCanceled(boolean canceled) {
113

    
114
                }
115

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

    
121
        }
122

    
123
        private Image getTileFromLayer(String fName, Rectangle2D tileExtent) {
124
                BufferedImage image;
125

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

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

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

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

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

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

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

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

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

    
233
                                        String fileName = f.getPath();
234
                                        // System.out.println(fileName);
235

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

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

    
251
                                                Hashtable props = wcsLayer.getProperties();
252

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

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

    
271
                                        FileUtils.copy(f, new File(fName));
272

    
273
                                        String fileName = f.getPath();
274
                                        // System.out.println(fileName);
275

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

    
285
                                // grid = rasterLayer.getSource().getGrid();
286
                                // if (grid == null)
287
                                // return null;
288

    
289
                                BufferFactory bufferFactory = new BufferFactory(rasterLayer
290
                                                .getDataSource());
291

    
292
                                int bands[] = { 0 };
293
                                bufferFactory.setDrawableBands(bands);
294
                                // bufferFactory.setNoDataValue(0.0);
295
                                // ((IBuffer) bufferFactory).setNoDataValue(0.0);
296
                                bufferFactory.setAdjustToExtent(false);
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
                                raster.setNoDataValue(0.0);
319
                                try {
320
                                        // raster.save(fName, new Extent(tileExtent));
321
                                        WriterBufferServer bufferServer = new WriterBufferServer(
322
                                                        raster);
323
                                        Params p = GeoRasterWriter.getWriter(fName).getParams();
324
                                        AffineTransform at = new AffineTransform(tileExtent
325
                                                        .getWidth() / 32, 0, 0,
326
                                                        -(tileExtent.getHeight() / 32), tileExtent
327
                                                                        .getMinX(), tileExtent.getMaxY());
328
                                        GeoRasterWriter grw = GeoRasterWriter.getWriter(
329
                                                        bufferServer, fName, 1, at, raster.getWidth(),
330
                                                        raster.getHeight(), raster.getDataType(), p, null);
331
                                        // grw.setWkt(d.getWktProjection());
332
                                        try {
333
                                                grw.dataWrite();
334
                                        } catch (InterruptedException e) {
335
                                                // TODO Auto-generated catch block
336
                                                e.printStackTrace();
337
                                        }
338
                                        grw.writeClose();
339
                                } catch (NotSupportedExtensionException e) {
340
                                        e.printStackTrace();
341
                                } catch (RasterDriverException e) {
342
                                        e.printStackTrace();
343
                                } catch (IOException e) {
344
                                        e.printStackTrace();
345
                                }
346

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

    
351
        }
352

    
353
        public String getTileAsFName(TileNum t, Rectangle2D extent)
354
                        throws CacheServiceException {
355
                if (_loadFailed) {
356
                        throw new CacheServiceException(new Exception());
357
                }
358
                String tileId = t.numToOpTileId();
359
                String fName = getTileFileName(t);
360
                // System.out.println("CMTexture2D: requestTexture: "+tileId);
361
                if (!new File(fName).exists()) {
362
                        Rectangle2D tileExtent = extent;
363
                        getTileFromLayer(fName, tileExtent);
364
                }
365
                return fName;
366
        }
367

    
368
        public Image getTileAsImage(TileNum tileNum, Rectangle2D extent)
369
                        throws CacheServiceException {
370
                if ((tileNum.getLevel() == 5)) {// && (tileNum.getX())==29 &&
371
                        // (tileNum.getY()==9)){
372
                        System.err.println("pillado");
373
                }
374

    
375
                if (_loadFailed) {
376
                        throw new CacheServiceException(new Exception());
377
                }
378
                String tileId = tileNum.numToOpTileId();
379
                String fName = getTileFileName(tileNum);
380
                // System.out.println("CMTexture2D: requestTexture: "+tileId);
381
                Rectangle2D tileExtent = extent;
382
                return getTileFromLayer(fName, tileExtent);
383
        }
384

    
385
        public boolean intersectsLayer(Rectangle2D extent) {
386
//                Rectangle2D tileExtent = extent;
387
                return _lyrExtentRect.intersects(extent);
388
                // return Math.max(_lyrExtentRect.getMinX(),tileExtent.getMinX()) <=
389
                // Math.min(_lyrExtentRect.getMaxX(),tileExtent.getMaxX()) &&
390
                // Math.max(Math.min(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMinY())
391
                // <=
392
                // Math.min(Math.max(_lyrExtentRect.getMinY(),_lyrExtentRect.getMaxY()),tileExtent.getMaxY());
393
        }
394

    
395
}