Statistics
| Revision:

svn-gvsig-desktop / branches / gvSIG_19_ext3D_osgVP_2_2_0 / libraries / lib3DMap / src / org / gvsig / gvsig3d / map3d / MapContext3D.java @ 31879

History | View | Annotate | Download (36.9 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.Hashtable;
14
import java.util.Iterator;
15
import java.util.Timer;
16
import java.util.Vector;
17

    
18
import javax.print.attribute.PrintRequestAttributeSet;
19

    
20
import org.apache.log4j.Logger;
21
import org.cresques.cts.IProjection;
22
import org.gvsig.cacheservice.TileNum;
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.viewer.Camera;
50
import org.gvsig.osgvp.viewer.IViewerContainer;
51
import org.gvsig.osgvp.viewer.PrintUtilities;
52

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

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

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

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

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

    
109
        private boolean visibilityChange = false;
110

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

    
115
                double x = getViewPort().getOffset().getX();
116
                double y = getViewPort().getOffset().getY();
117
                double w = image.getWidth();
118
                double h = image.getHeight();
119

    
120
                if (_canvasoff == null) {
121
                        try {
122
                                _canvasoff = new TerrainViewer();
123
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
124
                                
125
                                
126
                                Terrain planetView3D = ((TerrainViewer) _canvas3d.getOSGViewer()).getTerrain(0);
127
                                Terrain terrain = new Terrain();
128
                                terrain.setCoordinateSystemType(planetView3D
129
                                                .getCoordinateSystemType());
130
                                terrain.setCoordinateSystemName(planetView3D
131
                                                .getCoordinateSystemName());
132
                                terrain.setCoordinateSystemFormat(planetView3D
133
                                                .getCoordinateSystemFormat());
134
                                terrain.setExtent(planetView3D.getExtent());
135
                                terrain.setTerrainName(planetView3D.getTerrainName());
136

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

    
156
                }
157

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

    
171
                Image OSGimage = _canvasoff.getScreenshotImage();
172

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

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

    
196
        }
197

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

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

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

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

    
215
                        _printViewer = new TerrainViewer();
216
//                        Terrain planetView3D = ((TerrainViewer) _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

    
245
                        RenderedImage render = s;
246
                } catch (NodeException e1) {
247
                        // TODO Auto-generated catch block
248
                        e1.printStackTrace();
249
                }
250

    
251
                double scalex = w / s.getWidth(null);
252
                double scaley = h / s.getHeight(null);
253
                try {
254
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
255
                                        scaley);
256
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
257
                        xpos.concatenate(xform);
258
                        g.drawRenderedImage(s, xpos);
259
                        // g.drawRenderedImage(img, new AffineTransform());
260
                } catch (ImagingOpException e) {
261
                        NotificationManager.addError("Dibujando FFramePicture", e);
262
                }
263
                _printViewer.releaseGLContext();
264
                _printViewer.dispose();
265
                System.gc();
266
        }
267

    
268
        public MapContext3D(ViewPort vp) {
269
                super(vp);
270
        }
271

    
272
        public MapContext3D(FLayers fLayers, ViewPort vp) {
273
                super(fLayers, vp);
274
        }
275

    
276
        public void setTerrain(Terrain terrain) {
277
                if (_terrain == terrain)
278
                        return;
279

    
280
                _terrain = terrain;
281

    
282
                // add layers to terrain necessary when we are loading
283
                addCurrentLayers();
284
        }
285

    
286
        public Terrain getTerrain() {
287
                return _terrain;
288
        }
289

    
290
        public void setDataManager(JavaDataDriver manager) {
291
                _terrainDataManager = manager;
292
                _terrainDataManager.setDataLoader(this);
293
        }
294

    
295
        public JavaDataDriver getDataManager() {
296
                return _terrainDataManager;
297
        }
298

    
299
        public void setLayerManager(LayerManager manager) {
300
                _terrainLayerManager = manager;
301
        }
302

    
303
        public LayerManager getLayerManager() {
304
                return _terrainLayerManager;
305
        }
306

    
307
        public void setViewer(IViewerContainer canvas) {
308
                _canvas3d = canvas;
309
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
310
        }
311

    
312
        public IProjection getViewProjection() {
313
                return _viewProjection;
314
        }
315

    
316
        public void setViewProjection(IProjection projection) {
317
                _viewProjection = projection;
318
        }
319

    
320
        public IViewerContainer getCanvas3d() {
321
                return _canvas3d;
322
        }
323
        
324
        public float getVerticalExaggeration() {
325
                return _verticalExaggeration;
326
        }
327

    
328
        public void setVerticalExaggeration(float verticalExaggeration) {
329
                _verticalExaggeration = verticalExaggeration;
330
        }
331

    
332
        public void setLoading(boolean bLoading) {
333
                _bLoading = bLoading;
334
        }
335

    
336
        public FLayers getNewGroupLayer(FLayers parent) {
337
                return new FLayers3D(this, parent, getViewPort());
338
        }
339

    
340
        /** * LAYER CHANGES called by FLayers3D ** */
341

    
342
        public synchronized void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
343
                        int newPos) {
344

    
345
                if (layer instanceof FLayers) {
346
                        FLayers group = (FLayers) layer;
347
                        if (newPos > oldPos) {
348
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
349
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
350
                                                        oldPos, newPos);
351
                        } else {
352
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
353
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
354
                                                        oldPos, newPos);
355
                        }
356
                        return;
357
                }
358

    
359
                Layer3DProps props3D = getLayer3DProps(layer);
360
                int type = props3D.getType();
361

    
362
                // Now reorder in layer manager only for terrain layer types
363
                if ((type == Layer3DProps.layer3DOSG)
364
                                || ((type == Layer3DProps.layer3DVector)))
365
                        return;
366

    
367
                // Obtain the old position in the layer
368
                Layer terrainLayer = _terrainFLayerMap.get(layer);
369
                Vector<Integer> terrainOldPos = _terrainLayerManager
370
                                .getOrder(terrainLayer);
371

    
372
                int terrainNewPos = 0;
373
                // Compute the new position.
374
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
375
                while (lyrIterator.hasNext()) {
376
                        FLayer auxLayer = lyrIterator.next();
377
                        if (auxLayer == layer)
378
                                break;
379
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
380
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
381
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
382
                                terrainNewPos++;
383
                        }
384

    
385
                }
386

    
387
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
388
                        return;
389
                if (terrainOldPos.get(0) != terrainNewPos)
390
                        _terrainLayerManager.moveLayer(terrainOldPos.get(0), terrainNewPos);
391

    
392
                System.out.println("En el toc antes era el " + oldPos + " y ahora el "
393
                                + newPos);
394
                System.out.println("En el terrain antes era el " + terrainOldPos
395
                                + " y ahora el " + terrainNewPos);
396

    
397
                PrintDebugLayers();
398
        }
399

    
400
        public void layerAdded(FLayers3D parent, FLayer layer) {
401

    
402
                // to add group layers to 3D, just add recursively child data layers
403
                if (layer instanceof FLayers) {
404
                        FLayers group = (FLayers) layer;
405
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
406
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
407
                        }
408
                        getLayer3DProps(layer).setHooked(true);
409
                        return;
410
                }
411

    
412
                if (layer instanceof Classifiable) {
413
                        Classifiable legendLyr = (Classifiable) layer;
414
                        // legendLyr.addLegendListener((LegendListener) this);
415
                        this.addLayerListener(this);
416
                }
417
                layer.addLayerListener((LayerListener) this);
418

    
419
                // listener to manage the selection for the layers
420
                if (layer.getClass().equals(FLyrVect.class)) {
421
                        FLyrVect lyr = (FLyrVect) layer;
422
                        try {
423
                                SelectableDataSource recordSet = lyr.getRecordset();
424
                                if (recordSet != null) {
425
                                        SelectionSupport selectionSupport = recordSet
426
                                                        .getSelectionSupport();
427
                                        selectionSupport.addSelectionListener(this);
428
                                }
429
                        } catch (ReadDriverException e) {
430
                                // TODO Auto-generated catch block
431
                                e.printStackTrace();
432
                        }
433
                }
434

    
435
                if (!_bLoading)
436
                        addLayerToTerrain(layer, true);
437

    
438
                // Only do this the first time to add layer
439
                if (_bEmptyView && !_bLoading) {
440
                        if (layers.getLayersCount() > 0) {
441
                                try {
442
                                        zoomToExtent(layer.getFullExtent());
443
                                } catch (ExpansionFileReadException e) {
444
                                        e.printStackTrace();
445
                                } catch (ReadDriverException e) {
446
                                        e.printStackTrace();
447
                                }
448
                                _bEmptyView = false;
449
                        }
450
                }
451

    
452
                PrintDebugLayers();
453
        }
454

    
455
        public void layerRemoved(FLayers3D parent, FLayer layer) {
456

    
457
                // to remove group layers to 3D, just remove recursively child data
458
                // layers
459
                if (layer instanceof FLayers) {
460
                        FLayers group = (FLayers) layer;
461
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
462
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
463
                        }
464
                        getLayer3DProps(layer).setHooked(false);
465
                        return;
466
                }
467

    
468
                if (layer instanceof Classifiable) {
469
                        Classifiable legendLyr = (Classifiable) layer;
470
                        legendLyr.removeLegendListener((LegendListener) this);
471
                }
472

    
473
                layer.removeLayerListener((LayerListener) this);
474

    
475
                removeLayerToTerrain(layer);
476

    
477
                // All layers are removed
478
                if (layers.getLayersCount() == 0) {
479
                        _bEmptyView = true;
480
                }
481

    
482
                PrintDebugLayers();
483
        }
484

    
485
        /**
486
         * DOCUMENT ME!
487
         * 
488
         * @param e
489
         *            DOCUMENT ME!
490
         */
491
        public void legendChanged(LegendChangedEvent e) {
492

    
493
                if (!_bListenToLegend)
494
                        return;
495
                if ((e == null) && (!visibilityChange)) {
496
                        // find layer whose legend changed
497
                        FLayer found = null;
498
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
499
                        while (lyrIterator.hasNext()) {
500
                                FLayer lyr = lyrIterator.next();
501
                                if (lyr instanceof FLyrVect) {
502
                                        FLyrVect lyrVect = (FLyrVect) lyr;
503
                                        long newDrawVersion = lyrVect.getDrawVersion();
504
                                        Layer3DProps props3D = getLayer3DProps(lyrVect);
505
                                        if (newDrawVersion != props3D.drawVersion) {
506
                                                props3D.drawVersion = lyrVect.getDrawVersion();
507
                                                refreshLayerInTerrain(props3D, true);
508
                                                _bListenToLegend = false;
509
                                                props3D.VerifyLegend(_terrain.getTerrainName());
510
                                                _bListenToLegend = true;
511
                                        }
512
                                }
513
                        }
514

    
515
                        IWindow f = PluginServices.getMDIManager().getActiveWindow();
516
                        if (f instanceof BaseView) {
517
                                BaseView view3D = (BaseView) f;
518
                                view3D.getTOC().refresh();
519
                        }
520
                }
521
                visibilityChange = false;
522
        }
523

    
524
        public void visibilityChanged(LayerEvent e) {
525
                FLayer lyr = e.getSource();
526

    
527
                Layer3DProps props3D = getLayer3DProps(lyr);
528

    
529
                if (props3D.getType() == Layer3DProps.layer3DVector) {
530
                        refreshLayerVectorsVisibility(lyr);
531
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
532
                        refreshLayer3DOSGVisibility(lyr);
533
                } else {
534
                        refreshLayerVisibility(lyr);
535
                }
536
                visibilityChange = true;
537
        }
538

    
539
        private void refreshLayer3DOSGVisibility(FLayer lyr) {
540
                if (_terrain == null || _viewProjection == null)
541
                        return;
542

    
543
                Layer3DProps props3D = getLayer3DProps(lyr);
544

    
545
                OSGCacheService cacheService = (OSGCacheService) props3D
546
                                .getCacheService();
547
                if (cacheService != null) {
548
                        // use VectorCacheService to add features to terrain
549
                        cacheService.refreshFeaturesToTerrain(lyr.isVisible());
550
                }
551

    
552
        }
553

    
554
        private void refreshLayerVisibility(FLayer layer) {
555

    
556
                Layer terrainLayer = _terrainFLayerMap.get(layer);
557
                terrainLayer.setEnabled(layer.isVisible());
558
                _terrainLayerManager.updateLayers();
559

    
560
        }
561

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

    
566
                Layer3DProps props3D = getLayer3DProps(lyr);
567

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

    
576
        }
577

    
578
        public void activationChanged(LayerEvent e) {
579
                // TODO Implement this method
580
        }
581

    
582
        public void nameChanged(LayerEvent e) {
583
                // TODO Implement this method
584
        }
585

    
586
        public void editionChanged(LayerEvent e) {
587
                // TODO Implement this method
588

    
589
        }
590

    
591
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
592
                if (props == null)
593
                        return;
594

    
595
                if (_terrain == null)
596
                        return; // view not opened yet
597

    
598
                // clear cache
599

    
600
                if (bRemoveCache) {
601
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
602
                                        + _terrain.getTerrainName() + "/" + props.getCacheName();
603
                        removeCache(layerCacheDir);
604
                }
605

    
606
                // refresh layer in terrain
607
                int type = props.getType();
608
                if ((type == Layer3DProps.layer3DImage)||(type == Layer3DProps.layer3DElevation)||
609
                                (type == Layer3DProps.layer3DVectorMR)) {
610
                        _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
611
                } else if (type == Layer3DProps.layer3DVector) {
612
                        invalidateVectorLayer(props);
613
                }
614
        }
615

    
616
        private void invalidateVectorLayer(Layer3DProps props) {
617
                // TODO Auto-generated method stub
618
                if (_terrain == null || _viewProjection == null)
619
                        return;
620

    
621
                VectorCacheService cacheService = (VectorCacheService) props
622
                                .getCacheService();
623
                if (cacheService != null) {
624
                        // use VectorCacheService to add features to terrain
625
                        cacheService.refreshFeaturesToTerrain();
626
                }
627
        }
628

    
629
        private boolean removeCache(String folder) {
630
                File dir = new File(folder);
631
                if (dir.isDirectory()) {
632
                        String[] children = dir.list();
633
                        for (int i = 0; i < children.length; i++) {
634
                                boolean success = removeCache(folder + "/" + children[i]);
635
                                // Do not interrupt if it can't delete one file
636
                                // if (!success) {
637
                                // return false;
638
                                // }
639
                        }
640
                }
641

    
642
                // The directory is now empty so delete it
643
                return dir.delete();
644
        }
645

    
646
        protected Layer3DProps getLayer3DProps(FLayer layer) {
647

    
648
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
649

    
650
                // Create instance of props for osg layers.
651
                if (props3D == null) {
652
                        props3D = new Layer3DProps();
653
                        if (layer instanceof FLyrVect) {
654
                                FLyrVect nLayer = (FLyrVect) layer;
655
                                Driver driver;
656
                                try {
657
                                        driver = nLayer.getRecordset().getDriver();
658
                                        if (driver instanceof GvsigDriverOSG) {
659
                                                props3D.setChooseType(false);
660
                                                props3D.setType(Layer3DProps.layer3DOSG);
661
                                        }
662
                                } catch (ReadDriverException e) {
663
                                        // TODO Auto-generated catch block
664
                                        e.printStackTrace();
665
                                }
666

    
667
                        }
668
                        // Set the properties
669
                        props3D.setLayer(layer);
670

    
671
                        props3D.initCacheName(_terrain.getCoordinateSystemType(),
672
                                        _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
673
                        FLyrDefault baseLayer = (FLyrDefault) layer;
674
                        baseLayer.setProperty("3DLayerExtension", props3D);
675
                        props3D.setVerticalEx(getVerticalExaggeration());
676
                } else {
677
                        if (_bLoading)
678
                                props3D.setChooseType(false);
679
                        props3D.setLayer(layer);
680
                }
681

    
682
                return props3D;
683
        }
684

    
685
        public void addCurrentLayers() {
686
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
687
                while (lyrIterator.hasNext()) {
688
                        FLayer layer = lyrIterator.next();
689
                        Layer3DProps props = getLayer3DProps(layer);
690
                        // props.setTerrainOrder(props.getTocOrder());
691
                        addLayerToTerrain(layer, false);
692
                }
693
        }
694

    
695
        public synchronized void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
696
                Layer3DProps props3D = getLayer3DProps(layer);
697

    
698
                if (props3D.getType() == Layer3DProps.layer3DVector) {
699
                        CreateVectors(layer, props3D); // special case for now without
700
                        // disk cache
701
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
702
                        CreateOSGLayer(layer, props3D);
703
                } else {
704
                        Rectangle2D layerExtent = null;
705
                        try {
706
                                layerExtent = layer.getFullExtent();
707
                        } catch (ExpansionFileReadException e) {
708
                                e.printStackTrace();
709
                        } catch (ReadDriverException e) {
710
                                e.printStackTrace();
711
                        }
712
                        if (layerExtent == null) { // hack for missing extents
713
                                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC)
714
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
715
                                                        180.0);
716
                                else
717
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
718
                                                        -10000000.0, 40000000.0, 20000000.0);
719
                                // TODO toggle comment because this code use WCS extension. When
720
                                // WCS extension runs correctly uncoment!!!
721

    
722
                                if (layer instanceof FLyrWCS)
723
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
724
                        }
725

    
726
                        Extent extent = null;
727
                        if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
728
                                extent = new Extent(layerExtent.getMinX(), layerExtent
729
                                                .getMinY(), layerExtent.getMaxX(), layerExtent
730
                                                .getMaxY());
731
                        } else {
732
                                extent = new Extent(Math.toRadians(layerExtent.getMinX()), Math
733
                                                .toRadians(layerExtent.getMinY()), Math
734
                                                .toRadians(layerExtent.getMaxX()), Math
735
                                                .toRadians(layerExtent.getMaxY()));
736
                        }
737

    
738
                        if (props3D.getType() == Layer3DProps.layer3DImage) {
739
                                RasterLayer rlayer = new RasterLayer();
740
                                rlayer.setEnabled(layer.isVisible());
741
                                rlayer.setExtent(extent);
742
                                rlayer.setOpacity(props3D.getOpacity());
743
                                rlayer.setDataDriver(_terrainDataManager);
744
                                _terrainLayerManager.addLayer(rlayer);
745
                                _terrainFLayerMap.put(layer, rlayer);
746
                                _terrainLayerMap.put(rlayer.getLayerID(), layer);
747
                                props3D.setTerrainLayer(rlayer);
748
                        } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
749
                                HeightfieldLayer hlayer = new HeightfieldLayer();
750
                                hlayer.setEnabled(layer.isVisible());
751
                                hlayer.setExtent(extent);
752
                                hlayer.setVerticalExaggeration(props3D.getVerticalEx());
753
                                hlayer.setDataDriver(_terrainDataManager);
754
                                _terrainLayerManager.addLayer(hlayer);
755
                                _terrainFLayerMap.put(layer, hlayer);
756
                                _terrainLayerMap.put(hlayer.getLayerID(), layer);
757
                                props3D.setTerrainLayer(hlayer);
758
                        } else if (props3D.getType() == Layer3DProps.layer3DVectorMR) {
759
                                VectorLayer vlayer = new VectorLayer();
760
                                vlayer.setEnabled(true);
761
                                vlayer.setExtent(extent);
762
                                vlayer.setDensity(1.0f);
763
                                vlayer.setDataDriver(_terrainDataManager);
764
                                _terrainLayerManager.addLayer(vlayer);
765
                                _terrainFLayerMap.put(layer, vlayer);
766
                                _terrainLayerMap.put(vlayer.getLayerID(), layer);
767
                                props3D.setTerrainLayer(vlayer);
768
                        }
769

    
770
                        if (bVerifyLegend) {
771
                                _bListenToLegend = false;
772
                                props3D.VerifyLegend(_terrain.getTerrainName());
773
                                _bListenToLegend = true;
774
                        }
775
                }
776
        }
777

    
778
        private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) {
779
                if (_terrain == null || _viewProjection == null)
780
                        return;
781

    
782
                OSGCacheService cacheService = (OSGCacheService) props3D
783
                                .getCacheService();
784
                if (cacheService == null) {
785
                        cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
786
                                        .getCacheName(), layer, _viewProjection);
787
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
788
                        props3D.setCacheService(cacheService);
789
                }
790

    
791
                // use VectorCacheService to add features to planet
792
                cacheService.AddFeaturesToTerrain();
793

    
794
        }
795

    
796
        @Override
797
        public XMLEntity getXMLEntity() throws XMLException {
798
                // TODO Auto-generated method stub
799
                XMLEntity xml = super.getXMLEntity();
800

    
801
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
802
                while (lyrIterator.hasNext()) {
803
                        FLayer lyr = lyrIterator.next();
804
                        Layer3DProps props3D = getLayer3DProps(lyr);
805
                        int type = props3D.getType();
806
                        if (type == Layer3DProps.layer3DOSG) {
807

    
808
                                OSGCacheService cacheService = (OSGCacheService) props3D
809
                                                .getCacheService();
810
                                if (cacheService != null) {
811
                                        // use VectorCacheService to add features to planet
812
                                        if (props3D.isEditing()) {
813
                                                // TODO: PONER AKI EL CODIGO DE SALVAR
814
                                        }
815
                                }
816
                        }
817
                }
818

    
819
                return xml;
820

    
821
        }
822

    
823
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
824
                if (_terrain == null || _viewProjection == null)
825
                        return;
826

    
827
                VectorCacheService cacheService = (VectorCacheService) props3D
828
                                .getCacheService();
829
                if (cacheService == null) {
830
                        cacheService = new VectorCacheService(_canvas3d, _terrain, props3D
831
                                        .getCacheName(), layer, _viewProjection);
832
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
833
                        props3D.setCacheService(cacheService);
834
                }
835

    
836
                // use VectorCacheService to add features to terrain
837
                cacheService.addFeaturesToTerrain();
838
        }
839

    
840
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
841
                if (_terrain == null || _viewProjection == null)
842
                        return;
843

    
844
                VectorCacheService cacheService = (VectorCacheService) props3D
845
                                .getCacheService();
846
                if (cacheService != null) {
847
                        // use VectorCacheService to delete features to terrain
848
                        cacheService.deleteFeaturesToTerrain();
849
                }
850
        }
851

    
852
        /**
853
         * Sets the given zoom extent to the view
854
         * 
855
         * @param extent
856
         *            The extent to zoom to.
857
         */
858
        public void zoomToExtent(Rectangle2D geoExtent) {
859
                double maxHeight = 0.0;
860

    
861
                // Getting extent positions
862
                double minLat = geoExtent.getMinY();
863
                double maxLat = geoExtent.getMaxY();
864
                double cenLon = geoExtent.getCenterX();
865
                double cenLat = geoExtent.getCenterY();
866

    
867
                double elevation = 0;
868

    
869
                // calculate altitude
870
                double avLat = 0;
871
                if (minLat > 0.0 || maxLat < 0.0)
872
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
873
                double avLon = Math.min(180.0, geoExtent.getWidth());
874

    
875
                double terrainRadius = _terrain.getRadiusEquatorial();
876
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
877
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
878
                                * (1 - Math.cos(Math.toRadians(avLon))));
879
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
880
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
881

    
882
                double zoomFactor = 1.5;
883
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
884

    
885
                // Calculate XYZ positions for camera.
886

    
887
                int terrainType = _terrain.getCoordinateSystemType();
888

    
889
                Vec3 eye = new Vec3();
890
                Vec3 center = new Vec3();
891
                Vec3 up = new Vec3();
892
                // Calculate positions for PLAIN MODE.
893
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
894

    
895
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
896
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
897
                        double height;
898

    
899
                        height = Math.sqrt(difx * difx + dify * dify);
900
                        double fullWindowFactor = 1.7;
901
                        // EYE
902
                        eye.setX(cenLon);
903
                        eye.setY(cenLat);
904
                        eye.setZ(height * fullWindowFactor);
905
                        // CENTER
906
                        center.setX(cenLon);
907
                        center.setY(cenLat);
908
                        center.setZ(0.0);
909
                        // UP
910
                        up.setX(0.0);
911
                        up.setY(1.0);
912
                        up.setZ(0.0);
913
                } else
914
                // Calculate positions for SPHERICAL MODE.
915
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
916
                        // EYE
917
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
918
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
919
                        // CENTER
920
                        center.setX(0.0);
921
                        center.setY(0.0);
922
                        center.setZ(0.0);
923
                        // UP
924
                        up.setX(0.0);
925
                        up.setY(0.0);
926
                        up.setZ(1.0);
927
                }
928
                Camera cam = new Camera();
929
                cam.setViewByLookAt(eye, center, up);
930

    
931
                _terrainViewer.setCamera(cam);
932

    
933
        }
934

    
935
        private void PrintDebugLayers() {
936
                if (_terrainLayerManager != null) {
937
                        System.out.println("===========================");
938
                        System.out.println("Total terrain layers: "
939
                                        + _terrainLayerManager.getNumLayers());
940
                        System.out.println("===========================");
941
                }
942
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
943
                int pos = 0;
944
                while (lyrIterator.hasNext()) {
945
                        FLayer layer = lyrIterator.next();
946
                        System.out.println("  Layer " + layer.getName());
947
                        Layer3DProps props3D = getLayer3DProps(layer);
948
                        System.out.println("    Type " + props3D.getType());
949
                        System.out.println("    Order " + pos);
950
                        pos++;
951
                }
952
        }
953

    
954
        /**
955
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
956
         * 
957
         * @param xml
958
         *            XMLEntity
959
         * 
960
         * @return Nuevo MapContext3D.
961
         * 
962
         * @throws XMLException
963
         */
964
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
965
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
966

    
967
                FLayers layers = new FLayers3D(null, null, vp);
968
                layers.setXMLEntity(xml.getChild(1));
969

    
970
                MapContext fmap = layers.getMapContext();
971

    
972
                return fmap;
973
        }
974

    
975
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
976
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
977

    
978
                FLayers layers = new FLayers3D(null, null, vp);
979
                layers.setXMLEntity03(xml.getChild(1));
980

    
981
                MapContext fmap = layers.getMapContext();
982

    
983
                return fmap;
984
        }
985

    
986
        public GraphicLayer getGraphicsLayer() {
987
                GraphicLayer3D gra3D = new GraphicLayer3D(_terrainViewer, getTerrain());
988
                return gra3D;
989
        }
990

    
991
        public Node getSpecialNode() {
992
                Node specialNode = null;
993
                try {
994
                        specialNode = _terrainViewer.getFeature(0);
995
                } catch (ChildIndexOutOfBoundsExceptions e) {
996
                        _logger.error("Command: " + "Error child index out of bound.", e);
997
                }
998
                return specialNode;
999
        }
1000

    
1001
        public ViewPort getViewPort() {
1002

    
1003
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1004

    
1005
                if (_canvas3d != null)
1006
                        vp.setImageSize(new Dimension(_terrainViewer.getWidth(),
1007
                                        _terrainViewer.getHeight()));
1008
                vp.setTerrain(this.getTerrain());
1009
                vp.setViewer(this._canvas3d);
1010

    
1011
                return vp;
1012
        }
1013

    
1014
        /**
1015
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1016
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
1017
         * un evento de cambio de orden de capas que obligar� a redibujar todo lo
1018
         * que depende de FMap (TOC, MapControl, FFrameView, etc).
1019
         */
1020

    
1021
        /*
1022
         * public void invalidate() { ViewPort3D vp = (ViewPort3D)
1023
         * super.getViewPort(); if (vp.getDirty()) { vp.setDirty(false); } FLayer[]
1024
         * selectedExtent = getLayers().getActives();
1025
         * 
1026
         * if (selectedExtent.length > 0) { for (int i = 0; i <
1027
         * selectedExtent.length; i++) { if (selectedExtent[0].isAvailable()) {
1028
         * 
1029
         * FLayer lyr3D = selectedExtent[i]; Layer3DProps layer3DProps =
1030
         * Layer3DProps .getLayer3DProps(lyr3D);
1031
         * 
1032
         * Layer terrainLayer = _terrainFLayerMap.get(lyr3D); float opacity =
1033
         * (((FLyrDefault) lyr3D).getTransparency()) / (float) 255; if()
1034
         * //_terrain.setTextureOpacityLayer(order, opacity); } }
1035
         * 
1036
         * } }
1037
         */
1038

    
1039
        public void selectionChanged(SelectionEvent e) {
1040
                // TODO Auto-generated method stub
1041
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1042
                while (lyrIterator.hasNext()) {
1043
                        FLayer layer = lyrIterator.next();
1044
                        Layer3DProps props3D = getLayer3DProps(layer);
1045
                        if (props3D.getType() != Layer3DProps.layer3DOSG) {
1046
                                if (layer.getClass().equals(FLyrVect.class)) {
1047
                                        FLyrVect lyr = (FLyrVect) layer;
1048

    
1049
                                        FBitSet selection = null;
1050
                                        try {
1051
                                                selection = lyr.getRecordset().getSelectionSupport()
1052
                                                                .getSelection();
1053
                                        } catch (ReadDriverException e1) {
1054
                                                // TODO Auto-generated catch block
1055
                                                e1.printStackTrace();
1056
                                        }
1057

    
1058
                                        if ((selection.cardinality() == 0)
1059
                                                        || (!(selection.isEmpty()))) {
1060
                                                Layer3DProps props = Layer3DProps
1061
                                                                .getLayer3DProps(layer);
1062
                                                refreshLayerInTerrain(props, true);
1063
                                                if (layer instanceof FLyrVect) {
1064
                                                        FLyrVect fvect = (FLyrVect) layer;
1065
                                                        props.drawVersion = fvect.getDrawVersion();
1066
                                                }
1067
                                        }
1068
                                }
1069
                        }
1070
                }
1071
        }
1072

    
1073
        public synchronized void removeLayerToTerrain(FLayer layer) {
1074
                // TODO Auto-generated method stub
1075
                Layer3DProps props3D = getLayer3DProps(layer);
1076

    
1077
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1078
                        DeleteVectors(layer, props3D);
1079
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1080
                        DeleteOSGLayer(layer, props3D);
1081
                } else {
1082
                        Layer terrainLayer = _terrainFLayerMap.get(layer);
1083
                        if (terrainLayer != null) {
1084
                                _terrainLayerMap.remove(terrainLayer.getLayerID());
1085
                                _terrainFLayerMap.remove(layer);
1086

    
1087
                                _terrainLayerManager.removeLayer(terrainLayer);
1088
                        }
1089
                }
1090

    
1091
        }
1092

    
1093
        private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) {
1094
                if (_terrain == null || _viewProjection == null)
1095
                        return;
1096

    
1097
                OSGCacheService cacheService = (OSGCacheService) props3D
1098
                                .getCacheService();
1099
                if (cacheService != null) {
1100
                        // use VectorCacheService to delete features to terrain
1101
                        cacheService.DeleteFeaturesToTerrain();
1102
                }
1103
        }
1104

    
1105
        public boolean isRenewCanvasOff() {
1106
                return _renewCanvasOff;
1107
        }
1108

    
1109
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1110
                _renewCanvasOff = renewCanvasOff;
1111
        }
1112

    
1113
        public void drawValueChanged(LayerEvent arg0) {
1114
                // TODO Auto-generated method stub
1115

    
1116
        }
1117

    
1118
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1119

    
1120
                if (_terrainLayerMap.size() == 0)
1121
                        return null;
1122
                if (rde == null)
1123
                        return null;
1124
                if (rde.getExtent() == null)
1125
                        return null;
1126
                if (rde.getLayer() == null)
1127
                        return null;
1128
                if (rde.getLayerManager() == null)
1129
                        return null;
1130

    
1131
                UpdateDataEvent ude = new UpdateDataEvent();
1132
                ude.copyDataFromRequest(rde);
1133
                
1134

    
1135
                String layerID = rde.getLayer().getLayerID();
1136
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1137
                if (layer == null)
1138
                        return null;
1139
                if (!layer.isVisible())
1140
                        return null;
1141

    
1142
                Layer3DProps props3D = getLayer3DProps(layer);
1143

    
1144
                // get/create cache service
1145
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1146
                                .getCacheService();
1147
                if (cacheService == null) {
1148
                        cacheService = new FLayerCacheService(_terrain, props3D
1149
                                        .getCacheName(), layer, _viewProjection);
1150
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1151
                        props3D.setCacheService(cacheService);
1152
                }
1153

    
1154
                int dataType = props3D.getType();
1155
                Point tileIndices = new Point(rde.getTileX(), rde.getTileY());
1156
                TileNum tileNum = new TileNum(rde.getTileLevel(), tileIndices);
1157

    
1158
                String tileFileName = "";
1159

    
1160
                double minX, minY, width, height;
1161

    
1162
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1163
                        minX = rde.getExtent().xMin();
1164
                        minY = rde.getExtent().yMin();
1165
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1166
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1167
                } else {
1168
                        minX = Math.toDegrees(rde.getExtent().xMin());
1169
                        minY = Math.toDegrees(rde.getExtent().yMin());
1170
                        width = Math.toDegrees(rde.getExtent().xMax()
1171
                                        - rde.getExtent().xMin());
1172
                        height = Math.toDegrees(rde.getExtent().yMax()
1173
                                        - rde.getExtent().yMin());
1174
                }
1175
                boolean failData = false;
1176

    
1177
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1178
                if (cacheService.intersectsLayer(extent)) { // extent test
1179
                        try {
1180
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1181
                                if(tileFileName == null)
1182
                                        failData = true;
1183
                        } catch (Exception e) {
1184
                                failData = true;
1185
                                NotificationManager.addInfo("Problem reading tile:" + tileNum, e);
1186
                                e.printStackTrace();
1187
                        }
1188

    
1189
                        if (failData) {
1190
                                return null;
1191
                                //ude.setFailData();
1192
                        } else {
1193
                                switch (dataType) {
1194
                                case Layer3DProps.layer3DImage:
1195
                                        ude.setRasterData(tileFileName, "gdal");
1196
                                        break;
1197
                                case Layer3DProps.layer3DElevation:
1198
                                        ude.setHeightfieldData(tileFileName, "gdal");
1199
                                        break;
1200
                                case Layer3DProps.layer3DVectorMR:
1201
                                        ude.setVectorData(tileFileName, "osg");
1202
                                        break;
1203
                                }
1204
                        }
1205
                }
1206

    
1207
                return ude;
1208
        }
1209
}