Statistics
| Revision:

gvsig-3d / 2.0 / trunk / org.gvsig.gvsig3d / org.gvsig.gvsig3d.lib / org.gvsig.gvsig3d.lib.impl / src / main / java / org / gvsig / gvsig3d / impl / map3d / MapContext3DImpl.java @ 329

History | View | Annotate | Download (57.5 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.gvsig3d.impl.map3d;
23

    
24
import java.awt.Color;
25
import java.awt.Dimension;
26
import java.awt.Graphics2D;
27
import java.awt.geom.AffineTransform;
28
import java.awt.image.BufferedImage;
29
import java.awt.image.ImagingOpException;
30
import java.io.File;
31
import java.io.IOException;
32
import java.util.Hashtable;
33
import java.util.Vector;
34

    
35
import org.cresques.cts.IProjection;
36
import org.gvsig.fmap.dal.DataStore;
37
import org.gvsig.fmap.dal.coverage.RasterLibrary;
38
import org.gvsig.fmap.dal.coverage.RasterLocator;
39
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
40
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
41
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
42
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
43
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
44
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
45
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
46
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
47
import org.gvsig.fmap.dal.exception.ReadException;
48
import org.gvsig.fmap.geom.Geometry;
49
import org.gvsig.fmap.geom.GeometryLocator;
50
import org.gvsig.fmap.geom.GeometryManager;
51
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
52
import org.gvsig.fmap.geom.exception.CreateGeometryException;
53
import org.gvsig.fmap.geom.primitive.Envelope;
54
import org.gvsig.fmap.mapcontext.MapContext;
55
import org.gvsig.fmap.mapcontext.MapContextLocator;
56
import org.gvsig.fmap.mapcontext.ViewPort;
57
import org.gvsig.fmap.mapcontext.exceptions.LegendLayerException;
58
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
59
import org.gvsig.fmap.mapcontext.layers.FLayer;
60
import org.gvsig.fmap.mapcontext.layers.FLayers;
61
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
62
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
63
import org.gvsig.fmap.mapcontext.layers.LayerListener;
64
import org.gvsig.fmap.mapcontext.layers.SelectionEvent;
65
import org.gvsig.fmap.mapcontext.layers.SingleLayerIterator;
66
import org.gvsig.fmap.mapcontext.layers.operations.Classifiable;
67
import org.gvsig.fmap.mapcontext.layers.operations.SingleLayer;
68
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
69
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
70
import org.gvsig.fmap.mapcontext.rendering.legend.ISingleSymbolLegend;
71
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
72
import org.gvsig.fmap.mapcontext.rendering.legend.events.LegendChangedEvent;
73
import org.gvsig.fmap.mapcontext.rendering.legend.events.LegendClearEvent;
74
import org.gvsig.fmap.mapcontext.rendering.legend.events.SymbolLegendEvent;
75
import org.gvsig.fmap.mapcontext.rendering.legend.events.listeners.LegendListener;
76
import org.gvsig.gvsig3d.impl.symbology3d.Symbol3DFactory;
77
import org.gvsig.gvsig3d.impl.symbology3d.fill.impl.SimpleFill3DSymbol;
78
import org.gvsig.gvsig3d.impl.symbology3d.line.impl.SimpleLine3DSymbol;
79
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.GeometryMarker3DSymbol;
80
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.NodeMarker3DSymbol;
81
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.PictureMarker3DSymbol;
82
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.SimpleMarker3DSymbol;
83
import org.gvsig.gvsig3d.map3d.Layer3DProps;
84
import org.gvsig.gvsig3d.map3d.MapContext3D;
85
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
86
import org.gvsig.gvsig3d.symbology3d.I3DSymbol;
87
import org.gvsig.osgvp.core.osg.Image;
88
import org.gvsig.osgvp.core.osg.Matrix;
89
import org.gvsig.osgvp.core.osg.Node;
90
import org.gvsig.osgvp.core.osg.Vec2;
91
import org.gvsig.osgvp.core.osg.Vec3;
92
import org.gvsig.osgvp.core.osg.Vec4;
93
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
94
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
95
import org.gvsig.osgvp.exceptions.node.NodeException;
96
import org.gvsig.osgvp.symbology.ISymbol3D;
97
import org.gvsig.osgvp.terrain.Extent;
98
import org.gvsig.osgvp.terrain.HeightfieldLayer;
99
import org.gvsig.osgvp.terrain.JavaDataDriver;
100
import org.gvsig.osgvp.terrain.Layer;
101
import org.gvsig.osgvp.terrain.LayerManager;
102
import org.gvsig.osgvp.terrain.RequestDataEvent;
103
import org.gvsig.osgvp.terrain.Terrain;
104
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
105
import org.gvsig.osgvp.terrain.TerrainViewer;
106
import org.gvsig.osgvp.terrain.TextureLayer;
107
import org.gvsig.osgvp.terrain.UpdateDataEvent;
108
import org.gvsig.osgvp.terrain.VectorLayer;
109
import org.gvsig.osgvp.terrain.exceptions.LayerManagementException;
110
import org.gvsig.osgvp.viewer.Camera;
111
import org.gvsig.osgvp.viewer.IViewerContainer;
112
import org.gvsig.raster.cache.tile.TileCache;
113
import org.gvsig.raster.cache.tile.TileCacheLibrary;
114
import org.gvsig.raster.cache.tile.TileCacheLocator;
115
import org.gvsig.raster.cache.tile.TileCacheManager;
116
import org.gvsig.raster.cache.tile.provider.CacheStruct;
117
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
118
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
119
import org.gvsig.raster.netcdf.io.NetCDFDataParameters;
120
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.IFillSymbol;
121
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
122
import org.gvsig.tools.ToolsLocator;
123
import org.gvsig.tools.dynobject.DynStruct;
124
import org.gvsig.tools.dynobject.exception.DynMethodException;
125
import org.gvsig.tools.locator.LocatorException;
126
import org.gvsig.tools.persistence.PersistenceManager;
127
import org.gvsig.tools.task.Cancellable;
128
import org.gvsig.tools.util.Callable;
129

    
130
/**
131
 * @author gvSIG Team
132
 * @version $Id$
133
 * 
134
 */
135
public class MapContext3DImpl extends MapContext3D {
136

    
137
        private Terrain _terrain;
138
        private IViewerContainer _canvas3d;
139
        private TerrainViewer _terrainViewer;
140
        private LayerManager _terrainLayerManager;
141
        private JavaDataDriver _terrainDataManager = null;
142

    
143
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
144
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
145

    
146
        private Hashtable<DefaultFLyrRaster, CacheStruct> _cachedLayers = new Hashtable<DefaultFLyrRaster, CacheStruct>();
147

    
148
        private IProjection _viewProjection;
149
        private float _verticalExaggeration;
150
        private boolean _bEmptyView = true;
151
        private boolean _bListenToLegend = true;
152
        private boolean _bLoading = false;
153
        private TerrainViewer _canvasoff = null;
154
        private boolean _renewCanvasOff = false;
155

    
156
        TerrainViewer _printViewer = null;
157
        Layer _testRasterLayer = null;
158

    
159
        private boolean visibilityChange = false;
160

    
161
        TileCacheManager tileMan = TileCacheLocator.getManager();
162
        TileCache tileCache = tileMan.getTileCache(RasterLibrary.pathTileCache);
163

    
164
        int maxBands = 3;
165

    
166
        public MapContext3DImpl() {
167
        }
168

    
169
        public MapContext3DImpl(ViewPort vp) {
170
                super(vp);
171
        }
172

    
173
        public MapContext3DImpl(FLayers fLayers, ViewPort vp) {
174

    
175
                super(fLayers, vp);
176

    
177
        }
178

    
179
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
180
                        double scale) {
181

    
182
                if (_canvas3d == null || _canvas3d.getOSGViewer() == null)
183
                        return;
184
                double x = getViewPort().getOffset().getX();
185
                double y = getViewPort().getOffset().getY();
186
                double w = image.getWidth();
187
                double h = image.getHeight();
188

    
189
                if (_canvasoff == null) {
190
                        try {
191
                                _canvasoff = new TerrainViewer();
192
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
193

    
194
                                Terrain planetView3D = ((TerrainViewer) _canvas3d
195
                                                .getOSGViewer()).getTerrain(0);
196
                                Terrain terrain = new Terrain();
197
                                terrain.setCoordinateSystemType(planetView3D
198
                                                .getCoordinateSystemType());
199
                                terrain.setCoordinateSystemName(planetView3D
200
                                                .getCoordinateSystemName());
201
                                terrain.setCoordinateSystemFormat(planetView3D
202
                                                .getCoordinateSystemFormat());
203
                                terrain.setExtent(planetView3D.xMin(), planetView3D.yMin(),
204
                                                planetView3D.xMax(), planetView3D.yMax());
205
                                terrain.setTerrainName(planetView3D.getTerrainName());
206

    
207
                                terrain.init();
208
                                terrain.setLayerManager(_terrainLayerManager);
209

    
210
                                _canvasoff.addTerrain(terrain);
211
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
212
                                                .getOSGViewer()).getFeatures()));
213
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
214
                                                .getClearColor();
215
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(),
216
                                                color.w());
217
                                this.setRenewCanvasOff(false);
218
                        } catch (NodeException e) {
219
                                // TODO Auto-generated catch block
220
                                e.printStackTrace();
221
                        }
222

    
223
                }
224

    
225
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
226
                Matrix refView = refCam.getViewMatrix();
227
                Matrix refProy = refCam.getProjectionMatrix();
228
                Matrix.Perspective pers = refProy.getPerspective();
229
                Camera viewCam = new Camera();
230
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
231
                                pers.zFar);
232
                viewCam.setViewMatrix(refView);
233
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
234
                _canvasoff.setCamera(viewCam);
235
                _canvasoff.takeScreenshotToMemory();
236
                _canvasoff.frame();
237

    
238
                org.gvsig.osgvp.core.osg.Image OSGimage = _canvasoff
239
                                .getScreenshotImage();
240

    
241
                BufferedImage img = null;
242
                try {
243
                        img = OSGimage.getBufferedImage();
244
                } catch (ImageConversionException e1) {
245
                        // TODO Auto-generated catch block
246
                        e1.printStackTrace();
247
                } catch (IOException e1) {
248
                        // TODO Auto-generated catch block
249
                        e1.printStackTrace();
250
                }
251

    
252
                double scalex = w / img.getWidth(null);
253
                double scaley = h / img.getHeight(null);
254
                try {
255
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
256
                                        scaley);
257
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
258
                        xpos.concatenate(xform);
259
                        g.drawRenderedImage(img, xpos);
260
                } catch (ImagingOpException e) {
261

    
262
                }
263
        }
264

    
265
        public void CreateOSGLayer(FLayer layer, Layer3DProps props3d) {
266
                // if (_terrain == null || _viewProjection == null)
267
                // return;
268
                //
269
                // OSGCacheService cacheService = (OSGCacheService) props3D
270
                // .getCacheService();
271
                // if (cacheService == null) {
272
                // cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
273
                // .getCacheName(), layer, _viewProjection);
274
                // cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
275
                // props3D.setCacheService(cacheService);
276
                // }
277
                //
278
                // // use VectorCacheService to add features to planet
279
                // cacheService.AddFeaturesToTerrain();
280

    
281
        }
282

    
283
        public void DeleteOSGLayer(FLayer layer, Layer3DProps props3d) {
284
                // if (_terrain == null || _viewProjection == null)
285
                // return;
286
                //
287
                // OSGCacheService cacheService = (OSGCacheService) props3D
288
                // .getCacheService();
289
                // if (cacheService != null) {
290
                // // use VectorCacheService to delete features to terrain
291
                // cacheService.DeleteFeaturesToTerrain();
292
                // }
293

    
294
        }
295

    
296
        public void PrintDebugLayers() {
297
                if (_terrainLayerManager != null) {
298
                        System.out.println("===========================");
299
                        System.out.println("Total terrain layers: "
300
                                        + _terrainLayerManager.getNumLayers());
301
                        System.out.println("===========================");
302
                }
303
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
304
                int pos = 0;
305
                while (lyrIterator.hasNext()) {
306
                        FLayer layer = lyrIterator.next();
307
                        System.out.println("  Layer " + layer.getName());
308
                        Layer3DProps props3D = getLayer3DProps(layer);
309
                        System.out.println("    Type " + props3D.getType());
310
                        System.out.println("    Order " + pos);
311
                        pos++;
312
                }
313

    
314
        }
315

    
316
        public void activationChanged(LayerEvent e) {
317

    
318
        }
319

    
320
        public void addCurrentLayers() {
321

    
322
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
323
                while (lyrIterator.hasNext()) {
324
                        FLayer layer = lyrIterator.next();
325
                        Layer3DProps props = getLayer3DProps(layer);
326
                        addLayerToTerrain(layer, false);
327
                }
328

    
329
        }
330

    
331
        public void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
332

    
333
                System.out.println("ADD LAYER TO TERRAIN METHOD!");
334
                Envelope layerEnvelope = null;
335
                try {
336
                        layerEnvelope = layer.getFullEnvelope();
337
                } catch (ReadException e1) {
338
                        // TODO Auto-generated catch block
339
                        e1.printStackTrace();
340
                }
341

    
342
                Layer3DProps props = getLayer3DProps(layer);
343
                GeometryManager geoMan;
344

    
345
                geoMan = GeometryLocator.getGeometryManager();
346

    
347
                if (layerEnvelope == null) {
348

    
349
                        try {
350
                                layerEnvelope = geoMan.createEnvelope(Geometry.SUBTYPES.GEOM2D);
351
                                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC) {
352
                                        layerEnvelope.setLowerCorner(geoMan.createPoint(-180.0,
353
                                                        -90.0, Geometry.SUBTYPES.GEOM2D));
354
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(360.0,
355
                                                        180.0, Geometry.SUBTYPES.GEOM2D));
356
                                }
357

    
358
                                else {
359

    
360
                                        layerEnvelope.setLowerCorner(geoMan
361
                                                        .createPoint(-20000000.0, -10000000.00,
362
                                                                        Geometry.SUBTYPES.GEOM2D));
363
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(40000000.0,
364
                                                        20000000.0, Geometry.SUBTYPES.GEOM2D));
365

    
366
                                }
367
                        } catch (CreateEnvelopeException e) {
368
                                // TODO Auto-generated catch block
369
                                e.printStackTrace();
370
                        } catch (CreateGeometryException e) {
371
                                // TODO Auto-generated catch block
372
                                e.printStackTrace();
373
                        }
374

    
375
                }
376

    
377
                Extent extent = null;
378
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
379

    
380
                        extent = new Extent(layerEnvelope.getLowerCorner().getX(),
381
                                        layerEnvelope.getLowerCorner().getY(), layerEnvelope
382
                                                        .getUpperCorner().getX(), layerEnvelope
383
                                                        .getUpperCorner().getY());
384

    
385
                } else {
386
                        extent = new Extent(Math.toRadians(layerEnvelope.getLowerCorner()
387
                                        .getX()), Math.toRadians(layerEnvelope.getLowerCorner()
388
                                        .getY()), Math.toRadians(layerEnvelope.getUpperCorner()
389
                                        .getX()), Math.toRadians(layerEnvelope.getUpperCorner()
390
                                        .getY()));
391

    
392
                }
393

    
394
                // Raster Layers
395
                if (props.getType() == Layer3DPropsImpl.layer3DImage)
396
                // || props.reasterized()==true) {
397
                {
398
                        TextureLayer rlayer = new TextureLayer();
399
                        rlayer.setEnabled(layer.isVisible());
400
                        // Here we use extent because the older osgvp version. The new will
401
                        // be
402
                        // named envelope
403
                        rlayer.setExtent(extent);
404
                        rlayer.setOpacity(props.getOpacity());
405
                        rlayer.setDataDriver(_terrainDataManager);
406
                        rlayer.setMaxLevel(100);
407
                        rlayer.setMaxResolution(100);
408
                        // _logger.warn("computed optimum level = "
409
                        // + computeOptimumLevel(layer, 20, 256));
410
                        // rlayer.setMaxResolution(computeOptimumLevel(layer, 21, 256));
411
                        try {
412
                                _terrainLayerManager.addLayer(rlayer);
413
                        } catch (LayerManagementException e) {
414
                                // TODO Auto-generated catch block
415
                                e.printStackTrace();
416
                        }
417
                        _terrainFLayerMap.put(layer, rlayer);
418
                        _terrainLayerMap.put(rlayer.getLayerID(), layer);
419
                        props.setTerrainLayer(rlayer);
420

    
421
                        // if rasterizing layers set Default 2D symbology
422
                        if (layer instanceof FLyrVect) {
423
                                // Create a 2D Legend for jess
424
                                try {
425
                                        ((FLyrVect) layer)
426
                                                        .setLegend((IVectorLegend) MapContextLocator
427
                                                                        .getMapContextManager()
428
                                                                        .getLegend(
429
                                                                                        ((FLyrVect) layer).getDataStore(),
430
                                                                                        MapContextLocator
431
                                                                                                        .getMapContextManager()
432
                                                                                                        .getDefaultSymbologyDomain()));
433
                                } catch (LegendLayerException e) {
434
                                        // TODO Auto-generated catch block
435
                                        e.printStackTrace();
436
                                } catch (LocatorException e) {
437
                                        // TODO Auto-generated catch block
438
                                        e.printStackTrace();
439
                                }
440
                        }
441

    
442
                        // Delete the cachestruct if it exists, and create a new one.
443

    
444
                        if (_cachedLayers.containsKey(layer)) {
445

    
446
                                _cachedLayers.remove(layer);
447

    
448
                        }
449

    
450
                }
451
                // Vector layers
452
                if (props.getType() == Layer3DPropsImpl.layer3DVector) {
453
                        // if (layer instanceof FLyrVect) {
454
                        // Set a 3D Legend
455

    
456
                         if (!(((FLyrVect) layer).getLegend().getDefaultSymbol()
457
                         instanceof I3DSymbol)) {
458
                        try {
459
                                ((FLyrVect) layer).setLegend((IVectorLegend) MapContextLocator
460
                                                .getMapContextManager().getLegend(
461
                                                                ((FLyrVect) layer).getDataStore(),
462
                                                                "project.document.view3d"));
463
                        } catch (LegendLayerException e) {
464
                                // TODO Auto-generated catch block
465
                                e.printStackTrace();
466
                        } catch (LocatorException e) {
467
                                // TODO Auto-generated catch block
468
                                e.printStackTrace();
469
                        }
470
                        }
471

    
472
                        VectorLayer vlayer = new VectorLayer();
473
                        vlayer.setEnabled(layer.isVisible());
474
                        vlayer.setExtent(extent);
475
                        vlayer.setDataDriver(_terrainDataManager);
476
                        try {
477
                                _terrainLayerManager.addLayer(vlayer);
478
                        } catch (LayerManagementException e) {
479
                                // TODO Auto-generated catch block
480
                                e.printStackTrace();
481
                        }
482
                        _terrainFLayerMap.put(layer, vlayer);
483
                        _terrainLayerMap.put(vlayer.getLayerID(), layer);
484
                        props.setTerrainLayer(vlayer);
485
                }
486
                // OsgLayers
487

    
488
                // Elevation layers
489
                if (props.getType() == Layer3DPropsImpl.layer3DElevation) {
490

    
491
                        HeightfieldLayer hLayer = new HeightfieldLayer();
492
                        hLayer.setEnabled(layer.isVisible());
493
                        // Here we use extent because the older osgvp version. The new will
494
                        // be
495
                        // named envelope
496
                        hLayer.setExtent(extent);
497
                        hLayer.setDataDriver(_terrainDataManager);
498
                        hLayer.setMaxLevel(100);
499
                        hLayer.setMaxResolution(100);
500
                        hLayer.setScaleFactor(props.getVerticalEx());
501

    
502
                        hLayer.setValidDataValues(new Vec2(-9999, 9999));
503
                        // _logger.warn("computed optimum level = "
504
                        // + computeOptimumLevel(layer, 20, 256));
505
                        // rlayer.setMaxResolution(computeOptimumLevel(layer, 21, 256));
506
                        try {
507
                                _terrainLayerManager.addLayer(hLayer);
508
                        } catch (LayerManagementException e) {
509
                                // TODO Auto-generated catch block
510
                                e.printStackTrace();
511
                        }
512
                        _terrainFLayerMap.put(layer, hLayer);
513
                        _terrainLayerMap.put(hLayer.getLayerID(), layer);
514
                        props.setTerrainLayer(hLayer);
515

    
516
                        // Delete the cachestruct if it exists, and create a new one.
517

    
518
                        if (_cachedLayers.containsKey(layer)) {
519

    
520
                                _cachedLayers.remove(layer);
521

    
522
                        }
523

    
524
                }
525

    
526
                // if (bVerifyLegend) {
527
                // _bListenToLegend = false;
528
                // props3D.VerifyLegend(_terrain.getTerrainName());
529
                // _bListenToLegend = true;
530
                // }
531
                // }
532

    
533
        }
534

    
535
        public int computeOptimumLevel(FLayer layer, int maxLevel, double tileSize) {
536
                int level = maxLevel;
537
                if (!(layer instanceof DefaultFLyrRaster))
538
                        return level;
539
                //
540
                // Rectangle2D ext = null;
541
                // try {
542
                // ext = layer.getFullExtent();
543
                // } catch (ReadDriverException e1) {
544
                // NotificationManager.addError("Error al obtener el extent", e1);
545
                // }
546
                //
547
                // ArrayList attr = ((FLyrRasterSE) layer).getAttributes();
548
                // if (attr == null) {
549
                // return level;
550
                // }
551
                // int width = 0, height = 0;
552
                // for (int i = 0; i < attr.size(); i++) {
553
                // Object[] a = (Object[]) attr.get(i);
554
                // if (a[0].toString().equals("Width"))
555
                // width = ((Integer) a[1]).intValue();
556
                // if (a[0].toString().equals("Height"))
557
                // height = ((Integer) a[1]).intValue();
558
                // }
559
                //
560
                // if (ext != null && width != 0 && height != 0) {
561
                //
562
                // Extent destinationExtents = _terrain.getExtent();
563
                // double xMax = destinationExtents.xMax();
564
                // double xMin = destinationExtents.xMin();
565
                // double yMax = destinationExtents.yMax();
566
                // double yMin = destinationExtents.yMin();
567
                // int terrainType = _terrain.getCoordinateSystemType();
568
                // if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
569
                // xMax = Math.toDegrees(xMax);
570
                // xMin = Math.toDegrees(xMin);
571
                // yMax = Math.toDegrees(yMax);
572
                // yMin = Math.toDegrees(yMin);
573
                // }
574
                //
575
                // double destination_xRange = xMax - xMin;
576
                // double destination_yRange = yMax - yMin;
577
                // double AR = destination_xRange / destination_yRange;
578
                // int C1 = 1;
579
                // int R1 = 1;
580
                //
581
                // boolean swapAxis = AR < 1.0;
582
                // if (swapAxis)
583
                // AR = 1.0 / AR;
584
                //
585
                // double lower_AR = Math.floor(AR);
586
                // double upper_AR = Math.ceil(AR);
587
                //
588
                // if (AR < Math.sqrt(lower_AR * upper_AR)) {
589
                // C1 = (int) (lower_AR);
590
                // R1 = 1;
591
                // } else {
592
                // C1 = (int) (upper_AR);
593
                // R1 = 1;
594
                // }
595
                //
596
                // if (swapAxis) {
597
                // // std::swap(C1,R1);
598
                // int t = C1;
599
                // C1 = R1;
600
                // R1 = t;
601
                // }
602
                //
603
                // double source_xRange = ext.getMaxX() - ext.getMinX();
604
                // double source_yRange = ext.getMaxY() - ext.getMinY();
605
                //
606
                // float sourceResolutionX = ((float) source_xRange) / (float) width;
607
                // float sourceResolutionY = ((float) source_yRange) / (float) height;
608
                //
609
                // //
610
                // log(osg::NOTICE,"Source %s resX %f resY %f",source->getFileName().c_str(),
611
                // // sourceResolutionX, sourceResolutionX);
612
                //
613
                // int k_cols =
614
                // (int) (Math.ceil(1.0
615
                // + Math.log(destination_xRange
616
                // / (C1 * sourceResolutionX * tileSize)) / Math.log(2.0)));
617
                // int k_rows =
618
                // (int) (Math.ceil(1.0
619
                // + Math.log(destination_yRange
620
                // / (R1 * sourceResolutionY * tileSize)) / Math.log(2.0)));
621
                // level = Math.max(k_cols, k_rows);
622
                // level = Math.min(level, maxLevel);
623
                // level = Math.max(level, 0);
624
                // }
625
                return level;
626
        }
627

    
628
        public IViewerContainer getCanvas3d() {
629
                return _canvas3d;
630
        }
631

    
632
        public JavaDataDriver getDataManager() {
633
                return _terrainDataManager;
634
        }
635

    
636
        public Layer3DProps getLayer3DProps(FLayer layer) {
637
                Layer3DProps props3D = (Layer3DProps) layer
638
                                .getProperty("3DLayerExtension");
639
                //
640
                // // Create instance of props for osg layers.
641
                if (props3D == null) {
642
                        props3D = new Layer3DPropsImpl(layer);
643
                        // if (layer instanceof FLyrVect) {
644
                        // FLyrVect nLayer = (FLyrVect) layer;
645
                        // Driver driver;
646
                        // try {
647
                        // driver = nLayer.getRecordset().getDriver();
648
                        // if (driver instanceof GvsigDriverOSG) {
649
                        // props3D.setChooseType(false);
650
                        // props3D.setType(Layer3DProps.layer3DOSG);
651
                        // }
652
                        // } catch (ReadDriverException e) {
653
                        // // TODO Auto-generated catch block
654
                        // e.printStackTrace();
655
                        // }
656
                        //
657
                        // }
658
                        // // Set the properties
659
                        props3D.setLayer(layer);
660
                        //
661
                        // props3D.initCacheName(_terrain.getCoordinateSystemType(),
662
                        // _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
663
                        FLyrDefault baseLayer = (FLyrDefault) layer;
664
                        baseLayer.setProperty("3DLayerExtension", props3D);
665
                        props3D.setVerticalEx(getVerticalExaggeration());
666
                } else {
667
                        if (_bLoading)
668
                                props3D.setChooseType(false);
669
                        props3D.setLayer(layer);
670
                }
671
                //
672
                return props3D;
673

    
674
                // return null;
675
        }
676

    
677
        public LayerManager getLayerManager() {
678
                return _terrainLayerManager;
679
        }
680

    
681
        public Node getSpecialNode() {
682
                Node specialNode = null;
683
                try {
684
                        specialNode = _terrainViewer.getFeature(0);
685
                } catch (ChildIndexOutOfBoundsExceptions e) {
686

    
687
                }
688
                return specialNode;
689
        }
690

    
691
        public Terrain getTerrain() {
692
                return _terrain;
693
        }
694

    
695
        public float getVerticalExaggeration() {
696
                return _verticalExaggeration;
697
        }
698

    
699
        public IProjection getViewProjection() {
700
                return _viewProjection;
701
        }
702

    
703
        public void invalidateVectorLayer(Layer3DProps props) {
704

    
705
                // TODO Auto-generated method stub
706
                // if (_terrain == null || _viewProjection == null)
707
                // return;
708
                //
709
                // VectorCacheService cacheService = (VectorCacheService) props
710
                // .getCacheService();
711
                // if (cacheService != null) {
712
                // // use VectorCacheService to add features to terrain
713
                // cacheService.refreshFeaturesToTerrain();
714
                // }
715

    
716
        }
717

    
718
        public boolean isRenewCanvasOff() {
719
                return _renewCanvasOff;
720
        }
721

    
722
        public void layerAdded(FLayers3D parent, FLayer layer) {
723

    
724
                System.out.println("A?adida capa. Evento Capturado");
725
                // to add group layers to 3D, just add recursively child data layers
726
                if (layer instanceof FLayers) {
727
                        FLayers group = (FLayers) layer;
728
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
729
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
730
                        }
731
                        getLayer3DProps(layer).setHooked(true);
732
                        return;
733
                }
734
                //
735
                if (layer instanceof Classifiable) {
736
                        Classifiable legendLyr = (Classifiable) layer;
737
                        // legendLyr.addLegendListener((LegendListener) this);
738
                        this.addLayerListener(this);
739
                }
740
                layer.addLayerListener((LayerListener) this);
741

    
742
                // listener to manage the selection for the layers
743
                // if (layer.getClass().equals(FLyrVect.class)) {
744
                // FLyrVect lyr = (FLyrVect) layer;
745
                // refreshLayerVectorsVisibility(lyr);
746
                // try {
747
                // SelectableDataSource recordSet = lyr.getRecordset();
748
                // if (recordSet != null) {
749
                // SelectionSupport selectionSupport = recordSet
750
                // .getSelectionSupport();
751
                // selectionSupport.addSelectionListener(this);
752
                // }
753
                // } catch (ReadDriverException e) {
754
                // // TODO Auto-generated catch block
755
                // e.printStackTrace();
756
                // }
757
                // }
758

    
759
                // if (!_bLoading)
760
                Layer3DProps props3D = getLayer3DProps(layer);
761

    
762
                if (layer instanceof DefaultFLyrRaster) {
763
                        try {
764
                                // If DefaultFLayerRaster we must init the layer for the
765
                                // persistence to
766
                                // work
767
                                ((DefaultFLyrRaster) layer).init();
768
                                props3D.setType(Layer3DProps.layer3DImage);
769
                        } catch (LoadLayerException e) {
770
                                // TODO Auto-generated catch block
771
                                e.printStackTrace();
772
                        } catch (FilePaletteException e) {
773
                                // TODO Auto-generated catch block
774
                                e.printStackTrace();
775
                        }
776

    
777
                }
778

    
779
                // If it's a vectorial layer we load it as 3D by default
780
                else if (layer instanceof FLyrVect) {
781

    
782
                        props3D.setType(Layer3DProps.layer3DVector);
783
                }
784
                addLayerToTerrain(layer, true);
785

    
786
                // Only do this the first time to add layer
787
                // if (_bEmptyView && !_bLoading) {
788
                // if (layers.getLayersCount() > 0) {
789
                // try {
790
                try {
791
                        zoomToEnvelope(layer.getFullEnvelope());
792
                } catch (ReadException e) {
793
                        // TODO Auto-generated catch block
794
                        e.printStackTrace();
795
                }
796
                // } catch (ExpansionFileReadException e) {
797
                // e.printStackTrace();
798
                // } catch (ReadDriverException e) {
799
                // e.printStackTrace();
800
                // }
801
                // _bEmptyView = false;
802
                // }
803
                // }
804
                //
805
                // // PrintDebugLayers();
806

    
807
        }
808

    
809
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
810

    
811
                // System.out.println("Creando estructura de cache");
812

    
813
                // Se obtiene el datastore de la capa
814
                RasterDataStore dataStore = layer.getDataStore();
815

    
816
                // Creais la estructura de cach?
817
                TileCacheManager manager = TileCacheLocator.getManager();
818

    
819
                int coordinates = CacheStruct.FLAT;
820

    
821
                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOGRAPHIC)
822
                        coordinates = CacheStruct.GEOGRAFIC;
823

    
824
                DefaultRasterProvider provider = (DefaultRasterProvider) dataStore
825
                                .getProvider();
826

    
827
                provider.setProjection(layer.getProjection());
828

    
829
                // El epsg suele tener la forma EPSG:4326
830
                String epsg = null;
831
                IProjection proj = provider.getProjection();
832
                if (proj != null)
833
                        epsg = proj.getAbrev();
834

    
835
                int resolution = 256;
836

    
837
                int type = getLayer3DProps(layer).getType();
838

    
839
                // if elevation layer, lower the tile resolution
840
                if (type == Layer3DProps.layer3DElevation)
841

    
842
                        resolution = 32;
843

    
844
                CacheStruct struct = manager.createCacheStructure(coordinates,
845
                                TileCacheLibrary.DEFAULT_LEVELS, provider.getExtent()
846
                                                .toRectangle2D(), provider.getCellSize(), resolution,
847
                                resolution, provider.getFullName(),
848
                                TileCacheLibrary.DEFAULT_STRUCTURE,
849
                                RasterLibrary.pathTileCache, "png", epsg, provider
850
                                                .getFileSize());
851

    
852
                return struct;
853

    
854
        }
855

    
856
        private void refreshLayerVectorsVisibility(FLayer lyr) {
857
                // if (_terrain == null || _viewProjection == null)
858
                // return;
859
                //
860
                // Layer3DProps props3D = getLayer3DProps(lyr);
861
                //
862
                // VectorCacheService cacheService = (VectorCacheService) props3D
863
                // .getCacheService();
864
                // if (cacheService != null) {
865
                // // use VectorCacheService to add features to terrain
866
                // cacheService.refreshFeaturesToTerrain(lyr.isVisible());
867
                // props3D.drawVersion = lyr.getDrawVersion();
868
                // }
869

    
870
        }
871

    
872
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
873
                        int newPos) {
874
                if (layer instanceof FLayers) {
875
                        FLayers group = (FLayers) layer;
876
                        if (newPos > oldPos) {
877
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
878
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
879
                                                        oldPos, newPos);
880
                        } else {
881
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
882
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
883
                                                        oldPos, newPos);
884
                        }
885
                        return;
886
                }
887

    
888
                Layer3DProps props3D = getLayer3DProps(layer);
889
                refreshLayerInTerrain(layer, props3D, false);
890

    
891
                int type = props3D.getType();
892

    
893
                // Now reorder in layer manager only for terrain layer types
894
                if ((type == Layer3DProps.layer3DOSG)
895
                                || ((type == Layer3DProps.layer3DVector)))
896
                        return;
897

    
898
                // Obtain the old position in the layer
899
                Layer terrainLayer = _terrainFLayerMap.get(layer);
900
                Vector<Integer> terrainOldPos = null;
901
                try {
902
                        terrainOldPos = _terrainLayerManager.getOrder(terrainLayer);
903
                } catch (LayerManagementException e) {
904
                        // TODO Auto-generated catch block
905
                        e.printStackTrace();
906
                }
907

    
908
                int terrainNewPos = 0;
909
                // Compute the new position.
910
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
911
                while (lyrIterator.hasNext()) {
912
                        FLayer auxLayer = lyrIterator.next();
913
                        if (auxLayer == layer)
914
                                break;
915
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
916
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
917
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
918
                                terrainNewPos++;
919
                        }
920

    
921
                }
922

    
923
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
924
                        return;
925
                if (terrainOldPos.get(0) != terrainNewPos)
926
                        try {
927
                                _terrainLayerManager.moveLayer(terrainOldPos.get(0),
928
                                                terrainNewPos);
929
                        } catch (LayerManagementException e) {
930
                                // TODO Auto-generated catch block
931
                                e.printStackTrace();
932
                        }
933
                //
934
                // System.out.println("En el toc antes era el " + oldPos +
935
                // " y ahora el "
936
                // + newPos);
937
                // System.out.println("En el terrain antes era el " + terrainOldPos
938
                // + " y ahora el " + terrainNewPos);
939

    
940
                // PrintDebugLayers();
941

    
942
        }
943

    
944
        public void layerRemoved(FLayers3D parent, FLayer layer) {
945
                System.out.println("Removed layer");
946

    
947
                // to remove group layers to 3D, just remove recursively child data
948
                // layers
949
                if (layer instanceof FLayers) {
950
                        FLayers group = (FLayers) layer;
951
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
952
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
953
                        }
954
                        getLayer3DProps(layer).setHooked(false);
955
                        return;
956
                }
957

    
958
                if (layer instanceof Classifiable) {
959
                        Classifiable legendLyr = (Classifiable) layer;
960
                        legendLyr.removeLegendListener((LegendListener) this);
961
                }
962

    
963
                layer.removeLayerListener((LayerListener) this);
964

    
965
                removeLayerToTerrain(layer);
966

    
967
                // All layers are removed
968
                if (layers.getLayersCount() == 0) {
969
                        _bEmptyView = true;
970
                }
971

    
972
                // PrintDebugLayers();
973

    
974
        }
975

    
976
        public void legendChanged(LegendChangedEvent e) {
977
                if (!_bListenToLegend)
978
                        return;
979
                if ((e == null) && (!visibilityChange)) {
980
                        // find layer whose legend changed
981
                        FLayer found = null;
982
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
983
                        Layer3DProps props3D = getLayer3DProps(layers);
984
                        while (lyrIterator.hasNext()) {
985
                                FLayer lyr = lyrIterator.next();
986
                                if (lyr instanceof FLyrVect) {
987
                                        FLyrVect lyrVect = (FLyrVect) lyr;
988
                                        System.out
989
                                                        .println("Changeando la simbologia de la capa vectorial: "
990
                                                                        + lyrVect);
991
                                        long newDrawVersion = layers.getDrawVersion();
992
                                        Layer3DProps vectProps = getLayer3DProps(lyrVect);
993
                                        if ((newDrawVersion - props3D.getDrawVersion()) >= 1) {
994
                                                props3D.setDrawVersion(lyrVect.getDrawVersion());
995
                                                // refreshLayerInTerrain(lyrVect, vectProps, true);
996
                                                removeLayerToTerrain(lyr);
997
                                                addLayerToTerrain(lyr, true);
998
                                                refreshLayerVectorsVisibility(lyrVect);
999
                                                _bListenToLegend = false;
1000
                                                // props3D.VerifyLegend(_terrain.getTerrainName());
1001
                                                _bListenToLegend = true;
1002

    
1003
                                        }
1004
                                }
1005
                        }
1006

    
1007
                        // IWindow f = PluginServices.getMDIManager().getActiveWindow();
1008
                        // if (f instanceof BaseView) {
1009
                        // BaseView view3D = (BaseView) f;
1010
                        // view3D.getTOC().refresh();
1011
                        // }
1012
                }
1013
                visibilityChange = false;
1014

    
1015
        }
1016

    
1017
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1018

    
1019
                if (_terrainLayerMap.size() == 0)
1020
                        return null;
1021
                if (rde == null)
1022
                        return null;
1023
                if (rde.getExtent() == null || rde.getLayer() == null
1024
                                || rde.getLayerManager() == null)
1025
                        return null;
1026

    
1027
                String layerID = rde.getLayer().getLayerID();
1028
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1029
                if (layer == null)
1030
                        return null;
1031
                if (!layer.isVisible())
1032
                        return null;
1033
                double minX, minY, width, height;
1034

    
1035
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1036
                        minX = rde.getExtent().xMin();
1037
                        minY = rde.getExtent().yMin();
1038
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1039
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1040

    
1041
                } else {
1042
                        minX = Math.toDegrees(rde.getExtent().xMin());
1043
                        minY = Math.toDegrees(rde.getExtent().yMin());
1044
                        width = Math.toDegrees(rde.getExtent().xMax()
1045
                                        - rde.getExtent().xMin());
1046
                        height = Math.toDegrees(rde.getExtent().yMax()
1047
                                        - rde.getExtent().yMin());
1048
                }
1049
                GeometryManager geoMan = GeometryLocator.getGeometryManager();
1050
                Envelope envelope = null;
1051
                try {
1052
                        envelope = geoMan.createEnvelope(Geometry.SUBTYPES.GEOM2D);
1053
                        envelope.setLowerCorner(geoMan.createPoint(minX, minY,
1054
                                        Geometry.SUBTYPES.GEOM2D));
1055
                        envelope.setUpperCorner(geoMan.createPoint(minX + width, minY
1056
                                        + height, Geometry.SUBTYPES.GEOM2D));
1057
                } catch (CreateGeometryException e) {
1058
                        // TODO Auto-generated catch block
1059
                        e.printStackTrace();
1060
                } catch (CreateEnvelopeException e) {
1061
                        // TODO Auto-generated catch block
1062
                        e.printStackTrace();
1063
                }
1064

    
1065
                // Case of Raster data
1066

    
1067
                UpdateDataEvent ude = null;
1068

    
1069
                if (rde.getLayer().getLayerType() == Layer.LayerType.TEXTURELAYER)
1070
                        ude = loadRasterData(layer, envelope, rde);
1071

    
1072
                if (rde.getLayer().getLayerType() == Layer.LayerType.VECTORLAYER) {
1073
                        // NodeMarker3DSymbol n = new NodeMarker3DSymbol();
1074
                        // n.setNodeFileURL("/home/jtorres/Projects/OpenSceneGraph/OpenSceneGraph-Data/dumptruck.osg");
1075
                        // n.setSize(25.0f);
1076
                        ude = loadVectorData(layer, envelope, rde);
1077
                }
1078
                if (rde.getLayer().getLayerType() == Layer.LayerType.HEIGHTFIELDLAYER)
1079
                        ude = loadElevationData(layer, envelope, rde);
1080

    
1081
                return ude;
1082
        }
1083

    
1084
        private UpdateDataEvent loadRasterData(FLayer layer, Envelope envelope,
1085
                        RequestDataEvent rde) {
1086

    
1087
                UpdateDataEvent ude = new UpdateDataEvent();
1088
                ude.copyDataFromRequest(rde);
1089
                if (layer instanceof DefaultFLyrRaster) {
1090
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1091

    
1092
                        if (rLayer.getDataStore().isTiled()) {
1093

    
1094
                                rLayer = (DefaultFLyrRaster) layer;
1095

    
1096
                                boolean exists = _cachedLayers.containsKey(rLayer);
1097

    
1098
                                if (!exists) {
1099

    
1100
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1101

    
1102
                                }
1103

    
1104
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1105

    
1106
                                RasterQuery query = RasterLocator.getManager().createQuery();
1107

    
1108
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1109
                                                .getManager()
1110
                                                .getDataStructFactory()
1111
                                                .createExtent(envelope.getLowerCorner().getX(),
1112
                                                                envelope.getUpperCorner().getY(),
1113
                                                                envelope.getUpperCorner().getX(),
1114
                                                                envelope.getLowerCorner().getY());
1115

    
1116
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1117
                                                rde.getTileY(), extent, null);
1118

    
1119
                                // query.setAreaOfInterest(extent, 512, 512);
1120

    
1121
                                // System.out.println("Tile Parameters:");
1122
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1123
                                // System.out.println("TileX = " + rde.getTileX());
1124
                                // System.out.println("TileY = " + rde.getTileY());
1125
                                // System.out.println("Extent = " + extent.getULX() + " "
1126
                                // + extent.getULY() + " " + extent.getLRX() + " "
1127
                                // + extent.getLRY());
1128

    
1129
                                try {
1130
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1131
                                        Buffer rBuff = (Buffer) result[0];
1132
                                        Buffer transparencyBuffer;
1133
                                        int suma = 0;
1134

    
1135
                                        transparencyBuffer = (Buffer) result[1];
1136

    
1137
                                        if (transparencyBuffer != null)
1138
                                                suma = 1;
1139

    
1140
                                        // int bufferBands = rBuff.getBandCount();
1141
                                        // Si el numero de bandas es mayor que 3 (RGB) no se pueden
1142
                                        // dibujar todas
1143
                                        int numBands = rLayer.getDataStore().getBandCount();
1144

    
1145
                                        if (numBands > (maxBands + suma))
1146
                                                numBands = maxBands + suma;
1147

    
1148
                                        ColorInterpretation cInt = rLayer.getDataStore()
1149
                                                        .getColorInterpretation();
1150

    
1151
                                        int rgba[] = { 0, 1, 2, 3 };
1152

    
1153
                                        rgba = setBandsInColors(cInt);
1154

    
1155
                                        int pixelFormat = convertPixelFormat(numBands);
1156

    
1157
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1158
                                        // + " alto: " + rBuff.getHeight()
1159
                                        // + " bandas totales incluyendo alpha (si tiene): "
1160
                                        // + numBands);
1161

    
1162
                                        switch (rBuff.getDataType()) {
1163
                                        case Buffer.TYPE_BYTE:
1164
                                                ude.setRasterData(
1165
                                                                buildByteBuffer(ude, rBuff, transparencyBuffer,
1166
                                                                                numBands, rgba), rBuff.getWidth(),
1167
                                                                rBuff.getHeight(), numBands, pixelFormat,
1168
                                                                Image.DataType.GL_UNSIGNED_BYTE);
1169
                                                break;
1170
                                        case Buffer.TYPE_SHORT:
1171
                                                ude.setRasterData(
1172
                                                                buildShortBuffer(ude, rBuff,
1173
                                                                                transparencyBuffer, numBands), rBuff
1174
                                                                                .getWidth(), rBuff.getHeight(),
1175
                                                                numBands, pixelFormat, Image.DataType.GL_SHORT);
1176
                                                break;
1177
                                        case Buffer.TYPE_USHORT:
1178
                                                ude.setRasterData(
1179
                                                                buildShortBuffer(ude, rBuff,
1180
                                                                                transparencyBuffer, numBands), rBuff
1181
                                                                                .getWidth(), rBuff.getHeight(),
1182
                                                                numBands, pixelFormat,
1183
                                                                Image.DataType.GL_UNSIGNED_SHORT);
1184
                                                break;
1185
                                        case Buffer.TYPE_INT:
1186
                                                ude.setRasterData(
1187
                                                                buildIntBuffer(ude, rBuff, transparencyBuffer,
1188
                                                                                numBands), rBuff.getWidth(), rBuff
1189
                                                                                .getHeight(), numBands, pixelFormat,
1190
                                                                Image.DataType.GL_INT);
1191
                                                break;
1192
                                        case Buffer.TYPE_FLOAT:
1193
                                                ude.setRasterData(
1194
                                                                buildFloatBuffer(ude, rBuff,
1195
                                                                                transparencyBuffer, numBands), rBuff
1196
                                                                                .getWidth(), rBuff.getHeight(),
1197
                                                                numBands, pixelFormat, Image.DataType.GL_FLOAT);
1198
                                                break;
1199
                                        case Buffer.TYPE_DOUBLE:
1200
                                                ude.setRasterData(
1201
                                                                buildDoubleBuffer(ude, rBuff,
1202
                                                                                transparencyBuffer, numBands), rBuff
1203
                                                                                .getWidth(), rBuff.getHeight(),
1204
                                                                numBands, pixelFormat, Image.DataType.GL_DOUBLE);
1205
                                                break;
1206
                                        }
1207

    
1208
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1209

    
1210
                                } catch (ProcessInterruptedException e) {
1211
                                        // TODO Auto-generated catch block
1212
                                        e.printStackTrace();
1213
                                } catch (RasterDriverException e) {
1214
                                        System.out.println("QueryArray failed");
1215
                                        // e.printStackTrace();
1216
                                } catch (InvalidSetViewException e) {
1217
                                        // TODO Auto-generated catch block
1218
                                        e.printStackTrace();
1219
                                } catch (NullPointerException e) {
1220
                                        // ude.setFailData();
1221
                                        System.out.println("Problem getting the tile. NullPointer");
1222
                                }
1223

    
1224
                        }
1225
                        // Not tiled raster
1226
                        else {
1227
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1228
                        }
1229

    
1230
                }
1231

    
1232
                // Vectorial rasterized
1233
                else if (layer instanceof FLyrVect) {
1234
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1235
                }
1236
                // unrecognized layer type
1237
                else {
1238
                        ude.setFailData();
1239
                }
1240

    
1241
                // System.out.println("Returning UDE");
1242

    
1243
                return ude;
1244
        }
1245

    
1246
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1247
                        RequestDataEvent rde) {
1248

    
1249
                System.out.println("vector data");
1250
                UpdateDataEvent ude = new UpdateDataEvent();
1251
                ude.copyDataFromRequest(rde);
1252

    
1253
                // Convenience casting, create a default 3D symbol
1254
                ISingleSymbolLegend legend = (ISingleSymbolLegend) ((FLyrVect) layer).getLegend();
1255
                I3DSymbol sy= (I3DSymbol) legend.getDefaultSymbol();
1256

    
1257

    
1258
                // Hack for polylines and polygons to only render them rasterized
1259
                // till gvSIG architects solve geometries problem
1260
                if (sy instanceof IFillSymbol || sy instanceof ILineSymbol) {
1261

    
1262
                        removeLayerToTerrain(layer);
1263
                        getLayer3DProps(layer).setType(Layer3DPropsImpl.layer3DImage);
1264
                        addLayerToTerrain(layer, true);
1265
                        return null;
1266
                }// End hack
1267
                Layer3DProps layerprops = getLayer3DProps(layer);
1268

    
1269
                if (layerprops.isZEnable() == false)
1270
                        sy.setFixedHeight(layerprops.getHeight());
1271

    
1272
                ViewPort vp = new ViewPort(_viewProjection);
1273
                vp.setEnvelope(envelope); // the real extent of the tile
1274
                vp.setAdjustable(false);
1275
                vp.setImageSize(new Dimension(256, 256));
1276
                vp.setDist1pixel(0.000000001);
1277
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1278

    
1279
                if (sy.getGeometry().getSize() == 0) {
1280
                        try {
1281
                                layer.draw(null, null, vp, new MyCancel(), scale);
1282
                        } catch (ReadException e) {
1283
                                // TODO Auto-generated catch block
1284
                                e.printStackTrace();
1285
                        }
1286
                }
1287
                // OSG Layers
1288
                DataStore ds = ((SingleLayer) layer).getDataStore();
1289
                Node n = null;
1290

    
1291
                if (ds.getProviderName() == "OSG") {
1292
                        try {
1293
                                n = (Node) ds.invokeDynMethod("getNode", null);
1294
                        } catch (DynMethodException e) {
1295
                                // TODO Auto-generated catch block
1296
                                e.printStackTrace();
1297
                        }
1298
                        System.out.println("OSG Layer added");
1299
                }
1300
                // Vectorial layers
1301
                else {
1302
                        n=this.buildVectors(sy);
1303
                }
1304
                ude.setVectorData(n);
1305

    
1306
                return ude;
1307
        }
1308

    
1309
        private Node buildVectors(I3DSymbol symbol) {
1310
                Node n = null;
1311

    
1312
                ISymbol3D sym = null;
1313
                try {
1314
                        sym = Symbol3DFactory.getSymbol3D(symbol);
1315
                } catch (NodeException e) {
1316
                        // TODO Auto-generated catch block
1317
                        e.printStackTrace();
1318
                }
1319
                // sm.setPointSize((float) sy.getSize());
1320
                n = sym.buildSceneGraph(symbol.getGeometry());
1321
                return n;
1322
        }
1323

    
1324
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1325
                        RequestDataEvent rde) {
1326

    
1327
                UpdateDataEvent ude = new UpdateDataEvent();
1328
                ude.copyDataFromRequest(rde);
1329

    
1330
                if (layer instanceof DefaultFLyrRaster) {
1331
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1332
                        boolean hasCache = true;
1333
                        if (rLayer.getDataStore().getInternalParameters() instanceof NetCDFDataParameters)
1334
                                hasCache = false;
1335

    
1336
                        if (hasCache) {
1337

    
1338
                                rLayer = (DefaultFLyrRaster) layer;
1339
                                boolean exists = _cachedLayers.containsKey(rLayer);
1340

    
1341
                                if (!exists) {
1342

    
1343
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1344

    
1345
                                }
1346

    
1347
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1348

    
1349
                                RasterQuery query = RasterLocator.getManager().createQuery();
1350

    
1351
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1352
                                                .getManager()
1353
                                                .getDataStructFactory()
1354
                                                .createExtent(envelope.getLowerCorner().getX(),
1355
                                                                envelope.getUpperCorner().getY(),
1356
                                                                envelope.getUpperCorner().getX(),
1357
                                                                envelope.getLowerCorner().getY());
1358

    
1359
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1360
                                                rde.getTileY(), extent, null);
1361

    
1362
                                // query.setAreaOfInterest(extent, 512, 512);
1363

    
1364
                                // System.out.println("Tile Parameters:");
1365
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1366
                                // System.out.println("TileX = " + rde.getTileX());
1367
                                // System.out.println("TileY = " + rde.getTileY());
1368
                                // System.out.println("Extent = " + extent.getULX() + " "
1369
                                // + extent.getULY() + " " + extent.getLRX() + " "
1370
                                // + extent.getLRY());
1371

    
1372
                                try {
1373
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1374
                                        Buffer rBuff = (Buffer) result[0];
1375
                                        Buffer transparencyBuffer;
1376

    
1377
                                        if (result.length < 2)
1378
                                                transparencyBuffer = null;
1379
                                        else
1380
                                                transparencyBuffer = (Buffer) result[1];
1381

    
1382
                                        int numBands = rBuff.getBandCount();
1383
                                        if (transparencyBuffer != null) {
1384

    
1385
                                                // System.out
1386
                                                // .println("Tengo Transparency buffer con "
1387
                                                // + transparencyBuffer.getBandCount()
1388
                                                // + " bandas");
1389
                                                numBands++;
1390

    
1391
                                        }
1392

    
1393
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1394
                                        // + " alto: " + rBuff.getHeight()
1395
                                        // + " bandas totales incluyendo alpha (si tiene): "
1396
                                        // + numBands);
1397

    
1398
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1399
                                                        .getHeight()) / 64];
1400

    
1401
                                        int pixelFormat = convertPixelFormat(numBands);
1402

    
1403
                                        // K hay que setearlo en el dialogo
1404
                                        int cont = 0;
1405

    
1406
                                        int k = getLayer3DProps(rLayer).getElevationBand();
1407

    
1408
                                        for (int i = rBuff.getWidth() - 1; i >= 0; i = i - 8) {
1409
                                                // Vertical Flip needed
1410
                                                for (int j = 0; j < rBuff.getHeight(); j = j + 8) {
1411

    
1412
                                                        switch (rBuff.getDataType()) {
1413
                                                        case Buffer.TYPE_BYTE:
1414
                                                                data[cont] = (float) (rBuff
1415
                                                                                .getElemByte(i, j, k));
1416
                                                                cont++;
1417
                                                                break;
1418
                                                        case Buffer.TYPE_DOUBLE:
1419
                                                                data[cont] = (float) (Math.round(rBuff
1420
                                                                                .getElemDouble(i, j, k)));
1421
                                                                cont++;
1422
                                                                break;
1423
                                                        case Buffer.TYPE_FLOAT:
1424
                                                                data[cont] = (float) (Math.round(rBuff
1425
                                                                                .getElemFloat(i, j, k)));
1426
                                                                cont++;
1427
                                                                break;
1428
                                                        case Buffer.TYPE_INT:
1429
                                                                data[cont] = (float) (rBuff.getElemInt(i, j, k) & 0xffffffff);
1430
                                                                cont++;
1431
                                                                break;
1432
                                                        case Buffer.TYPE_SHORT:
1433
                                                        case Buffer.TYPE_USHORT:
1434
                                                                data[cont] = (float) (rBuff.getElemShort(i, j,
1435
                                                                                k) & 0xffff);
1436
                                                                cont++;
1437
                                                                break;
1438
                                                        }
1439

    
1440
                                                }
1441

    
1442
                                        }
1443
                                        ude.setHeightfieldData(data, rBuff.getWidth() / 8,
1444
                                                        rBuff.getHeight() / 8);
1445

    
1446
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1447

    
1448
                                } catch (ProcessInterruptedException e) {
1449
                                        // TODO Auto-generated catch block
1450
                                        e.printStackTrace();
1451
                                } catch (RasterDriverException e) {
1452
                                        e.printStackTrace();
1453
                                } catch (InvalidSetViewException e) {
1454
                                        // TODO Auto-generated catch block
1455
                                        e.printStackTrace();
1456
                                } catch (NullPointerException e) {
1457
                                        // ude.setFailData();
1458
                                        System.out.println("Problem getting the tile");
1459
                                }
1460

    
1461
                        }
1462
                        // No cache
1463
                        else {
1464
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1465
                        }
1466

    
1467
                }
1468

    
1469
                // Vectorial rasterized
1470
                else if (layer instanceof FLyrVect) {
1471
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1472
                }
1473
                // unrecognized layer type
1474
                else {
1475
                        ude.setFailData();
1476
                }
1477

    
1478
                return ude;
1479

    
1480
        }
1481

    
1482
        protected byte[] buildByteBuffer(UpdateDataEvent ude, Buffer rBuff,
1483
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1484

    
1485
                int cont = 0;
1486
                int colorBands = numBands;
1487

    
1488
                if (transparencyBuffer != null) {
1489
                        colorBands--;
1490
                }
1491

    
1492
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * numBands];
1493

    
1494
                for (int i = 0; i < rBuff.getWidth(); i++) {
1495

    
1496
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1497

    
1498
                                for (int k = 0; k < colorBands; k++) {
1499
                                        // En lugar de k se deben usar las bandas asociadas al
1500
                                        // componente
1501
                                        data[cont] = (byte) rBuff.getElemByte(i, j, rgba[k]);
1502
                                        cont++;
1503

    
1504
                                }
1505
                                if (transparencyBuffer != null) {
1506
                                        if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1507
                                                data[cont] = (byte) 0;
1508
                                        else
1509
                                                data[cont] = (byte) 255;
1510
                                        // data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1511

    
1512
                                        cont++;
1513

    
1514
                                }
1515
                        }
1516
                }
1517

    
1518
                return data;
1519
        }
1520

    
1521
        protected short[] buildShortBuffer(UpdateDataEvent ude, Buffer rBuff,
1522
                        Buffer transparencyBuffer, int numBands) {
1523
                short[] data = new short[rBuff.getWidth() * rBuff.getHeight()
1524
                                * numBands];
1525

    
1526
                int cont = 0;
1527
                int colorBands = numBands;
1528

    
1529
                if (transparencyBuffer != null)
1530
                        colorBands--;
1531

    
1532
                for (int i = 0; i < rBuff.getWidth(); i++) {
1533

    
1534
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1535

    
1536
                                for (int k = 0; k < colorBands; k++) {
1537
                                        data[cont] = (short) (rBuff.getElemShort(i, j, k) & 0xffff);
1538
                                        cont++;
1539
                                }
1540
                                if (transparencyBuffer != null) {
1541
                                        data[cont] = (short) (rBuff.getElemShort(i, j, 0) & 0xffff);
1542
                                        cont++;
1543
                                }
1544
                        }
1545
                }
1546

    
1547
                return data;
1548
        }
1549

    
1550
        protected int[] buildIntBuffer(UpdateDataEvent ude, Buffer rBuff,
1551
                        Buffer transparencyBuffer, int numBands) {
1552
                int[] data = new int[rBuff.getWidth() * rBuff.getHeight() * numBands];
1553

    
1554
                int cont = 0;
1555
                int colorBands = numBands;
1556

    
1557
                if (transparencyBuffer != null)
1558
                        colorBands--;
1559

    
1560
                for (int i = 0; i < rBuff.getWidth(); i++) {
1561

    
1562
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1563

    
1564
                                for (int k = 0; k < colorBands; k++) {
1565
                                        data[cont] = (int) (rBuff.getElemByte(i, j, k) & 0xffffffff);
1566
                                        cont++;
1567
                                }
1568
                                if (transparencyBuffer != null) {
1569
                                        data[cont] = (int) (rBuff.getElemByte(i, j, 0) & 0xffffffff);
1570
                                        cont++;
1571
                                }
1572
                        }
1573
                }
1574

    
1575
                return data;
1576
        }
1577

    
1578
        protected float[] buildFloatBuffer(UpdateDataEvent ude, Buffer rBuff,
1579
                        Buffer transparencyBuffer, int numBands) {
1580
                float[] data = new float[rBuff.getWidth() * rBuff.getHeight()
1581
                                * numBands];
1582

    
1583
                int cont = 0;
1584
                int colorBands = numBands;
1585

    
1586
                if (transparencyBuffer != null)
1587
                        colorBands--;
1588

    
1589
                for (int i = 0; i < rBuff.getWidth(); i++) {
1590

    
1591
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1592

    
1593
                                for (int k = 0; k < colorBands; k++) {
1594
                                        data[cont] = rBuff.getElemByte(i, j, k);
1595
                                        cont++;
1596
                                }
1597
                                if (transparencyBuffer != null) {
1598
                                        data[cont] = rBuff.getElemByte(i, j, 0);
1599
                                        cont++;
1600
                                }
1601
                        }
1602
                }
1603

    
1604
                return data;
1605
        }
1606

    
1607
        protected double[] buildDoubleBuffer(UpdateDataEvent ude, Buffer rBuff,
1608
                        Buffer transparencyBuffer, int numBands) {
1609
                double[] data = new double[rBuff.getWidth() * rBuff.getHeight()
1610
                                * numBands];
1611

    
1612
                int cont = 0;
1613
                int colorBands = numBands;
1614

    
1615
                if (transparencyBuffer != null)
1616
                        colorBands--;
1617

    
1618
                for (int i = 0; i < rBuff.getWidth(); i++) {
1619

    
1620
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1621

    
1622
                                for (int k = 0; k < colorBands; k++) {
1623
                                        data[cont] = rBuff.getElemByte(i, j, k);
1624
                                        cont++;
1625
                                }
1626
                                if (transparencyBuffer != null) {
1627
                                        data[cont] = rBuff.getElemByte(i, j, 0);
1628
                                        cont++;
1629
                                }
1630
                        }
1631
                }
1632

    
1633
                return data;
1634
        }
1635

    
1636
        protected int convertPixelFormat(int type) {
1637

    
1638
                switch (type) {
1639

    
1640
                case 1:
1641
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1642

    
1643
                case 2:
1644
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1645

    
1646
                case 3:
1647
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1648

    
1649
                case 4:
1650
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1651

    
1652
                }
1653

    
1654
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1655

    
1656
        }
1657

    
1658
        protected int[] setBandsInColors(ColorInterpretation cInt) {
1659

    
1660
                int rgba[] = new int[4];
1661

    
1662
                rgba[0] = cInt.getBand(ColorInterpretation.RED_BAND);
1663
                if (rgba[0] == -1)
1664
                        rgba[0] = 0;
1665
                rgba[1] = cInt.getBand(ColorInterpretation.GREEN_BAND);
1666
                if (rgba[1] == -1)
1667
                        rgba[1] = 1;
1668
                rgba[2] = cInt.getBand(ColorInterpretation.BLUE_BAND);
1669
                if (rgba[2] == -1)
1670
                        rgba[2] = 2;
1671
                rgba[3] = cInt.getBand(ColorInterpretation.ALPHA_BAND);
1672
                if (rgba[3] == -1)
1673
                        rgba[3] = 3;
1674

    
1675
                return rgba;
1676

    
1677
        }
1678

    
1679
        protected class MyCancel implements Cancellable {
1680
                private boolean cancel = false;
1681

    
1682
                public MyCancel() {
1683
                }
1684

    
1685
                public void setCanceled(boolean canceled) {
1686
                        cancel = canceled;
1687
                }
1688

    
1689
                public boolean isCanceled() {
1690
                        return cancel;
1691
                }
1692
        }
1693

    
1694
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1695

    
1696
                int size = 256;
1697
                BufferedImage image = new BufferedImage(size, size,
1698
                                BufferedImage.TYPE_4BYTE_ABGR);
1699

    
1700
                ViewPort vp = new ViewPort(_viewProjection);
1701
                vp.setEnvelope(envelope); // the real extent of the tile
1702

    
1703
                vp.setAdjustable(false);
1704
                vp.setImageSize(new Dimension(size, size));
1705
                vp.setDist1pixel(0.000000001);
1706

    
1707
                Graphics2D graphics = image.createGraphics();
1708
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1709
                // background
1710
                graphics.setColor(backgColor);
1711
                graphics.fillRect(0, 0, size, size);
1712

    
1713
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1714

    
1715
                try {
1716
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1717

    
1718
                } catch (Exception e) {
1719
                        return null;
1720
                }
1721

    
1722
                return image;
1723

    
1724
        }
1725

    
1726
        public void nameChanged(LayerEvent e) {
1727
                System.out.println("Name change");
1728

    
1729
        }
1730

    
1731
        public void refreshLayerInTerrain(FLayer layer, Layer3DProps props,
1732
                        boolean bRemoveCache) {
1733

    
1734
                System.out.println("Refresh");
1735
                if (props == null)
1736
                        return;
1737

    
1738
                if (_terrain == null)
1739
                        return; // view not opened yet
1740

    
1741
                // clear cache
1742

    
1743
                // refresh layer in terrain
1744
                int type = props.getType();
1745
                if ((type == Layer3DProps.layer3DImage)
1746
                                || (type == Layer3DProps.layer3DElevation)
1747
                                || (type == Layer3DProps.layer3DVectorMR)) {
1748

    
1749
                        try {
1750
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
1751
                        } catch (LayerManagementException e) {
1752
                                // TODO Auto-generated catch block
1753
                                e.printStackTrace();
1754
                        }
1755
                } else if (type == Layer3DProps.layer3DVector) {
1756
                        // ILegend legend = ((FLyrVect) layer).getLegend();
1757
                        //
1758
                        // try {
1759
                        // RequestDataEvent rde = new RequestDataEvent();
1760
                        // loadVectorData(layer, layer.getFullEnvelope(),
1761
                        // new RequestDataEvent(), (I3DSymbol) legend.getDefaultSymbol());
1762
                        // } catch (ReadException e) {
1763
                        // // TODO Auto-generated catch block
1764
                        // e.printStackTrace();
1765
                        // }
1766

    
1767
                }
1768

    
1769
        }
1770

    
1771
        public boolean removeCache(File path) {
1772
                if (path.exists()) {
1773
                        File[] files = path.listFiles();
1774
                        for (int i = 0; i < files.length; i++) {
1775
                                if (files[i].isDirectory()) {
1776
                                        removeCache(files[i]);
1777
                                } else {
1778
                                        files[i].delete();
1779
                                }
1780
                        }
1781
                }
1782
                return (path.delete());
1783
        }
1784

    
1785
        public void removeLayerToTerrain(FLayer layer) {
1786

    
1787
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1788
                if (terrainLayer != null) {
1789

    
1790
                        _terrainLayerMap.remove(terrainLayer.getLayerID());
1791
                        _terrainFLayerMap.remove(layer);
1792

    
1793
                        try {
1794
                                _terrainLayerManager.removeLayer(terrainLayer);
1795
                        } catch (LayerManagementException e) {
1796
                                // TODO Auto-generated catch block
1797
                                e.printStackTrace();
1798
                        }
1799
                }
1800

    
1801
        }
1802

    
1803
        public void selectionChanged(SelectionEvent e) {
1804
                // TODO Auto-generated method stub
1805
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1806
                // while (lyrIterator.hasNext()) {
1807
                // FLayer layer = lyrIterator.next();
1808
                // Layer3DProps props3D = getLayer3DProps(layer);
1809
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
1810
                // if (layer.getClass().equals(FLyrVect.class)) {
1811
                // FLyrVect lyr = (FLyrVect) layer;
1812
                //
1813
                // FBitSet selection = null;
1814
                // try {
1815
                // selection = lyr.getRecordset().getSelectionSupport()
1816
                // .getSelection();
1817
                // } catch (ReadDriverException e1) {
1818
                // // TODO Auto-generated catch block
1819
                // e1.printStackTrace();
1820
                // }
1821
                //
1822
                // if ((selection.cardinality() == 0)
1823
                // || (!(selection.isEmpty()))) {
1824
                // Layer3DProps props = Layer3DProps
1825
                // .getLayer3DProps(layer);
1826
                // refreshLayerInTerrain(props, true);
1827
                // if (layer instanceof FLyrVect) {
1828
                // FLyrVect fvect = (FLyrVect) layer;
1829
                // props.drawVersion = fvect.getDrawVersion();
1830
                // }
1831
                // }
1832
                // }
1833
                // }
1834
                // }
1835

    
1836
        }
1837

    
1838
        public void setDataManager(JavaDataDriver manager) {
1839
                _terrainDataManager = manager;
1840
                _terrainDataManager.setDataLoader(this);
1841

    
1842
        }
1843

    
1844
        public void setLayerManager(LayerManager manager) {
1845
                _terrainLayerManager = manager;
1846

    
1847
        }
1848

    
1849
        public void setLoading(boolean bLoading) {
1850
                _bLoading = bLoading;
1851

    
1852
        }
1853

    
1854
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1855
                _renewCanvasOff = renewCanvasOff;
1856

    
1857
        }
1858

    
1859
        public void setTerrain(Terrain terrain) {
1860
                if (_terrain == terrain)
1861
                        return;
1862

    
1863
                _terrain = terrain;
1864

    
1865
                // add layers to terrain necessary when we are loading
1866
                addCurrentLayers();
1867

    
1868
        }
1869

    
1870
        public void setVerticalExaggeration(float verticalExaggeration) {
1871
                _verticalExaggeration = verticalExaggeration;
1872

    
1873
        }
1874

    
1875
        public void setViewProjection(IProjection projection) {
1876
                _viewProjection = projection;
1877

    
1878
        }
1879

    
1880
        public void setViewer(IViewerContainer canvas) {
1881
                _canvas3d = canvas;
1882
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
1883

    
1884
        }
1885

    
1886
        public void visibilityChanged(LayerEvent e) {
1887
                FLayer lyr = e.getSource();
1888

    
1889
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
1890
                // refreshLayerVectorsVisibility(lyr);
1891
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1892
                // refreshLayer3DOSGVisibility(lyr);
1893
                // } else {
1894
                refreshLayerVisibility(lyr);
1895
                // }
1896
                visibilityChange = true;
1897

    
1898
        }
1899

    
1900
        private void refreshLayerVisibility(FLayer layer) {
1901

    
1902
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1903
                terrainLayer.setEnabled(layer.isVisible());
1904
                // _terrainLayerManager.updateLayers();
1905

    
1906
        }
1907

    
1908
        public void zoomToEnvelope(Envelope geoEnvelope) {
1909
                if (geoEnvelope == null)
1910
                        return;
1911
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
1912
                        return;
1913

    
1914
                double maxHeight = 0.0;
1915

    
1916
                // Getting envelope positions
1917
                double minLat = geoEnvelope.getMinimum(0);
1918
                double maxLat = geoEnvelope.getMaximum(0);
1919
                double cenLon = geoEnvelope.getCenter(0);
1920
                double cenLat = geoEnvelope.getCenter(1);
1921

    
1922
                double elevation = 0;
1923

    
1924
                // calculate altitude
1925
                double avLat = 0;
1926
                if (minLat > 0.0 || maxLat < 0.0)
1927
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1928
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
1929

    
1930
                double terrainRadius = _terrain.getRadiusEquatorial();
1931
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
1932
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1933
                                * (1 - Math.cos(Math.toRadians(avLon))));
1934
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
1935
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
1936

    
1937
                // Calculate XYZ positions for camera.
1938

    
1939
                int terrainType = _terrain.getCoordinateSystemType();
1940

    
1941
                double zoomFactor = 1.5;
1942
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
1943
                        zoomFactor = 1.3;
1944
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1945

    
1946
                Vec3 eye = new Vec3();
1947
                Vec3 center = new Vec3();
1948
                Vec3 up = new Vec3();
1949
                // Calculate positions for PLAIN MODE.
1950
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
1951

    
1952
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
1953
                                        .getMinimum(1)) / 1.2d;
1954
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
1955
                                        .getMinimum(0)) / 1.2d;
1956
                        double height;
1957

    
1958
                        height = Math.sqrt(difx * difx + dify * dify);
1959
                        double fullWindowFactor = 1.7;
1960
                        // EYE
1961
                        eye.setX(cenLon);
1962
                        eye.setY(cenLat);
1963
                        eye.setZ(height * fullWindowFactor);
1964
                        // CENTER
1965
                        center.setX(cenLon);
1966
                        center.setY(cenLat);
1967
                        center.setZ(0.0);
1968
                        // UP
1969
                        up.setX(0.0);
1970
                        up.setY(1.0);
1971
                        up.setZ(0.0);
1972
                } else
1973
                // Calculate positions for SPHERICAL MODE.
1974
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
1975
                        // EYE
1976
                        Vec3 aux = new Vec3(cenLon, cenLat, elevation);
1977
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
1978
                        // CENTER
1979
                        center.setX(0.0);
1980
                        center.setY(0.0);
1981
                        center.setZ(0.0);
1982
                        // UP
1983
                        up.setX(0.0);
1984
                        up.setY(0.0);
1985
                        up.setZ(1.0);
1986
                }
1987
                Camera cam = new Camera();
1988
                cam.setViewByLookAt(eye, center, up);
1989

    
1990
                _terrainViewer.setCamera(cam);
1991

    
1992
        }
1993

    
1994
        public void editionChanged(LayerEvent e) {
1995
                // TODO Auto-generated method stub
1996

    
1997
        }
1998

    
1999
        public void drawValueChanged(LayerEvent e) {
2000
                // TODO Auto-generated method stub
2001

    
2002
        }
2003

    
2004
        public boolean symbolChanged(SymbolLegendEvent e) {
2005

    
2006
                System.out.println("Symbol changed");
2007
                return false;
2008
        }
2009

    
2010
        public void legendCleared(LegendClearEvent event) {
2011
                // TODO Auto-generated method stub
2012

    
2013
        }
2014

    
2015
        public static class RegisterPersistence implements Callable {
2016

    
2017
                public Object call() throws Exception {
2018
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
2019
                        if (manager.getDefinition(MapContext.class) == null) {
2020
                                MapContext.registerPersistent();
2021
                        }
2022
                        DynStruct definition = manager.addDefinition(
2023
                                        MapContext3DImpl.class, "MapContext3DImpl",
2024
                                        "MapContext3DImpl Persistence definition", null, null);
2025
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
2026
                                        "MapContext");
2027

    
2028
                        return Boolean.TRUE;
2029
                }
2030
        }
2031

    
2032
}