Statistics
| Revision:

gvsig-3d / 1.10 / trunk / libraries / lib3DMap / src / org / gvsig / gvsig3d / map3d / MapContext3D.java @ 34

History | View | Annotate | Download (40.4 KB)

1
package org.gvsig.gvsig3d.map3d;
2

    
3
import java.awt.Dimension;
4
import java.awt.Graphics2D;
5
import java.awt.Point;
6
import java.awt.geom.AffineTransform;
7
import java.awt.geom.Rectangle2D;
8
import java.awt.image.BufferedImage;
9
import java.awt.image.ImagingOpException;
10
import java.awt.image.RenderedImage;
11
import java.io.File;
12
import java.io.IOException;
13
import java.net.ConnectException;
14
import java.net.URL;
15
import java.util.HashMap;
16
import java.util.Hashtable;
17
import java.util.Vector;
18

    
19
import javax.print.attribute.PrintRequestAttributeSet;
20

    
21
import org.apache.log4j.Logger;
22
import org.cresques.cts.IProjection;
23
import org.gvsig.cacheservice.CacheServiceException;
24
import org.gvsig.cacheservice.TileNum;
25
import org.gvsig.gvsig3d.cacheservices.FLayerCacheService;
26
import org.gvsig.gvsig3d.cacheservices.OSGCacheService;
27
import org.gvsig.gvsig3d.cacheservices.VectorCacheService;
28
import org.gvsig.gvsig3d.drivers.GvsigDriverOSG;
29
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
30
import org.gvsig.osgvp.core.osg.Image;
31
import org.gvsig.osgvp.core.osg.Matrix;
32
import org.gvsig.osgvp.core.osg.Node;
33
import org.gvsig.osgvp.core.osg.Vec3;
34
import org.gvsig.osgvp.core.osg.Vec4;
35
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
36
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
37
import org.gvsig.osgvp.exceptions.node.NodeException;
38
import org.gvsig.osgvp.terrain.DataLoader;
39
import org.gvsig.osgvp.terrain.Extent;
40
import org.gvsig.osgvp.terrain.HeightfieldLayer;
41
import org.gvsig.osgvp.terrain.JavaDataDriver;
42
import org.gvsig.osgvp.terrain.Layer;
43
import org.gvsig.osgvp.terrain.LayerManager;
44
import org.gvsig.osgvp.terrain.RasterLayer;
45
import org.gvsig.osgvp.terrain.RequestDataEvent;
46
import org.gvsig.osgvp.terrain.Terrain;
47
import org.gvsig.osgvp.terrain.TerrainViewer;
48
import org.gvsig.osgvp.terrain.UpdateDataEvent;
49
import org.gvsig.osgvp.terrain.VectorLayer;
50
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
51
import org.gvsig.osgvp.terrain.exceptions.LayerManagementException;
52
import org.gvsig.osgvp.viewer.Camera;
53
import org.gvsig.osgvp.viewer.IViewerContainer;
54
import org.gvsig.osgvp.viewer.PrintUtilities;
55
import org.gvsig.remoteClient.utils.Utilities;
56
import org.gvsig.remoteClient.wms.ICancellable;
57
import org.gvsig.remoteClient.wms.WMSLayer;
58
import org.gvsig.remoteClient.wms.WMSStatus;
59

    
60
import com.hardcode.driverManager.Driver;
61
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
62
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
63
import com.iver.andami.PluginServices;
64
import com.iver.andami.messages.NotificationManager;
65
import com.iver.andami.ui.mdiManager.IWindow;
66
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
67
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
68
import com.iver.cit.gvsig.fmap.MapContext;
69
import com.iver.cit.gvsig.fmap.ViewPort;
70
import com.iver.cit.gvsig.fmap.WMSDriverExceptionType;
71
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriver;
72
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriverFactory;
73
import com.iver.cit.gvsig.fmap.drivers.wms.WMSException;
74
import com.iver.cit.gvsig.fmap.layers.FBitSet;
75
import com.iver.cit.gvsig.fmap.layers.FLayer;
76
import com.iver.cit.gvsig.fmap.layers.FLayers;
77
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
78
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
79
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
80
import com.iver.cit.gvsig.fmap.layers.FLyrWMS;
81
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
82
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
83
import com.iver.cit.gvsig.fmap.layers.LayerListener;
84
import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent;
85
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
86
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
87
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
88
import com.iver.cit.gvsig.fmap.layers.SelectionSupport;
89
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
90
import com.iver.cit.gvsig.fmap.layers.XMLException;
91
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
92
import com.iver.cit.gvsig.fmap.rendering.LegendListener;
93
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
94
import com.iver.utiles.FileUtils;
95
import com.iver.utiles.XMLEntity;
96
import com.iver.utiles.swing.threads.Cancellable;
97

    
98
public class MapContext3D extends MapContext implements DataLoader,
99
LayerListener, LegendListener, SelectionListener {
100

    
101
        // JOSG library objects
102
        private Terrain _terrain;
103
        private IViewerContainer _canvas3d;
104
        private TerrainViewer _terrainViewer;
105
        private LayerManager _terrainLayerManager;
106
        private JavaDataDriver _terrainDataManager = null;
107

    
108
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
109
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
110

    
111
        private IProjection _viewProjection;
112
        private float _verticalExaggeration;
113
        private boolean _bEmptyView = true;
114
        private boolean _bListenToLegend = true;
115
        private boolean _bLoading = false;
116
        private TerrainViewer _canvasoff = null;
117
        private boolean _renewCanvasOff = false;
118
        private static Logger _logger = Logger.getLogger(MapContext3D.class
119
                        .getName());
120
        TerrainViewer _printViewer = null;
121
        Layer _testRasterLayer = null;
122

    
123
        private boolean visibilityChange = false;
124

    
125
        @Override
126
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
127
                        double scale) throws ReadDriverException {
128

    
129
                if(_canvas3d == null || _canvas3d.getOSGViewer() == null) return;
130
                double x = getViewPort().getOffset().getX();
131
                double y = getViewPort().getOffset().getY();
132
                double w = image.getWidth();
133
                double h = image.getHeight();
134

    
135
                if (_canvasoff == null) {
136
                        try {
137
                                _canvasoff = new TerrainViewer();
138
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
139

    
140
                                Terrain planetView3D = ((TerrainViewer) _canvas3d
141
                                                .getOSGViewer()).getTerrain(0);
142
                                Terrain terrain = new Terrain();
143
                                terrain.setCoordinateSystemType(planetView3D
144
                                                .getCoordinateSystemType());
145
                                terrain.setCoordinateSystemName(planetView3D
146
                                                .getCoordinateSystemName());
147
                                terrain.setCoordinateSystemFormat(planetView3D
148
                                                .getCoordinateSystemFormat());
149
                                terrain.setExtent(planetView3D.getExtent());
150
                                terrain.setTerrainName(planetView3D.getTerrainName());
151

    
152
                                terrain.init();
153
                                terrain.setLayerManager(_terrainLayerManager);
154

    
155
                                _canvasoff.addTerrain(terrain);
156
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
157
                                                .getOSGViewer()).getFeatures()));
158
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
159
                                .getClearColor();
160
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(), color
161
                                                .w());
162
                                this.setRenewCanvasOff(false);
163
                        } catch (NodeException e) {
164
                                // TODO Auto-generated catch block
165
                                e.printStackTrace();
166
                        }
167

    
168
                }
169

    
170
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
171
                Matrix refView = refCam.getViewMatrix();
172
                Matrix refProy = refCam.getProjectionMatrix();
173
                Matrix.Perspective pers = refProy.getPerspective();
174
                Camera viewCam = new Camera();
175
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
176
                                pers.zFar);
177
                viewCam.setViewMatrix(refView);
178
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
179
                _canvasoff.setCamera(viewCam);
180
                _canvasoff.takeScreenshotToMemory();
181
                _canvasoff.frame();
182

    
183
                Image OSGimage = _canvasoff.getScreenshotImage();
184

    
185
                BufferedImage img = null;
186
                try {
187
                        img = OSGimage.getBufferedImage();
188
                } catch (ImageConversionException e1) {
189
                        // TODO Auto-generated catch block
190
                        e1.printStackTrace();
191
                } catch (IOException e1) {
192
                        // TODO Auto-generated catch block
193
                        e1.printStackTrace();
194
                }
195

    
196
                double scalex = w / img.getWidth(null);
197
                double scaley = h / img.getHeight(null);
198
                try {
199
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
200
                                        scaley);
201
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
202
                        xpos.concatenate(xform);
203
                        g.drawRenderedImage(img, xpos);
204
                } catch (ImagingOpException e) {
205
                        NotificationManager.addError("Dibujando FFramePicture", e);
206
                }
207

    
208
        }
209

    
210
        public void print(Graphics2D g, double scale, PrintRequestAttributeSet arg2)
211
        throws ReadDriverException {
212

    
213
                int x = (int) getViewPort().getOffset().getX();
214
                int y = (int) getViewPort().getOffset().getY();
215
                int w = (int) g.getClipBounds().getWidth();
216
                int h = (int) g.getClipBounds().getHeight();
217
                System.err.println("x " + x + "; y " + y + "; w " + w + "; h" + h);
218

    
219
                Camera viewerCam = _canvas3d.getOSGViewer().getCamera();
220
                BufferedImage s = null;
221

    
222
                try {
223
                        int minw = (int) w / 10;
224
                        int minh = (int) h / 10;
225
                        System.out.println("minw" + minw + " minh" + minh);
226

    
227
                        _printViewer = new TerrainViewer();
228
                        // Terrain planetView3D = ((TerrainViewer)
229
                        // _canvas3d.getOSGViewer()).getTerrain(0);
230
                        // Terrain terrain = new Terrain();
231
                        // terrain.setCoordinateSystemType(planetView3D
232
                        // .getCoordinateSystemType());
233
                        // terrain.setCoordinateSystemName(planetView3D
234
                        // .getCoordinateSystemName());
235
                        // terrain.setCoordinateSystemFormat(planetView3D
236
                        // .getCoordinateSystemFormat());
237
                        // terrain.setExtent(planetView3D.getExtent());
238
                        // terrain.setTerrainName(planetView3D.getTerrainName());
239
                        //
240
                        //                
241
                        // terrain.init();
242
                        // terrain.setLayerManager(_terrainLayerManager);
243

    
244
                        _printViewer.addTerrain((((TerrainViewer) _canvas3d.getOSGViewer())
245
                                        .getTerrain(0)));
246
                        _printViewer.addFeature((((TerrainViewer) _canvas3d.getOSGViewer())
247
                                        .getFeatures()));
248
                        Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
249
                        .getClearColor();
250
                        _printViewer.setClearColor(color.x(), color.y(), color.z(), color
251
                                        .w());
252
                        _printViewer.setUpViewerInBackground(0, 0, minw, minh);
253

    
254
                        PrintUtilities util = new PrintUtilities();
255
                        util.setViewer(_printViewer);
256
                        s = util.getHighResolutionImage(viewerCam, w, h,
257
                                        new PrintUtilities.FrameFinishedListener() {
258

    
259
                                public boolean isframeFinished() {
260
                                        /*if (getDataManager().getNumPendingRequests() > 0) {
261
                                                                System.out.println("getNumPending:" + getDataManager().getNumPendingRequests());
262
                                                                return false;
263
                                                        }
264
                                                        System.out.println("------------------ OLE! -------------");*/
265
                                        return true;
266
                                }
267
                        });
268

    
269
                        RenderedImage render = s;
270
                } catch (NodeException e1) {
271
                        // TODO Auto-generated catch block
272
                        e1.printStackTrace();
273
                }
274

    
275
                double scalex = w / s.getWidth(null);
276
                double scaley = h / s.getHeight(null);
277
                try {
278
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
279
                                        scaley);
280
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
281
                        xpos.concatenate(xform);
282
                        g.drawRenderedImage(s, xpos);
283
                        // g.drawRenderedImage(img, new AffineTransform());
284
                } catch (ImagingOpException e) {
285
                        NotificationManager.addError("Dibujando FFramePicture", e);
286
                }
287
                _printViewer.releaseGLContext();
288
                _printViewer.dispose();
289
                System.gc();
290
        }
291

    
292
        public MapContext3D(ViewPort vp) {
293
                super(vp);
294
        }
295

    
296
        public MapContext3D(FLayers fLayers, ViewPort vp) {
297
                super(fLayers, vp);
298
        }
299

    
300
        public void setTerrain(Terrain terrain) {
301
                if (_terrain == terrain)
302
                        return;
303

    
304
                _terrain = terrain;
305

    
306
                // add layers to terrain necessary when we are loading
307
                addCurrentLayers();
308
        }
309

    
310
        public Terrain getTerrain() {
311
                return _terrain;
312
        }
313

    
314
        public void setDataManager(JavaDataDriver manager) {
315
                _terrainDataManager = manager;
316
                _terrainDataManager.setDataLoader(this);
317
        }
318

    
319
        public JavaDataDriver getDataManager() {
320
                return _terrainDataManager;
321
        }
322

    
323
        public void setLayerManager(LayerManager manager) {
324
                _terrainLayerManager = manager;
325
        }
326

    
327
        public LayerManager getLayerManager() {
328
                return _terrainLayerManager;
329
        }
330

    
331
        public void setViewer(IViewerContainer canvas) {
332
                _canvas3d = canvas;
333
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
334
        }
335

    
336
        public IProjection getViewProjection() {
337
                return _viewProjection;
338
        }
339

    
340
        public void setViewProjection(IProjection projection) {
341
                _viewProjection = projection;
342
        }
343

    
344
        public IViewerContainer getCanvas3d() {
345
                return _canvas3d;
346
        }
347

    
348
        public float getVerticalExaggeration() {
349
                return _verticalExaggeration;
350
        }
351

    
352
        public void setVerticalExaggeration(float verticalExaggeration) {
353
                _verticalExaggeration = verticalExaggeration;
354
        }
355

    
356
        public void setLoading(boolean bLoading) {
357
                _bLoading = bLoading;
358
        }
359

    
360
        public FLayers getNewGroupLayer(FLayers parent) {
361
                return new FLayers3D(this, parent, getViewPort());
362
        }
363

    
364
        /** * LAYER CHANGES called by FLayers3D ** */
365

    
366
        public void layerMoved(FLayers3D parent, FLayer layer,
367
                        int oldPos, int newPos) {
368

    
369
                if (layer instanceof FLayers) {
370
                        FLayers group = (FLayers) layer;
371
                        if (newPos > oldPos) {
372
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
373
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
374
                                                        oldPos, newPos);
375
                        } else {
376
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
377
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
378
                                                        oldPos, newPos);
379
                        }
380
                        return;
381
                }
382

    
383
                Layer3DProps props3D = getLayer3DProps(layer);
384
                int type = props3D.getType();
385

    
386
                // Now reorder in layer manager only for terrain layer types
387
                if ((type == Layer3DProps.layer3DOSG)
388
                                || ((type == Layer3DProps.layer3DVector)))
389
                        return;
390

    
391
                // Obtain the old position in the layer
392
                Layer terrainLayer = _terrainFLayerMap.get(layer);
393
                Vector<Integer> terrainOldPos=null;
394
                try {
395
                        terrainOldPos = _terrainLayerManager
396
                        .getOrder(terrainLayer);
397
                } catch (LayerManagementException e) {
398
                        // TODO Auto-generated catch block
399
                        e.printStackTrace();
400
                }
401

    
402
                int terrainNewPos = 0;
403
                // Compute the new position.
404
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
405
                while (lyrIterator.hasNext()) {
406
                        FLayer auxLayer = lyrIterator.next();
407
                        if (auxLayer == layer)
408
                                break;
409
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
410
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
411
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
412
                                terrainNewPos++;
413
                        }
414

    
415
                }
416

    
417
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
418
                        return;
419
                if (terrainOldPos.get(0) != terrainNewPos)
420
                        try {
421
                                _terrainLayerManager.moveLayer(terrainOldPos.get(0), terrainNewPos);
422
                        } catch (LayerManagementException e) {
423
                                // TODO Auto-generated catch block
424
                                e.printStackTrace();
425
                        }
426

    
427
                        System.out.println("En el toc antes era el " + oldPos + " y ahora el "
428
                                        + newPos);
429
                        System.out.println("En el terrain antes era el " + terrainOldPos
430
                                        + " y ahora el " + terrainNewPos);
431

    
432
                        PrintDebugLayers();
433
        }
434

    
435
        public void layerAdded(FLayers3D parent, FLayer layer) {
436

    
437
                // to add group layers to 3D, just add recursively child data layers
438
                if (layer instanceof FLayers) {
439
                        FLayers group = (FLayers) layer;
440
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
441
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
442
                        }
443
                        getLayer3DProps(layer).setHooked(true);
444
                        return;
445
                }
446

    
447
                if (layer instanceof Classifiable) {
448
                        Classifiable legendLyr = (Classifiable) layer;
449
                        // legendLyr.addLegendListener((LegendListener) this);
450
                        this.addLayerListener(this);
451
                }
452
                layer.addLayerListener((LayerListener) this);
453

    
454
                // listener to manage the selection for the layers
455
                if (layer.getClass().equals(FLyrVect.class)) {
456
                        FLyrVect lyr = (FLyrVect) layer;
457
                        refreshLayerVectorsVisibility(lyr);
458
                        try {
459
                                SelectableDataSource recordSet = lyr.getRecordset();
460
                                if (recordSet != null) {
461
                                        SelectionSupport selectionSupport = recordSet
462
                                        .getSelectionSupport();
463
                                        selectionSupport.addSelectionListener(this);
464
                                }
465
                        } catch (ReadDriverException e) {
466
                                // TODO Auto-generated catch block
467
                                e.printStackTrace();
468
                        }
469
                }
470

    
471
                if (!_bLoading)
472
                        addLayerToTerrain(layer, true);
473

    
474
                // Only do this the first time to add layer
475
                if (_bEmptyView && !_bLoading) {
476
                        if (layers.getLayersCount() > 0) {
477
                                try {
478
                                        zoomToExtent(layer.getFullExtent());
479
                                } catch (ExpansionFileReadException e) {
480
                                        e.printStackTrace();
481
                                } catch (ReadDriverException e) {
482
                                        e.printStackTrace();
483
                                }
484
                                _bEmptyView = false;
485
                        }
486
                }
487

    
488
                PrintDebugLayers();
489
        }
490

    
491
        public void layerRemoved(FLayers3D parent, FLayer layer) {
492

    
493
                // to remove group layers to 3D, just remove recursively child data
494
                // layers
495
                if (layer instanceof FLayers) {
496
                        FLayers group = (FLayers) layer;
497
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
498
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
499
                        }
500
                        getLayer3DProps(layer).setHooked(false);
501
                        return;
502
                }
503

    
504
                if (layer instanceof Classifiable) {
505
                        Classifiable legendLyr = (Classifiable) layer;
506
                        legendLyr.removeLegendListener((LegendListener) this);
507
                }
508

    
509
                layer.removeLayerListener((LayerListener) this);
510

    
511
                removeLayerToTerrain(layer);
512

    
513
                // All layers are removed
514
                if (layers.getLayersCount() == 0) {
515
                        _bEmptyView = true;
516
                }
517

    
518
                PrintDebugLayers();
519
        }
520

    
521
        /**
522
         * DOCUMENT ME!
523
         * 
524
         * @param e
525
         *            DOCUMENT ME!
526
         */
527
        public void legendChanged(LegendChangedEvent e) {
528

    
529
                if (!_bListenToLegend)
530
                        return;
531
                if ((e == null) && (!visibilityChange)) {
532
                        // find layer whose legend changed
533
                        FLayer found = null;
534
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
535
                        while (lyrIterator.hasNext()) {
536
                                FLayer lyr = lyrIterator.next();
537
                                if (lyr instanceof FLyrVect) {
538
                                        FLyrVect lyrVect = (FLyrVect) lyr;
539
                                        long newDrawVersion = lyrVect.getDrawVersion();
540
                                        Layer3DProps props3D = getLayer3DProps(lyrVect);
541
                                        if (newDrawVersion != props3D.drawVersion) {
542
                                                props3D.drawVersion = lyrVect.getDrawVersion();
543
                                                refreshLayerInTerrain(props3D, true);
544
                                                _bListenToLegend = false;
545
                                                props3D.VerifyLegend(_terrain.getTerrainName());
546
                                                _bListenToLegend = true;
547
                                        }
548
                                }
549
                        }
550

    
551
                        IWindow f = PluginServices.getMDIManager().getActiveWindow();
552
                        if (f instanceof BaseView) {
553
                                BaseView view3D = (BaseView) f;
554
                                view3D.getTOC().refresh();
555
                        }
556
                }
557
                visibilityChange = false;
558
        }
559

    
560
        public void visibilityChanged(LayerEvent e) {
561
                FLayer lyr = e.getSource();
562

    
563
                Layer3DProps props3D = getLayer3DProps(lyr);
564

    
565
                if (props3D.getType() == Layer3DProps.layer3DVector) {
566
                        refreshLayerVectorsVisibility(lyr);
567
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
568
                        refreshLayer3DOSGVisibility(lyr);
569
                } else {
570
                        refreshLayerVisibility(lyr);
571
                }
572
                visibilityChange = true;
573
        }
574

    
575
        private void refreshLayer3DOSGVisibility(FLayer lyr) {
576
                if (_terrain == null || _viewProjection == null)
577
                        return;
578

    
579
                Layer3DProps props3D = getLayer3DProps(lyr);
580

    
581
                OSGCacheService cacheService = (OSGCacheService) props3D
582
                .getCacheService();
583
                if (cacheService != null) {
584
                        // use VectorCacheService to add features to terrain
585
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
586
                }
587

    
588
        }
589

    
590
        private void refreshLayerVisibility(FLayer layer) {
591

    
592
                Layer terrainLayer = _terrainFLayerMap.get(layer);
593
                terrainLayer.setEnabled(layer.isVisible());
594
                _terrainLayerManager.updateLayers();
595

    
596
        }
597

    
598
        private void refreshLayerVectorsVisibility(FLayer lyr) {
599
                if (_terrain == null || _viewProjection == null)
600
                        return;
601

    
602
                Layer3DProps props3D = getLayer3DProps(lyr);
603

    
604
                VectorCacheService cacheService = (VectorCacheService) props3D
605
                .getCacheService();
606
                if (cacheService != null) {
607
                        // use VectorCacheService to add features to terrain
608
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
609
                        props3D.drawVersion = lyr.getDrawVersion();
610
                }
611

    
612
        }
613

    
614
        public void activationChanged(LayerEvent e) {
615

    
616
                int a = 0;
617
        }
618

    
619
        public void nameChanged(LayerEvent e) {
620
                // TODO Implement this method
621
        }
622

    
623
        public void editionChanged(LayerEvent e) {
624
                // TODO Implement this method
625

    
626
        }
627

    
628
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
629
                if (props == null)
630
                        return;
631

    
632
                if (_terrain == null)
633
                        return; // view not opened yet
634

    
635
                // clear cache
636

    
637
                if (bRemoveCache) {
638
                        
639
                        String layerCacheDir = Layer3DProps.m_cacheDir + File.separator
640
                        + _terrain.getTerrainName() + File.separator + props.getCacheName();
641
                        
642
                        FLayerCacheService cacheServices = (FLayerCacheService) props.getCacheService();
643
                        if(cacheServices != null)
644
                        {
645
                                try {
646
                                        cacheServices.free();
647
                                        props.setCacheService(null);
648
                                } catch (Throwable e) {
649
                                        // TODO Auto-generated catch block
650
                                        e.printStackTrace();
651
                                }
652
                        }
653

    
654
                        removeCache(new File(layerCacheDir));
655
                }
656

    
657
                // refresh layer in terrain
658
                int type = props.getType();
659
                if ((type == Layer3DProps.layer3DImage)
660
                                || (type == Layer3DProps.layer3DElevation)
661
                                || (type == Layer3DProps.layer3DVectorMR)) {
662
                        try {
663
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
664
                        } catch (LayerManagementException e) {
665
                                // TODO Auto-generated catch block
666
                                e.printStackTrace();
667
                        }
668
                } else if (type == Layer3DProps.layer3DVector) {
669
                        invalidateVectorLayer(props);
670
                }
671
        }
672

    
673
        private void invalidateVectorLayer(Layer3DProps props) {
674
                // TODO Auto-generated method stub
675
                if (_terrain == null || _viewProjection == null)
676
                        return;
677

    
678
                VectorCacheService cacheService = (VectorCacheService) props
679
                .getCacheService();
680
                if (cacheService != null) {
681
                        // use VectorCacheService to add features to terrain
682
                        cacheService.refreshFeaturesToTerrain();
683
                }
684
        }
685

    
686
        private boolean removeCache(File path) {
687
            if( path.exists() ) {
688
                File[] files = path.listFiles();
689
                for(int i=0; i<files.length; i++) {
690
                   if(files[i].isDirectory()) {
691
                           removeCache(files[i]);
692
                   }
693
                   else {
694
                     files[i].delete();
695
                   }
696
                }
697
              }
698
              return( path.delete() );
699
        }
700

    
701
        protected Layer3DProps getLayer3DProps(FLayer layer) {
702

    
703
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
704

    
705
                // Create instance of props for osg layers.
706
                if (props3D == null) {
707
                        props3D = new Layer3DProps();
708
                        if (layer instanceof FLyrVect) {
709
                                FLyrVect nLayer = (FLyrVect) layer;
710
                                Driver driver;
711
                                try {
712
                                        driver = nLayer.getRecordset().getDriver();
713
                                        if (driver instanceof GvsigDriverOSG) {
714
                                                props3D.setChooseType(false);
715
                                                props3D.setType(Layer3DProps.layer3DOSG);
716
                                        }
717
                                } catch (ReadDriverException e) {
718
                                        // TODO Auto-generated catch block
719
                                        e.printStackTrace();
720
                                }
721

    
722
                        }
723
                        // Set the properties
724
                        props3D.setLayer(layer);
725

    
726
                        props3D.initCacheName(_terrain.getCoordinateSystemType(),
727
                                        _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
728
                        FLyrDefault baseLayer = (FLyrDefault) layer;
729
                        baseLayer.setProperty("3DLayerExtension", props3D);
730
                        props3D.setVerticalEx(getVerticalExaggeration());
731
                } else {
732
                        if (_bLoading)
733
                                props3D.setChooseType(false);
734
                        props3D.setLayer(layer);
735
                }
736

    
737
                return props3D;
738
        }
739

    
740
        public void addCurrentLayers() {
741
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
742
                while (lyrIterator.hasNext()) {
743
                        FLayer layer = lyrIterator.next();
744
                        Layer3DProps props = getLayer3DProps(layer);
745
                        // props.setTerrainOrder(props.getTocOrder());
746
                        addLayerToTerrain(layer, false);
747
                }
748
        }
749

    
750
        public void addLayerToTerrain(FLayer layer,
751
                        boolean bVerifyLegend) {
752
                Layer3DProps props3D = getLayer3DProps(layer);
753

    
754
                if (props3D.getType() == Layer3DProps.layer3DVector) {
755
                        CreateVectors(layer, props3D); // special case for now without
756
                        // disk cache
757
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
758
                        CreateOSGLayer(layer, props3D);
759
                } else {
760
                        Rectangle2D layerExtent = null;
761
                        try {
762
                                layerExtent = layer.getFullExtent();
763
                        } catch (ExpansionFileReadException e) {
764
                                e.printStackTrace();
765
                        } catch (ReadDriverException e) {
766
                                e.printStackTrace();
767
                        }
768
                        if (layerExtent == null) { // hack for missing extents
769
                                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC)
770
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
771
                                                        180.0);
772
                                else
773
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
774
                                                        -10000000.0, 40000000.0, 20000000.0);
775
                                // TODO toggle comment because this code use WCS extension. When
776
                                // WCS extension runs correctly uncoment!!!
777

    
778
                                if (layer instanceof FLyrWCS)
779
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
780
                        }
781

    
782
                        Extent extent = null;
783
                        if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
784
                                extent = new Extent(layerExtent.getMinX(), layerExtent
785
                                                .getMinY(), layerExtent.getMaxX(), layerExtent
786
                                                .getMaxY());
787
                        } else {
788
                                extent = new Extent(Math.toRadians(layerExtent.getMinX()), Math
789
                                                .toRadians(layerExtent.getMinY()), Math
790
                                                .toRadians(layerExtent.getMaxX()), Math
791
                                                .toRadians(layerExtent.getMaxY()));
792
                        }
793

    
794
                        if (props3D.getType() == Layer3DProps.layer3DImage) {
795
                                RasterLayer rlayer = new RasterLayer();
796
                                rlayer.setEnabled(layer.isVisible());
797
                                rlayer.setExtent(extent);
798
                                rlayer.setOpacity(props3D.getOpacity());
799
                                rlayer.setDataDriver(_terrainDataManager);
800
                                try {
801
                                        _terrainLayerManager.addLayer(rlayer);
802
                                } catch (LayerManagementException e) {
803
                                        // TODO Auto-generated catch block
804
                                        e.printStackTrace();
805
                                }
806
                                _terrainFLayerMap.put(layer, rlayer);
807
                                _terrainLayerMap.put(rlayer.getLayerID(), layer);
808
                                props3D.setTerrainLayer(rlayer);
809
                        } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
810
                                HeightfieldLayer hlayer = new HeightfieldLayer();
811
                                hlayer.setEnabled(layer.isVisible());
812
                                hlayer.setExtent(extent);
813
                                hlayer.setVerticalExaggeration(props3D.getVerticalEx());
814
                                hlayer.setDataDriver(_terrainDataManager);
815
                                try {
816
                                        _terrainLayerManager.addLayer(hlayer);
817
                                } catch (LayerManagementException e) {
818
                                        // TODO Auto-generated catch block
819
                                        e.printStackTrace();
820
                                }
821
                                _terrainFLayerMap.put(layer, hlayer);
822
                                _terrainLayerMap.put(hlayer.getLayerID(), layer);
823
                                props3D.setTerrainLayer(hlayer);
824
                        } else if (props3D.getType() == Layer3DProps.layer3DVectorMR) {
825
                                VectorLayer vlayer = new VectorLayer();
826
                                vlayer.setEnabled(true);
827
                                vlayer.setExtent(extent);
828
                                vlayer.setDensity(1.0f);
829
                                vlayer.setDataDriver(_terrainDataManager);
830
                                try {
831
                                        _terrainLayerManager.addLayer(vlayer);
832
                                } catch (LayerManagementException e) {
833
                                        // TODO Auto-generated catch block
834
                                        e.printStackTrace();
835
                                }
836
                                _terrainFLayerMap.put(layer, vlayer);
837
                                _terrainLayerMap.put(vlayer.getLayerID(), layer);
838
                                props3D.setTerrainLayer(vlayer);
839
                        }
840

    
841
                        if (bVerifyLegend) {
842
                                _bListenToLegend = false;
843
                                props3D.VerifyLegend(_terrain.getTerrainName());
844
                                _bListenToLegend = true;
845
                        }
846
                }
847
        }
848

    
849
        private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) {
850
                if (_terrain == null || _viewProjection == null)
851
                        return;
852

    
853
                OSGCacheService cacheService = (OSGCacheService) props3D
854
                .getCacheService();
855
                if (cacheService == null) {
856
                        cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
857
                                        .getCacheName(), layer, _viewProjection);
858
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
859
                        props3D.setCacheService(cacheService);
860
                }
861

    
862
                // use VectorCacheService to add features to planet
863
                cacheService.AddFeaturesToTerrain();
864

    
865
        }
866

    
867
        @Override
868
        public XMLEntity getXMLEntity() throws XMLException {
869
                // TODO Auto-generated method stub
870
                XMLEntity xml = super.getXMLEntity();
871

    
872
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
873
                while (lyrIterator.hasNext()) {
874
                        FLayer lyr = lyrIterator.next();
875
                        Layer3DProps props3D = getLayer3DProps(lyr);
876
                        int type = props3D.getType();
877
                        if (type == Layer3DProps.layer3DOSG) {
878

    
879
                                OSGCacheService cacheService = (OSGCacheService) props3D
880
                                .getCacheService();
881
                                if (cacheService != null) {
882
                                        // use VectorCacheService to add features to planet
883
                                        if (props3D.isEditing()) {
884
                                                // TODO: PONER AKI EL CODIGO DE SALVAR
885
                                        }
886
                                }
887
                        }
888
                }
889

    
890
                return xml;
891

    
892
        }
893

    
894
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
895
                if (_terrain == null || _viewProjection == null)
896
                        return;
897

    
898
                VectorCacheService cacheService = (VectorCacheService) props3D
899
                .getCacheService();
900
                if (cacheService == null) {
901
                        cacheService = new VectorCacheService(_canvas3d, _terrain, props3D
902
                                        .getCacheName(), layer, _viewProjection);
903
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
904
                        props3D.setCacheService(cacheService);
905
                }
906

    
907
                // use VectorCacheService to add features to terrain
908
                cacheService.addFeaturesToTerrain();
909
        }
910

    
911
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
912
                if (_terrain == null || _viewProjection == null)
913
                        return;
914

    
915
                VectorCacheService cacheService = (VectorCacheService) props3D
916
                .getCacheService();
917
                if (cacheService != null) {
918
                        // use VectorCacheService to delete features to terrain
919
                        cacheService.deleteFeaturesToTerrain();
920
                }
921
        }
922

    
923
        /**
924
         * Sets the given zoom extent to the view
925
         * 
926
         * @param extent
927
         *            The extent to zoom to.
928
         */
929
        public void zoomToExtent(Rectangle2D geoExtent) {
930
                double maxHeight = 0.0;
931

    
932
                // Getting extent positions
933
                double minLat = geoExtent.getMinY();
934
                double maxLat = geoExtent.getMaxY();
935
                double cenLon = geoExtent.getCenterX();
936
                double cenLat = geoExtent.getCenterY();
937

    
938
                double elevation = 0;
939

    
940
                // calculate altitude
941
                double avLat = 0;
942
                if (minLat > 0.0 || maxLat < 0.0)
943
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
944
                double avLon = Math.min(180.0, geoExtent.getWidth());
945

    
946
                double terrainRadius = _terrain.getRadiusEquatorial();
947
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
948
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
949
                                * (1 - Math.cos(Math.toRadians(avLon))));
950
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
951
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
952

    
953
                double zoomFactor = 1.5;
954
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
955

    
956
                // Calculate XYZ positions for camera.
957

    
958
                int terrainType = _terrain.getCoordinateSystemType();
959

    
960
                Vec3 eye = new Vec3();
961
                Vec3 center = new Vec3();
962
                Vec3 up = new Vec3();
963
                // Calculate positions for PLAIN MODE.
964
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
965

    
966
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
967
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
968
                        double height;
969

    
970
                        height = Math.sqrt(difx * difx + dify * dify);
971
                        double fullWindowFactor = 1.7;
972
                        // EYE
973
                        eye.setX(cenLon);
974
                        eye.setY(cenLat);
975
                        eye.setZ(height * fullWindowFactor);
976
                        // CENTER
977
                        center.setX(cenLon);
978
                        center.setY(cenLat);
979
                        center.setZ(0.0);
980
                        // UP
981
                        up.setX(0.0);
982
                        up.setY(1.0);
983
                        up.setZ(0.0);
984
                } else
985
                        // Calculate positions for SPHERICAL MODE.
986
                        if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
987
                                // EYE
988
                                Vec3 aux = new Vec3(cenLat, cenLon, elevation);
989
                                eye = _terrain.convertLatLongHeightToXYZ(aux);
990
                                // CENTER
991
                                center.setX(0.0);
992
                                center.setY(0.0);
993
                                center.setZ(0.0);
994
                                // UP
995
                                up.setX(0.0);
996
                                up.setY(0.0);
997
                                up.setZ(1.0);
998
                        }
999
                Camera cam = new Camera();
1000
                cam.setViewByLookAt(eye, center, up);
1001

    
1002
                _terrainViewer.setCamera(cam);
1003

    
1004
        }
1005

    
1006
        private void PrintDebugLayers() {
1007
                if (_terrainLayerManager != null) {
1008
                        System.out.println("===========================");
1009
                        System.out.println("Total terrain layers: "
1010
                                        + _terrainLayerManager.getNumLayers());
1011
                        System.out.println("===========================");
1012
                }
1013
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1014
                int pos = 0;
1015
                while (lyrIterator.hasNext()) {
1016
                        FLayer layer = lyrIterator.next();
1017
                        System.out.println("  Layer " + layer.getName());
1018
                        Layer3DProps props3D = getLayer3DProps(layer);
1019
                        System.out.println("    Type " + props3D.getType());
1020
                        System.out.println("    Order " + pos);
1021
                        pos++;
1022
                }
1023
        }
1024

    
1025
        /**
1026
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
1027
         * 
1028
         * @param xml
1029
         *            XMLEntity
1030
         * 
1031
         * @return Nuevo MapContext3D.
1032
         * 
1033
         * @throws XMLException
1034
         */
1035
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
1036
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
1037

    
1038
                FLayers layers = new FLayers3D(null, null, vp);
1039
                layers.setXMLEntity(xml.getChild(1));
1040

    
1041
                MapContext fmap = layers.getMapContext();
1042

    
1043
                return fmap;
1044
        }
1045

    
1046
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
1047
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
1048

    
1049
                FLayers layers = new FLayers3D(null, null, vp);
1050
                layers.setXMLEntity03(xml.getChild(1));
1051

    
1052
                MapContext fmap = layers.getMapContext();
1053

    
1054
                return fmap;
1055
        }
1056

    
1057
        public GraphicLayer getGraphicsLayer() {
1058
                GraphicLayer3D gra3D = new GraphicLayer3D(_terrainViewer, getTerrain());
1059
                return gra3D;
1060
        }
1061

    
1062
        public Node getSpecialNode() {
1063
                Node specialNode = null;
1064
                try {
1065
                        specialNode = _terrainViewer.getFeature(0);
1066
                } catch (ChildIndexOutOfBoundsExceptions e) {
1067
                        _logger.error("Command: " + "Error child index out of bound.", e);
1068
                }
1069
                return specialNode;
1070
        }
1071

    
1072
        public ViewPort getViewPort() {
1073

    
1074
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1075

    
1076
                if (_canvas3d != null)
1077
                        vp.setImageSize(new Dimension(_terrainViewer.getWidth(),
1078
                                        _terrainViewer.getHeight()));
1079
                vp.setTerrain(this.getTerrain());
1080
                vp.setViewer(this._canvas3d);
1081

    
1082
                return vp;
1083
        }
1084

    
1085
        /**
1086
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1087
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar� un
1088
         * evento de cambio de orden de capas que obligar� a redibujar todo lo que
1089
         * depende de FMap (TOC, MapControl, FFrameView, etc).
1090
         */
1091

    
1092
        /*
1093
         * public void invalidate() { ViewPort3D vp = (ViewPort3D)
1094
         * super.getViewPort(); if (vp.getDirty()) { vp.setDirty(false); } FLayer[]
1095
         * selectedExtent = getLayers().getActives();
1096
         * 
1097
         * if (selectedExtent.length > 0) { for (int i = 0; i <
1098
         * selectedExtent.length; i++) { if (selectedExtent[0].isAvailable()) {
1099
         * 
1100
         * FLayer lyr3D = selectedExtent[i]; Layer3DProps layer3DProps =
1101
         * Layer3DProps .getLayer3DProps(lyr3D);
1102
         * 
1103
         * Layer terrainLayer = _terrainFLayerMap.get(lyr3D); float opacity =
1104
         * (((FLyrDefault) lyr3D).getTransparency()) / (float) 255; if()
1105
         * //_terrain.setTextureOpacityLayer(order, opacity); } }
1106
         * 
1107
         * } }
1108
         */
1109

    
1110
        public void selectionChanged(SelectionEvent e) {
1111
                // TODO Auto-generated method stub
1112
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1113
                while (lyrIterator.hasNext()) {
1114
                        FLayer layer = lyrIterator.next();
1115
                        Layer3DProps props3D = getLayer3DProps(layer);
1116
                        if (props3D.getType() != Layer3DProps.layer3DOSG) {
1117
                                if (layer.getClass().equals(FLyrVect.class)) {
1118
                                        FLyrVect lyr = (FLyrVect) layer;
1119

    
1120
                                        FBitSet selection = null;
1121
                                        try {
1122
                                                selection = lyr.getRecordset().getSelectionSupport()
1123
                                                .getSelection();
1124
                                        } catch (ReadDriverException e1) {
1125
                                                // TODO Auto-generated catch block
1126
                                                e1.printStackTrace();
1127
                                        }
1128

    
1129
                                        if ((selection.cardinality() == 0)
1130
                                                        || (!(selection.isEmpty()))) {
1131
                                                Layer3DProps props = Layer3DProps
1132
                                                .getLayer3DProps(layer);
1133
                                                refreshLayerInTerrain(props, true);
1134
                                                if (layer instanceof FLyrVect) {
1135
                                                        FLyrVect fvect = (FLyrVect) layer;
1136
                                                        props.drawVersion = fvect.getDrawVersion();
1137
                                                }
1138
                                        }
1139
                                }
1140
                        }
1141
                }
1142
        }
1143

    
1144
        public void removeLayerToTerrain(FLayer layer) {
1145
                // TODO Auto-generated method stub
1146
                Layer3DProps props3D = getLayer3DProps(layer);
1147

    
1148
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1149
                        DeleteVectors(layer, props3D);
1150
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1151
                        DeleteOSGLayer(layer, props3D);
1152
                } else {
1153
                        Layer terrainLayer = _terrainFLayerMap.get(layer);
1154
                        if (terrainLayer != null) {
1155
                                FLayerCacheService cacheService = (FLayerCacheService) props3D.getCacheService();
1156
                                if(cacheService != null)
1157
                                        try {
1158
                                                cacheService.free();
1159
                                        } catch (Throwable e) {
1160
                                                // TODO Auto-generated catch block
1161
                                                e.printStackTrace();
1162
                                        }
1163
                                        _terrainLayerMap.remove(terrainLayer.getLayerID());
1164
                                        _terrainFLayerMap.remove(layer);
1165

    
1166
                                        try {
1167
                                                _terrainLayerManager.removeLayer(terrainLayer);
1168
                                        } catch (LayerManagementException e) {
1169
                                                // TODO Auto-generated catch block
1170
                                                e.printStackTrace();
1171
                                        }
1172
                        }
1173
                }
1174

    
1175
        }
1176

    
1177
        private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) {
1178
                if (_terrain == null || _viewProjection == null)
1179
                        return;
1180

    
1181
                OSGCacheService cacheService = (OSGCacheService) props3D
1182
                .getCacheService();
1183
                if (cacheService != null) {
1184
                        // use VectorCacheService to delete features to terrain
1185
                        cacheService.DeleteFeaturesToTerrain();
1186
                }
1187
        }
1188

    
1189
        public boolean isRenewCanvasOff() {
1190
                return _renewCanvasOff;
1191
        }
1192

    
1193
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1194
                _renewCanvasOff = renewCanvasOff;
1195
        }
1196

    
1197
        public void drawValueChanged(LayerEvent arg0) {
1198
                // TODO Auto-generated method stub
1199

    
1200
        }
1201

    
1202
        protected class MyCancel implements Cancellable, ICancellable {
1203

    
1204
                public boolean isCanceled() {
1205
                        return false;
1206
                }
1207

    
1208
                public void setCanceled(boolean canceled) {
1209

    
1210
                }
1211

    
1212
                /* if you don�t put and ID the wms donwload will be fail */
1213
                public Object getID() {
1214
                        return this;
1215
                }
1216

    
1217
        }
1218

    
1219
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1220

    
1221
                if (_terrainLayerMap.size() == 0)
1222
                        return null;
1223
                if (rde == null)
1224
                        return null;
1225
                if (rde.getExtent() == null)
1226
                        return null;
1227
                if (rde.getLayer() == null)
1228
                        return null;
1229
                if (rde.getLayerManager() == null)
1230
                        return null;
1231

    
1232
                UpdateDataEvent ude = new UpdateDataEvent();
1233
                ude.copyDataFromRequest(rde);
1234

    
1235

    
1236
                String layerID = rde.getLayer().getLayerID();
1237
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1238
                if (layer == null)
1239
                        return null;
1240
                if (!layer.isVisible())
1241
                        return null;
1242

    
1243
                Layer3DProps props3D = getLayer3DProps(layer);
1244

    
1245
                // get/create cache service
1246
                boolean existsCacheService = true;
1247
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1248
                .getCacheService();
1249
                if (cacheService == null) {
1250
                        existsCacheService = false;
1251
                        cacheService = new FLayerCacheService(_terrain, props3D
1252
                                        .getCacheName(), layer, _viewProjection);
1253
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1254
                        props3D.setCacheService(cacheService);
1255

    
1256
                }
1257

    
1258

    
1259

    
1260
                int dataType = props3D.getType();
1261
                Point tileIndices = new Point(rde.getTileX(), rde.getTileY());
1262
                TileNum tileNum = new TileNum(rde.getTileLevel(), tileIndices);
1263

    
1264
                String tileFileName = "";
1265

    
1266
                double minX, minY, width, height;
1267

    
1268
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1269
                        minX = rde.getExtent().xMin();
1270
                        minY = rde.getExtent().yMin();
1271
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1272
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1273
                } else {
1274
                        minX = Math.toDegrees(rde.getExtent().xMin());
1275
                        minY = Math.toDegrees(rde.getExtent().yMin());
1276
                        width = Math.toDegrees(rde.getExtent().xMax()
1277
                                        - rde.getExtent().xMin());
1278
                        height = Math.toDegrees(rde.getExtent().yMax()
1279
                                        - rde.getExtent().yMin());
1280
                }
1281
                boolean failData = false;
1282

    
1283
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1284
                if (cacheService.intersectsLayer(extent)) { // extent test
1285
                        try {
1286
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1287
                                if (tileFileName == null)
1288
                                        failData = true;
1289
                        } catch (Exception e) {
1290
                                failData = true;
1291
                                NotificationManager.addInfo("Problem reading tile:" + tileNum,
1292
                                                e);
1293
                                e.printStackTrace();
1294
                        }
1295

    
1296
                        if (failData) {
1297
                                return null;
1298
                                // ude.setFailData();
1299
                        } else {
1300
                                switch (dataType) {
1301
                                case Layer3DProps.layer3DImage:
1302
                                        ude.setRasterData(tileFileName, "gdal");
1303
                                        break;
1304
                                case Layer3DProps.layer3DElevation:
1305
                                        ude.setHeightfieldData(tileFileName, "gdal");
1306
                                        break;
1307
                                case Layer3DProps.layer3DVectorMR:
1308
                                        ude.setVectorData(tileFileName, "osg");
1309
                                        break;
1310
                                }
1311
                        }
1312
                }
1313

    
1314
//                if(layer instanceof FLyrWMS && existsCacheService) {
1315
//                        try {
1316
//                                FLyrWMS wmsLayer = (FLyrWMS) layer;
1317
//                                String  name = cacheService.getTileAsFName(tileNum, extent);
1318
//
1319
//                                if(name != null){
1320
//
1321
//                                        File f = new File(name);
1322
//                                        wmsLayer.setName(f.getName());
1323
//                                        wmsLayer.setLoadParams(f);
1324
//                                        wmsLayer.load();
1325
//                                }
1326
//
1327
//                        } catch (LoadLayerException e) {
1328
//                                // TODO Auto-generated catch block
1329
//                                e.printStackTrace();
1330
//                        } catch (CacheServiceException e) {
1331
//                                // TODO Auto-generated catch block
1332
//                                e.printStackTrace();
1333
//                        }
1334
//
1335
//
1336
//                }
1337

    
1338
                return ude;
1339
        }
1340
}