Statistics
| Revision:

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

History | View | Annotate | Download (41.6 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.util.ArrayList;
14
import java.util.Hashtable;
15
import java.util.Vector;
16

    
17
import javax.print.attribute.PrintRequestAttributeSet;
18

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

    
54
import com.hardcode.driverManager.Driver;
55
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
56
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
57
import com.iver.andami.PluginServices;
58
import com.iver.andami.messages.NotificationManager;
59
import com.iver.andami.ui.mdiManager.IWindow;
60
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
61
import com.iver.cit.gvsig.fmap.MapContext;
62
import com.iver.cit.gvsig.fmap.ViewPort;
63
import com.iver.cit.gvsig.fmap.layers.FBitSet;
64
import com.iver.cit.gvsig.fmap.layers.FLayer;
65
import com.iver.cit.gvsig.fmap.layers.FLayers;
66
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
67
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
68
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
69
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
70
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
71
import com.iver.cit.gvsig.fmap.layers.LayerListener;
72
import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent;
73
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
74
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
75
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
76
import com.iver.cit.gvsig.fmap.layers.SelectionSupport;
77
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
78
import com.iver.cit.gvsig.fmap.layers.XMLException;
79
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
80
import com.iver.cit.gvsig.fmap.rendering.LegendListener;
81
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
82
import com.iver.utiles.XMLEntity;
83
import com.iver.utiles.swing.threads.Cancellable;
84

    
85
public class MapContext3D extends MapContext implements DataLoader,
86
LayerListener, LegendListener, SelectionListener {
87

    
88
        // JOSG library objects
89
        private Terrain _terrain;
90
        private IViewerContainer _canvas3d;
91
        private TerrainViewer _terrainViewer;
92
        private LayerManager _terrainLayerManager;
93
        private JavaDataDriver _terrainDataManager = null;
94

    
95
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
96
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
97

    
98
        private IProjection _viewProjection;
99
        private float _verticalExaggeration;
100
        private boolean _bEmptyView = true;
101
        private boolean _bListenToLegend = true;
102
        private boolean _bLoading = false;
103
        private TerrainViewer _canvasoff = null;
104
        private boolean _renewCanvasOff = false;
105
        private static Logger _logger = Logger.getLogger(MapContext3D.class
106
                        .getName());
107
        TerrainViewer _printViewer = null;
108
        Layer _testRasterLayer = null;
109

    
110
        private boolean visibilityChange = false;
111

    
112
        @Override
113
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
114
                        double scale) throws ReadDriverException {
115

    
116
                if(_canvas3d == null || _canvas3d.getOSGViewer() == null) return;
117
                double x = getViewPort().getOffset().getX();
118
                double y = getViewPort().getOffset().getY();
119
                double w = image.getWidth();
120
                double h = image.getHeight();
121

    
122
                if (_canvasoff == null) {
123
                        try {
124
                                _canvasoff = new TerrainViewer();
125
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
126

    
127
                                Terrain planetView3D = ((TerrainViewer) _canvas3d
128
                                                .getOSGViewer()).getTerrain(0);
129
                                Terrain terrain = new Terrain();
130
                                terrain.setCoordinateSystemType(planetView3D
131
                                                .getCoordinateSystemType());
132
                                terrain.setCoordinateSystemName(planetView3D
133
                                                .getCoordinateSystemName());
134
                                terrain.setCoordinateSystemFormat(planetView3D
135
                                                .getCoordinateSystemFormat());
136
                                terrain.setExtent(planetView3D.getExtent());
137
                                terrain.setTerrainName(planetView3D.getTerrainName());
138

    
139
                                terrain.init();
140
                                terrain.setLayerManager(_terrainLayerManager);
141

    
142
                                _canvasoff.addTerrain(terrain);
143
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
144
                                                .getOSGViewer()).getFeatures()));
145
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
146
                                .getClearColor();
147
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(), color
148
                                                .w());
149
                                this.setRenewCanvasOff(false);
150
                        } catch (NodeException e) {
151
                                // TODO Auto-generated catch block
152
                                e.printStackTrace();
153
                        }
154

    
155
                }
156

    
157
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
158
                Matrix refView = refCam.getViewMatrix();
159
                Matrix refProy = refCam.getProjectionMatrix();
160
                Matrix.Perspective pers = refProy.getPerspective();
161
                Camera viewCam = new Camera();
162
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
163
                                pers.zFar);
164
                viewCam.setViewMatrix(refView);
165
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
166
                _canvasoff.setCamera(viewCam);
167
                _canvasoff.takeScreenshotToMemory();
168
                _canvasoff.frame();
169

    
170
                Image OSGimage = _canvasoff.getScreenshotImage();
171

    
172
                BufferedImage img = null;
173
                try {
174
                        img = OSGimage.getBufferedImage();
175
                } catch (ImageConversionException e1) {
176
                        // TODO Auto-generated catch block
177
                        e1.printStackTrace();
178
                } catch (IOException e1) {
179
                        // TODO Auto-generated catch block
180
                        e1.printStackTrace();
181
                }
182

    
183
                double scalex = w / img.getWidth(null);
184
                double scaley = h / img.getHeight(null);
185
                try {
186
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
187
                                        scaley);
188
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
189
                        xpos.concatenate(xform);
190
                        g.drawRenderedImage(img, xpos);
191
                } catch (ImagingOpException e) {
192
                        NotificationManager.addError("Dibujando FFramePicture", e);
193
                }
194

    
195
        }
196

    
197
        public void print(Graphics2D g, double scale, PrintRequestAttributeSet arg2)
198
        throws ReadDriverException {
199

    
200
                int x = (int) getViewPort().getOffset().getX();
201
                int y = (int) getViewPort().getOffset().getY();
202
                int w = (int) g.getClipBounds().getWidth();
203
                int h = (int) g.getClipBounds().getHeight();
204
                System.err.println("x " + x + "; y " + y + "; w " + w + "; h" + h);
205

    
206
                Camera viewerCam = _canvas3d.getOSGViewer().getCamera();
207
                BufferedImage s = null;
208

    
209
                try {
210
                        int minw = (int) w / 10;
211
                        int minh = (int) h / 10;
212
                        System.out.println("minw" + minw + " minh" + minh);
213

    
214
                        _printViewer = new TerrainViewer();
215
                        // Terrain planetView3D = ((TerrainViewer)
216
                        // _canvas3d.getOSGViewer()).getTerrain(0);
217
                        // Terrain terrain = new Terrain();
218
                        // terrain.setCoordinateSystemType(planetView3D
219
                        // .getCoordinateSystemType());
220
                        // terrain.setCoordinateSystemName(planetView3D
221
                        // .getCoordinateSystemName());
222
                        // terrain.setCoordinateSystemFormat(planetView3D
223
                        // .getCoordinateSystemFormat());
224
                        // terrain.setExtent(planetView3D.getExtent());
225
                        // terrain.setTerrainName(planetView3D.getTerrainName());
226
                        //
227
                        //                
228
                        // terrain.init();
229
                        // terrain.setLayerManager(_terrainLayerManager);
230

    
231
                        _printViewer.addTerrain((((TerrainViewer) _canvas3d.getOSGViewer())
232
                                        .getTerrain(0)));
233
                        _printViewer.addFeature((((TerrainViewer) _canvas3d.getOSGViewer())
234
                                        .getFeatures()));
235
                        Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
236
                        .getClearColor();
237
                        _printViewer.setClearColor(color.x(), color.y(), color.z(), color
238
                                        .w());
239
                        _printViewer.setUpViewerInBackground(0, 0, minw, minh);
240

    
241
                        PrintUtilities util = new PrintUtilities();
242
                        util.setViewer(_printViewer);
243
                        s = util.getHighResolutionImage(viewerCam, w, h,
244
                                        new PrintUtilities.FrameFinishedListener() {
245

    
246
                                public boolean isframeFinished() {
247
                                        /*if (getDataManager().getNumPendingRequests() > 0) {
248
                                                                System.out.println("getNumPending:" + getDataManager().getNumPendingRequests());
249
                                                                return false;
250
                                                        }
251
                                                        System.out.println("------------------ OLE! -------------");*/
252
                                        return true;
253
                                }
254
                        });
255

    
256
                        RenderedImage render = s;
257
                } catch (NodeException e1) {
258
                        // TODO Auto-generated catch block
259
                        e1.printStackTrace();
260
                }
261

    
262
                double scalex = w / s.getWidth(null);
263
                double scaley = h / s.getHeight(null);
264
                try {
265
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
266
                                        scaley);
267
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
268
                        xpos.concatenate(xform);
269
                        g.drawRenderedImage(s, xpos);
270
                        // g.drawRenderedImage(img, new AffineTransform());
271
                } catch (ImagingOpException e) {
272
                        NotificationManager.addError("Dibujando FFramePicture", e);
273
                }
274
                _printViewer.releaseGLContext();
275
                _printViewer.dispose();
276
                System.gc();
277
        }
278

    
279
        public MapContext3D(ViewPort vp) {
280
                super(vp);
281
        }
282

    
283
        public MapContext3D(FLayers fLayers, ViewPort vp) {
284
                super(fLayers, vp);
285
        }
286

    
287
        public void setTerrain(Terrain terrain) {
288
                if (_terrain == terrain)
289
                        return;
290

    
291
                _terrain = terrain;
292

    
293
                // add layers to terrain necessary when we are loading
294
                addCurrentLayers();
295
        }
296

    
297
        public Terrain getTerrain() {
298
                return _terrain;
299
        }
300

    
301
        public void setDataManager(JavaDataDriver manager) {
302
                _terrainDataManager = manager;
303
                _terrainDataManager.setDataLoader(this);
304
        }
305

    
306
        public JavaDataDriver getDataManager() {
307
                return _terrainDataManager;
308
        }
309

    
310
        public void setLayerManager(LayerManager manager) {
311
                _terrainLayerManager = manager;
312
        }
313

    
314
        public LayerManager getLayerManager() {
315
                return _terrainLayerManager;
316
        }
317

    
318
        public void setViewer(IViewerContainer canvas) {
319
                _canvas3d = canvas;
320
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
321
        }
322

    
323
        public IProjection getViewProjection() {
324
                return _viewProjection;
325
        }
326

    
327
        public void setViewProjection(IProjection projection) {
328
                _viewProjection = projection;
329
        }
330

    
331
        public IViewerContainer getCanvas3d() {
332
                return _canvas3d;
333
        }
334

    
335
        public float getVerticalExaggeration() {
336
                return _verticalExaggeration;
337
        }
338

    
339
        public void setVerticalExaggeration(float verticalExaggeration) {
340
                _verticalExaggeration = verticalExaggeration;
341
        }
342

    
343
        public void setLoading(boolean bLoading) {
344
                _bLoading = bLoading;
345
        }
346

    
347
        public FLayers getNewGroupLayer(FLayers parent) {
348
                return new FLayers3D(this, parent, getViewPort());
349
        }
350

    
351
        /** * LAYER CHANGES called by FLayers3D ** */
352

    
353
        public void layerMoved(FLayers3D parent, FLayer layer,
354
                        int oldPos, int newPos) {
355

    
356
                if (layer instanceof FLayers) {
357
                        FLayers group = (FLayers) layer;
358
                        if (newPos > oldPos) {
359
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
360
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
361
                                                        oldPos, newPos);
362
                        } else {
363
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
364
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
365
                                                        oldPos, newPos);
366
                        }
367
                        return;
368
                }
369

    
370
                Layer3DProps props3D = getLayer3DProps(layer);
371
                int type = props3D.getType();
372

    
373
                // Now reorder in layer manager only for terrain layer types
374
                if ((type == Layer3DProps.layer3DOSG)
375
                                || ((type == Layer3DProps.layer3DVector)))
376
                        return;
377

    
378
                // Obtain the old position in the layer
379
                Layer terrainLayer = _terrainFLayerMap.get(layer);
380
                Vector<Integer> terrainOldPos=null;
381
                try {
382
                        terrainOldPos = _terrainLayerManager
383
                        .getOrder(terrainLayer);
384
                } catch (LayerManagementException e) {
385
                        // TODO Auto-generated catch block
386
                        e.printStackTrace();
387
                }
388

    
389
                int terrainNewPos = 0;
390
                // Compute the new position.
391
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
392
                while (lyrIterator.hasNext()) {
393
                        FLayer auxLayer = lyrIterator.next();
394
                        if (auxLayer == layer)
395
                                break;
396
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
397
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
398
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
399
                                terrainNewPos++;
400
                        }
401

    
402
                }
403

    
404
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
405
                        return;
406
                if (terrainOldPos.get(0) != terrainNewPos)
407
                        try {
408
                                _terrainLayerManager.moveLayer(terrainOldPos.get(0), terrainNewPos);
409
                        } catch (LayerManagementException e) {
410
                                // TODO Auto-generated catch block
411
                                e.printStackTrace();
412
                        }
413

    
414
                        System.out.println("En el toc antes era el " + oldPos + " y ahora el "
415
                                        + newPos);
416
                        System.out.println("En el terrain antes era el " + terrainOldPos
417
                                        + " y ahora el " + terrainNewPos);
418

    
419
                        PrintDebugLayers();
420
        }
421

    
422
        public void layerAdded(FLayers3D parent, FLayer layer) {
423

    
424
                // to add group layers to 3D, just add recursively child data layers
425
                if (layer instanceof FLayers) {
426
                        FLayers group = (FLayers) layer;
427
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
428
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
429
                        }
430
                        getLayer3DProps(layer).setHooked(true);
431
                        return;
432
                }
433

    
434
                if (layer instanceof Classifiable) {
435
                        Classifiable legendLyr = (Classifiable) layer;
436
                        // legendLyr.addLegendListener((LegendListener) this);
437
                        this.addLayerListener(this);
438
                }
439
                layer.addLayerListener((LayerListener) this);
440

    
441
                // listener to manage the selection for the layers
442
                if (layer.getClass().equals(FLyrVect.class)) {
443
                        FLyrVect lyr = (FLyrVect) layer;
444
                        refreshLayerVectorsVisibility(lyr);
445
                        try {
446
                                SelectableDataSource recordSet = lyr.getRecordset();
447
                                if (recordSet != null) {
448
                                        SelectionSupport selectionSupport = recordSet
449
                                        .getSelectionSupport();
450
                                        selectionSupport.addSelectionListener(this);
451
                                }
452
                        } catch (ReadDriverException e) {
453
                                // TODO Auto-generated catch block
454
                                e.printStackTrace();
455
                        }
456
                }
457

    
458
                if (!_bLoading)
459
                        addLayerToTerrain(layer, true);
460

    
461
                // Only do this the first time to add layer
462
                if (_bEmptyView && !_bLoading) {
463
                        if (layers.getLayersCount() > 0) {
464
                                try {
465
                                        zoomToExtent(layer.getFullExtent());
466
                                } catch (ExpansionFileReadException e) {
467
                                        e.printStackTrace();
468
                                } catch (ReadDriverException e) {
469
                                        e.printStackTrace();
470
                                }
471
                                _bEmptyView = false;
472
                        }
473
                }
474

    
475
                PrintDebugLayers();
476
        }
477

    
478
        public void layerRemoved(FLayers3D parent, FLayer layer) {
479

    
480
                // to remove group layers to 3D, just remove recursively child data
481
                // layers
482
                if (layer instanceof FLayers) {
483
                        FLayers group = (FLayers) layer;
484
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
485
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
486
                        }
487
                        getLayer3DProps(layer).setHooked(false);
488
                        return;
489
                }
490

    
491
                if (layer instanceof Classifiable) {
492
                        Classifiable legendLyr = (Classifiable) layer;
493
                        legendLyr.removeLegendListener((LegendListener) this);
494
                }
495

    
496
                layer.removeLayerListener((LayerListener) this);
497

    
498
                removeLayerToTerrain(layer);
499

    
500
                // All layers are removed
501
                if (layers.getLayersCount() == 0) {
502
                        _bEmptyView = true;
503
                }
504

    
505
                PrintDebugLayers();
506
        }
507

    
508
        /**
509
         * DOCUMENT ME!
510
         * 
511
         * @param e
512
         *            DOCUMENT ME!
513
         */
514
        public void legendChanged(LegendChangedEvent e) {
515
                if (!_bListenToLegend)
516
                        return;
517
                if ((e == null) && (!visibilityChange)) {
518
                        // find layer whose legend changed
519
                        FLayer found = null;
520
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
521
                        while (lyrIterator.hasNext()) {
522
                                FLayer lyr = lyrIterator.next();
523
                                if (lyr instanceof FLyrVect) {
524
                                        FLyrVect lyrVect = (FLyrVect) lyr;
525
                                        long newDrawVersion = lyrVect.getDrawVersion();
526
                                        Layer3DProps props3D = getLayer3DProps(lyrVect);
527
                                        if ((newDrawVersion - props3D.drawVersion) >= 1) {
528
                                                props3D.drawVersion = lyrVect.getDrawVersion();
529
                                                refreshLayerInTerrain(props3D, true);
530
                                                refreshLayerVectorsVisibility(lyrVect);
531
                                                _bListenToLegend = false;
532
                                                //props3D.VerifyLegend(_terrain.getTerrainName());
533
                                                _bListenToLegend = true;
534
                                                
535
                                        }
536
                                }
537
                        }
538

    
539
                        IWindow f = PluginServices.getMDIManager().getActiveWindow();
540
                        if (f instanceof BaseView) {
541
                                BaseView view3D = (BaseView) f;
542
                                view3D.getTOC().refresh();
543
                        }
544
                }
545
                visibilityChange = false;
546
        }
547

    
548
        public void visibilityChanged(LayerEvent e) {
549
                FLayer lyr = e.getSource();
550

    
551
                Layer3DProps props3D = getLayer3DProps(lyr);
552

    
553
                if (props3D.getType() == Layer3DProps.layer3DVector) {
554
                        refreshLayerVectorsVisibility(lyr);
555
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
556
                        refreshLayer3DOSGVisibility(lyr);
557
                } else {
558
                        refreshLayerVisibility(lyr);
559
                }
560
                visibilityChange = true;
561
        }
562

    
563
        private void refreshLayer3DOSGVisibility(FLayer lyr) {
564
                if (_terrain == null || _viewProjection == null)
565
                        return;
566

    
567
                Layer3DProps props3D = getLayer3DProps(lyr);
568

    
569
                OSGCacheService cacheService = (OSGCacheService) props3D
570
                .getCacheService();
571
                if (cacheService != null) {
572
                        // use VectorCacheService to add features to terrain
573
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
574
                }
575

    
576
        }
577

    
578
        private void refreshLayerVisibility(FLayer layer) {
579

    
580
                Layer terrainLayer = _terrainFLayerMap.get(layer);
581
                terrainLayer.setEnabled(layer.isVisible());
582
                _terrainLayerManager.updateLayers();
583

    
584
        }
585

    
586
        private void refreshLayerVectorsVisibility(FLayer lyr) {
587
                if (_terrain == null || _viewProjection == null)
588
                        return;
589

    
590
                Layer3DProps props3D = getLayer3DProps(lyr);
591

    
592
                VectorCacheService cacheService = (VectorCacheService) props3D
593
                .getCacheService();
594
                if (cacheService != null) {
595
                        // use VectorCacheService to add features to terrain
596
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
597
                        props3D.drawVersion = lyr.getDrawVersion();
598
                }
599

    
600
        }
601

    
602
        public void activationChanged(LayerEvent e) {
603

    
604
                int a = 0;
605
        }
606

    
607
        public void nameChanged(LayerEvent e) {
608
                // TODO Implement this method
609
        }
610

    
611
        public void editionChanged(LayerEvent e) {
612
                // TODO Implement this method
613

    
614
        }
615

    
616
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
617
                if (props == null)
618
                        return;
619

    
620
                if (_terrain == null)
621
                        return; // view not opened yet
622

    
623
                // clear cache
624

    
625

    
626

    
627
                // refresh layer in terrain
628
                int type = props.getType();
629
                if ((type == Layer3DProps.layer3DImage)
630
                                || (type == Layer3DProps.layer3DElevation)
631
                                || (type == Layer3DProps.layer3DVectorMR)) {
632

    
633
                        if (bRemoveCache) {
634

    
635
                                String layerCacheDir = Layer3DProps.m_cacheDir + File.separator
636
                                + _terrain.getTerrainName() + File.separator + props.getCacheName();
637

    
638
                                FLayerCacheService cacheServices = (FLayerCacheService) props.getCacheService();
639
                                if(cacheServices != null)
640
                                {
641
                                        try {
642
                                                cacheServices.free();
643
                                                props.setCacheService(null);
644
                                        } catch (Throwable e) {
645
                                                // TODO Auto-generated catch block
646
                                                e.printStackTrace();
647
                                        }
648
                                }
649

    
650
                                removeCache(new File(layerCacheDir));
651
                        }
652
                        try {
653
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
654
                        } catch (LayerManagementException e) {
655
                                // TODO Auto-generated catch block
656
                                e.printStackTrace();
657
                        }
658
                } else if (type == Layer3DProps.layer3DVector) {
659
                        invalidateVectorLayer(props);
660
                }
661
        }
662

    
663
        private void invalidateVectorLayer(Layer3DProps props) {
664
                // TODO Auto-generated method stub
665
                if (_terrain == null || _viewProjection == null)
666
                        return;
667

    
668
                VectorCacheService cacheService = (VectorCacheService) props
669
                .getCacheService();
670
                if (cacheService != null) {
671
                        // use VectorCacheService to add features to terrain
672
                        cacheService.refreshFeaturesToTerrain();
673
                }
674
        }
675

    
676
        private boolean removeCache(File path) {
677
                if( path.exists() ) {
678
                        File[] files = path.listFiles();
679
                        for(int i=0; i<files.length; i++) {
680
                                if(files[i].isDirectory()) {
681
                                        removeCache(files[i]);
682
                                }
683
                                else {
684
                                        files[i].delete();
685
                                }
686
                        }
687
                }
688
                return( path.delete() );
689
        }
690

    
691
        protected Layer3DProps getLayer3DProps(FLayer layer) {
692

    
693
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
694

    
695
                // Create instance of props for osg layers.
696
                if (props3D == null) {
697
                        props3D = new Layer3DProps();
698
                        if (layer instanceof FLyrVect) {
699
                                FLyrVect nLayer = (FLyrVect) layer;
700
                                Driver driver;
701
                                try {
702
                                        driver = nLayer.getRecordset().getDriver();
703
                                        if (driver instanceof GvsigDriverOSG) {
704
                                                props3D.setChooseType(false);
705
                                                props3D.setType(Layer3DProps.layer3DOSG);
706
                                        }
707
                                } catch (ReadDriverException e) {
708
                                        // TODO Auto-generated catch block
709
                                        e.printStackTrace();
710
                                }
711

    
712
                        }
713
                        // Set the properties
714
                        props3D.setLayer(layer);
715

    
716
                        props3D.initCacheName(_terrain.getCoordinateSystemType(),
717
                                        _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
718
                        FLyrDefault baseLayer = (FLyrDefault) layer;
719
                        baseLayer.setProperty("3DLayerExtension", props3D);
720
                        props3D.setVerticalEx(getVerticalExaggeration());
721
                } else {
722
                        if (_bLoading)
723
                                props3D.setChooseType(false);
724
                        props3D.setLayer(layer);
725
                }
726

    
727
                return props3D;
728
        }
729

    
730
        public void addCurrentLayers() {
731
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
732
                while (lyrIterator.hasNext()) {
733
                        FLayer layer = lyrIterator.next();
734
                        Layer3DProps props = getLayer3DProps(layer);
735
                        // props.setTerrainOrder(props.getTocOrder());
736
                        addLayerToTerrain(layer, false);
737
                }
738
        }
739

    
740
        public void addLayerToTerrain(FLayer layer,
741
                        boolean bVerifyLegend) {
742
                Layer3DProps props3D = getLayer3DProps(layer);
743

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

    
768
                                if (layer instanceof FLyrWCS)
769
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
770
                        }
771

    
772
                        Extent extent = null;
773
                        if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
774
                                extent = new Extent(layerExtent.getMinX(), layerExtent
775
                                                .getMinY(), layerExtent.getMaxX(), layerExtent
776
                                                .getMaxY());
777
                        } else {
778
                                extent = new Extent(Math.toRadians(layerExtent.getMinX()), Math
779
                                                .toRadians(layerExtent.getMinY()), Math
780
                                                .toRadians(layerExtent.getMaxX()), Math
781
                                                .toRadians(layerExtent.getMaxY()));
782
                        }
783

    
784
                        if (props3D.getType() == Layer3DProps.layer3DImage) {
785
                                RasterLayer rlayer = new RasterLayer();
786
                                rlayer.setEnabled(layer.isVisible());
787
                                rlayer.setExtent(extent);
788
                                rlayer.setOpacity(props3D.getOpacity());
789
                                rlayer.setDataDriver(_terrainDataManager);
790
                                try {
791
                                        _terrainLayerManager.addLayer(rlayer);
792
                                } catch (LayerManagementException e) {
793
                                        // TODO Auto-generated catch block
794
                                        e.printStackTrace();
795
                                }
796
                                _terrainFLayerMap.put(layer, rlayer);
797
                                _terrainLayerMap.put(rlayer.getLayerID(), layer);
798
                                props3D.setTerrainLayer(rlayer);
799
                                // Refresh cache for vector rasterized layers
800
                                if (layer.getClass().equals(FLyrVect.class)) {
801
                                        refreshLayerInTerrain(props3D, true);
802
                                }
803
                        } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
804
                                HeightfieldLayer hlayer = new HeightfieldLayer();
805
                                hlayer.setEnabled(layer.isVisible());
806
                                hlayer.setExtent(extent);
807
                                hlayer.setVerticalExaggeration(props3D.getVerticalEx());
808
                                _logger.warn("computed optimum level = "+computeOptimumLevel(layer,20));
809
                                //hlayer.setMaxResolution(computeOptimumLevel(layer,20)-1);
810
                                hlayer.setDataDriver(_terrainDataManager);
811
                                try {
812
                                        _terrainLayerManager.addLayer(hlayer);
813
                                } catch (LayerManagementException e) {
814
                                        // TODO Auto-generated catch block
815
                                        e.printStackTrace();
816
                                }
817
                                _terrainFLayerMap.put(layer, hlayer);
818
                                _terrainLayerMap.put(hlayer.getLayerID(), layer);
819
                                props3D.setTerrainLayer(hlayer);
820
                        } else if (props3D.getType() == Layer3DProps.layer3DVectorMR) {
821
                                VectorLayer vlayer = new VectorLayer();
822
                                vlayer.setEnabled(true);
823
                                vlayer.setExtent(extent);
824
                                vlayer.setDensity(1.0f);
825
                                vlayer.setDataDriver(_terrainDataManager);
826
                                try {
827
                                        _terrainLayerManager.addLayer(vlayer);
828
                                } catch (LayerManagementException e) {
829
                                        // TODO Auto-generated catch block
830
                                        e.printStackTrace();
831
                                }
832
                                _terrainFLayerMap.put(layer, vlayer);
833
                                _terrainLayerMap.put(vlayer.getLayerID(), layer);
834
                                props3D.setTerrainLayer(vlayer);
835
                        }
836

    
837
                        if (bVerifyLegend) {
838
                                _bListenToLegend = false;
839
                                props3D.VerifyLegend(_terrain.getTerrainName());
840
                                _bListenToLegend = true;
841
                        }
842
                }
843
        }
844

    
845
        public int computeOptimumLevel(FLayer layer, int maxLevel) {
846
                int level = maxLevel;
847
                if(!(layer instanceof FLyrRasterSE))
848
                                return level;
849
                
850
                
851
                Rectangle2D ext = null;
852
        try {
853
            ext = layer.getFullExtent();
854
        } catch (ReadDriverException e1) {
855
            NotificationManager.addError("Error al obtener el extent", e1);
856
        }
857

    
858
                ArrayList attr = ((FLyrRasterSE)layer).getAttributes();
859
        int width = 0, height = 0;
860
        for (int i=0; i<attr.size(); i++) {
861
            Object[] a = (Object []) attr.get(i);
862
            if (a[0].toString().equals("Width"))
863
                width = ((Integer)a[1]).intValue();
864
            if (a[0].toString().equals("Height"))
865
                height = ((Integer)a[1]).intValue();
866
        }
867

    
868
        if( ext != null &&
869
                width != 0 &&
870
                height != 0){
871

    
872
                Extent destinationExtents = _terrain.getExtent();
873
                        double destination_xRange = destinationExtents.xMax()-destinationExtents.xMin();
874
                    double destination_yRange = destinationExtents.yMax()-destinationExtents.yMin();
875
                    double AR = destination_xRange / destination_yRange;
876
                    int C1 = 1;
877
                    int R1 = 1;
878

    
879
                    boolean swapAxis = AR<1.0;
880
                    if (swapAxis) AR = 1.0/AR;
881

    
882
                    double lower_AR = Math.floor(AR);
883
                    double upper_AR = Math.ceil(AR);
884

    
885
                    if (AR<Math.sqrt(lower_AR*upper_AR))
886
                    {
887
                        C1 = (int)(lower_AR);
888
                        R1 = 1;
889
                    }
890
                    else
891
                    {
892
                        C1 = (int)(upper_AR);
893
                        R1 = 1;
894
                    }
895

    
896
                    if (swapAxis)
897
                    {
898
                        //std::swap(C1,R1);
899
                            int t = C1;
900
                            C1 = R1;
901
                            R1 = t;
902
                    }
903

    
904
        
905
                    double source_xRange = ext.getMaxX() - ext.getMinX();
906
                    double source_yRange = ext.getMaxY() - ext.getMinY();
907
        
908
                    float sourceResolutionX = ((float)source_xRange)/(float)width;
909
                    float sourceResolutionY = ((float)source_yRange)/(float)height;
910
        
911
                    // log(osg::NOTICE,"Source %s resX %f resY %f",source->getFileName().c_str(), sourceResolutionX, sourceResolutionX);
912
        
913
                    double tileSize = 32.0;
914
        
915
                    int k_cols = (int)( Math.ceil( 1.0 + Math.log( destination_xRange / (C1 * sourceResolutionX * tileSize ) ) / Math.log(2.0) ) );
916
                    int k_rows = (int)( Math.ceil( 1.0 + Math.log( destination_yRange / (R1 * sourceResolutionY * tileSize ) ) / Math.log(2.0) ) );
917
                    level = Math.max(k_cols, k_rows);
918
                    level = Math.min(level, maxLevel);
919
                    level = Math.max(level, 0);
920
        }
921
                return level;
922
        }
923

    
924
        private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) {
925
                if (_terrain == null || _viewProjection == null)
926
                        return;
927

    
928
                OSGCacheService cacheService = (OSGCacheService) props3D
929
                .getCacheService();
930
                if (cacheService == null) {
931
                        cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
932
                                        .getCacheName(), layer, _viewProjection);
933
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
934
                        props3D.setCacheService(cacheService);
935
                }
936

    
937
                // use VectorCacheService to add features to planet
938
                cacheService.AddFeaturesToTerrain();
939

    
940
        }
941

    
942
        @Override
943
        public XMLEntity getXMLEntity() throws XMLException {
944
                // TODO Auto-generated method stub
945
                XMLEntity xml = super.getXMLEntity();
946

    
947
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
948
                while (lyrIterator.hasNext()) {
949
                        FLayer lyr = lyrIterator.next();
950
                        Layer3DProps props3D = getLayer3DProps(lyr);
951
                        int type = props3D.getType();
952
                        if (type == Layer3DProps.layer3DOSG) {
953

    
954
                                OSGCacheService cacheService = (OSGCacheService) props3D
955
                                .getCacheService();
956
                                if (cacheService != null) {
957
                                        // use VectorCacheService to add features to planet
958
                                        if (props3D.isEditing()) {
959
                                                // TODO: PONER AKI EL CODIGO DE SALVAR
960
                                        }
961
                                }
962
                        }
963
                }
964

    
965
                return xml;
966

    
967
        }
968

    
969
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
970
                if (_terrain == null || _viewProjection == null)
971
                        return;
972

    
973
                VectorCacheService cacheService = (VectorCacheService) props3D
974
                .getCacheService();
975
                if (cacheService == null) {
976
                        cacheService = new VectorCacheService(_canvas3d, _terrain, props3D
977
                                        .getCacheName(), layer, _viewProjection);
978
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
979
                        props3D.setCacheService(cacheService);
980
                }
981

    
982
                // use VectorCacheService to add features to terrain
983
                cacheService.addFeaturesToTerrain();
984
        }
985

    
986
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
987
                if (_terrain == null || _viewProjection == null)
988
                        return;
989

    
990
                VectorCacheService cacheService = (VectorCacheService) props3D
991
                .getCacheService();
992
                if (cacheService != null) {
993
                        // use VectorCacheService to delete features to terrain
994
                        cacheService.deleteFeaturesToTerrain();
995
                }
996
        }
997

    
998
        /**
999
         * Sets the given zoom extent to the view
1000
         * 
1001
         * @param extent
1002
         *            The extent to zoom to.
1003
         */
1004
        public void zoomToExtent(Rectangle2D geoExtent) {
1005
                double maxHeight = 0.0;
1006

    
1007
                // Getting extent positions
1008
                double minLat = geoExtent.getMinY();
1009
                double maxLat = geoExtent.getMaxY();
1010
                double cenLon = geoExtent.getCenterX();
1011
                double cenLat = geoExtent.getCenterY();
1012

    
1013
                double elevation = 0;
1014

    
1015
                // calculate altitude
1016
                double avLat = 0;
1017
                if (minLat > 0.0 || maxLat < 0.0)
1018
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1019
                double avLon = Math.min(180.0, geoExtent.getWidth());
1020

    
1021
                double terrainRadius = _terrain.getRadiusEquatorial();
1022
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
1023
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1024
                                * (1 - Math.cos(Math.toRadians(avLon))));
1025
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
1026
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
1027

    
1028
                double zoomFactor = 1.5;
1029
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1030

    
1031
                // Calculate XYZ positions for camera.
1032

    
1033
                int terrainType = _terrain.getCoordinateSystemType();
1034

    
1035
                Vec3 eye = new Vec3();
1036
                Vec3 center = new Vec3();
1037
                Vec3 up = new Vec3();
1038
                // Calculate positions for PLAIN MODE.
1039
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
1040

    
1041
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
1042
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
1043
                        double height;
1044

    
1045
                        height = Math.sqrt(difx * difx + dify * dify);
1046
                        double fullWindowFactor = 1.7;
1047
                        // EYE
1048
                        eye.setX(cenLon);
1049
                        eye.setY(cenLat);
1050
                        eye.setZ(height * fullWindowFactor);
1051
                        // CENTER
1052
                        center.setX(cenLon);
1053
                        center.setY(cenLat);
1054
                        center.setZ(0.0);
1055
                        // UP
1056
                        up.setX(0.0);
1057
                        up.setY(1.0);
1058
                        up.setZ(0.0);
1059
                } else
1060
                        // Calculate positions for SPHERICAL MODE.
1061
                        if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
1062
                                // EYE
1063
                                Vec3 aux = new Vec3(cenLat, cenLon, elevation);
1064
                                eye = _terrain.convertLatLongHeightToXYZ(aux);
1065
                                // CENTER
1066
                                center.setX(0.0);
1067
                                center.setY(0.0);
1068
                                center.setZ(0.0);
1069
                                // UP
1070
                                up.setX(0.0);
1071
                                up.setY(0.0);
1072
                                up.setZ(1.0);
1073
                        }
1074
                Camera cam = new Camera();
1075
                cam.setViewByLookAt(eye, center, up);
1076

    
1077
                _terrainViewer.setCamera(cam);
1078

    
1079
        }
1080

    
1081
        private void PrintDebugLayers() {
1082
                if (_terrainLayerManager != null) {
1083
                        System.out.println("===========================");
1084
                        System.out.println("Total terrain layers: "
1085
                                        + _terrainLayerManager.getNumLayers());
1086
                        System.out.println("===========================");
1087
                }
1088
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1089
                int pos = 0;
1090
                while (lyrIterator.hasNext()) {
1091
                        FLayer layer = lyrIterator.next();
1092
                        System.out.println("  Layer " + layer.getName());
1093
                        Layer3DProps props3D = getLayer3DProps(layer);
1094
                        System.out.println("    Type " + props3D.getType());
1095
                        System.out.println("    Order " + pos);
1096
                        pos++;
1097
                }
1098
        }
1099

    
1100
        /**
1101
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
1102
         * 
1103
         * @param xml
1104
         *            XMLEntity
1105
         * 
1106
         * @return Nuevo MapContext3D.
1107
         * 
1108
         * @throws XMLException
1109
         */
1110
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
1111
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
1112

    
1113
                FLayers layers = new FLayers3D(null, null, vp);
1114
                layers.setXMLEntity(xml.getChild(1));
1115

    
1116
                MapContext fmap = layers.getMapContext();
1117

    
1118
                return fmap;
1119
        }
1120

    
1121
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
1122
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
1123

    
1124
                FLayers layers = new FLayers3D(null, null, vp);
1125
                layers.setXMLEntity03(xml.getChild(1));
1126

    
1127
                MapContext fmap = layers.getMapContext();
1128

    
1129
                return fmap;
1130
        }
1131

    
1132
        public GraphicLayer getGraphicsLayer() {
1133
                GraphicLayer3D gra3D = new GraphicLayer3D(_terrainViewer, getTerrain());
1134
                return gra3D;
1135
        }
1136

    
1137
        public Node getSpecialNode() {
1138
                Node specialNode = null;
1139
                try {
1140
                        specialNode = _terrainViewer.getFeature(0);
1141
                } catch (ChildIndexOutOfBoundsExceptions e) {
1142
                        _logger.error("Command: " + "Error child index out of bound.", e);
1143
                }
1144
                return specialNode;
1145
        }
1146

    
1147
        public ViewPort getViewPort() {
1148

    
1149
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1150

    
1151
                if (_canvas3d != null)
1152
                        vp.setImageSize(new Dimension(_terrainViewer.getWidth(),
1153
                                        _terrainViewer.getHeight()));
1154
                vp.setTerrain(this.getTerrain());
1155
                vp.setViewer(this._canvas3d);
1156

    
1157
                return vp;
1158
        }
1159

    
1160
        /**
1161
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1162
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar� un
1163
         * evento de cambio de orden de capas que obligar� a redibujar todo lo que
1164
         * depende de FMap (TOC, MapControl, FFrameView, etc).
1165
         */
1166

    
1167
        /*
1168
         * public void invalidate() { ViewPort3D vp = (ViewPort3D)
1169
         * super.getViewPort(); if (vp.getDirty()) { vp.setDirty(false); } FLayer[]
1170
         * selectedExtent = getLayers().getActives();
1171
         * 
1172
         * if (selectedExtent.length > 0) { for (int i = 0; i <
1173
         * selectedExtent.length; i++) { if (selectedExtent[0].isAvailable()) {
1174
         * 
1175
         * FLayer lyr3D = selectedExtent[i]; Layer3DProps layer3DProps =
1176
         * Layer3DProps .getLayer3DProps(lyr3D);
1177
         * 
1178
         * Layer terrainLayer = _terrainFLayerMap.get(lyr3D); float opacity =
1179
         * (((FLyrDefault) lyr3D).getTransparency()) / (float) 255; if()
1180
         * //_terrain.setTextureOpacityLayer(order, opacity); } }
1181
         * 
1182
         * } }
1183
         */
1184

    
1185
        public void selectionChanged(SelectionEvent e) {
1186
                // TODO Auto-generated method stub
1187
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1188
                while (lyrIterator.hasNext()) {
1189
                        FLayer layer = lyrIterator.next();
1190
                        Layer3DProps props3D = getLayer3DProps(layer);
1191
                        if (props3D.getType() != Layer3DProps.layer3DOSG) {
1192
                                if (layer.getClass().equals(FLyrVect.class)) {
1193
                                        FLyrVect lyr = (FLyrVect) layer;
1194

    
1195
                                        FBitSet selection = null;
1196
                                        try {
1197
                                                selection = lyr.getRecordset().getSelectionSupport()
1198
                                                .getSelection();
1199
                                        } catch (ReadDriverException e1) {
1200
                                                // TODO Auto-generated catch block
1201
                                                e1.printStackTrace();
1202
                                        }
1203

    
1204
                                        if ((selection.cardinality() == 0)
1205
                                                        || (!(selection.isEmpty()))) {
1206
                                                Layer3DProps props = Layer3DProps
1207
                                                .getLayer3DProps(layer);
1208
                                                refreshLayerInTerrain(props, true);
1209
                                                if (layer instanceof FLyrVect) {
1210
                                                        FLyrVect fvect = (FLyrVect) layer;
1211
                                                        props.drawVersion = fvect.getDrawVersion();
1212
                                                }
1213
                                        }
1214
                                }
1215
                        }
1216
                }
1217
        }
1218

    
1219
        public void removeLayerToTerrain(FLayer layer) {
1220
                // TODO Auto-generated method stub
1221
                Layer3DProps props3D = getLayer3DProps(layer);
1222

    
1223
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1224
                        DeleteVectors(layer, props3D);
1225
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1226
                        DeleteOSGLayer(layer, props3D);
1227
                } else {
1228
                        Layer terrainLayer = _terrainFLayerMap.get(layer);
1229
                        if (terrainLayer != null) {
1230
                                FLayerCacheService cacheService = (FLayerCacheService) props3D.getCacheService();
1231
                                if(cacheService != null)
1232
                                        try {
1233
                                                cacheService.free();
1234
                                        } catch (Throwable e) {
1235
                                                // TODO Auto-generated catch block
1236
                                                e.printStackTrace();
1237
                                        }
1238
                                        _terrainLayerMap.remove(terrainLayer.getLayerID());
1239
                                        _terrainFLayerMap.remove(layer);
1240

    
1241
                                        try {
1242
                                                _terrainLayerManager.removeLayer(terrainLayer);
1243
                                        } catch (LayerManagementException e) {
1244
                                                // TODO Auto-generated catch block
1245
                                                e.printStackTrace();
1246
                                        }
1247
                        }
1248
                }
1249

    
1250
        }
1251

    
1252
        private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) {
1253
                if (_terrain == null || _viewProjection == null)
1254
                        return;
1255

    
1256
                OSGCacheService cacheService = (OSGCacheService) props3D
1257
                .getCacheService();
1258
                if (cacheService != null) {
1259
                        // use VectorCacheService to delete features to terrain
1260
                        cacheService.DeleteFeaturesToTerrain();
1261
                }
1262
        }
1263

    
1264
        public boolean isRenewCanvasOff() {
1265
                return _renewCanvasOff;
1266
        }
1267

    
1268
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1269
                _renewCanvasOff = renewCanvasOff;
1270
        }
1271

    
1272
        public void drawValueChanged(LayerEvent arg0) {
1273
                // TODO Auto-generated method stub
1274

    
1275
        }
1276

    
1277

    
1278

    
1279
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1280

    
1281
                if (_terrainLayerMap.size() == 0)
1282
                        return null;
1283
                if (rde == null)
1284
                        return null;
1285
                if (rde.getExtent() == null)
1286
                        return null;
1287
                if (rde.getLayer() == null)
1288
                        return null;
1289
                if (rde.getLayerManager() == null)
1290
                        return null;
1291

    
1292
                UpdateDataEvent ude = new UpdateDataEvent();
1293
                ude.copyDataFromRequest(rde);
1294

    
1295

    
1296
                String layerID = rde.getLayer().getLayerID();
1297
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1298
                if (layer == null)
1299
                        return null;
1300
                if (!layer.isVisible())
1301
                        return null;
1302

    
1303
                Layer3DProps props3D = getLayer3DProps(layer);
1304

    
1305
                // get/create cache service
1306
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1307
                .getCacheService();
1308
                if (cacheService == null) {
1309

    
1310
                        cacheService = new FLayerCacheService(_terrain, props3D
1311
                                        .getCacheName(), layer, _viewProjection);
1312
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1313
                        props3D.setCacheService(cacheService);
1314

    
1315
                }
1316

    
1317

    
1318

    
1319
                int dataType = props3D.getType();
1320
                Point tileIndices = new Point(rde.getTileX(), rde.getTileY());
1321
                TileNum tileNum = new TileNum(rde.getTileLevel(), tileIndices);
1322

    
1323
                String tileFileName = "";
1324

    
1325
                double minX, minY, width, height;
1326

    
1327
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1328
                        minX = rde.getExtent().xMin();
1329
                        minY = rde.getExtent().yMin();
1330
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1331
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1332
                } else {
1333
                        minX = Math.toDegrees(rde.getExtent().xMin());
1334
                        minY = Math.toDegrees(rde.getExtent().yMin());
1335
                        width = Math.toDegrees(rde.getExtent().xMax()
1336
                                        - rde.getExtent().xMin());
1337
                        height = Math.toDegrees(rde.getExtent().yMax()
1338
                                        - rde.getExtent().yMin());
1339
                }
1340
                boolean failData = false;
1341

    
1342
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1343
                if (cacheService.intersectsLayer(extent)) { // extent test
1344
                        try {
1345
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1346
                                if (tileFileName == null)
1347
                                        failData = true;
1348
                        } catch (Exception e) {
1349
                                failData = true;
1350
                                NotificationManager.addInfo("Problem reading tile:" + tileNum,
1351
                                                e);
1352
                                e.printStackTrace();
1353
                        }
1354

    
1355
                        if (failData) {
1356
                                return null;
1357
                                // ude.setFailData();
1358
                        } else {
1359
                                switch (dataType) {
1360
                                case Layer3DProps.layer3DImage:
1361
                                        ude.setRasterData(tileFileName, "gdal");
1362
                                        break;
1363
                                case Layer3DProps.layer3DElevation:
1364
                                        ude.setHeightfieldData(tileFileName, "gdal");
1365
                                        break;
1366
                                case Layer3DProps.layer3DVectorMR:
1367
                                        ude.setVectorData(tileFileName, "osg");
1368
                                        break;
1369
                                }
1370
                        }
1371
                }
1372

    
1373
                return ude;
1374
        }
1375
}