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 @ 336

History | View | Annotate | Download (58.1 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.events.ColorEvent;
58
import org.gvsig.fmap.mapcontext.events.ExtentEvent;
59
import org.gvsig.fmap.mapcontext.events.ProjectionEvent;
60
import org.gvsig.fmap.mapcontext.exceptions.LegendLayerException;
61
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
62
import org.gvsig.fmap.mapcontext.layers.FLayer;
63
import org.gvsig.fmap.mapcontext.layers.FLayers;
64
import org.gvsig.fmap.mapcontext.layers.FLyrDefault;
65
import org.gvsig.fmap.mapcontext.layers.LayerEvent;
66
import org.gvsig.fmap.mapcontext.layers.LayerListener;
67
import org.gvsig.fmap.mapcontext.layers.SelectionEvent;
68
import org.gvsig.fmap.mapcontext.layers.SingleLayerIterator;
69
import org.gvsig.fmap.mapcontext.layers.operations.Classifiable;
70
import org.gvsig.fmap.mapcontext.layers.operations.SingleLayer;
71
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
72
import org.gvsig.fmap.mapcontext.rendering.legend.ILegend;
73
import org.gvsig.fmap.mapcontext.rendering.legend.ISingleSymbolLegend;
74
import org.gvsig.fmap.mapcontext.rendering.legend.IVectorLegend;
75
import org.gvsig.fmap.mapcontext.rendering.legend.events.LegendChangedEvent;
76
import org.gvsig.fmap.mapcontext.rendering.legend.events.LegendClearEvent;
77
import org.gvsig.fmap.mapcontext.rendering.legend.events.SymbolLegendEvent;
78
import org.gvsig.fmap.mapcontext.rendering.legend.events.listeners.LegendListener;
79
import org.gvsig.gvsig3d.impl.symbology3d.Symbol3DFactory;
80
import org.gvsig.gvsig3d.impl.symbology3d.fill.impl.SimpleFill3DSymbol;
81
import org.gvsig.gvsig3d.impl.symbology3d.line.impl.SimpleLine3DSymbol;
82
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.GeometryMarker3DSymbol;
83
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.NodeMarker3DSymbol;
84
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.PictureMarker3DSymbol;
85
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.SimpleMarker3DSymbol;
86
import org.gvsig.gvsig3d.map3d.Layer3DProps;
87
import org.gvsig.gvsig3d.map3d.MapContext3D;
88
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
89
import org.gvsig.gvsig3d.symbology3d.I3DSymbol;
90
import org.gvsig.osgvp.core.osg.Image;
91
import org.gvsig.osgvp.core.osg.Matrix;
92
import org.gvsig.osgvp.core.osg.Node;
93
import org.gvsig.osgvp.core.osg.Vec2;
94
import org.gvsig.osgvp.core.osg.Vec3;
95
import org.gvsig.osgvp.core.osg.Vec4;
96
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
97
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
98
import org.gvsig.osgvp.exceptions.node.NodeException;
99
import org.gvsig.osgvp.symbology.ISymbol3D;
100
import org.gvsig.osgvp.terrain.Extent;
101
import org.gvsig.osgvp.terrain.HeightfieldLayer;
102
import org.gvsig.osgvp.terrain.JavaDataDriver;
103
import org.gvsig.osgvp.terrain.Layer;
104
import org.gvsig.osgvp.terrain.LayerManager;
105
import org.gvsig.osgvp.terrain.RequestDataEvent;
106
import org.gvsig.osgvp.terrain.Terrain;
107
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
108
import org.gvsig.osgvp.terrain.TerrainViewer;
109
import org.gvsig.osgvp.terrain.TextureLayer;
110
import org.gvsig.osgvp.terrain.UpdateDataEvent;
111
import org.gvsig.osgvp.terrain.VectorLayer;
112
import org.gvsig.osgvp.terrain.exceptions.LayerManagementException;
113
import org.gvsig.osgvp.viewer.Camera;
114
import org.gvsig.osgvp.viewer.IViewerContainer;
115
import org.gvsig.raster.cache.tile.TileCache;
116
import org.gvsig.raster.cache.tile.TileCacheLibrary;
117
import org.gvsig.raster.cache.tile.TileCacheLocator;
118
import org.gvsig.raster.cache.tile.TileCacheManager;
119
import org.gvsig.raster.cache.tile.provider.CacheStruct;
120
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
121
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
122
import org.gvsig.raster.netcdf.io.NetCDFDataParameters;
123
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.IFillSymbol;
124
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
125
import org.gvsig.tools.ToolsLocator;
126
import org.gvsig.tools.dynobject.DynStruct;
127
import org.gvsig.tools.dynobject.exception.DynMethodException;
128
import org.gvsig.tools.locator.LocatorException;
129
import org.gvsig.tools.persistence.PersistenceManager;
130
import org.gvsig.tools.task.Cancellable;
131
import org.gvsig.tools.util.Callable;
132

    
133
/**
134
 * @author gvSIG Team
135
 * @version $Id$
136
 * 
137
 */
138
public class MapContext3DImpl extends MapContext3D {
139

    
140
        private Terrain _terrain;
141
        private IViewerContainer _canvas3d;
142
        private TerrainViewer _terrainViewer;
143
        private LayerManager _terrainLayerManager;
144
        private JavaDataDriver _terrainDataManager = null;
145

    
146
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
147
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
148

    
149
        private Hashtable<DefaultFLyrRaster, CacheStruct> _cachedLayers = new Hashtable<DefaultFLyrRaster, CacheStruct>();
150

    
151
        private IProjection _viewProjection;
152
        private float _verticalExaggeration;
153
        private boolean _bEmptyView = true;
154
        private boolean _bListenToLegend = true;
155
        private boolean _bLoading = false;
156
        private TerrainViewer _canvasoff = null;
157
        private boolean _renewCanvasOff = false;
158

    
159
        TerrainViewer _printViewer = null;
160
        Layer _testRasterLayer = null;
161

    
162
        private boolean visibilityChange = false;
163

    
164
        TileCacheManager tileMan = TileCacheLocator.getManager();
165
        TileCache tileCache = tileMan.getTileCache(RasterLibrary.pathTileCache);
166

    
167
        int maxBands = 3;
168

    
169
        public MapContext3DImpl() {
170
        
171
        }
172

    
173
        public MapContext3DImpl(ViewPort vp) {
174
                super(vp);
175
                
176
        }
177

    
178
        public MapContext3DImpl(FLayers fLayers, ViewPort vp) {
179

    
180
                super(fLayers, vp);
181
        }
182

    
183
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
184
                        double scale) {
185

    
186
                if (_canvas3d == null || _canvas3d.getOSGViewer() == null)
187
                        return;
188
                double x = getViewPort().getOffset().getX();
189
                double y = getViewPort().getOffset().getY();
190
                double w = image.getWidth();
191
                double h = image.getHeight();
192

    
193
                if (_canvasoff == null) {
194
                        try {
195
                                _canvasoff = new TerrainViewer();
196
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
197

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

    
211
                                terrain.init();
212
                                terrain.setLayerManager(_terrainLayerManager);
213

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

    
227
                }
228

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

    
242
                org.gvsig.osgvp.core.osg.Image OSGimage = _canvasoff
243
                                .getScreenshotImage();
244

    
245
                BufferedImage img = null;
246
                try {
247
                        img = OSGimage.getBufferedImage();
248
                } catch (ImageConversionException e1) {
249
                        // TODO Auto-generated catch block
250
                        e1.printStackTrace();
251
                } catch (IOException e1) {
252
                        // TODO Auto-generated catch block
253
                        e1.printStackTrace();
254
                }
255

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

    
266
                }
267
        }
268

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

    
285
        }
286

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

    
298
        }
299

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

    
318
        }
319

    
320
        public void activationChanged(LayerEvent e) {
321

    
322
        }
323

    
324
        public void addCurrentLayers() {
325

    
326
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
327
                while (lyrIterator.hasNext()) {
328
                        FLayer layer = lyrIterator.next();
329
                        Layer3DProps props = getLayer3DProps(layer);
330
                        addLayerToTerrain(layer, false);
331
                }
332

    
333
        }
334

    
335
        public void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
336

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

    
346
                Layer3DProps props = getLayer3DProps(layer);
347
                GeometryManager geoMan;
348

    
349
                geoMan = GeometryLocator.getGeometryManager();
350

    
351
                if (layerEnvelope == null) {
352

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

    
362
                                else {
363

    
364
                                        layerEnvelope.setLowerCorner(geoMan
365
                                                        .createPoint(-20000000.0, -10000000.00,
366
                                                                        Geometry.SUBTYPES.GEOM2D));
367
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(40000000.0,
368
                                                        20000000.0, Geometry.SUBTYPES.GEOM2D));
369

    
370
                                }
371
                        } catch (CreateEnvelopeException e) {
372
                                // TODO Auto-generated catch block
373
                                e.printStackTrace();
374
                        } catch (CreateGeometryException e) {
375
                                // TODO Auto-generated catch block
376
                                e.printStackTrace();
377
                        }
378

    
379
                }
380

    
381
                Extent extent = null;
382
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
383

    
384
                        extent = new Extent(layerEnvelope.getLowerCorner().getX(),
385
                                        layerEnvelope.getLowerCorner().getY(), layerEnvelope
386
                                                        .getUpperCorner().getX(), layerEnvelope
387
                                                        .getUpperCorner().getY());
388

    
389
                } else {
390
                        extent = new Extent(Math.toRadians(layerEnvelope.getLowerCorner()
391
                                        .getX()), Math.toRadians(layerEnvelope.getLowerCorner()
392
                                        .getY()), Math.toRadians(layerEnvelope.getUpperCorner()
393
                                        .getX()), Math.toRadians(layerEnvelope.getUpperCorner()
394
                                        .getY()));
395

    
396
                }
397

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

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

    
446
                        // Delete the cachestruct if it exists, and create a new one.
447

    
448
                        if (_cachedLayers.containsKey(layer)) {
449

    
450
                                _cachedLayers.remove(layer);
451

    
452
                        }
453

    
454
                }
455
                // Vector layers
456
                if (props.getType() == Layer3DPropsImpl.layer3DVector) {
457
                        // if (layer instanceof FLyrVect) {
458
                        // Set a 3D Legend
459

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

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

    
492
                // Elevation layers
493
                if (props.getType() == Layer3DPropsImpl.layer3DElevation) {
494

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

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

    
520
                        // Delete the cachestruct if it exists, and create a new one.
521

    
522
                        if (_cachedLayers.containsKey(layer)) {
523

    
524
                                _cachedLayers.remove(layer);
525

    
526
                        }
527

    
528
                }
529

    
530
                // if (bVerifyLegend) {
531
                // _bListenToLegend = false;
532
                // props3D.VerifyLegend(_terrain.getTerrainName());
533
                // _bListenToLegend = true;
534
                // }
535
                // }
536

    
537
        }
538

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

    
632
        public IViewerContainer getCanvas3d() {
633
                return _canvas3d;
634
        }
635

    
636
        public JavaDataDriver getDataManager() {
637
                return _terrainDataManager;
638
        }
639

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

    
678
                // return null;
679
        }
680

    
681
        public LayerManager getLayerManager() {
682
                return _terrainLayerManager;
683
        }
684

    
685
        public Node getSpecialNode() {
686
                Node specialNode = null;
687
                try {
688
                        specialNode = _terrainViewer.getFeature(0);
689
                } catch (ChildIndexOutOfBoundsExceptions e) {
690

    
691
                }
692
                return specialNode;
693
        }
694

    
695
        public Terrain getTerrain() {
696
                return _terrain;
697
        }
698

    
699
        public float getVerticalExaggeration() {
700
                return _verticalExaggeration;
701
        }
702

    
703
        public IProjection getViewProjection() {
704
                return _viewProjection;
705
        }
706

    
707
        public void invalidateVectorLayer(Layer3DProps props) {
708

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

    
720
        }
721

    
722
        public boolean isRenewCanvasOff() {
723
                return _renewCanvasOff;
724
        }
725

    
726
        public void layerAdded(FLayers3D parent, FLayer layer) {
727

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

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

    
763
                // if (!_bLoading)
764
                Layer3DProps props3D = getLayer3DProps(layer);
765

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

    
781
                }
782

    
783
                // If it's a vectorial layer we load it as 3D by default
784
                else if (layer instanceof FLyrVect) {
785

    
786
                        props3D.setType(Layer3DProps.layer3DVector);
787
                }
788
                addLayerToTerrain(layer, true);
789

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

    
811
        }
812

    
813
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
814

    
815
                // System.out.println("Creando estructura de cache");
816

    
817
                // Se obtiene el datastore de la capa
818
                RasterDataStore dataStore = layer.getDataStore();
819

    
820
                // Creais la estructura de cach?
821
                TileCacheManager manager = TileCacheLocator.getManager();
822

    
823
                int coordinates = CacheStruct.FLAT;
824

    
825
                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOGRAPHIC)
826
                        coordinates = CacheStruct.GEOGRAFIC;
827

    
828
                DefaultRasterProvider provider = (DefaultRasterProvider) dataStore
829
                                .getProvider();
830

    
831
                provider.setProjection(layer.getProjection());
832

    
833
                // El epsg suele tener la forma EPSG:4326
834
                String epsg = null;
835
                IProjection proj = provider.getProjection();
836
                if (proj != null)
837
                        epsg = proj.getAbrev();
838

    
839
                int resolution = 256;
840

    
841
                int type = getLayer3DProps(layer).getType();
842

    
843
                // if elevation layer, lower the tile resolution
844
                if (type == Layer3DProps.layer3DElevation)
845

    
846
                        resolution = 32;
847

    
848
                CacheStruct struct = manager.createCacheStructure(coordinates,
849
                                TileCacheLibrary.DEFAULT_LEVELS, provider.getExtent()
850
                                                .toRectangle2D(), provider.getCellSize(), resolution,
851
                                resolution, provider.getFullName(),
852
                                TileCacheLibrary.DEFAULT_STRUCTURE,
853
                                RasterLibrary.pathTileCache, "png", epsg, provider
854
                                                .getFileSize());
855

    
856
                return struct;
857

    
858
        }
859

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

    
874
        }
875

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

    
892
                Layer3DProps props3D = getLayer3DProps(layer);
893
                refreshLayerInTerrain(layer, props3D, false);
894

    
895
                int type = props3D.getType();
896

    
897
                // Now reorder in layer manager only for terrain layer types
898
                if ((type == Layer3DProps.layer3DOSG)
899
                                || ((type == Layer3DProps.layer3DVector)))
900
                        return;
901

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

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

    
925
                }
926

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

    
944
                // PrintDebugLayers();
945

    
946
        }
947

    
948
        public void layerRemoved(FLayers3D parent, FLayer layer) {
949
                System.out.println("Removed layer");
950

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

    
962
                if (layer instanceof Classifiable) {
963
                        Classifiable legendLyr = (Classifiable) layer;
964
                        legendLyr.removeLegendListener((LegendListener) this);
965
                }
966

    
967
                layer.removeLayerListener((LayerListener) this);
968

    
969
                removeLayerToTerrain(layer);
970

    
971
                // All layers are removed
972
                if (layers.getLayersCount() == 0) {
973
                        _bEmptyView = true;
974
                }
975

    
976
                // PrintDebugLayers();
977

    
978
        }
979

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

    
1011
                                        }
1012
                                }
1013
                        }
1014

    
1015
                        // IWindow f = PluginServices.getMDIManager().getActiveWindow();
1016
                        // if (f instanceof BaseView) {
1017
                        // BaseView view3D = (BaseView) f;
1018
                        // view3D.getTOC().refresh();
1019
                        // }
1020
                }
1021
                visibilityChange = false;
1022

    
1023
        }
1024

    
1025
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1026

    
1027
                if (_terrainLayerMap.size() == 0)
1028
                        return null;
1029
                if (rde == null)
1030
                        return null;
1031
                if (rde.getExtent() == null || rde.getLayer() == null
1032
                                || rde.getLayerManager() == null)
1033
                        return null;
1034

    
1035
                String layerID = rde.getLayer().getLayerID();
1036
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1037
                if (layer == null)
1038
                        return null;
1039
                if (!layer.isVisible())
1040
                        return null;
1041
                double minX, minY, width, height;
1042

    
1043
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1044
                        minX = rde.getExtent().xMin();
1045
                        minY = rde.getExtent().yMin();
1046
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1047
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1048

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

    
1073
                // Case of Raster data
1074

    
1075
                UpdateDataEvent ude = null;
1076

    
1077
                if (rde.getLayer().getLayerType() == Layer.LayerType.TEXTURELAYER)
1078
                        ude = loadRasterData(layer, envelope, rde);
1079

    
1080
                if (rde.getLayer().getLayerType() == Layer.LayerType.VECTORLAYER) {
1081
                        // NodeMarker3DSymbol n = new NodeMarker3DSymbol();
1082
                        // n.setNodeFileURL("/home/jtorres/Projects/OpenSceneGraph/OpenSceneGraph-Data/dumptruck.osg");
1083
                        // n.setSize(25.0f);
1084
                        ude = loadVectorData(layer, envelope, rde);
1085
                }
1086
                if (rde.getLayer().getLayerType() == Layer.LayerType.HEIGHTFIELDLAYER)
1087
                        ude = loadElevationData(layer, envelope, rde);
1088

    
1089
                return ude;
1090
        }
1091

    
1092
        private UpdateDataEvent loadRasterData(FLayer layer, Envelope envelope,
1093
                        RequestDataEvent rde) {
1094

    
1095
                System.out.println("PETICION DE TILE!!!!!!!!!!");
1096
                UpdateDataEvent ude = new UpdateDataEvent();
1097
                ude.copyDataFromRequest(rde);
1098
                if (layer instanceof DefaultFLyrRaster) {
1099
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1100

    
1101
                        if (rLayer.getDataStore().isTiled()) {
1102

    
1103
                                rLayer = (DefaultFLyrRaster) layer;
1104

    
1105
                                boolean exists = _cachedLayers.containsKey(rLayer);
1106

    
1107
                                if (!exists) {
1108

    
1109
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1110

    
1111
                                }
1112

    
1113
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1114

    
1115
                                RasterQuery query = RasterLocator.getManager().createQuery();
1116

    
1117
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1118
                                                .getManager()
1119
                                                .getDataStructFactory()
1120
                                                .createExtent(envelope.getLowerCorner().getX(),
1121
                                                                envelope.getUpperCorner().getY(),
1122
                                                                envelope.getUpperCorner().getX(),
1123
                                                                envelope.getLowerCorner().getY());
1124

    
1125
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1126
                                                rde.getTileY(), extent, null);
1127

    
1128
                                // query.setAreaOfInterest(extent, 512, 512);
1129

    
1130
                                 System.out.println("Tile Parameters:");
1131
                                 System.out.println("TileLevel: " + rde.getTileLevel());
1132
                                 System.out.println("TileX = " + rde.getTileX());
1133
                                 System.out.println("TileY = " + rde.getTileY());
1134
                                 System.out.println("Extent = " + extent.getULX() + " "
1135
                                 + extent.getULY() + " " + extent.getLRX() + " "
1136
                                 + extent.getLRY());
1137

    
1138
                                try {
1139
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1140
                                        Buffer rBuff = (Buffer) result[0];
1141
                                        Buffer transparencyBuffer;
1142
                                        int suma = 0;
1143

    
1144
                                        transparencyBuffer = (Buffer) result[1];
1145

    
1146
                                        if (transparencyBuffer != null)
1147
                                                suma = 1;
1148

    
1149
                                        // int bufferBands = rBuff.getBandCount();
1150
                                        // Si el numero de bandas es mayor que 3 (RGB) no se pueden
1151
                                        // dibujar todas
1152
                                        int numBands = rLayer.getDataStore().getBandCount();
1153

    
1154
                                        if (numBands > (maxBands + suma))
1155
                                                numBands = maxBands + suma;
1156

    
1157
                                        ColorInterpretation cInt = rLayer.getDataStore()
1158
                                                        .getColorInterpretation();
1159

    
1160
                                        int rgba[] = { 0, 1, 2, 3 };
1161

    
1162
                                        rgba = setBandsInColors(cInt);
1163
                                        
1164
                                        
1165
                                        int pixelFormat = convertPixelFormat(numBands+suma);
1166

    
1167
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1168
                                        // + " alto: " + rBuff.getHeight()
1169
                                        // + " bandas totales incluyendo alpha (si tiene): "
1170
                                        // + numBands);
1171

    
1172
                                        switch (rBuff.getDataType()) {
1173
                                        case Buffer.TYPE_BYTE:
1174
                                                ude.setRasterData(
1175
                                                                buildByteBuffer(ude, rBuff, transparencyBuffer,
1176
                                                                                numBands, rgba), rBuff.getWidth(),
1177
                                                                rBuff.getHeight(), numBands+suma, pixelFormat,
1178
                                                                Image.DataType.GL_UNSIGNED_BYTE);
1179
                                                break;
1180
                                        case Buffer.TYPE_SHORT:
1181
                                                ude.setRasterData(
1182
                                                                buildShortBuffer(ude, rBuff,
1183
                                                                                transparencyBuffer, numBands), rBuff
1184
                                                                                .getWidth(), rBuff.getHeight(),
1185
                                                                numBands, pixelFormat, Image.DataType.GL_SHORT);
1186
                                                break;
1187
                                        case Buffer.TYPE_USHORT:
1188
                                                ude.setRasterData(
1189
                                                                buildShortBuffer(ude, rBuff,
1190
                                                                                transparencyBuffer, numBands), rBuff
1191
                                                                                .getWidth(), rBuff.getHeight(),
1192
                                                                numBands, pixelFormat,
1193
                                                                Image.DataType.GL_UNSIGNED_SHORT);
1194
                                                break;
1195
                                        case Buffer.TYPE_INT:
1196
                                                ude.setRasterData(
1197
                                                                buildIntBuffer(ude, rBuff, transparencyBuffer,
1198
                                                                                numBands), rBuff.getWidth(), rBuff
1199
                                                                                .getHeight(), numBands, pixelFormat,
1200
                                                                Image.DataType.GL_INT);
1201
                                                break;
1202
                                        case Buffer.TYPE_FLOAT:
1203
                                                ude.setRasterData(
1204
                                                                buildFloatBuffer(ude, rBuff,
1205
                                                                                transparencyBuffer, numBands), rBuff
1206
                                                                                .getWidth(), rBuff.getHeight(),
1207
                                                                numBands, pixelFormat, Image.DataType.GL_FLOAT);
1208
                                                break;
1209
                                        case Buffer.TYPE_DOUBLE:
1210
                                                ude.setRasterData(
1211
                                                                buildDoubleBuffer(ude, rBuff,
1212
                                                                                transparencyBuffer, numBands), rBuff
1213
                                                                                .getWidth(), rBuff.getHeight(),
1214
                                                                numBands, pixelFormat, Image.DataType.GL_DOUBLE);
1215
                                                break;
1216
                                        }
1217

    
1218
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1219

    
1220
                                } catch (ProcessInterruptedException e) {
1221
                                        // TODO Auto-generated catch block
1222
                                        e.printStackTrace();
1223
                                } catch (RasterDriverException e) {
1224
                                        System.out.println("QueryArray failed");
1225
                                        // e.printStackTrace();
1226
                                } catch (InvalidSetViewException e) {
1227
                                        // TODO Auto-generated catch block
1228
                                        e.printStackTrace();
1229
                                } catch (NullPointerException e) {
1230
                                        // ude.setFailData();
1231
                                        System.out.println("Problem getting the tile. NullPointer");
1232
                                }
1233

    
1234
                        }
1235
                        // Not tiled raster
1236
                        else {
1237
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1238
                        }
1239

    
1240
                }
1241

    
1242
                // Vectorial rasterized
1243
                else if (layer instanceof FLyrVect) {
1244
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1245
                }
1246
                // unrecognized layer type
1247
                else {
1248
                        ude.setFailData();
1249
                }
1250

    
1251
                // System.out.println("Returning UDE");
1252

    
1253
                return ude;
1254
        }
1255

    
1256
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1257
                        RequestDataEvent rde) {
1258

    
1259
                System.out.println("vector data");
1260
                UpdateDataEvent ude = new UpdateDataEvent();
1261
                ude.copyDataFromRequest(rde);
1262

    
1263
                // Convenience casting, create a default 3D symbol
1264
                ISingleSymbolLegend legend = (ISingleSymbolLegend) ((FLyrVect) layer).getLegend();
1265
                I3DSymbol sy= (I3DSymbol) legend.getDefaultSymbol();
1266
                sy.setCoordinateSystemType(_terrain.getCoordinateSystemType());
1267

    
1268
//                 Hack for polylines and polygons to only render them rasterized
1269
//                 till gvSIG architects solve geometries problem
1270
                if (sy instanceof IFillSymbol || sy instanceof ILineSymbol) {
1271

    
1272
                        removeLayerToTerrain(layer);
1273
                        getLayer3DProps(layer).setType(Layer3DPropsImpl.layer3DImage);
1274
                        addLayerToTerrain(layer, true);
1275
                        return null;
1276
                }// End hack
1277
                Layer3DProps layerprops = getLayer3DProps(layer);
1278

    
1279
                if (layerprops.isZEnable() == false)
1280
                        sy.setFixedHeight(layerprops.getHeight());
1281
        
1282
                ViewPort vp = getViewPort();
1283
                vp.setEnvelope(envelope); // the real extent of the tile
1284
                vp.setAdjustable(false);
1285
                vp.setImageSize(new Dimension(256, 256));
1286
                vp.setDist1pixel(0.000000001);
1287
                
1288
                
1289
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1290
                
1291
                DataStore ds = ((SingleLayer) layer).getDataStore();
1292
                if (sy.getGeometry().getSize() == 0 || ds.getProviderName() == "NetCDFVectorial" || layerprops.isGeometryDirty()==true) {
1293
                        try {
1294
                                ((SimpleMarker3DSymbol)(sy)).resetGeometry();
1295
                                layer.draw(null, null, getViewPort(), new MyCancel(), scale);
1296
                                //setGeometryDirty to false to avoid unnecessary repaints
1297
                                layerprops.setDirtyGeometry(false);
1298
                        } catch (ReadException e) {
1299
                                // TODO Auto-generated catch block
1300
                                e.printStackTrace();
1301
                        }
1302
                }
1303
                // OSG Layers
1304
                Node n = null;
1305

    
1306
                if (ds.getProviderName() == "OSG") {
1307
                        try {
1308
                                n = (Node) ds.invokeDynMethod("getNode", null);
1309
                        } catch (DynMethodException e) {
1310
                                // TODO Auto-generated catch block
1311
                                e.printStackTrace();
1312
                        }
1313
                        System.out.println("OSG Layer added");
1314
                }
1315
                // Vectorial layers
1316
                else {
1317
                        n=this.buildVectors(sy);
1318
                }
1319
                ude.setVectorData(n);
1320
                return ude;
1321
        }
1322

    
1323
        private Node buildVectors(I3DSymbol symbol) {
1324
                Node n = null;
1325

    
1326
                ISymbol3D sym = null;
1327
                try {
1328
                        sym = Symbol3DFactory.getSymbol3D(symbol);
1329
                } catch (NodeException e) {
1330
                        // TODO Auto-generated catch block
1331
                        e.printStackTrace();
1332
                }                
1333
                // sm.setPointSize((float) sy.getSize());
1334
                n = sym.buildSceneGraph(symbol.getGeometry());
1335
                return n;
1336
        }
1337

    
1338
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1339
                        RequestDataEvent rde) {
1340

    
1341
                UpdateDataEvent ude = new UpdateDataEvent();
1342
                ude.copyDataFromRequest(rde);
1343

    
1344
                if (layer instanceof DefaultFLyrRaster) {
1345
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1346
                        boolean hasCache = true;
1347
                        if (rLayer.getDataStore().getInternalParameters() instanceof NetCDFDataParameters)
1348
                                hasCache = false;
1349

    
1350
                        if (hasCache) {
1351

    
1352
                                rLayer = (DefaultFLyrRaster) layer;
1353
                                boolean exists = _cachedLayers.containsKey(rLayer);
1354

    
1355
                                if (!exists) {
1356

    
1357
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1358

    
1359
                                }
1360

    
1361
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1362

    
1363
                                RasterQuery query = RasterLocator.getManager().createQuery();
1364

    
1365
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1366
                                                .getManager()
1367
                                                .getDataStructFactory()
1368
                                                .createExtent(envelope.getLowerCorner().getX(),
1369
                                                                envelope.getUpperCorner().getY(),
1370
                                                                envelope.getUpperCorner().getX(),
1371
                                                                envelope.getLowerCorner().getY());
1372

    
1373
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1374
                                                rde.getTileY(), extent, null);
1375

    
1376
                                // query.setAreaOfInterest(extent, 512, 512);
1377

    
1378
                                // System.out.println("Tile Parameters:");
1379
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1380
                                // System.out.println("TileX = " + rde.getTileX());
1381
                                // System.out.println("TileY = " + rde.getTileY());
1382
                                // System.out.println("Extent = " + extent.getULX() + " "
1383
                                // + extent.getULY() + " " + extent.getLRX() + " "
1384
                                // + extent.getLRY());
1385

    
1386
                                try {
1387
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1388
                                        Buffer rBuff = (Buffer) result[0];
1389
                                        Buffer transparencyBuffer;
1390

    
1391
                                        if (result.length < 2)
1392
                                                transparencyBuffer = null;
1393
                                        else
1394
                                                transparencyBuffer = (Buffer) result[1];
1395

    
1396
                                        int numBands = rBuff.getBandCount();
1397
                                        if (transparencyBuffer != null) {
1398

    
1399
                                                // System.out
1400
                                                // .println("Tengo Transparency buffer con "
1401
                                                // + transparencyBuffer.getBandCount()
1402
                                                // + " bandas");
1403
                                                numBands++;
1404

    
1405
                                        }
1406

    
1407
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1408
                                        // + " alto: " + rBuff.getHeight()
1409
                                        // + " bandas totales incluyendo alpha (si tiene): "
1410
                                        // + numBands);
1411

    
1412
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1413
                                                        .getHeight()) / 64];
1414

    
1415
                                        int pixelFormat = convertPixelFormat(numBands);
1416

    
1417
                                        // K hay que setearlo en el dialogo
1418
                                        int cont = 0;
1419

    
1420
                                        int k = getLayer3DProps(rLayer).getElevationBand();
1421

    
1422
                                        for (int i = rBuff.getWidth() - 1; i >= 0; i = i - 8) {
1423
                                                // Vertical Flip needed
1424
                                                for (int j = 0; j < rBuff.getHeight(); j = j + 8) {
1425

    
1426
                                                        switch (rBuff.getDataType()) {
1427
                                                        case Buffer.TYPE_BYTE:
1428
                                                                data[cont] = (float) (rBuff
1429
                                                                                .getElemByte(i, j, k));
1430
                                                                cont++;
1431
                                                                break;
1432
                                                        case Buffer.TYPE_DOUBLE:
1433
                                                                data[cont] = (float) (Math.round(rBuff
1434
                                                                                .getElemDouble(i, j, k)));
1435
                                                                cont++;
1436
                                                                break;
1437
                                                        case Buffer.TYPE_FLOAT:
1438
                                                                data[cont] = (float) (Math.round(rBuff
1439
                                                                                .getElemFloat(i, j, k)));
1440
                                                                cont++;
1441
                                                                break;
1442
                                                        case Buffer.TYPE_INT:
1443
                                                                data[cont] = (float) (rBuff.getElemInt(i, j, k) & 0xffffffff);
1444
                                                                cont++;
1445
                                                                break;
1446
                                                        case Buffer.TYPE_SHORT:
1447
                                                        case Buffer.TYPE_USHORT:
1448
                                                                data[cont] = (float) (rBuff.getElemShort(i, j,
1449
                                                                                k) & 0xffff);
1450
                                                                cont++;
1451
                                                                break;
1452
                                                        }
1453

    
1454
                                                }
1455

    
1456
                                        }
1457
                                        ude.setHeightfieldData(data, rBuff.getWidth() / 8,
1458
                                                        rBuff.getHeight() / 8);
1459

    
1460
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1461

    
1462
                                } catch (ProcessInterruptedException e) {
1463
                                        // TODO Auto-generated catch block
1464
                                        e.printStackTrace();
1465
                                } catch (RasterDriverException e) {
1466
                                        e.printStackTrace();
1467
                                } catch (InvalidSetViewException e) {
1468
                                        // TODO Auto-generated catch block
1469
                                        e.printStackTrace();
1470
                                } catch (NullPointerException e) {
1471
                                        // ude.setFailData();
1472
                                        System.out.println("Problem getting the tile");
1473
                                }
1474

    
1475
                        }
1476
                        // No cache
1477
                        else {
1478
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1479
                        }
1480

    
1481
                }
1482

    
1483
                // Vectorial rasterized
1484
                else if (layer instanceof FLyrVect) {
1485
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1486
                }
1487
                // unrecognized layer type
1488
                else {
1489
                        ude.setFailData();
1490
                }
1491

    
1492
                return ude;
1493

    
1494
        }
1495

    
1496
        protected byte[] buildByteBuffer(UpdateDataEvent ude, Buffer rBuff,
1497
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1498

    
1499
                int cont = 0;
1500
                int colorBands = numBands;
1501

    
1502
                if (transparencyBuffer != null) {
1503
//                        colorBands--;
1504
                        numBands = numBands+1;
1505
                }
1506

    
1507
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * numBands];
1508

    
1509
                for (int i = 0; i < rBuff.getWidth(); i++) {
1510

    
1511
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1512

    
1513
                                for (int k = 0; k < colorBands; k++) {
1514
                                        // En lugar de k se deben usar las bandas asociadas al
1515
                                        // componente
1516
                                        data[cont] = (byte) rBuff.getElemByte(i, j, rgba[k]);
1517
                                        cont++;
1518

    
1519
                                }
1520
                                if (transparencyBuffer != null) {
1521
//                                        if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1522
//                                                data[cont] = (byte) 0;
1523
//                                        else
1524
//                                                data[cont] = (byte) 255;
1525
                                        data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1526

    
1527
                                        cont++;
1528

    
1529
                                }
1530
                        }
1531
                }
1532

    
1533
                return data;
1534
        }
1535

    
1536
        protected short[] buildShortBuffer(UpdateDataEvent ude, Buffer rBuff,
1537
                        Buffer transparencyBuffer, int numBands) {
1538
                short[] data = new short[rBuff.getWidth() * rBuff.getHeight()
1539
                                * numBands];
1540

    
1541
                int cont = 0;
1542
                int colorBands = numBands;
1543

    
1544
                if (transparencyBuffer != null)
1545
                        colorBands--;
1546

    
1547
                for (int i = 0; i < rBuff.getWidth(); i++) {
1548

    
1549
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1550

    
1551
                                for (int k = 0; k < colorBands; k++) {
1552
                                        data[cont] = (short) (rBuff.getElemShort(i, j, k) & 0xffff);
1553
                                        cont++;
1554
                                }
1555
                                if (transparencyBuffer != null) {
1556
                                        data[cont] = (short) (rBuff.getElemShort(i, j, 0) & 0xffff);
1557
                                        cont++;
1558
                                }
1559
                        }
1560
                }
1561

    
1562
                return data;
1563
        }
1564

    
1565
        protected int[] buildIntBuffer(UpdateDataEvent ude, Buffer rBuff,
1566
                        Buffer transparencyBuffer, int numBands) {
1567
                int[] data = new int[rBuff.getWidth() * rBuff.getHeight() * numBands];
1568

    
1569
                int cont = 0;
1570
                int colorBands = numBands;
1571

    
1572
                if (transparencyBuffer != null)
1573
                        colorBands--;
1574

    
1575
                for (int i = 0; i < rBuff.getWidth(); i++) {
1576

    
1577
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1578

    
1579
                                for (int k = 0; k < colorBands; k++) {
1580
                                        data[cont] = (int) (rBuff.getElemByte(i, j, k) & 0xffffffff);
1581
                                        cont++;
1582
                                }
1583
                                if (transparencyBuffer != null) {
1584
                                        data[cont] = (int) (rBuff.getElemByte(i, j, 0) & 0xffffffff);
1585
                                        cont++;
1586
                                }
1587
                        }
1588
                }
1589

    
1590
                return data;
1591
        }
1592

    
1593
        protected float[] buildFloatBuffer(UpdateDataEvent ude, Buffer rBuff,
1594
                        Buffer transparencyBuffer, int numBands) {
1595
                float[] data = new float[rBuff.getWidth() * rBuff.getHeight()
1596
                                * numBands];
1597

    
1598
                int cont = 0;
1599
                int colorBands = numBands;
1600

    
1601
                if (transparencyBuffer != null)
1602
                        colorBands--;
1603

    
1604
                for (int i = 0; i < rBuff.getWidth(); i++) {
1605

    
1606
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1607

    
1608
                                for (int k = 0; k < colorBands; k++) {
1609
                                        data[cont] = rBuff.getElemByte(i, j, k);
1610
                                        cont++;
1611
                                }
1612
                                if (transparencyBuffer != null) {
1613
                                        data[cont] = rBuff.getElemByte(i, j, 0);
1614
                                        cont++;
1615
                                }
1616
                        }
1617
                }
1618

    
1619
                return data;
1620
        }
1621

    
1622
        protected double[] buildDoubleBuffer(UpdateDataEvent ude, Buffer rBuff,
1623
                        Buffer transparencyBuffer, int numBands) {
1624
                double[] data = new double[rBuff.getWidth() * rBuff.getHeight()
1625
                                * numBands];
1626

    
1627
                int cont = 0;
1628
                int colorBands = numBands;
1629

    
1630
                if (transparencyBuffer != null)
1631
                        colorBands--;
1632

    
1633
                for (int i = 0; i < rBuff.getWidth(); i++) {
1634

    
1635
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1636

    
1637
                                for (int k = 0; k < colorBands; k++) {
1638
                                        data[cont] = rBuff.getElemByte(i, j, k);
1639
                                        cont++;
1640
                                }
1641
                                if (transparencyBuffer != null) {
1642
                                        data[cont] = rBuff.getElemByte(i, j, 0);
1643
                                        cont++;
1644
                                }
1645
                        }
1646
                }
1647

    
1648
                return data;
1649
        }
1650

    
1651
        protected int convertPixelFormat(int type) {
1652

    
1653
                switch (type) {
1654

    
1655
                case 1:
1656
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1657

    
1658
                case 2:
1659
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1660

    
1661
                case 3:
1662
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1663

    
1664
                case 4:
1665
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1666

    
1667
                }
1668

    
1669
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1670

    
1671
        }
1672

    
1673
        protected int[] setBandsInColors(ColorInterpretation cInt) {
1674

    
1675
                int rgba[] = new int[4];
1676

    
1677
                rgba[0] = cInt.getBand(ColorInterpretation.RED_BAND);
1678
                if (rgba[0] == -1)
1679
                        rgba[0] = 0;
1680
                rgba[1] = cInt.getBand(ColorInterpretation.GREEN_BAND);
1681
                if (rgba[1] == -1)
1682
                        rgba[1] = 1;
1683
                rgba[2] = cInt.getBand(ColorInterpretation.BLUE_BAND);
1684
                if (rgba[2] == -1)
1685
                        rgba[2] = 2;
1686
                rgba[3] = cInt.getBand(ColorInterpretation.ALPHA_BAND);
1687
                if (rgba[3] == -1)
1688
                        rgba[3] = 3;
1689

    
1690
                return rgba;
1691

    
1692
        }
1693

    
1694
        protected class MyCancel implements Cancellable {
1695
                private boolean cancel = false;
1696

    
1697
                public MyCancel() {
1698
                }
1699

    
1700
                public void setCanceled(boolean canceled) {
1701
                        cancel = canceled;
1702
                }
1703

    
1704
                public boolean isCanceled() {
1705
                        return cancel;
1706
                }
1707
        }
1708

    
1709
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1710

    
1711
                int size = 256;
1712
                BufferedImage image = new BufferedImage(size, size,
1713
                                BufferedImage.TYPE_4BYTE_ABGR);
1714

    
1715
                ViewPort vp = new ViewPort(_viewProjection);
1716
                vp.setEnvelope(envelope); // the real extent of the tile
1717

    
1718
                vp.setAdjustable(false);
1719
                vp.setImageSize(new Dimension(size, size));
1720
                vp.setDist1pixel(0.000000001);
1721

    
1722
                Graphics2D graphics = image.createGraphics();
1723
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1724
                // background
1725
                graphics.setColor(backgColor);
1726
                graphics.fillRect(0, 0, size, size);
1727

    
1728
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1729

    
1730
                try {
1731
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1732

    
1733
                } catch (Exception e) {
1734
                        return null;
1735
                }
1736

    
1737
                return image;
1738

    
1739
        }
1740

    
1741
        public void nameChanged(LayerEvent e) {
1742
                System.out.println("Name change");
1743

    
1744
        }
1745

    
1746
        public void refreshLayerInTerrain(FLayer layer, Layer3DProps props,
1747
                        boolean bRemoveCache) {
1748

    
1749
                System.out.println("Refresh");
1750
                if (props == null)
1751
                        return;
1752

    
1753
                if (_terrain == null)
1754
                        return; // view not opened yet
1755

    
1756
                // clear cache
1757

    
1758
                // refresh layer in terrain
1759
                int type = props.getType();
1760
                if ((type == Layer3DProps.layer3DImage)
1761
                                || (type == Layer3DProps.layer3DElevation)
1762
                                || (type == Layer3DProps.layer3DVectorMR)) {
1763

    
1764
                        try {
1765
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
1766
                        } catch (LayerManagementException e) {
1767
                                // TODO Auto-generated catch block
1768
                                e.printStackTrace();
1769
                        }
1770
                } else if (type == Layer3DProps.layer3DVector) {
1771
                        // ILegend legend = ((FLyrVect) layer).getLegend();
1772
                        //
1773
                        // try {
1774
                        // RequestDataEvent rde = new RequestDataEvent();
1775
                        // loadVectorData(layer, layer.getFullEnvelope(),
1776
                        // new RequestDataEvent(), (I3DSymbol) legend.getDefaultSymbol());
1777
                        // } catch (ReadException e) {
1778
                        // // TODO Auto-generated catch block
1779
                        // e.printStackTrace();
1780
                        // }
1781

    
1782
                }
1783

    
1784
        }
1785

    
1786
        public boolean removeCache(File path) {
1787
                if (path.exists()) {
1788
                        File[] files = path.listFiles();
1789
                        for (int i = 0; i < files.length; i++) {
1790
                                if (files[i].isDirectory()) {
1791
                                        removeCache(files[i]);
1792
                                } else {
1793
                                        files[i].delete();
1794
                                }
1795
                        }
1796
                }
1797
                return (path.delete());
1798
        }
1799

    
1800
        public void removeLayerToTerrain(FLayer layer) {
1801

    
1802
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1803
                if (terrainLayer != null) {
1804

    
1805
                        _terrainLayerMap.remove(terrainLayer.getLayerID());
1806
                        _terrainFLayerMap.remove(layer);
1807

    
1808
                        try {
1809
                                _terrainLayerManager.removeLayer(terrainLayer);        
1810
                        } catch (LayerManagementException e) {
1811
                                // TODO Auto-generated catch block
1812
                                e.printStackTrace();
1813
                        }
1814
                }
1815

    
1816
        }
1817

    
1818
        public void selectionChanged(SelectionEvent e) {
1819
                // TODO Auto-generated method stub
1820
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1821
                // while (lyrIterator.hasNext()) {
1822
                // FLayer layer = lyrIterator.next();
1823
                // Layer3DProps props3D = getLayer3DProps(layer);
1824
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
1825
                // if (layer.getClass().equals(FLyrVect.class)) {
1826
                // FLyrVect lyr = (FLyrVect) layer;
1827
                //
1828
                // FBitSet selection = null;
1829
                // try {
1830
                // selection = lyr.getRecordset().getSelectionSupport()
1831
                // .getSelection();
1832
                // } catch (ReadDriverException e1) {
1833
                // // TODO Auto-generated catch block
1834
                // e1.printStackTrace();
1835
                // }
1836
                //
1837
                // if ((selection.cardinality() == 0)
1838
                // || (!(selection.isEmpty()))) {
1839
                // Layer3DProps props = Layer3DProps
1840
                // .getLayer3DProps(layer);
1841
                // refreshLayerInTerrain(props, true);
1842
                // if (layer instanceof FLyrVect) {
1843
                // FLyrVect fvect = (FLyrVect) layer;
1844
                // props.drawVersion = fvect.getDrawVersion();
1845
                // }
1846
                // }
1847
                // }
1848
                // }
1849
                // }
1850

    
1851
        }
1852

    
1853
        public void setDataManager(JavaDataDriver manager) {
1854
                _terrainDataManager = manager;
1855
                _terrainDataManager.setDataLoader(this);
1856

    
1857
        }
1858

    
1859
        public void setLayerManager(LayerManager manager) {
1860
                _terrainLayerManager = manager;
1861

    
1862
        }
1863

    
1864
        public void setLoading(boolean bLoading) {
1865
                _bLoading = bLoading;
1866

    
1867
        }
1868

    
1869
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1870
                _renewCanvasOff = renewCanvasOff;
1871

    
1872
        }
1873

    
1874
        public void setTerrain(Terrain terrain) {
1875
                if (_terrain == terrain)
1876
                        return;
1877

    
1878
                _terrain = terrain;
1879

    
1880
                // add layers to terrain necessary when we are loading
1881
                addCurrentLayers();
1882

    
1883
        }
1884

    
1885
        public void setVerticalExaggeration(float verticalExaggeration) {
1886
                _verticalExaggeration = verticalExaggeration;
1887

    
1888
        }
1889

    
1890
        public void setViewProjection(IProjection projection) {
1891
                _viewProjection = projection;
1892

    
1893
        }
1894

    
1895
        public void setViewer(IViewerContainer canvas) {
1896
                _canvas3d = canvas;
1897
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
1898

    
1899
        }
1900

    
1901
        public void visibilityChanged(LayerEvent e) {
1902
                FLayer lyr = e.getSource();
1903

    
1904
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
1905
                // refreshLayerVectorsVisibility(lyr);
1906
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1907
                // refreshLayer3DOSGVisibility(lyr);
1908
                // } else {
1909
                refreshLayerVisibility(lyr);
1910
                // }
1911
                visibilityChange = true;
1912

    
1913
        }
1914

    
1915
        private void refreshLayerVisibility(FLayer layer) {
1916

    
1917
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1918
                terrainLayer.setEnabled(layer.isVisible());
1919
                // _terrainLayerManager.updateLayers();
1920

    
1921
        }
1922

    
1923
        public void zoomToEnvelope(Envelope geoEnvelope) {
1924
                if (geoEnvelope == null)
1925
                        return;
1926
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
1927
                        return;
1928

    
1929
                double maxHeight = 0.0;
1930

    
1931
                // Getting envelope positions
1932
                double minLat = geoEnvelope.getMinimum(0);
1933
                double maxLat = geoEnvelope.getMaximum(0);
1934
                double cenLon = geoEnvelope.getCenter(0);
1935
                double cenLat = geoEnvelope.getCenter(1);
1936

    
1937
                double elevation = 0;
1938

    
1939
                // calculate altitude
1940
                double avLat = 0;
1941
                if (minLat > 0.0 || maxLat < 0.0)
1942
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1943
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
1944

    
1945
                double terrainRadius = _terrain.getRadiusEquatorial();
1946
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
1947
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1948
                                * (1 - Math.cos(Math.toRadians(avLon))));
1949
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
1950
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
1951

    
1952
                // Calculate XYZ positions for camera.
1953

    
1954
                int terrainType = _terrain.getCoordinateSystemType();
1955

    
1956
                double zoomFactor = 1.5;
1957
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
1958
                        zoomFactor = 1.3;
1959
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1960

    
1961
                Vec3 eye = new Vec3();
1962
                Vec3 center = new Vec3();
1963
                Vec3 up = new Vec3();
1964
                // Calculate positions for PLAIN MODE.
1965
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
1966

    
1967
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
1968
                                        .getMinimum(1)) / 1.2d;
1969
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
1970
                                        .getMinimum(0)) / 1.2d;
1971
                        double height;
1972

    
1973
                        height = Math.sqrt(difx * difx + dify * dify);
1974
                        double fullWindowFactor = 1.7;
1975
                        // EYE
1976
                        eye.setX(cenLon);
1977
                        eye.setY(cenLat);
1978
                        eye.setZ(height * fullWindowFactor);
1979
                        // CENTER
1980
                        center.setX(cenLon);
1981
                        center.setY(cenLat);
1982
                        center.setZ(0.0);
1983
                        // UP
1984
                        up.setX(0.0);
1985
                        up.setY(1.0);
1986
                        up.setZ(0.0);
1987
                } else
1988
                // Calculate positions for SPHERICAL MODE.
1989
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
1990
                        // EYE
1991
                        Vec3 aux = new Vec3(cenLon, cenLat, elevation);
1992
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
1993
                        // CENTER
1994
                        center.setX(0.0);
1995
                        center.setY(0.0);
1996
                        center.setZ(0.0);
1997
                        // UP
1998
                        up.setX(0.0);
1999
                        up.setY(0.0);
2000
                        up.setZ(1.0);
2001
                }
2002
                Camera cam = new Camera();
2003
                cam.setViewByLookAt(eye, center, up);
2004

    
2005
                _terrainViewer.setCamera(cam);
2006

    
2007
        }
2008

    
2009
        public void editionChanged(LayerEvent e) {
2010
                // TODO Auto-generated method stub
2011

    
2012
        }
2013

    
2014
        public void drawValueChanged(LayerEvent e) {
2015
                // TODO Auto-generated method stub
2016

    
2017
        }
2018

    
2019
        public boolean symbolChanged(SymbolLegendEvent e) {
2020

    
2021
                System.out.println("Symbol changed");
2022
                return false;
2023
        }
2024

    
2025
        public void legendCleared(LegendClearEvent event) {
2026
                // TODO Auto-generated method stub
2027

    
2028
        }
2029

    
2030
        public static class RegisterPersistence implements Callable {
2031

    
2032
                public Object call() throws Exception {
2033
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
2034
                        if (manager.getDefinition(MapContext.class) == null) {
2035
                                MapContext.registerPersistent();
2036
                        }
2037
                        DynStruct definition = manager.addDefinition(
2038
                                        MapContext3DImpl.class, "MapContext3DImpl",
2039
                                        "MapContext3DImpl Persistence definition", null, null);
2040
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
2041
                                        "MapContext");
2042

    
2043
                        return Boolean.TRUE;
2044
                }
2045
        }
2046
}