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

History | View | Annotate | Download (56.9 KB)

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

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

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

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

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

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

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

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

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

    
161
        private boolean visibilityChange = false;
162

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

    
166
        int maxBands = 3;
167

    
168
        public MapContext3DImpl() {
169
        }
170

    
171
        public MapContext3DImpl(ViewPort vp) {
172
                super(vp);
173
        }
174

    
175
        public MapContext3DImpl(FLayers fLayers, ViewPort vp) {
176

    
177
                super(fLayers, vp);
178

    
179
        }
180

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

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

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

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

    
209
                                terrain.init();
210
                                terrain.setLayerManager(_terrainLayerManager);
211

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

    
225
                }
226

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

    
240
                org.gvsig.osgvp.core.osg.Image OSGimage = _canvasoff
241
                                .getScreenshotImage();
242

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

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

    
264
                }
265
        }
266

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

    
283
        }
284

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

    
296
        }
297

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

    
316
        }
317

    
318
        public void activationChanged(LayerEvent e) {
319

    
320
        }
321

    
322
        public void addCurrentLayers() {
323

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

    
331
        }
332

    
333
        public void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
334

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

    
344
                Layer3DProps props = getLayer3DProps(layer);
345
                GeometryManager geoMan;
346

    
347
                geoMan = GeometryLocator.getGeometryManager();
348

    
349
                if (layerEnvelope == null) {
350

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

    
360
                                else {
361

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

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

    
377
                }
378

    
379
                Extent extent = null;
380
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
381

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

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

    
394
                }
395

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

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

    
444
                        // Delete the cachestruct if it exists, and create a new one.
445

    
446
                        if (_cachedLayers.containsKey(layer)) {
447

    
448
                                _cachedLayers.remove(layer);
449

    
450
                        }
451

    
452
                }
453
                // Vector layers
454
                if (props.getType() == Layer3DPropsImpl.layer3DVector) {
455
                        // if (layer instanceof FLyrVect) {
456
                        // Set a 3D Legend
457
                        try {
458
                                ((FLyrVect) layer).setLegend((IVectorLegend) MapContextLocator
459
                                                .getMapContextManager().getLegend(
460
                                                                ((FLyrVect) layer).getDataStore(),
461
                                                                "project.document.view3d"));
462
                        } catch (LegendLayerException e) {
463
                                // TODO Auto-generated catch block
464
                                e.printStackTrace();
465
                        } catch (LocatorException e) {
466
                                // TODO Auto-generated catch block
467
                                e.printStackTrace();
468
                        }
469

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

    
486
                // Elevation layers
487
                if (props.getType() == Layer3DPropsImpl.layer3DElevation) {
488

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

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

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

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

    
519
                                _cachedLayers.remove(layer);
520

    
521
                        }
522

    
523
                }
524

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

    
532
        }
533

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

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

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

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

    
673
                // return null;
674
        }
675

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

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

    
686
                }
687
                return specialNode;
688
        }
689

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

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

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

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

    
714
        }
715

    
716
        public boolean isRenewCanvasOff() {
717
                return _renewCanvasOff;
718
        }
719

    
720
        public void layerAdded(FLayers3D parent, FLayer layer) {
721

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

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

    
757
                // if (!_bLoading)
758
                Layer3DProps props3D = getLayer3DProps(layer);
759

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

    
775
                }
776

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

    
780
                        props3D.setType(Layer3DProps.layer3DVector);
781
                }
782
                addLayerToTerrain(layer, true);
783

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

    
805
        }
806

    
807
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
808

    
809
                // System.out.println("Creando estructura de cache");
810

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

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

    
817
                int coordinates = CacheStruct.FLAT;
818

    
819
                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOGRAPHIC)
820
                        coordinates = CacheStruct.GEOGRAFIC;
821

    
822
                DefaultRasterProvider provider = (DefaultRasterProvider) dataStore
823
                                .getProvider();
824

    
825
                provider.setProjection(layer.getProjection());
826

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

    
833
                int resolution = 256;
834

    
835
                int type = getLayer3DProps(layer).getType();
836

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

    
840
                        resolution = 32;
841

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

    
850
                return struct;
851

    
852
        }
853

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

    
868
        }
869

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

    
886
                Layer3DProps props3D = getLayer3DProps(layer);
887
                refreshLayerInTerrain(props3D, false);
888

    
889
                int type = props3D.getType();
890

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

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

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

    
919
                }
920

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

    
938
                // PrintDebugLayers();
939

    
940
        }
941

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

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

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

    
961
                layer.removeLayerListener((LayerListener) this);
962

    
963
                removeLayerToTerrain(layer);
964

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

    
970
                // PrintDebugLayers();
971

    
972
        }
973

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

    
999
                                        }
1000
                                }
1001
                        }
1002

    
1003
                        // IWindow f = PluginServices.getMDIManager().getActiveWindow();
1004
                        // if (f instanceof BaseView) {
1005
                        // BaseView view3D = (BaseView) f;
1006
                        // view3D.getTOC().refresh();
1007
                        // }
1008
                }
1009
                visibilityChange = false;
1010

    
1011
        }
1012

    
1013
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1014

    
1015
                if (_terrainLayerMap.size() == 0)
1016
                        return null;
1017
                if (rde == null)
1018
                        return null;
1019
                if (rde.getExtent() == null || rde.getLayer() == null
1020
                                || rde.getLayerManager() == null)
1021
                        return null;
1022

    
1023
                String layerID = rde.getLayer().getLayerID();
1024
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1025
                if (layer == null)
1026
                        return null;
1027
                if (!layer.isVisible())
1028
                        return null;
1029
                double minX, minY, width, height;
1030

    
1031
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1032
                        minX = rde.getExtent().xMin();
1033
                        minY = rde.getExtent().yMin();
1034
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1035
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1036

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

    
1061
                // Case of Raster data
1062

    
1063
                UpdateDataEvent ude = null;
1064

    
1065
                if (rde.getLayer().getLayerType() == Layer.LayerType.TEXTURELAYER)
1066
                        ude = loadRasterData(layer, envelope, rde);
1067

    
1068
                if (rde.getLayer().getLayerType() == Layer.LayerType.VECTORLAYER)
1069
                        {
1070
//                        NodeMarker3DSymbol n = new NodeMarker3DSymbol();
1071
//                        n.setNodeFileURL("/home/jtorres/.depman/share/osgVP/resources/fire.osg");
1072
                        ude = loadVectorData(layer, envelope, rde, null);
1073
                        }
1074
                if (rde.getLayer().getLayerType() == Layer.LayerType.HEIGHTFIELDLAYER)
1075
                        ude = loadElevationData(layer, envelope, rde);
1076

    
1077
                return ude;
1078
        }
1079

    
1080
        private UpdateDataEvent loadRasterData(FLayer layer, Envelope envelope,
1081
                        RequestDataEvent rde) {
1082

    
1083
                UpdateDataEvent ude = new UpdateDataEvent();
1084
                ude.copyDataFromRequest(rde);
1085
                if (layer instanceof DefaultFLyrRaster) {
1086
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1087

    
1088
                        if (rLayer.getDataStore().isTiled()) {
1089

    
1090
                                rLayer = (DefaultFLyrRaster) layer;
1091

    
1092
                                boolean exists = _cachedLayers.containsKey(rLayer);
1093

    
1094
                                if (!exists) {
1095

    
1096
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1097

    
1098
                                }
1099

    
1100
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1101

    
1102
                                RasterQuery query = RasterLocator.getManager().createQuery();
1103

    
1104
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1105
                                                .getManager()
1106
                                                .getDataStructFactory()
1107
                                                .createExtent(envelope.getLowerCorner().getX(),
1108
                                                                envelope.getUpperCorner().getY(),
1109
                                                                envelope.getUpperCorner().getX(),
1110
                                                                envelope.getLowerCorner().getY());
1111

    
1112
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1113
                                                rde.getTileY(), extent, null);
1114

    
1115
                                // query.setAreaOfInterest(extent, 512, 512);
1116

    
1117
//                                 System.out.println("Tile Parameters:");
1118
//                                 System.out.println("TileLevel: " + rde.getTileLevel());
1119
//                                 System.out.println("TileX = " + rde.getTileX());
1120
//                                 System.out.println("TileY = " + rde.getTileY());
1121
//                                 System.out.println("Extent = " + extent.getULX() + " "
1122
//                                 + extent.getULY() + " " + extent.getLRX() + " "
1123
//                                 + extent.getLRY());
1124

    
1125
                                try {
1126
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1127
                                        Buffer rBuff = (Buffer) result[0];
1128
                                        Buffer transparencyBuffer;
1129
                                        int suma = 0;
1130

    
1131
                                        transparencyBuffer = (Buffer) result[1];
1132

    
1133
                                        if (transparencyBuffer != null)
1134
                                                suma = 1;
1135

    
1136
                                        // int bufferBands = rBuff.getBandCount();
1137
                                        // Si el numero de bandas es mayor que 3 (RGB) no se pueden
1138
                                        // dibujar todas
1139
                                        int numBands = rLayer.getDataStore().getBandCount();
1140

    
1141
                                        if (numBands > (maxBands + suma))
1142
                                                numBands = maxBands + suma;
1143

    
1144
                                        ColorInterpretation cInt = rLayer.getDataStore()
1145
                                                        .getColorInterpretation();
1146

    
1147
                                        int rgba[] = {0,1,2,3};
1148
                                        
1149
                                        rgba = setBandsInColors(cInt);
1150

    
1151
                                        int pixelFormat = convertPixelFormat(numBands);
1152

    
1153
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1154
                                        // + " alto: " + rBuff.getHeight()
1155
                                        // + " bandas totales incluyendo alpha (si tiene): "
1156
                                        // + numBands);
1157

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

    
1204
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1205

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

    
1220
                        }
1221
                        // Not tiled raster
1222
                        else {
1223
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1224
                        }
1225

    
1226
                }
1227

    
1228
                // Vectorial rasterized
1229
                else if (layer instanceof FLyrVect) {
1230
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1231
                }
1232
                // unrecognized layer type
1233
                else {
1234
                        ude.setFailData();
1235
                }
1236

    
1237
                // System.out.println("Returning UDE");
1238

    
1239
                return ude;
1240
        }
1241

    
1242
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1243
                        RequestDataEvent rde, I3DSymbol sy) {
1244
                
1245
                System.out.println("vector data");
1246
                UpdateDataEvent ude = new UpdateDataEvent();
1247
                ude.copyDataFromRequest(rde);
1248

    
1249
                
1250
                // Convenience casting, create a default 3D symbol
1251
                IVectorLegend legend = (IVectorLegend) ((FLyrVect) layer).getLegend();
1252
                if(sy==null) sy = (I3DSymbol) legend.getDefaultSymbol();
1253
                else legend.setDefaultSymbol(sy);
1254
                
1255
                
1256
                //Hack for polylines and polygons to only render them rasterized
1257
                //till gvSIG architects solve geometries problem
1258
                if (sy instanceof IFillSymbol || sy instanceof ILineSymbol)
1259
                {
1260
                        removeLayerToTerrain(layer);
1261
                        getLayer3DProps(layer).setType(Layer3DPropsImpl.layer3DImage);
1262
                        addLayerToTerrain(layer, true);
1263
                        return null;
1264
                }//End hack
1265
                Layer3DProps layerprops = getLayer3DProps(layer);
1266
                
1267
                if (layerprops.isZEnable()==false)
1268
                        sy.setFixedHeight(layerprops.getHeight());
1269
                
1270
                
1271
                ViewPort vp = new ViewPort(_viewProjection);
1272
                vp.setEnvelope(envelope); // the real extent of the tile
1273
                vp.setAdjustable(false);
1274
                vp.setImageSize(new Dimension(256, 256));
1275
                vp.setDist1pixel(0.000000001);
1276
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1277
                
1278
                try {
1279
                        layer.draw(null, null, vp, new MyCancel(), scale);
1280
                } catch (ReadException e) {
1281
                        // TODO Auto-generated catch block
1282
                        e.printStackTrace();
1283
                }
1284

    
1285
                // OSG Layers
1286
                DataStore ds = ((SingleLayer) layer).getDataStore();
1287
                Node n = null;
1288

    
1289
                if (ds.getProviderName() == "OSG") {
1290
                        try {
1291
                                n = (Node) ds.invokeDynMethod("getNode", null);
1292
                        } catch (DynMethodException e) {
1293
                                // TODO Auto-generated catch block
1294
                                e.printStackTrace();
1295
                        }
1296
                        System.out.println("OSG Layer added");
1297
                }
1298
                // Vectorial layers
1299
                else {                
1300
                        ISymbol3D sym = null;
1301
                        try {
1302
                                sym = Symbol3DFactory.getSymbol3D(sy);
1303
                        } catch (NodeException e) {
1304
                                // TODO Auto-generated catch block
1305
                                e.printStackTrace();
1306
                        }
1307
                        //sm.setPointSize((float) sy.getSize());
1308
                        n = sym.buildSceneGraph(sy.getGeometry());
1309
                }
1310

    
1311
                ude.setVectorData(n);
1312

    
1313
                return ude;
1314
        }
1315

    
1316
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1317
                        RequestDataEvent rde) {
1318

    
1319
                UpdateDataEvent ude = new UpdateDataEvent();
1320
                ude.copyDataFromRequest(rde);
1321

    
1322
                if (layer instanceof DefaultFLyrRaster) {
1323
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1324
                        boolean hasCache = true;
1325
                        if (rLayer.getDataStore().getInternalParameters() instanceof NetCDFDataParameters)
1326
                                hasCache = false;
1327

    
1328
                        if (hasCache) {
1329

    
1330
                                rLayer = (DefaultFLyrRaster) layer;
1331
                                boolean exists = _cachedLayers.containsKey(rLayer);
1332

    
1333
                                if (!exists) {
1334

    
1335
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1336

    
1337
                                }
1338

    
1339
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1340

    
1341
                                RasterQuery query = RasterLocator.getManager().createQuery();
1342

    
1343
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1344
                                                .getManager()
1345
                                                .getDataStructFactory()
1346
                                                .createExtent(envelope.getLowerCorner().getX(),
1347
                                                                envelope.getUpperCorner().getY(),
1348
                                                                envelope.getUpperCorner().getX(),
1349
                                                                envelope.getLowerCorner().getY());
1350

    
1351
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1352
                                                rde.getTileY(), extent, cacheStruct);
1353

    
1354
                                // query.setAreaOfInterest(extent, 512, 512);
1355

    
1356
                                // System.out.println("Tile Parameters:");
1357
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1358
                                // System.out.println("TileX = " + rde.getTileX());
1359
                                // System.out.println("TileY = " + rde.getTileY());
1360
                                // System.out.println("Extent = " + extent.getULX() + " "
1361
                                // + extent.getULY() + " " + extent.getLRX() + " "
1362
                                // + extent.getLRY());
1363

    
1364
                                try {
1365
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1366
                                        Buffer rBuff = (Buffer) result[0];
1367
                                        Buffer transparencyBuffer;
1368

    
1369
                                        if (result.length < 2)
1370
                                                transparencyBuffer = null;
1371
                                        else
1372
                                                transparencyBuffer = (Buffer) result[1];
1373

    
1374
                                        int numBands = rBuff.getBandCount();
1375
                                        if (transparencyBuffer != null) {
1376

    
1377
                                                // System.out
1378
                                                // .println("Tengo Transparency buffer con "
1379
                                                // + transparencyBuffer.getBandCount()
1380
                                                // + " bandas");
1381
                                                numBands++;
1382

    
1383
                                        }
1384

    
1385
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1386
                                        // + " alto: " + rBuff.getHeight()
1387
                                        // + " bandas totales incluyendo alpha (si tiene): "
1388
                                        // + numBands);
1389

    
1390
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1391
                                                        .getHeight()) / 64];
1392

    
1393
                                        int pixelFormat = convertPixelFormat(numBands);
1394

    
1395
                                        // K hay que setearlo en el dialogo
1396
                                        int cont = 0;
1397

    
1398
                                        int k = getLayer3DProps(rLayer).getElevationBand();
1399

    
1400
                                        for (int i = rBuff.getWidth() - 1; i >= 0; i = i - 8) {
1401
                                                // Vertical Flip needed
1402
                                                for (int j = 0; j < rBuff.getHeight(); j = j + 8) {
1403

    
1404
                                                        switch (rBuff.getDataType()) {
1405
                                                        case Buffer.TYPE_BYTE:
1406
                                                                data[cont] = (float) (rBuff
1407
                                                                                .getElemByte(i, j, k));
1408
                                                                cont++;
1409
                                                                break;
1410
                                                        case Buffer.TYPE_DOUBLE:
1411
                                                                data[cont] = (float) (Math.round(rBuff
1412
                                                                                .getElemDouble(i, j, k)));
1413
                                                                cont++;
1414
                                                                break;
1415
                                                        case Buffer.TYPE_FLOAT:
1416
                                                                data[cont] = (float) (Math.round(rBuff
1417
                                                                                .getElemFloat(i, j, k)));
1418
                                                                cont++;
1419
                                                                break;
1420
                                                        case Buffer.TYPE_INT:
1421
                                                                data[cont] = (float) (rBuff.getElemInt(i, j, k) & 0xffffffff);
1422
                                                                cont++;
1423
                                                                break;
1424
                                                        case Buffer.TYPE_SHORT:
1425
                                                        case Buffer.TYPE_USHORT:
1426
                                                                data[cont] = (float) (rBuff.getElemShort(i, j,
1427
                                                                                k) & 0xffff);
1428
                                                                cont++;
1429
                                                                break;
1430
                                                        }
1431

    
1432
                                                }
1433

    
1434
                                        }
1435
                                        ude.setHeightfieldData(data, rBuff.getWidth() / 8,
1436
                                                        rBuff.getHeight() / 8);
1437

    
1438
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1439

    
1440
                                } catch (ProcessInterruptedException e) {
1441
                                        // TODO Auto-generated catch block
1442
                                        e.printStackTrace();
1443
                                } catch (RasterDriverException e) {
1444
                                        e.printStackTrace();
1445
                                } catch (InvalidSetViewException e) {
1446
                                        // TODO Auto-generated catch block
1447
                                        e.printStackTrace();
1448
                                } catch (NullPointerException e) {
1449
                                        // ude.setFailData();
1450
                                        System.out.println("Problem getting the tile");
1451
                                }
1452

    
1453
                        }
1454
                        // No cache
1455
                        else {
1456
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1457
                        }
1458

    
1459
                }
1460

    
1461
                // Vectorial rasterized
1462
                else if (layer instanceof FLyrVect) {
1463
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1464
                }
1465
                // unrecognized layer type
1466
                else {
1467
                        ude.setFailData();
1468
                }
1469

    
1470
                return ude;
1471

    
1472
        }
1473

    
1474
        protected byte[] buildByteBuffer(UpdateDataEvent ude, Buffer rBuff,
1475
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1476

    
1477
                int cont = 0;
1478
                int colorBands = numBands;
1479

    
1480
                if (transparencyBuffer != null) {
1481
                        colorBands--;
1482
                }
1483

    
1484
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * numBands];
1485

    
1486
                for (int i = 0; i < rBuff.getWidth(); i++) {
1487

    
1488
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1489

    
1490
                                for (int k = 0; k < colorBands; k++) {
1491
                                        // En lugar de k se deben usar las bandas asociadas al
1492
                                        // componente
1493
                                        data[cont] = (byte) rBuff.getElemByte(i, j, rgba[k]);
1494
                                        cont++;
1495

    
1496
                                }
1497
                                if (transparencyBuffer != null) {
1498
                                        if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1499
                                                data[cont] = (byte) 0;
1500
                                        else
1501
                                                data[cont] = (byte) 255;
1502
                                        //data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1503

    
1504
                                        cont++;
1505

    
1506
                                }
1507
                        }
1508
                }
1509

    
1510
                return data;
1511
        }
1512

    
1513
        protected short[] buildShortBuffer(UpdateDataEvent ude, Buffer rBuff,
1514
                        Buffer transparencyBuffer, int numBands) {
1515
                short[] data = new short[rBuff.getWidth() * rBuff.getHeight()
1516
                                * numBands];
1517

    
1518
                int cont = 0;
1519
                int colorBands = numBands;
1520

    
1521
                if (transparencyBuffer != null)
1522
                        colorBands--;
1523

    
1524
                for (int i = 0; i < rBuff.getWidth(); i++) {
1525

    
1526
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1527

    
1528
                                for (int k = 0; k < colorBands; k++) {
1529
                                        data[cont] = (short) (rBuff.getElemShort(i, j, k) & 0xffff);
1530
                                        cont++;
1531
                                }
1532
                                if (transparencyBuffer != null) {
1533
                                        data[cont] = (short) (rBuff.getElemShort(i, j, 0) & 0xffff);
1534
                                        cont++;
1535
                                }
1536
                        }
1537
                }
1538

    
1539
                return data;
1540
        }
1541

    
1542
        protected int[] buildIntBuffer(UpdateDataEvent ude, Buffer rBuff,
1543
                        Buffer transparencyBuffer, int numBands) {
1544
                int[] data = new int[rBuff.getWidth() * rBuff.getHeight() * numBands];
1545

    
1546
                int cont = 0;
1547
                int colorBands = numBands;
1548

    
1549
                if (transparencyBuffer != null)
1550
                        colorBands--;
1551

    
1552
                for (int i = 0; i < rBuff.getWidth(); i++) {
1553

    
1554
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1555

    
1556
                                for (int k = 0; k < colorBands; k++) {
1557
                                        data[cont] = (int) (rBuff.getElemByte(i, j, k) & 0xffffffff);
1558
                                        cont++;
1559
                                }
1560
                                if (transparencyBuffer != null) {
1561
                                        data[cont] = (int) (rBuff.getElemByte(i, j, 0) & 0xffffffff);
1562
                                        cont++;
1563
                                }
1564
                        }
1565
                }
1566

    
1567
                return data;
1568
        }
1569

    
1570
        protected float[] buildFloatBuffer(UpdateDataEvent ude, Buffer rBuff,
1571
                        Buffer transparencyBuffer, int numBands) {
1572
                float[] data = new float[rBuff.getWidth() * rBuff.getHeight()
1573
                                * numBands];
1574

    
1575
                int cont = 0;
1576
                int colorBands = numBands;
1577

    
1578
                if (transparencyBuffer != null)
1579
                        colorBands--;
1580

    
1581
                for (int i = 0; i < rBuff.getWidth(); i++) {
1582

    
1583
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1584

    
1585
                                for (int k = 0; k < colorBands; k++) {
1586
                                        data[cont] = rBuff.getElemByte(i, j, k);
1587
                                        cont++;
1588
                                }
1589
                                if (transparencyBuffer != null) {
1590
                                        data[cont] = rBuff.getElemByte(i, j, 0);
1591
                                        cont++;
1592
                                }
1593
                        }
1594
                }
1595

    
1596
                return data;
1597
        }
1598

    
1599
        protected double[] buildDoubleBuffer(UpdateDataEvent ude, Buffer rBuff,
1600
                        Buffer transparencyBuffer, int numBands) {
1601
                double[] data = new double[rBuff.getWidth() * rBuff.getHeight()
1602
                                * numBands];
1603

    
1604
                int cont = 0;
1605
                int colorBands = numBands;
1606

    
1607
                if (transparencyBuffer != null)
1608
                        colorBands--;
1609

    
1610
                for (int i = 0; i < rBuff.getWidth(); i++) {
1611

    
1612
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1613

    
1614
                                for (int k = 0; k < colorBands; k++) {
1615
                                        data[cont] = rBuff.getElemByte(i, j, k);
1616
                                        cont++;
1617
                                }
1618
                                if (transparencyBuffer != null) {
1619
                                        data[cont] = rBuff.getElemByte(i, j, 0);
1620
                                        cont++;
1621
                                }
1622
                        }
1623
                }
1624

    
1625
                return data;
1626
        }
1627

    
1628
        protected int convertPixelFormat(int type) {
1629

    
1630
                switch (type) {
1631

    
1632
                case 1:
1633
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1634

    
1635
                case 2:
1636
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1637

    
1638
                case 3:
1639
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1640

    
1641
                case 4:
1642
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1643

    
1644
                }
1645

    
1646
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1647

    
1648
        }
1649

    
1650
        protected int[] setBandsInColors(ColorInterpretation cInt) {
1651
                
1652
                int rgba[] = new int[4];
1653
                
1654
                rgba[0] = cInt.getBand(ColorInterpretation.RED_BAND);
1655
                if(rgba[0]==-1) rgba[0]=0;
1656
                rgba[1] = cInt.getBand(ColorInterpretation.GREEN_BAND);
1657
                if(rgba[1]==-1) rgba[1]=1;
1658
                rgba[2] = cInt.getBand(ColorInterpretation.BLUE_BAND);
1659
                if(rgba[2]==-1) rgba[2]=2;
1660
                rgba[3] = cInt.getBand(ColorInterpretation.ALPHA_BAND);
1661
                if(rgba[3]==-1) rgba[3]=3;
1662
                
1663
                return rgba;
1664
                
1665
        }
1666

    
1667
        protected class MyCancel implements Cancellable {
1668
                private boolean cancel = false;
1669

    
1670
                public MyCancel() {
1671
                }
1672

    
1673
                public void setCanceled(boolean canceled) {
1674
                        cancel = canceled;
1675
                }
1676

    
1677
                public boolean isCanceled() {
1678
                        return cancel;
1679
                }
1680
        }
1681

    
1682
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1683

    
1684
                int size = 256;
1685
                BufferedImage image = new BufferedImage(size, size,
1686
                                BufferedImage.TYPE_4BYTE_ABGR);
1687

    
1688
                ViewPort vp = new ViewPort(_viewProjection);
1689
                vp.setEnvelope(envelope); // the real extent of the tile
1690

    
1691
                vp.setAdjustable(false);
1692
                vp.setImageSize(new Dimension(size, size));
1693
                vp.setDist1pixel(0.000000001);
1694

    
1695
                Graphics2D graphics = image.createGraphics();
1696
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1697
                // background
1698
                graphics.setColor(backgColor);
1699
                graphics.fillRect(0, 0, size, size);
1700

    
1701
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1702

    
1703
                try {
1704
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1705

    
1706
                } catch (Exception e) {
1707
                        return null;
1708
                }
1709

    
1710
                return image;
1711

    
1712
        }
1713

    
1714
        public void nameChanged(LayerEvent e) {
1715
                System.out.println("Name change");
1716

    
1717
        }
1718

    
1719
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
1720

    
1721
                System.out.println("Refresh");
1722
                if (props == null)
1723
                        return;
1724

    
1725
                if (_terrain == null)
1726
                        return; // view not opened yet
1727

    
1728
                // clear cache
1729

    
1730
                // refresh layer in terrain
1731
                int type = props.getType();
1732
                if ((type == Layer3DProps.layer3DImage)
1733
                                || (type == Layer3DProps.layer3DElevation)
1734
                                || (type == Layer3DProps.layer3DVectorMR)) {
1735

    
1736
                        try {
1737
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
1738
                        } catch (LayerManagementException e) {
1739
                                // TODO Auto-generated catch block
1740
                                e.printStackTrace();
1741
                        }
1742
                } else if (type == Layer3DProps.layer3DVector) {
1743
                        invalidateVectorLayer(props);
1744
                }
1745

    
1746
        }
1747

    
1748
        public boolean removeCache(File path) {
1749
                if (path.exists()) {
1750
                        File[] files = path.listFiles();
1751
                        for (int i = 0; i < files.length; i++) {
1752
                                if (files[i].isDirectory()) {
1753
                                        removeCache(files[i]);
1754
                                } else {
1755
                                        files[i].delete();
1756
                                }
1757
                        }
1758
                }
1759
                return (path.delete());
1760
        }
1761

    
1762
        public void removeLayerToTerrain(FLayer layer) {
1763

    
1764
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1765
                if (terrainLayer != null) {
1766

    
1767
                        _terrainLayerMap.remove(terrainLayer.getLayerID());
1768
                        _terrainFLayerMap.remove(layer);
1769

    
1770
                        try {
1771
                                _terrainLayerManager.removeLayer(terrainLayer);
1772
                        } catch (LayerManagementException e) {
1773
                                // TODO Auto-generated catch block
1774
                                e.printStackTrace();
1775
                        }
1776
                }
1777

    
1778
        }
1779

    
1780
        public void selectionChanged(SelectionEvent e) {
1781
                // TODO Auto-generated method stub
1782
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1783
                // while (lyrIterator.hasNext()) {
1784
                // FLayer layer = lyrIterator.next();
1785
                // Layer3DProps props3D = getLayer3DProps(layer);
1786
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
1787
                // if (layer.getClass().equals(FLyrVect.class)) {
1788
                // FLyrVect lyr = (FLyrVect) layer;
1789
                //
1790
                // FBitSet selection = null;
1791
                // try {
1792
                // selection = lyr.getRecordset().getSelectionSupport()
1793
                // .getSelection();
1794
                // } catch (ReadDriverException e1) {
1795
                // // TODO Auto-generated catch block
1796
                // e1.printStackTrace();
1797
                // }
1798
                //
1799
                // if ((selection.cardinality() == 0)
1800
                // || (!(selection.isEmpty()))) {
1801
                // Layer3DProps props = Layer3DProps
1802
                // .getLayer3DProps(layer);
1803
                // refreshLayerInTerrain(props, true);
1804
                // if (layer instanceof FLyrVect) {
1805
                // FLyrVect fvect = (FLyrVect) layer;
1806
                // props.drawVersion = fvect.getDrawVersion();
1807
                // }
1808
                // }
1809
                // }
1810
                // }
1811
                // }
1812

    
1813
        }
1814

    
1815
        public void setDataManager(JavaDataDriver manager) {
1816
                _terrainDataManager = manager;
1817
                _terrainDataManager.setDataLoader(this);
1818

    
1819
        }
1820

    
1821
        public void setLayerManager(LayerManager manager) {
1822
                _terrainLayerManager = manager;
1823

    
1824
        }
1825

    
1826
        public void setLoading(boolean bLoading) {
1827
                _bLoading = bLoading;
1828

    
1829
        }
1830

    
1831
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1832
                _renewCanvasOff = renewCanvasOff;
1833

    
1834
        }
1835

    
1836
        public void setTerrain(Terrain terrain) {
1837
                if (_terrain == terrain)
1838
                        return;
1839

    
1840
                _terrain = terrain;
1841

    
1842
                // add layers to terrain necessary when we are loading
1843
                addCurrentLayers();
1844

    
1845
        }
1846

    
1847
        public void setVerticalExaggeration(float verticalExaggeration) {
1848
                _verticalExaggeration = verticalExaggeration;
1849

    
1850
        }
1851

    
1852
        public void setViewProjection(IProjection projection) {
1853
                _viewProjection = projection;
1854

    
1855
        }
1856

    
1857
        public void setViewer(IViewerContainer canvas) {
1858
                _canvas3d = canvas;
1859
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
1860

    
1861
        }
1862

    
1863
        public void visibilityChanged(LayerEvent e) {
1864
                FLayer lyr = e.getSource();
1865

    
1866
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
1867
                // refreshLayerVectorsVisibility(lyr);
1868
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1869
                // refreshLayer3DOSGVisibility(lyr);
1870
                // } else {
1871
                refreshLayerVisibility(lyr);
1872
                // }
1873
                visibilityChange = true;
1874

    
1875
        }
1876

    
1877
        private void refreshLayerVisibility(FLayer layer) {
1878

    
1879
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1880
                terrainLayer.setEnabled(layer.isVisible());
1881
                // _terrainLayerManager.updateLayers();
1882

    
1883
        }
1884

    
1885
        public void zoomToEnvelope(Envelope geoEnvelope) {
1886
                if (geoEnvelope == null)
1887
                        return;
1888
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
1889
                        return;
1890

    
1891
                double maxHeight = 0.0;
1892

    
1893
                // Getting envelope positions
1894
                double minLat = geoEnvelope.getMinimum(0);
1895
                double maxLat = geoEnvelope.getMaximum(0);
1896
                double cenLon = geoEnvelope.getCenter(0);
1897
                double cenLat = geoEnvelope.getCenter(1);
1898

    
1899
                double elevation = 0;
1900

    
1901
                // calculate altitude
1902
                double avLat = 0;
1903
                if (minLat > 0.0 || maxLat < 0.0)
1904
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1905
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
1906

    
1907
                double terrainRadius = _terrain.getRadiusEquatorial();
1908
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
1909
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1910
                                * (1 - Math.cos(Math.toRadians(avLon))));
1911
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
1912
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
1913

    
1914
                // Calculate XYZ positions for camera.
1915

    
1916
                int terrainType = _terrain.getCoordinateSystemType();
1917

    
1918
                double zoomFactor = 1.5;
1919
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
1920
                        zoomFactor = 1.3;
1921
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1922

    
1923
                Vec3 eye = new Vec3();
1924
                Vec3 center = new Vec3();
1925
                Vec3 up = new Vec3();
1926
                // Calculate positions for PLAIN MODE.
1927
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
1928

    
1929
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
1930
                                        .getMinimum(1)) / 1.2d;
1931
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
1932
                                        .getMinimum(0)) / 1.2d;
1933
                        double height;
1934

    
1935
                        height = Math.sqrt(difx * difx + dify * dify);
1936
                        double fullWindowFactor = 1.7;
1937
                        // EYE
1938
                        eye.setX(cenLon);
1939
                        eye.setY(cenLat);
1940
                        eye.setZ(height * fullWindowFactor);
1941
                        // CENTER
1942
                        center.setX(cenLon);
1943
                        center.setY(cenLat);
1944
                        center.setZ(0.0);
1945
                        // UP
1946
                        up.setX(0.0);
1947
                        up.setY(1.0);
1948
                        up.setZ(0.0);
1949
                } else
1950
                // Calculate positions for SPHERICAL MODE.
1951
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
1952
                        // EYE
1953
                        Vec3 aux = new Vec3(cenLon, cenLat, elevation);
1954
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
1955
                        // CENTER
1956
                        center.setX(0.0);
1957
                        center.setY(0.0);
1958
                        center.setZ(0.0);
1959
                        // UP
1960
                        up.setX(0.0);
1961
                        up.setY(0.0);
1962
                        up.setZ(1.0);
1963
                }
1964
                Camera cam = new Camera();
1965
                cam.setViewByLookAt(eye, center, up);
1966

    
1967
                _terrainViewer.setCamera(cam);
1968

    
1969
        }
1970

    
1971
        public void editionChanged(LayerEvent e) {
1972
                // TODO Auto-generated method stub
1973

    
1974
        }
1975

    
1976
        public void drawValueChanged(LayerEvent e) {
1977
                // TODO Auto-generated method stub
1978

    
1979
        }
1980

    
1981
        public boolean symbolChanged(SymbolLegendEvent e) {
1982

    
1983
                System.out.println("Symbol changed");
1984
                return false;
1985
        }
1986

    
1987
        public void legendCleared(LegendClearEvent event) {
1988
                // TODO Auto-generated method stub
1989

    
1990
        }
1991

    
1992
        public static class RegisterPersistence implements Callable {
1993

    
1994
                public Object call() throws Exception {
1995
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
1996
                        if (manager.getDefinition(MapContext.class) == null) {
1997
                                MapContext.registerPersistent();
1998
                        }
1999
                        DynStruct definition = manager.addDefinition(
2000
                                        MapContext3DImpl.class, "MapContext3DImpl",
2001
                                        "MapContext3DImpl Persistence definition", null, null);
2002
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
2003
                                        "MapContext");
2004

    
2005
                        return Boolean.TRUE;
2006
                }
2007
        }
2008

    
2009
}