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

History | View | Annotate | Download (53.6 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.DataBuffer;
30
import java.awt.image.ImagingOpException;
31
import java.io.File;
32
import java.io.IOException;
33
import java.util.Hashtable;
34
import java.util.Vector;
35

    
36
import org.cresques.cts.IProjection;
37
import org.gvsig.fmap.dal.DataStore;
38
import org.gvsig.fmap.dal.coverage.RasterLibrary;
39
import org.gvsig.fmap.dal.coverage.RasterLocator;
40
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
41
import org.gvsig.fmap.dal.coverage.exception.FilePaletteException;
42
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
43
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
44
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
45
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
46
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
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.gvsig3d.impl.symbology3d.fill.impl.SimpleFill3DSymbol;
75
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.SimpleMarker3DSymbol;
76
import org.gvsig.gvsig3d.map3d.Layer3DProps;
77
import org.gvsig.gvsig3d.map3d.MapContext3D;
78
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
79
import org.gvsig.osgvp.core.osg.Matrix;
80
import org.gvsig.osgvp.core.osg.Node;
81
import org.gvsig.osgvp.core.osg.Vec2;
82
import org.gvsig.osgvp.core.osg.Vec3;
83
import org.gvsig.osgvp.core.osg.Vec4;
84
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
85
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
86
import org.gvsig.osgvp.exceptions.node.NodeException;
87
import org.gvsig.osgvp.symbology.FireMarker;
88
import org.gvsig.osgvp.symbology.SimpleMarker;
89
import org.gvsig.osgvp.terrain.Extent;
90
import org.gvsig.osgvp.terrain.HeightfieldLayer;
91
import org.gvsig.osgvp.terrain.JavaDataDriver;
92
import org.gvsig.osgvp.terrain.Layer;
93
import org.gvsig.osgvp.terrain.LayerManager;
94
import org.gvsig.osgvp.terrain.RequestDataEvent;
95
import org.gvsig.osgvp.terrain.Terrain;
96
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
97
import org.gvsig.osgvp.terrain.TerrainViewer;
98
import org.gvsig.osgvp.terrain.TextureLayer;
99
import org.gvsig.osgvp.terrain.UpdateDataEvent;
100
import org.gvsig.osgvp.terrain.VectorLayer;
101
import org.gvsig.osgvp.terrain.exceptions.LayerManagementException;
102
import org.gvsig.osgvp.viewer.Camera;
103
import org.gvsig.osgvp.viewer.IViewerContainer;
104
import org.gvsig.raster.cache.tile.TileCache;
105
import org.gvsig.raster.cache.tile.TileCacheLibrary;
106
import org.gvsig.raster.cache.tile.TileCacheLocator;
107
import org.gvsig.raster.cache.tile.TileCacheManager;
108
import org.gvsig.raster.cache.tile.provider.CacheStruct;
109
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
110
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
111
import org.gvsig.raster.netcdf.io.NetCDFDataParameters;
112
import org.gvsig.tools.ToolsLocator;
113
import org.gvsig.tools.dynobject.DynStruct;
114
import org.gvsig.tools.dynobject.exception.DynMethodException;
115
import org.gvsig.tools.locator.LocatorException;
116
import org.gvsig.tools.persistence.PersistenceManager;
117
import org.gvsig.tools.task.Cancellable;
118
import org.gvsig.tools.util.Callable;
119

    
120
/**
121
 * @author gvSIG Team
122
 * @version $Id$
123
 * 
124
 */
125
public class MapContext3DImpl extends MapContext3D {
126

    
127
        private Terrain _terrain;
128
        private IViewerContainer _canvas3d;
129
        private TerrainViewer _terrainViewer;
130
        private LayerManager _terrainLayerManager;
131
        private JavaDataDriver _terrainDataManager = null;
132

    
133
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
134
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
135

    
136
        private Hashtable<DefaultFLyrRaster, CacheStruct> _cachedLayers = new Hashtable<DefaultFLyrRaster, CacheStruct>();
137

    
138
        private IProjection _viewProjection;
139
        private float _verticalExaggeration;
140
        private boolean _bEmptyView = true;
141
        private boolean _bListenToLegend = true;
142
        private boolean _bLoading = false;
143
        private TerrainViewer _canvasoff = null;
144
        private boolean _renewCanvasOff = false;
145

    
146
        TerrainViewer _printViewer = null;
147
        Layer _testRasterLayer = null;
148

    
149
        private boolean visibilityChange = false;
150

    
151
        TileCacheManager tileMan = TileCacheLocator.getManager();
152
        TileCache tileCache = tileMan.getTileCache(RasterLibrary.pathTileCache);
153

    
154
        public MapContext3DImpl() {
155
        }
156

    
157
        public MapContext3DImpl(ViewPort vp) {
158
                super(vp);
159
        }
160

    
161
        public MapContext3DImpl(FLayers fLayers, ViewPort vp) {
162

    
163
                super(fLayers, vp);
164

    
165
        }
166

    
167
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
168
                        double scale) {
169

    
170
                if (_canvas3d == null || _canvas3d.getOSGViewer() == null)
171
                        return;
172
                double x = getViewPort().getOffset().getX();
173
                double y = getViewPort().getOffset().getY();
174
                double w = image.getWidth();
175
                double h = image.getHeight();
176

    
177
                if (_canvasoff == null) {
178
                        try {
179
                                _canvasoff = new TerrainViewer();
180
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
181

    
182
                                Terrain planetView3D = ((TerrainViewer) _canvas3d
183
                                                .getOSGViewer()).getTerrain(0);
184
                                Terrain terrain = new Terrain();
185
                                terrain.setCoordinateSystemType(planetView3D
186
                                                .getCoordinateSystemType());
187
                                terrain.setCoordinateSystemName(planetView3D
188
                                                .getCoordinateSystemName());
189
                                terrain.setCoordinateSystemFormat(planetView3D
190
                                                .getCoordinateSystemFormat());
191
                                terrain.setExtent(planetView3D.xMin(), planetView3D.yMin(),
192
                                                planetView3D.xMax(), planetView3D.yMax());
193
                                terrain.setTerrainName(planetView3D.getTerrainName());
194

    
195
                                terrain.init();
196
                                terrain.setLayerManager(_terrainLayerManager);
197

    
198
                                _canvasoff.addTerrain(terrain);
199
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
200
                                                .getOSGViewer()).getFeatures()));
201
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
202
                                                .getClearColor();
203
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(),
204
                                                color.w());
205
                                this.setRenewCanvasOff(false);
206
                        } catch (NodeException e) {
207
                                // TODO Auto-generated catch block
208
                                e.printStackTrace();
209
                        }
210

    
211
                }
212

    
213
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
214
                Matrix refView = refCam.getViewMatrix();
215
                Matrix refProy = refCam.getProjectionMatrix();
216
                Matrix.Perspective pers = refProy.getPerspective();
217
                Camera viewCam = new Camera();
218
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
219
                                pers.zFar);
220
                viewCam.setViewMatrix(refView);
221
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
222
                _canvasoff.setCamera(viewCam);
223
                _canvasoff.takeScreenshotToMemory();
224
                _canvasoff.frame();
225

    
226
                org.gvsig.osgvp.core.osg.Image OSGimage = _canvasoff
227
                                .getScreenshotImage();
228

    
229
                BufferedImage img = null;
230
                try {
231
                        img = OSGimage.getBufferedImage();
232
                } catch (ImageConversionException e1) {
233
                        // TODO Auto-generated catch block
234
                        e1.printStackTrace();
235
                } catch (IOException e1) {
236
                        // TODO Auto-generated catch block
237
                        e1.printStackTrace();
238
                }
239

    
240
                double scalex = w / img.getWidth(null);
241
                double scaley = h / img.getHeight(null);
242
                try {
243
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
244
                                        scaley);
245
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
246
                        xpos.concatenate(xform);
247
                        g.drawRenderedImage(img, xpos);
248
                } catch (ImagingOpException e) {
249

    
250
                }
251
        }
252

    
253
        public void CreateOSGLayer(FLayer layer, Layer3DProps props3d) {
254
                // if (_terrain == null || _viewProjection == null)
255
                // return;
256
                //
257
                // OSGCacheService cacheService = (OSGCacheService) props3D
258
                // .getCacheService();
259
                // if (cacheService == null) {
260
                // cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
261
                // .getCacheName(), layer, _viewProjection);
262
                // cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
263
                // props3D.setCacheService(cacheService);
264
                // }
265
                //
266
                // // use VectorCacheService to add features to planet
267
                // cacheService.AddFeaturesToTerrain();
268

    
269
        }
270

    
271
        public void DeleteOSGLayer(FLayer layer, Layer3DProps props3d) {
272
                // if (_terrain == null || _viewProjection == null)
273
                // return;
274
                //
275
                // OSGCacheService cacheService = (OSGCacheService) props3D
276
                // .getCacheService();
277
                // if (cacheService != null) {
278
                // // use VectorCacheService to delete features to terrain
279
                // cacheService.DeleteFeaturesToTerrain();
280
                // }
281

    
282
        }
283

    
284
        public void PrintDebugLayers() {
285
                if (_terrainLayerManager != null) {
286
                        System.out.println("===========================");
287
                        System.out.println("Total terrain layers: "
288
                                        + _terrainLayerManager.getNumLayers());
289
                        System.out.println("===========================");
290
                }
291
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
292
                int pos = 0;
293
                while (lyrIterator.hasNext()) {
294
                        FLayer layer = lyrIterator.next();
295
                        System.out.println("  Layer " + layer.getName());
296
                        Layer3DProps props3D = getLayer3DProps(layer);
297
                        System.out.println("    Type " + props3D.getType());
298
                        System.out.println("    Order " + pos);
299
                        pos++;
300
                }
301

    
302
        }
303

    
304
        public void activationChanged(LayerEvent e) {
305

    
306
        }
307

    
308
        public void addCurrentLayers() {
309

    
310
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
311
                while (lyrIterator.hasNext()) {
312
                        FLayer layer = lyrIterator.next();
313
                        Layer3DProps props = getLayer3DProps(layer);
314
                        addLayerToTerrain(layer, false);
315
                }
316

    
317
        }
318

    
319
        public void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
320

    
321
                System.out.println("ADD LAYER TO TERRAIN METHOD!");
322
                Envelope layerEnvelope = null;
323
                try {
324
                        layerEnvelope = layer.getFullEnvelope();
325
                } catch (ReadException e1) {
326
                        // TODO Auto-generated catch block
327
                        e1.printStackTrace();
328
                }
329

    
330
                Layer3DProps props = getLayer3DProps(layer);
331

    
332
                // hack!!
333
                // props.setType(Layer3DPropsImpl.layer3DVector);
334
                GeometryManager geoMan;
335

    
336
                geoMan = GeometryLocator.getGeometryManager();
337

    
338
                if (layerEnvelope == null) {
339

    
340
                        try {
341
                                layerEnvelope = geoMan.createEnvelope(Geometry.SUBTYPES.GEOM2D);
342
                                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC) {
343
                                        layerEnvelope.setLowerCorner(geoMan.createPoint(-180.0,
344
                                                        -90.0, Geometry.SUBTYPES.GEOM2D));
345
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(360.0,
346
                                                        180.0, Geometry.SUBTYPES.GEOM2D));
347
                                }
348

    
349
                                else {
350

    
351
                                        layerEnvelope.setLowerCorner(geoMan
352
                                                        .createPoint(-20000000.0, -10000000.00,
353
                                                                        Geometry.SUBTYPES.GEOM2D));
354
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(40000000.0,
355
                                                        20000000.0, Geometry.SUBTYPES.GEOM2D));
356

    
357
                                }
358
                        } catch (CreateEnvelopeException e) {
359
                                // TODO Auto-generated catch block
360
                                e.printStackTrace();
361
                        } catch (CreateGeometryException e) {
362
                                // TODO Auto-generated catch block
363
                                e.printStackTrace();
364
                        }
365

    
366
                }
367

    
368
                Extent extent = null;
369
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
370

    
371
                        extent = new Extent(layerEnvelope.getLowerCorner().getX(),
372
                                        layerEnvelope.getLowerCorner().getY(), layerEnvelope
373
                                                        .getUpperCorner().getX(), layerEnvelope
374
                                                        .getUpperCorner().getY());
375

    
376
                } else {
377
                        extent = new Extent(Math.toRadians(layerEnvelope.getLowerCorner()
378
                                        .getX()), Math.toRadians(layerEnvelope.getLowerCorner()
379
                                        .getY()), Math.toRadians(layerEnvelope.getUpperCorner()
380
                                        .getX()), Math.toRadians(layerEnvelope.getUpperCorner()
381
                                        .getY()));
382

    
383
                }
384

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

    
412
                        // if rasterizing layers set Default 2D symbology
413
                        if (layer instanceof FLyrVect) {
414
                                // Create a 2D Legend for jess
415
                                try {
416
                                        ((FLyrVect) layer)
417
                                                        .setLegend((IVectorLegend) MapContextLocator
418
                                                                        .getMapContextManager()
419
                                                                        .getLegend(
420
                                                                                        ((FLyrVect) layer).getDataStore(),
421
                                                                                        MapContextLocator
422
                                                                                                        .getMapContextManager()
423
                                                                                                        .getDefaultSymbologyDomain()));
424
                                } catch (LegendLayerException e) {
425
                                        // TODO Auto-generated catch block
426
                                        e.printStackTrace();
427
                                } catch (LocatorException e) {
428
                                        // TODO Auto-generated catch block
429
                                        e.printStackTrace();
430
                                }
431
                        }
432

    
433
                        // Delete the cachestruct if it exists, and create a new one.
434

    
435
                        if (_cachedLayers.containsKey(layer)) {
436

    
437
                                _cachedLayers.remove(layer);
438

    
439
                        }
440

    
441
                }
442
                // Vector layers
443
                if (props.getType() == Layer3DPropsImpl.layer3DVector) {
444
                        // if (layer instanceof FLyrVect) {
445

    
446
                        // Set a 3D Legend for jordi
447
                        try {
448
                                ((FLyrVect) layer).setLegend((IVectorLegend) MapContextLocator
449
                                                .getMapContextManager().getLegend(
450
                                                                ((FLyrVect) layer).getDataStore(),
451
                                                                "project.document.view3d"));
452
                        } catch (LegendLayerException e) {
453
                                // TODO Auto-generated catch block
454
                                e.printStackTrace();
455
                        } catch (LocatorException e) {
456
                                // TODO Auto-generated catch block
457
                                e.printStackTrace();
458
                        }
459

    
460
                        VectorLayer vlayer = new VectorLayer();
461
                        vlayer.setEnabled(layer.isVisible());
462
                        vlayer.setExtent(extent);
463
                        vlayer.setDataDriver(_terrainDataManager);
464
                        System.out.println("Vectorial torpedo");
465
                        try {
466
                                _terrainLayerManager.addLayer(vlayer);
467
                        } catch (LayerManagementException e) {
468
                                // TODO Auto-generated catch block
469
                                e.printStackTrace();
470
                        }
471
                        _terrainFLayerMap.put(layer, vlayer);
472
                        _terrainLayerMap.put(vlayer.getLayerID(), layer);
473
                        props.setTerrainLayer(vlayer);
474
                }
475
                // OsgLayers
476

    
477
                // Elevation layers
478
                if (props.getType() == Layer3DPropsImpl.layer3DElevation) {
479

    
480
                        HeightfieldLayer hLayer = new HeightfieldLayer();
481
                        hLayer.setEnabled(layer.isVisible());
482
                        // Here we use extent because the older osgvp version. The new will
483
                        // be
484
                        // named envelope
485
                        hLayer.setExtent(extent);
486
                        hLayer.setDataDriver(_terrainDataManager);
487
                        hLayer.setMaxLevel(100);
488
                        hLayer.setMaxResolution(100);
489
                        // Esto esta hardcodeado
490
                        hLayer.setScaleFactor(1);
491

    
492
                        hLayer.setValidDataValues(new Vec2(-9999, 9999));
493
                        // _logger.warn("computed optimum level = "
494
                        // + computeOptimumLevel(layer, 20, 256));
495
                        // rlayer.setMaxResolution(computeOptimumLevel(layer, 21, 256));
496
                        try {
497
                                _terrainLayerManager.addLayer(hLayer);
498
                        } catch (LayerManagementException e) {
499
                                // TODO Auto-generated catch block
500
                                e.printStackTrace();
501
                        }
502
                        _terrainFLayerMap.put(layer, hLayer);
503
                        _terrainLayerMap.put(hLayer.getLayerID(), layer);
504
                        props.setTerrainLayer(hLayer);
505

    
506
                        // Delete the cachestruct if it exists, and create a new one.
507

    
508
                        if (_cachedLayers.containsKey(layer)) {
509

    
510
                                _cachedLayers.remove(layer);
511

    
512
                        }
513

    
514
                }
515

    
516
                // if (bVerifyLegend) {
517
                // _bListenToLegend = false;
518
                // props3D.VerifyLegend(_terrain.getTerrainName());
519
                // _bListenToLegend = true;
520
                // }
521
                // }
522

    
523
        }
524

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

    
618
        public IViewerContainer getCanvas3d() {
619
                return _canvas3d;
620
        }
621

    
622
        public JavaDataDriver getDataManager() {
623
                return _terrainDataManager;
624
        }
625

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

    
664
                // return null;
665
        }
666

    
667
        public LayerManager getLayerManager() {
668
                return _terrainLayerManager;
669
        }
670

    
671
        public Node getSpecialNode() {
672
                Node specialNode = null;
673
                try {
674
                        specialNode = _terrainViewer.getFeature(0);
675
                } catch (ChildIndexOutOfBoundsExceptions e) {
676

    
677
                }
678
                return specialNode;
679
        }
680

    
681
        public Terrain getTerrain() {
682
                return _terrain;
683
        }
684

    
685
        public float getVerticalExaggeration() {
686
                return _verticalExaggeration;
687
        }
688

    
689
        public IProjection getViewProjection() {
690
                return _viewProjection;
691
        }
692

    
693
        public void invalidateVectorLayer(Layer3DProps props) {
694
                // TODO Auto-generated method stub
695
                // if (_terrain == null || _viewProjection == null)
696
                // return;
697
                //
698
                // VectorCacheService cacheService = (VectorCacheService) props
699
                // .getCacheService();
700
                // if (cacheService != null) {
701
                // // use VectorCacheService to add features to terrain
702
                // cacheService.refreshFeaturesToTerrain();
703
                // }
704

    
705
        }
706

    
707
        public boolean isRenewCanvasOff() {
708
                return _renewCanvasOff;
709
        }
710

    
711
        public void layerAdded(FLayers3D parent, FLayer layer) {
712

    
713
                System.out.println("A?adida capa. Evento Capturado");
714
                // to add group layers to 3D, just add recursively child data layers
715
                if (layer instanceof FLayers) {
716
                        FLayers group = (FLayers) layer;
717
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
718
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
719
                        }
720
                        getLayer3DProps(layer).setHooked(true);
721
                        return;
722
                }
723
                //
724
                if (layer instanceof Classifiable) {
725
                        Classifiable legendLyr = (Classifiable) layer;
726
                        // legendLyr.addLegendListener((LegendListener) this);
727
                        this.addLayerListener(this);
728
                }
729
                layer.addLayerListener((LayerListener) this);
730

    
731
                // listener to manage the selection for the layers
732
                // if (layer.getClass().equals(FLyrVect.class)) {
733
                // FLyrVect lyr = (FLyrVect) layer;
734
                // refreshLayerVectorsVisibility(lyr);
735
                // try {
736
                // SelectableDataSource recordSet = lyr.getRecordset();
737
                // if (recordSet != null) {
738
                // SelectionSupport selectionSupport = recordSet
739
                // .getSelectionSupport();
740
                // selectionSupport.addSelectionListener(this);
741
                // }
742
                // } catch (ReadDriverException e) {
743
                // // TODO Auto-generated catch block
744
                // e.printStackTrace();
745
                // }
746
                // }
747

    
748
                // if (!_bLoading)
749
                Layer3DProps props3D = getLayer3DProps(layer);
750

    
751
                if (layer instanceof DefaultFLyrRaster) {
752
                        try {
753
                                // If DefaultFLayerRaster we must init the layer for the
754
                                // persistence to
755
                                // work
756
                                ((DefaultFLyrRaster) layer).init();
757
                                props3D.setType(Layer3DProps.layer3DImage);
758
                        } catch (LoadLayerException e) {
759
                                // TODO Auto-generated catch block
760
                                e.printStackTrace();
761
                        } catch (FilePaletteException e) {
762
                                // TODO Auto-generated catch block
763
                                e.printStackTrace();
764
                        }
765

    
766
                }
767

    
768
                // If it's a vectorial layer we load it as 3D by default
769
                else if (layer instanceof FLyrVect) {
770

    
771
                        props3D.setType(Layer3DProps.layer3DVector);
772

    
773
                }
774
                addLayerToTerrain(layer, true);
775

    
776
                // Only do this the first time to add layer
777
                // if (_bEmptyView && !_bLoading) {
778
                // if (layers.getLayersCount() > 0) {
779
                // try {
780
                try {
781
                        zoomToEnvelope(layer.getFullEnvelope());
782
                } catch (ReadException e) {
783
                        // TODO Auto-generated catch block
784
                        e.printStackTrace();
785
                }
786
                // } catch (ExpansionFileReadException e) {
787
                // e.printStackTrace();
788
                // } catch (ReadDriverException e) {
789
                // e.printStackTrace();
790
                // }
791
                // _bEmptyView = false;
792
                // }
793
                // }
794
                //
795
                // // PrintDebugLayers();
796

    
797
        }
798

    
799
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
800

    
801
                // System.out.println("Creando estructura de cache");
802

    
803
                // Se obtiene el datastore de la capa
804
                RasterDataStore dataStore = layer.getDataStore();
805

    
806
                // Creais la estructura de cach?
807
                TileCacheManager manager = TileCacheLocator.getManager();
808

    
809
                int coordinates = CacheStruct.FLAT;
810

    
811
                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOGRAPHIC)
812
                        coordinates = CacheStruct.GEOGRAFIC;
813

    
814
                DefaultRasterProvider provider = (DefaultRasterProvider) dataStore
815
                                .getProvider();
816

    
817
                provider.setProjection(layer.getProjection());
818

    
819
                // El epsg suele tener la forma EPSG:4326
820
                String epsg = null;
821
                IProjection proj = provider.getProjection();
822
                if (proj != null)
823
                        epsg = proj.getAbrev();
824

    
825
                int resolution = 512;
826

    
827
                int type = getLayer3DProps(layer).getType();
828

    
829
                // if elevation layer, lower the tile resolution
830
                if (type == Layer3DProps.layer3DElevation)
831

    
832
                        resolution = 32;
833

    
834
                CacheStruct struct = manager.createCacheStructure(coordinates,
835
                                TileCacheLibrary.DEFAULT_LEVELS, provider.getExtent()
836
                                                .toRectangle2D(), provider.getCellSize(), resolution,
837
                                resolution, provider.getFullName(),
838
                                TileCacheLibrary.DEFAULT_STRUCTURE,
839
                                RasterLibrary.pathTileCache, "jpg", epsg, provider
840
                                                .getFileSize());
841

    
842
                return struct;
843

    
844
        }
845

    
846
        private void refreshLayerVectorsVisibility(FLayer lyr) {
847
                // if (_terrain == null || _viewProjection == null)
848
                // return;
849
                //
850
                // Layer3DProps props3D = getLayer3DProps(lyr);
851
                //
852
                // VectorCacheService cacheService = (VectorCacheService) props3D
853
                // .getCacheService();
854
                // if (cacheService != null) {
855
                // // use VectorCacheService to add features to terrain
856
                // cacheService.refreshFeaturesToTerrain(lyr.isVisible());
857
                // props3D.drawVersion = lyr.getDrawVersion();
858
                // }
859

    
860
        }
861

    
862
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
863
                        int newPos) {
864
                if (layer instanceof FLayers) {
865
                        FLayers group = (FLayers) layer;
866
                        if (newPos > oldPos) {
867
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
868
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
869
                                                        oldPos, newPos);
870
                        } else {
871
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
872
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
873
                                                        oldPos, newPos);
874
                        }
875
                        return;
876
                }
877

    
878
                Layer3DProps props3D = getLayer3DProps(layer);
879
                refreshLayerInTerrain(props3D, false);
880

    
881
                int type = props3D.getType();
882

    
883
                // Now reorder in layer manager only for terrain layer types
884
                if ((type == Layer3DProps.layer3DOSG)
885
                                || ((type == Layer3DProps.layer3DVector)))
886
                        return;
887

    
888
                // Obtain the old position in the layer
889
                Layer terrainLayer = _terrainFLayerMap.get(layer);
890
                Vector<Integer> terrainOldPos = null;
891
                try {
892
                        terrainOldPos = _terrainLayerManager.getOrder(terrainLayer);
893
                } catch (LayerManagementException e) {
894
                        // TODO Auto-generated catch block
895
                        e.printStackTrace();
896
                }
897

    
898
                int terrainNewPos = 0;
899
                // Compute the new position.
900
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
901
                while (lyrIterator.hasNext()) {
902
                        FLayer auxLayer = lyrIterator.next();
903
                        if (auxLayer == layer)
904
                                break;
905
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
906
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
907
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
908
                                terrainNewPos++;
909
                        }
910

    
911
                }
912

    
913
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
914
                        return;
915
                if (terrainOldPos.get(0) != terrainNewPos)
916
                        try {
917
                                _terrainLayerManager.moveLayer(terrainOldPos.get(0),
918
                                                terrainNewPos);
919
                        } catch (LayerManagementException e) {
920
                                // TODO Auto-generated catch block
921
                                e.printStackTrace();
922
                        }
923
                //
924
                // System.out.println("En el toc antes era el " + oldPos +
925
                // " y ahora el "
926
                // + newPos);
927
                // System.out.println("En el terrain antes era el " + terrainOldPos
928
                // + " y ahora el " + terrainNewPos);
929

    
930
                // PrintDebugLayers();
931

    
932
        }
933

    
934
        public void layerRemoved(FLayers3D parent, FLayer layer) {
935
                System.out.println("Removed layer");
936

    
937
                // to remove group layers to 3D, just remove recursively child data
938
                // layers
939
                if (layer instanceof FLayers) {
940
                        FLayers group = (FLayers) layer;
941
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
942
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
943
                        }
944
                        getLayer3DProps(layer).setHooked(false);
945
                        return;
946
                }
947

    
948
                if (layer instanceof Classifiable) {
949
                        Classifiable legendLyr = (Classifiable) layer;
950
                        legendLyr.removeLegendListener((LegendListener) this);
951
                }
952

    
953
                layer.removeLayerListener((LayerListener) this);
954

    
955
                removeLayerToTerrain(layer);
956

    
957
                // All layers are removed
958
                if (layers.getLayersCount() == 0) {
959
                        _bEmptyView = true;
960
                }
961

    
962
                // PrintDebugLayers();
963

    
964
        }
965

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

    
991
                                        }
992
                                }
993
                        }
994

    
995
                        // IWindow f = PluginServices.getMDIManager().getActiveWindow();
996
                        // if (f instanceof BaseView) {
997
                        // BaseView view3D = (BaseView) f;
998
                        // view3D.getTOC().refresh();
999
                        // }
1000
                }
1001
                visibilityChange = false;
1002

    
1003
        }
1004

    
1005
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1006

    
1007
                if (_terrainLayerMap.size() == 0)
1008
                        return null;
1009
                if (rde == null)
1010
                        return null;
1011
                if (rde.getExtent() == null || rde.getLayer() == null
1012
                                || rde.getLayerManager() == null)
1013
                        return null;
1014

    
1015
                String layerID = rde.getLayer().getLayerID();
1016
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1017
                if (layer == null)
1018
                        return null;
1019
                if (!layer.isVisible())
1020
                        return null;
1021
                double minX, minY, width, height;
1022

    
1023
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1024
                        minX = rde.getExtent().xMin();
1025
                        minY = rde.getExtent().yMin();
1026
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1027
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1028

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

    
1053
                // Case of Raster data
1054

    
1055
                UpdateDataEvent ude = null;
1056

    
1057
                if (rde.getLayer().getLayerType() == Layer.LayerType.TEXTURELAYER)
1058
                        ude = loadRasterData(layer, envelope, rde);
1059

    
1060
                if (rde.getLayer().getLayerType() == Layer.LayerType.VECTORLAYER)
1061
                        ude = loadVectorData(layer, envelope, rde);
1062

    
1063
                if (rde.getLayer().getLayerType() == Layer.LayerType.HEIGHTFIELDLAYER)
1064
                        ude = loadElevationData(layer, envelope, rde);
1065

    
1066
                return ude;
1067
        }
1068

    
1069
        private UpdateDataEvent loadRasterData(FLayer layer, Envelope envelope,
1070
                        RequestDataEvent rde) {
1071

    
1072
                UpdateDataEvent ude = new UpdateDataEvent();
1073
                ude.copyDataFromRequest(rde);
1074
                if (layer instanceof DefaultFLyrRaster) {
1075
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1076
                        boolean hasCache = true;
1077
                        if (rLayer.getDataStore().getInternalParameters() instanceof NetCDFDataParameters)
1078
                                hasCache = false;
1079

    
1080
                        if (hasCache) {
1081

    
1082
                                rLayer = (DefaultFLyrRaster) layer;
1083
                                boolean exists = _cachedLayers.containsKey(rLayer);
1084

    
1085
                                if (!exists) {
1086

    
1087
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1088

    
1089
                                }
1090

    
1091
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1092

    
1093
                                RasterQuery query = RasterLocator.getManager().createQuery();
1094

    
1095
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1096
                                                .getManager()
1097
                                                .getDataStructFactory()
1098
                                                .createExtent(envelope.getLowerCorner().getX(),
1099
                                                                envelope.getUpperCorner().getY(),
1100
                                                                envelope.getUpperCorner().getX(),
1101
                                                                envelope.getLowerCorner().getY());
1102

    
1103
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1104
                                                rde.getTileY(), extent, cacheStruct);
1105

    
1106
                                // query.setAreaOfInterest(extent, 512, 512);
1107

    
1108
                                // System.out.println("Tile Parameters:");
1109
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1110
                                // System.out.println("TileX = " + rde.getTileX());
1111
                                // System.out.println("TileY = " + rde.getTileY());
1112
                                // System.out.println("Extent = " + extent.getULX() + " "
1113
                                // + extent.getULY() + " " + extent.getLRX() + " "
1114
                                // + extent.getLRY());
1115

    
1116
                                try {
1117
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1118
                                        Buffer rBuff = (Buffer) result[0];
1119
                                        Buffer transparencyBuffer;
1120

    
1121
                                        if (result.length < 2)
1122
                                                transparencyBuffer = null;
1123
                                        else
1124
                                                transparencyBuffer = (Buffer) result[1];
1125

    
1126
                                        // int numBands = rBuff.getBandCount();
1127
                                        int numBands = rLayer.getDataStore().getBandCount();
1128

    
1129
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1130
                                        // + " alto: " + rBuff.getHeight()
1131
                                        // + " bandas totales incluyendo alpha (si tiene): "
1132
                                        // + numBands);
1133

    
1134
                                        byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight()
1135
                                                        * numBands];
1136

    
1137
                                        int dataType = convertDataType(rBuff.getDataType());
1138
                                        int pixelFormat = convertPixelFormat(numBands);
1139

    
1140
                                        int colorBands = numBands;
1141

    
1142
                                        if (transparencyBuffer != null)
1143
                                                colorBands--;
1144

    
1145
                                        int cont = 0;
1146

    
1147
                                        for (int i = 0; i < rBuff.getWidth(); i++) {
1148

    
1149
                                                for (int j = 0; j < rBuff.getHeight(); j++) {
1150

    
1151
                                                        for (int k = 0; k < colorBands; k++) {
1152

    
1153
                                                                switch (rBuff.getDataType()) {
1154
                                                                case Buffer.TYPE_BYTE:
1155
                                                                        data[cont] = (byte) (rBuff.getElemByte(i,
1156
                                                                                        j, k));
1157
                                                                        cont++;
1158
                                                                        break;
1159
                                                                case Buffer.TYPE_DOUBLE:
1160
                                                                        data[cont] = (byte) (Math.round(rBuff
1161
                                                                                        .getElemDouble(i, j, k)));
1162
                                                                        cont++;
1163
                                                                        break;
1164
                                                                case Buffer.TYPE_FLOAT:
1165
                                                                        data[cont] = (byte) (Math.round(rBuff
1166
                                                                                        .getElemFloat(i, j, k)));
1167
                                                                        cont++;
1168
                                                                        break;
1169
                                                                case Buffer.TYPE_INT:
1170
                                                                        data[cont] = (byte) (rBuff.getElemInt(i, j,
1171
                                                                                        k) & 0xffffffff);
1172
                                                                        cont++;
1173
                                                                        break;
1174
                                                                case Buffer.TYPE_SHORT:
1175
                                                                case Buffer.TYPE_USHORT:
1176
                                                                        data[cont] = (byte) (rBuff.getElemShort(i,
1177
                                                                                        j, k) & 0xffff);
1178
                                                                        cont++;
1179
                                                                        break;
1180
                                                                }
1181
                                                        }
1182

    
1183
                                                        if (transparencyBuffer != null) {
1184

    
1185
                                                                switch (transparencyBuffer.getDataType()) {
1186
                                                                case Buffer.TYPE_BYTE:
1187

    
1188
                                                                        if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1189
                                                                                data[cont] = (byte) (0);
1190
                                                                        else
1191
                                                                                data[cont] = (byte) (255);
1192
                                                                        cont++;
1193
                                                                        break;
1194
                                                                case Buffer.TYPE_DOUBLE:
1195
                                                                        data[cont] = (byte) (Math
1196
                                                                                        .round(transparencyBuffer
1197
                                                                                                        .getElemInt(i, j, 0)));
1198
                                                                        cont++;
1199
                                                                        break;
1200
                                                                case Buffer.TYPE_FLOAT:
1201
                                                                        data[cont] = (byte) (Math
1202
                                                                                        .round(transparencyBuffer
1203
                                                                                                        .getElemFloat(i, j, 0)));
1204
                                                                        cont++;
1205
                                                                        break;
1206
                                                                case Buffer.TYPE_INT:
1207
                                                                        data[cont] = (byte) (transparencyBuffer
1208
                                                                                        .getElemInt(i, j, 0) & 0xffffffff);
1209
                                                                        cont++;
1210
                                                                        break;
1211
                                                                case Buffer.TYPE_SHORT:
1212
                                                                case Buffer.TYPE_USHORT:
1213
                                                                        data[cont] = (byte) (transparencyBuffer
1214
                                                                                        .getElemShort(i, j, 0) & 0xffff);
1215
                                                                        cont++;
1216
                                                                        break;
1217
                                                                }
1218

    
1219
                                                        }
1220

    
1221
                                                }
1222

    
1223
                                        }
1224
                                        ude.setRasterData(
1225
                                                        data,
1226
                                                        rBuff.getWidth(),
1227
                                                        rBuff.getHeight(),
1228
                                                        numBands,
1229
                                                        pixelFormat,
1230
                                                        org.gvsig.osgvp.core.osg.Image.DataType.GL_UNSIGNED_BYTE);
1231

    
1232
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1233

    
1234
                                } catch (ProcessInterruptedException e) {
1235
                                        // TODO Auto-generated catch block
1236
                                        e.printStackTrace();
1237
                                } catch (RasterDriverException e) {
1238
                                        e.printStackTrace();
1239
                                } catch (InvalidSetViewException e) {
1240
                                        // TODO Auto-generated catch block
1241
                                        e.printStackTrace();
1242
                                } catch (NullPointerException e) {
1243
                                        // ude.setFailData();
1244
                                        // System.out.println("Problem getting the tile");
1245
                                }
1246

    
1247
                        }
1248
                        // No cache
1249
                        else {
1250
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1251
                        }
1252

    
1253
                }
1254

    
1255
                // Vectorial rasterized
1256
                else if (layer instanceof FLyrVect) {
1257
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1258
                }
1259
                // unrecognized layer type
1260
                else {
1261
                        ude.setFailData();
1262
                }
1263

    
1264
                return ude;
1265
        }
1266

    
1267
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1268
                        RequestDataEvent rde) {
1269

    
1270
                System.out.println("vector data");
1271
                UpdateDataEvent ude = new UpdateDataEvent();
1272
                ude.copyDataFromRequest(rde);
1273
                
1274
                SimpleFill3DSymbol sy = (SimpleFill3DSymbol) ((FLyrVect) layer)
1275
                .getLegend().getDefaultSymbol();
1276
                
1277
//                SimpleMarker3DSymbol sy = (SimpleMarker3DSymbol) ((FLyrVect) layer)
1278
//                                .getLegend().getDefaultSymbol();
1279

    
1280
                ViewPort vp = new ViewPort(_viewProjection);
1281
                vp.setEnvelope(envelope); // the real extent of the tile
1282
                vp.setAdjustable(false);
1283
                vp.setImageSize(new Dimension(256, 256));
1284
                vp.setDist1pixel(0.000000001);
1285
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1286

    
1287
                try {
1288
                        layer.draw(null, null, vp, new MyCancel(), scale);
1289
                } catch (ReadException e) {
1290
                        // TODO Auto-generated catch block
1291
                        e.printStackTrace();
1292
                }
1293

    
1294
                // OSG Layers
1295
                DataStore ds = ((SingleLayer) layer).getDataStore();
1296
                Node n = null;
1297

    
1298
                if (ds.getProviderName() == "OSG") {
1299
                        try {
1300
                                n = (Node) ds.invokeDynMethod("getNode", null);
1301
                        } catch (DynMethodException e) {
1302
                                // TODO Auto-generated catch block
1303
                                e.printStackTrace();
1304
                        }
1305
                        System.out.println("OSG Layer added");
1306

    
1307
                }
1308
                /// Vectorial layers
1309
//                else {
1310
//                        // HACK: TODO create a SymbolFactory
1311
//                        SimpleMarker sm = null;
1312
//
1313
//                        try {
1314
//                                sm = new SimpleMarker();
1315
//                        } catch (NodeException e) {
1316
//                                // TODO Auto-generated catch block
1317
//                                e.printStackTrace();
1318
//                        }
1319
//                        sm.setPointSize((float) sy.getSize());
1320
//                        Color color = sy.getColor();
1321
//                        sm.setColor(color);
1322
//                        n = sm.buildSceneGraph(sy.getGeometry());
1323
//                        //n = sm.buildSceneGraph(sy.getGeometry());
1324
//                }
1325

    
1326
                ude.setVectorData(n);
1327

    
1328
                return ude;
1329
        }
1330

    
1331
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1332
                        RequestDataEvent rde) {
1333

    
1334
                UpdateDataEvent ude = new UpdateDataEvent();
1335
                ude.copyDataFromRequest(rde);
1336

    
1337
                if (layer instanceof DefaultFLyrRaster) {
1338
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1339
                        boolean hasCache = true;
1340
                        if (rLayer.getDataStore().getInternalParameters() instanceof NetCDFDataParameters)
1341
                                hasCache = false;
1342

    
1343
                        if (hasCache) {
1344

    
1345
                                rLayer = (DefaultFLyrRaster) layer;
1346
                                boolean exists = _cachedLayers.containsKey(rLayer);
1347

    
1348
                                if (!exists) {
1349

    
1350
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1351

    
1352
                                }
1353

    
1354
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1355

    
1356
                                RasterQuery query = RasterLocator.getManager().createQuery();
1357

    
1358
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1359
                                                .getManager()
1360
                                                .getDataStructFactory()
1361
                                                .createExtent(envelope.getLowerCorner().getX(),
1362
                                                                envelope.getUpperCorner().getY(),
1363
                                                                envelope.getUpperCorner().getX(),
1364
                                                                envelope.getLowerCorner().getY());
1365

    
1366
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1367
                                                rde.getTileY(), extent, cacheStruct);
1368

    
1369
                                // query.setAreaOfInterest(extent, 512, 512);
1370

    
1371
                                // System.out.println("Tile Parameters:");
1372
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1373
                                // System.out.println("TileX = " + rde.getTileX());
1374
                                // System.out.println("TileY = " + rde.getTileY());
1375
                                // System.out.println("Extent = " + extent.getULX() + " "
1376
                                // + extent.getULY() + " " + extent.getLRX() + " "
1377
                                // + extent.getLRY());
1378

    
1379
                                try {
1380
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1381
                                        Buffer rBuff = (Buffer) result[0];
1382
                                        Buffer transparencyBuffer;
1383

    
1384
                                        if (result.length < 2)
1385
                                                transparencyBuffer = null;
1386
                                        else
1387
                                                transparencyBuffer = (Buffer) result[1];
1388

    
1389
                                        int numBands = rBuff.getBandCount();
1390
                                        if (transparencyBuffer != null) {
1391

    
1392
                                                // System.out
1393
                                                // .println("Tengo Transparency buffer con "
1394
                                                // + transparencyBuffer.getBandCount()
1395
                                                // + " bandas");
1396
                                                numBands++;
1397

    
1398
                                        }
1399

    
1400
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1401
                                        // + " alto: " + rBuff.getHeight()
1402
                                        // + " bandas totales incluyendo alpha (si tiene): "
1403
                                        // + numBands);
1404

    
1405
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1406
                                                        .getHeight()) / 64];
1407

    
1408
                                        int dataType = convertDataType(rBuff.getDataType());
1409
                                        int pixelFormat = convertPixelFormat(numBands);
1410

    
1411
                                        // K hay que setearlo en el dialogo
1412
                                        int cont = 0, k = 0;
1413

    
1414
                                        for (int i = rBuff.getWidth() - 1; i >= 0; i = i - 8) {
1415
                                                // Vertical Flip needed
1416
                                                for (int j = 0; j < rBuff.getHeight(); j = j + 8) {
1417

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

    
1446
                                                }
1447

    
1448
                                        }
1449
                                        ude.setHeightfieldData(data, rBuff.getWidth() / 8,
1450
                                                        rBuff.getHeight() / 8);
1451

    
1452
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1453

    
1454
                                } catch (ProcessInterruptedException e) {
1455
                                        // TODO Auto-generated catch block
1456
                                        e.printStackTrace();
1457
                                } catch (RasterDriverException e) {
1458
                                        e.printStackTrace();
1459
                                } catch (InvalidSetViewException e) {
1460
                                        // TODO Auto-generated catch block
1461
                                        e.printStackTrace();
1462
                                } catch (NullPointerException e) {
1463
                                        // ude.setFailData();
1464
                                        System.out.println("Problem getting the tile");
1465
                                }
1466

    
1467
                        }
1468
                        // No cache
1469
                        else {
1470
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1471
                        }
1472

    
1473
                }
1474

    
1475
                // Vectorial rasterized
1476
                else if (layer instanceof FLyrVect) {
1477
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1478
                }
1479
                // unrecognized layer type
1480
                else {
1481
                        ude.setFailData();
1482
                }
1483

    
1484
                return ude;
1485

    
1486
        }
1487

    
1488
        protected int convertDataType(int type) {
1489

    
1490
                switch (type) {
1491

    
1492
                case DataBuffer.TYPE_BYTE:
1493
                        return org.gvsig.osgvp.core.osg.Image.DataType.GL_BYTE;
1494

    
1495
                case DataBuffer.TYPE_DOUBLE:
1496
                        return org.gvsig.osgvp.core.osg.Image.DataType.GL_DOUBLE;
1497

    
1498
                case DataBuffer.TYPE_FLOAT:
1499
                        return org.gvsig.osgvp.core.osg.Image.DataType.GL_FLOAT;
1500

    
1501
                case DataBuffer.TYPE_INT:
1502
                        return org.gvsig.osgvp.core.osg.Image.DataType.GL_INT;
1503

    
1504
                case DataBuffer.TYPE_SHORT:
1505
                        return org.gvsig.osgvp.core.osg.Image.DataType.GL_SHORT;
1506

    
1507
                case DataBuffer.TYPE_USHORT:
1508
                        return org.gvsig.osgvp.core.osg.Image.DataType.GL_UNSIGNED_SHORT;
1509

    
1510
                }
1511

    
1512
                return org.gvsig.osgvp.core.osg.Image.DataType.GL_BYTE;
1513

    
1514
        }
1515

    
1516
        protected int convertPixelFormat(int type) {
1517

    
1518
                switch (type) {
1519

    
1520
                case 1:
1521
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1522

    
1523
                case 2:
1524
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1525

    
1526
                case 3:
1527
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1528

    
1529
                case 4:
1530
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1531

    
1532
                }
1533

    
1534
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1535

    
1536
        }
1537

    
1538
        protected class MyCancel implements Cancellable {
1539
                private boolean cancel = false;
1540

    
1541
                public MyCancel() {
1542
                }
1543

    
1544
                public void setCanceled(boolean canceled) {
1545
                        cancel = canceled;
1546
                }
1547

    
1548
                public boolean isCanceled() {
1549
                        return cancel;
1550
                }
1551
        }
1552

    
1553
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1554

    
1555
                int size = 256;
1556
                BufferedImage image = new BufferedImage(size, size,
1557
                                BufferedImage.TYPE_4BYTE_ABGR);
1558

    
1559
                ViewPort vp = new ViewPort(_viewProjection);
1560
                vp.setEnvelope(envelope); // the real extent of the tile
1561

    
1562
                vp.setAdjustable(false);
1563
                vp.setImageSize(new Dimension(size, size));
1564
                vp.setDist1pixel(0.000000001);
1565

    
1566
                Graphics2D graphics = image.createGraphics();
1567
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1568
                // background
1569
                graphics.setColor(backgColor);
1570
                graphics.fillRect(0, 0, size, size);
1571

    
1572
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1573

    
1574
                try {
1575
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1576

    
1577
                } catch (Exception e) {
1578
                        return null;
1579
                }
1580

    
1581
                return image;
1582

    
1583
        }
1584

    
1585
        public void nameChanged(LayerEvent e) {
1586
                System.out.println("Name change");
1587

    
1588
        }
1589

    
1590
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
1591

    
1592
                System.out.println("Refresh");
1593
                if (props == null)
1594
                        return;
1595

    
1596
                if (_terrain == null)
1597
                        return; // view not opened yet
1598

    
1599
                // clear cache
1600

    
1601
                // refresh layer in terrain
1602
                int type = props.getType();
1603
                if ((type == Layer3DProps.layer3DImage)
1604
                                || (type == Layer3DProps.layer3DElevation)
1605
                                || (type == Layer3DProps.layer3DVectorMR)) {
1606

    
1607
                        try {
1608
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
1609
                        } catch (LayerManagementException e) {
1610
                                // TODO Auto-generated catch block
1611
                                e.printStackTrace();
1612
                        }
1613
                } else if (type == Layer3DProps.layer3DVector) {
1614
                        invalidateVectorLayer(props);
1615
                }
1616

    
1617
        }
1618

    
1619
        public boolean removeCache(File path) {
1620
                if (path.exists()) {
1621
                        File[] files = path.listFiles();
1622
                        for (int i = 0; i < files.length; i++) {
1623
                                if (files[i].isDirectory()) {
1624
                                        removeCache(files[i]);
1625
                                } else {
1626
                                        files[i].delete();
1627
                                }
1628
                        }
1629
                }
1630
                return (path.delete());
1631
        }
1632

    
1633
        public void removeLayerToTerrain(FLayer layer) {
1634
                // TODO Auto-generated method stub
1635
                Layer3DProps props3D = getLayer3DProps(layer);
1636

    
1637
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1638
                        // DeleteVectors(layer, props3D);
1639
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1640
                        DeleteOSGLayer(layer, props3D);
1641
                } else {
1642
                        Layer terrainLayer = _terrainFLayerMap.get(layer);
1643
                        if (terrainLayer != null) {
1644
                                // FLayerCacheService cacheService = (FLayerCacheService)
1645
                                // props3D
1646
                                // .getCacheService();
1647
                                // if (cacheService != null)
1648
                                // try {
1649
                                // cacheService.free();
1650
                                // } catch (Throwable e) {
1651
                                // // TODO Auto-generated catch block
1652
                                // e.printStackTrace();
1653
                                // }
1654
                                _terrainLayerMap.remove(terrainLayer.getLayerID());
1655
                                _terrainFLayerMap.remove(layer);
1656

    
1657
                                try {
1658
                                        _terrainLayerManager.removeLayer(terrainLayer);
1659
                                } catch (LayerManagementException e) {
1660
                                        // TODO Auto-generated catch block
1661
                                        e.printStackTrace();
1662
                                }
1663
                        }
1664
                }
1665

    
1666
        }
1667

    
1668
        public void selectionChanged(SelectionEvent e) {
1669
                // TODO Auto-generated method stub
1670
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1671
                // while (lyrIterator.hasNext()) {
1672
                // FLayer layer = lyrIterator.next();
1673
                // Layer3DProps props3D = getLayer3DProps(layer);
1674
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
1675
                // if (layer.getClass().equals(FLyrVect.class)) {
1676
                // FLyrVect lyr = (FLyrVect) layer;
1677
                //
1678
                // FBitSet selection = null;
1679
                // try {
1680
                // selection = lyr.getRecordset().getSelectionSupport()
1681
                // .getSelection();
1682
                // } catch (ReadDriverException e1) {
1683
                // // TODO Auto-generated catch block
1684
                // e1.printStackTrace();
1685
                // }
1686
                //
1687
                // if ((selection.cardinality() == 0)
1688
                // || (!(selection.isEmpty()))) {
1689
                // Layer3DProps props = Layer3DProps
1690
                // .getLayer3DProps(layer);
1691
                // refreshLayerInTerrain(props, true);
1692
                // if (layer instanceof FLyrVect) {
1693
                // FLyrVect fvect = (FLyrVect) layer;
1694
                // props.drawVersion = fvect.getDrawVersion();
1695
                // }
1696
                // }
1697
                // }
1698
                // }
1699
                // }
1700

    
1701
        }
1702

    
1703
        public void setDataManager(JavaDataDriver manager) {
1704
                _terrainDataManager = manager;
1705
                _terrainDataManager.setDataLoader(this);
1706

    
1707
        }
1708

    
1709
        public void setLayerManager(LayerManager manager) {
1710
                _terrainLayerManager = manager;
1711

    
1712
        }
1713

    
1714
        public void setLoading(boolean bLoading) {
1715
                _bLoading = bLoading;
1716

    
1717
        }
1718

    
1719
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1720
                _renewCanvasOff = renewCanvasOff;
1721

    
1722
        }
1723

    
1724
        public void setTerrain(Terrain terrain) {
1725
                if (_terrain == terrain)
1726
                        return;
1727

    
1728
                _terrain = terrain;
1729

    
1730
                // add layers to terrain necessary when we are loading
1731
                addCurrentLayers();
1732

    
1733
        }
1734

    
1735
        public void setVerticalExaggeration(float verticalExaggeration) {
1736
                _verticalExaggeration = verticalExaggeration;
1737

    
1738
        }
1739

    
1740
        public void setViewProjection(IProjection projection) {
1741
                _viewProjection = projection;
1742

    
1743
        }
1744

    
1745
        public void setViewer(IViewerContainer canvas) {
1746
                _canvas3d = canvas;
1747
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
1748

    
1749
        }
1750

    
1751
        public void visibilityChanged(LayerEvent e) {
1752
                FLayer lyr = e.getSource();
1753

    
1754
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
1755
                // refreshLayerVectorsVisibility(lyr);
1756
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1757
                // refreshLayer3DOSGVisibility(lyr);
1758
                // } else {
1759
                refreshLayerVisibility(lyr);
1760
                // }
1761
                visibilityChange = true;
1762

    
1763
        }
1764

    
1765
        private void refreshLayerVisibility(FLayer layer) {
1766

    
1767
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1768
                terrainLayer.setEnabled(layer.isVisible());
1769
                // _terrainLayerManager.updateLayers();
1770

    
1771
        }
1772

    
1773
        public void zoomToEnvelope(Envelope geoEnvelope) {
1774
                if (geoEnvelope == null)
1775
                        return;
1776
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
1777
                        return;
1778

    
1779
                double maxHeight = 0.0;
1780

    
1781
                // Getting envelope positions
1782
                double minLat = geoEnvelope.getMinimum(0);
1783
                double maxLat = geoEnvelope.getMaximum(0);
1784
                double cenLon = geoEnvelope.getCenter(0);
1785
                double cenLat = geoEnvelope.getCenter(1);
1786

    
1787
                double elevation = 0;
1788

    
1789
                // calculate altitude
1790
                double avLat = 0;
1791
                if (minLat > 0.0 || maxLat < 0.0)
1792
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1793
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
1794

    
1795
                double terrainRadius = _terrain.getRadiusEquatorial();
1796
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
1797
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1798
                                * (1 - Math.cos(Math.toRadians(avLon))));
1799
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
1800
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
1801

    
1802
                // Calculate XYZ positions for camera.
1803

    
1804
                int terrainType = _terrain.getCoordinateSystemType();
1805

    
1806
                double zoomFactor = 1.5;
1807
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
1808
                        zoomFactor = 1.3;
1809
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1810

    
1811
                Vec3 eye = new Vec3();
1812
                Vec3 center = new Vec3();
1813
                Vec3 up = new Vec3();
1814
                // Calculate positions for PLAIN MODE.
1815
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
1816

    
1817
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
1818
                                        .getMinimum(1)) / 1.2d;
1819
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
1820
                                        .getMinimum(0)) / 1.2d;
1821
                        double height;
1822

    
1823
                        height = Math.sqrt(difx * difx + dify * dify);
1824
                        double fullWindowFactor = 1.7;
1825
                        // EYE
1826
                        eye.setX(cenLon);
1827
                        eye.setY(cenLat);
1828
                        eye.setZ(height * fullWindowFactor);
1829
                        // CENTER
1830
                        center.setX(cenLon);
1831
                        center.setY(cenLat);
1832
                        center.setZ(0.0);
1833
                        // UP
1834
                        up.setX(0.0);
1835
                        up.setY(1.0);
1836
                        up.setZ(0.0);
1837
                } else
1838
                // Calculate positions for SPHERICAL MODE.
1839
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
1840
                        // EYE
1841
                        Vec3 aux = new Vec3(cenLon, cenLat, elevation);
1842
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
1843
                        // CENTER
1844
                        center.setX(0.0);
1845
                        center.setY(0.0);
1846
                        center.setZ(0.0);
1847
                        // UP
1848
                        up.setX(0.0);
1849
                        up.setY(0.0);
1850
                        up.setZ(1.0);
1851
                }
1852
                Camera cam = new Camera();
1853
                cam.setViewByLookAt(eye, center, up);
1854

    
1855
                _terrainViewer.setCamera(cam);
1856

    
1857
        }
1858

    
1859
        public void editionChanged(LayerEvent e) {
1860
                // TODO Auto-generated method stub
1861

    
1862
        }
1863

    
1864
        public void drawValueChanged(LayerEvent e) {
1865
                // TODO Auto-generated method stub
1866

    
1867
        }
1868

    
1869
        public boolean symbolChanged(SymbolLegendEvent e) {
1870

    
1871
                System.out.println("Symbol changed");
1872
                return false;
1873
        }
1874

    
1875
        public void legendCleared(LegendClearEvent event) {
1876
                // TODO Auto-generated method stub
1877

    
1878
        }
1879

    
1880
        public static class RegisterPersistence implements Callable {
1881

    
1882
                public Object call() throws Exception {
1883
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
1884
                        if (manager.getDefinition(MapContext.class) == null) {
1885
                                MapContext.registerPersistent();
1886
                        }
1887
                        DynStruct definition = manager.addDefinition(
1888
                                        MapContext3DImpl.class, "MapContext3DImpl",
1889
                                        "MapContext3DImpl Persistence definition", null, null);
1890
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
1891
                                        "MapContext");
1892

    
1893
                        return Boolean.TRUE;
1894
                }
1895
        }
1896

    
1897
}