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

History | View | Annotate | Download (56.5 KB)

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

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

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

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

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

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

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

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

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

    
160
        private boolean visibilityChange = false;
161

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

    
165
        int maxBands = 3;
166

    
167
        public MapContext3DImpl() {
168
        }
169

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

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

    
176
                super(fLayers, vp);
177

    
178
        }
179

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

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

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

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

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

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

    
224
                }
225

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

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

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

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

    
263
                }
264
        }
265

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

    
282
        }
283

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

    
295
        }
296

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

    
315
        }
316

    
317
        public void activationChanged(LayerEvent e) {
318

    
319
        }
320

    
321
        public void addCurrentLayers() {
322

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

    
330
        }
331

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

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

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

    
346
                geoMan = GeometryLocator.getGeometryManager();
347

    
348
                if (layerEnvelope == null) {
349

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

    
359
                                else {
360

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

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

    
376
                }
377

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

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

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

    
393
                }
394

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

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

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

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

    
447
                                _cachedLayers.remove(layer);
448

    
449
                        }
450

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

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

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

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

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

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

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

    
518
                                _cachedLayers.remove(layer);
519

    
520
                        }
521

    
522
                }
523

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

    
531
        }
532

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

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

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

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

    
672
                // return null;
673
        }
674

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

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

    
685
                }
686
                return specialNode;
687
        }
688

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

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

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

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

    
713
        }
714

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

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

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

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

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

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

    
774
                }
775

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

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

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

    
804
        }
805

    
806
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
807

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

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

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

    
816
                int coordinates = CacheStruct.FLAT;
817

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

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

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

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

    
832
                int resolution = 256;
833

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

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

    
839
                        resolution = 32;
840

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

    
849
                return struct;
850

    
851
        }
852

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

    
867
        }
868

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

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

    
888
                int type = props3D.getType();
889

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

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

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

    
918
                }
919

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

    
937
                // PrintDebugLayers();
938

    
939
        }
940

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

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

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

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

    
962
                removeLayerToTerrain(layer);
963

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

    
969
                // PrintDebugLayers();
970

    
971
        }
972

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

    
998
                                        }
999
                                }
1000
                        }
1001

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

    
1010
        }
1011

    
1012
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1013

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

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

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

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

    
1060
                // Case of Raster data
1061

    
1062
                UpdateDataEvent ude = null;
1063

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

    
1067
                if (rde.getLayer().getLayerType() == Layer.LayerType.VECTORLAYER)
1068
                        ude = loadVectorData(layer, envelope, rde);
1069

    
1070
                if (rde.getLayer().getLayerType() == Layer.LayerType.HEIGHTFIELDLAYER)
1071
                        ude = loadElevationData(layer, envelope, rde);
1072

    
1073
                return ude;
1074
        }
1075

    
1076
        private UpdateDataEvent loadRasterData(FLayer layer, Envelope envelope,
1077
                        RequestDataEvent rde) {
1078

    
1079
                UpdateDataEvent ude = new UpdateDataEvent();
1080
                ude.copyDataFromRequest(rde);
1081
                if (layer instanceof DefaultFLyrRaster) {
1082
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1083

    
1084
                        if (rLayer.getDataStore().isTiled()) {
1085

    
1086
                                rLayer = (DefaultFLyrRaster) layer;
1087

    
1088
                                boolean exists = _cachedLayers.containsKey(rLayer);
1089

    
1090
                                if (!exists) {
1091

    
1092
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1093

    
1094
                                }
1095

    
1096
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1097

    
1098
                                RasterQuery query = RasterLocator.getManager().createQuery();
1099

    
1100
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1101
                                                .getManager()
1102
                                                .getDataStructFactory()
1103
                                                .createExtent(envelope.getLowerCorner().getX(),
1104
                                                                envelope.getUpperCorner().getY(),
1105
                                                                envelope.getUpperCorner().getX(),
1106
                                                                envelope.getLowerCorner().getY());
1107

    
1108
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1109
                                                rde.getTileY(), extent, null);
1110

    
1111
                                // query.setAreaOfInterest(extent, 512, 512);
1112

    
1113
//                                 System.out.println("Tile Parameters:");
1114
//                                 System.out.println("TileLevel: " + rde.getTileLevel());
1115
//                                 System.out.println("TileX = " + rde.getTileX());
1116
//                                 System.out.println("TileY = " + rde.getTileY());
1117
//                                 System.out.println("Extent = " + extent.getULX() + " "
1118
//                                 + extent.getULY() + " " + extent.getLRX() + " "
1119
//                                 + extent.getLRY());
1120

    
1121
                                try {
1122
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1123
                                        Buffer rBuff = (Buffer) result[0];
1124
                                        Buffer transparencyBuffer;
1125
                                        int suma = 0;
1126

    
1127
                                        transparencyBuffer = (Buffer) result[1];
1128

    
1129
                                        if (transparencyBuffer != null)
1130
                                                suma = 1;
1131

    
1132
                                        // int bufferBands = rBuff.getBandCount();
1133
                                        // Si el numero de bandas es mayor que 3 (RGB) no se pueden
1134
                                        // dibujar todas
1135
                                        int numBands = rLayer.getDataStore().getBandCount();
1136

    
1137
                                        if (numBands > (maxBands + suma))
1138
                                                numBands = maxBands + suma;
1139

    
1140
                                        ColorInterpretation cInt = rLayer.getDataStore()
1141
                                                        .getColorInterpretation();
1142

    
1143
                                        int rgba[] = {0,1,2,3};
1144
                                        
1145
                                        rgba = setBandsInColors(cInt);
1146

    
1147
                                        int pixelFormat = convertPixelFormat(numBands);
1148

    
1149
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1150
                                        // + " alto: " + rBuff.getHeight()
1151
                                        // + " bandas totales incluyendo alpha (si tiene): "
1152
                                        // + numBands);
1153

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

    
1200
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1201

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

    
1216
                        }
1217
                        // Not tiled raster
1218
                        else {
1219
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1220
                        }
1221

    
1222
                }
1223

    
1224
                // Vectorial rasterized
1225
                else if (layer instanceof FLyrVect) {
1226
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1227
                }
1228
                // unrecognized layer type
1229
                else {
1230
                        ude.setFailData();
1231
                }
1232

    
1233
                // System.out.println("Returning UDE");
1234

    
1235
                return ude;
1236
        }
1237

    
1238
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1239
                        RequestDataEvent rde) {
1240
                
1241
                System.out.println("vector data");
1242
                UpdateDataEvent ude = new UpdateDataEvent();
1243
                ude.copyDataFromRequest(rde);
1244

    
1245
                
1246
                // Convenience casting
1247
                I3DSymbol sy = (I3DSymbol) ((FLyrVect) layer).getLegend()
1248
                                .getDefaultSymbol();
1249
                //Hack for polylines and polygons only rendered rasterized by now
1250
                if (sy instanceof IFillSymbol || sy instanceof ILineSymbol)
1251
                {
1252
                        removeLayerToTerrain(layer);
1253
                        getLayer3DProps(layer).setType(Layer3DPropsImpl.layer3DImage);
1254
                        addLayerToTerrain(layer, true);
1255
                        return null;
1256
                }//End hack
1257
                Layer3DProps layerprops = getLayer3DProps(layer);
1258
                
1259
                if (layerprops.isZEnable()==false)
1260
                        sy.setFixedHeight(layerprops.getHeight());
1261
                
1262
                
1263
                ViewPort vp = new ViewPort(_viewProjection);
1264
                vp.setEnvelope(envelope); // the real extent of the tile
1265
                vp.setAdjustable(false);
1266
                vp.setImageSize(new Dimension(256, 256));
1267
                vp.setDist1pixel(0.000000001);
1268
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1269
                
1270
                try {
1271
                        layer.draw(null, null, vp, new MyCancel(), scale);
1272
                } catch (ReadException e) {
1273
                        // TODO Auto-generated catch block
1274
                        e.printStackTrace();
1275
                }
1276

    
1277
                // OSG Layers
1278
                DataStore ds = ((SingleLayer) layer).getDataStore();
1279
                Node n = null;
1280

    
1281
                if (ds.getProviderName() == "OSG") {
1282
                        try {
1283
                                n = (Node) ds.invokeDynMethod("getNode", null);
1284
                        } catch (DynMethodException e) {
1285
                                // TODO Auto-generated catch block
1286
                                e.printStackTrace();
1287
                        }
1288
                        System.out.println("OSG Layer added");
1289
                }
1290
                // Vectorial layers
1291
                else {                
1292
                        ISymbol3D sym = null;
1293
                        try {
1294
                                sym = Symbol3DFactory.getSymbol3D(sy);
1295
                        } catch (NodeException e) {
1296
                                // TODO Auto-generated catch block
1297
                                e.printStackTrace();
1298
                        }
1299
                        //sm.setPointSize((float) sy.getSize());
1300
                        
1301
                        Color color = sy.getColor();
1302
                        sym.setColor(color);
1303
                        n = sym.buildSceneGraph(sy.getGeometry());
1304
                }
1305

    
1306
                ude.setVectorData(n);
1307

    
1308
                return ude;
1309
        }
1310

    
1311
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1312
                        RequestDataEvent rde) {
1313

    
1314
                UpdateDataEvent ude = new UpdateDataEvent();
1315
                ude.copyDataFromRequest(rde);
1316

    
1317
                if (layer instanceof DefaultFLyrRaster) {
1318
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1319
                        boolean hasCache = true;
1320
                        if (rLayer.getDataStore().getInternalParameters() instanceof NetCDFDataParameters)
1321
                                hasCache = false;
1322

    
1323
                        if (hasCache) {
1324

    
1325
                                rLayer = (DefaultFLyrRaster) layer;
1326
                                boolean exists = _cachedLayers.containsKey(rLayer);
1327

    
1328
                                if (!exists) {
1329

    
1330
                                        _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1331

    
1332
                                }
1333

    
1334
                                CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1335

    
1336
                                RasterQuery query = RasterLocator.getManager().createQuery();
1337

    
1338
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1339
                                                .getManager()
1340
                                                .getDataStructFactory()
1341
                                                .createExtent(envelope.getLowerCorner().getX(),
1342
                                                                envelope.getUpperCorner().getY(),
1343
                                                                envelope.getUpperCorner().getX(),
1344
                                                                envelope.getLowerCorner().getY());
1345

    
1346
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1347
                                                rde.getTileY(), extent, cacheStruct);
1348

    
1349
                                // query.setAreaOfInterest(extent, 512, 512);
1350

    
1351
                                // System.out.println("Tile Parameters:");
1352
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1353
                                // System.out.println("TileX = " + rde.getTileX());
1354
                                // System.out.println("TileY = " + rde.getTileY());
1355
                                // System.out.println("Extent = " + extent.getULX() + " "
1356
                                // + extent.getULY() + " " + extent.getLRX() + " "
1357
                                // + extent.getLRY());
1358

    
1359
                                try {
1360
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1361
                                        Buffer rBuff = (Buffer) result[0];
1362
                                        Buffer transparencyBuffer;
1363

    
1364
                                        if (result.length < 2)
1365
                                                transparencyBuffer = null;
1366
                                        else
1367
                                                transparencyBuffer = (Buffer) result[1];
1368

    
1369
                                        int numBands = rBuff.getBandCount();
1370
                                        if (transparencyBuffer != null) {
1371

    
1372
                                                // System.out
1373
                                                // .println("Tengo Transparency buffer con "
1374
                                                // + transparencyBuffer.getBandCount()
1375
                                                // + " bandas");
1376
                                                numBands++;
1377

    
1378
                                        }
1379

    
1380
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1381
                                        // + " alto: " + rBuff.getHeight()
1382
                                        // + " bandas totales incluyendo alpha (si tiene): "
1383
                                        // + numBands);
1384

    
1385
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1386
                                                        .getHeight()) / 64];
1387

    
1388
                                        int pixelFormat = convertPixelFormat(numBands);
1389

    
1390
                                        // K hay que setearlo en el dialogo
1391
                                        int cont = 0;
1392

    
1393
                                        int k = getLayer3DProps(rLayer).getElevationBand();
1394

    
1395
                                        for (int i = rBuff.getWidth() - 1; i >= 0; i = i - 8) {
1396
                                                // Vertical Flip needed
1397
                                                for (int j = 0; j < rBuff.getHeight(); j = j + 8) {
1398

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

    
1427
                                                }
1428

    
1429
                                        }
1430
                                        ude.setHeightfieldData(data, rBuff.getWidth() / 8,
1431
                                                        rBuff.getHeight() / 8);
1432

    
1433
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1434

    
1435
                                } catch (ProcessInterruptedException e) {
1436
                                        // TODO Auto-generated catch block
1437
                                        e.printStackTrace();
1438
                                } catch (RasterDriverException e) {
1439
                                        e.printStackTrace();
1440
                                } catch (InvalidSetViewException e) {
1441
                                        // TODO Auto-generated catch block
1442
                                        e.printStackTrace();
1443
                                } catch (NullPointerException e) {
1444
                                        // ude.setFailData();
1445
                                        System.out.println("Problem getting the tile");
1446
                                }
1447

    
1448
                        }
1449
                        // No cache
1450
                        else {
1451
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1452
                        }
1453

    
1454
                }
1455

    
1456
                // Vectorial rasterized
1457
                else if (layer instanceof FLyrVect) {
1458
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1459
                }
1460
                // unrecognized layer type
1461
                else {
1462
                        ude.setFailData();
1463
                }
1464

    
1465
                return ude;
1466

    
1467
        }
1468

    
1469
        protected byte[] buildByteBuffer(UpdateDataEvent ude, Buffer rBuff,
1470
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1471

    
1472
                int cont = 0;
1473
                int colorBands = numBands;
1474

    
1475
                if (transparencyBuffer != null) {
1476
                        colorBands--;
1477
                }
1478

    
1479
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * numBands];
1480

    
1481
                for (int i = 0; i < rBuff.getWidth(); i++) {
1482

    
1483
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1484

    
1485
                                for (int k = 0; k < colorBands; k++) {
1486
                                        // En lugar de k se deben usar las bandas asociadas al
1487
                                        // componente
1488
                                        data[cont] = (byte) rBuff.getElemByte(i, j, rgba[k]);
1489
                                        cont++;
1490

    
1491
                                }
1492
                                if (transparencyBuffer != null) {
1493
                                        if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1494
                                                data[cont] = (byte) 0;
1495
                                        else
1496
                                                data[cont] = (byte) 255;
1497
                                        //data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1498

    
1499
                                        cont++;
1500

    
1501
                                }
1502
                        }
1503
                }
1504

    
1505
                return data;
1506
        }
1507

    
1508
        protected short[] buildShortBuffer(UpdateDataEvent ude, Buffer rBuff,
1509
                        Buffer transparencyBuffer, int numBands) {
1510
                short[] data = new short[rBuff.getWidth() * rBuff.getHeight()
1511
                                * numBands];
1512

    
1513
                int cont = 0;
1514
                int colorBands = numBands;
1515

    
1516
                if (transparencyBuffer != null)
1517
                        colorBands--;
1518

    
1519
                for (int i = 0; i < rBuff.getWidth(); i++) {
1520

    
1521
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1522

    
1523
                                for (int k = 0; k < colorBands; k++) {
1524
                                        data[cont] = (short) (rBuff.getElemShort(i, j, k) & 0xffff);
1525
                                        cont++;
1526
                                }
1527
                                if (transparencyBuffer != null) {
1528
                                        data[cont] = (short) (rBuff.getElemShort(i, j, 0) & 0xffff);
1529
                                        cont++;
1530
                                }
1531
                        }
1532
                }
1533

    
1534
                return data;
1535
        }
1536

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

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

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

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

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

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

    
1562
                return data;
1563
        }
1564

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

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

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

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

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

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

    
1591
                return data;
1592
        }
1593

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

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

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

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

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

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

    
1620
                return data;
1621
        }
1622

    
1623
        protected int convertPixelFormat(int type) {
1624

    
1625
                switch (type) {
1626

    
1627
                case 1:
1628
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1629

    
1630
                case 2:
1631
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1632

    
1633
                case 3:
1634
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1635

    
1636
                case 4:
1637
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1638

    
1639
                }
1640

    
1641
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1642

    
1643
        }
1644

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

    
1662
        protected class MyCancel implements Cancellable {
1663
                private boolean cancel = false;
1664

    
1665
                public MyCancel() {
1666
                }
1667

    
1668
                public void setCanceled(boolean canceled) {
1669
                        cancel = canceled;
1670
                }
1671

    
1672
                public boolean isCanceled() {
1673
                        return cancel;
1674
                }
1675
        }
1676

    
1677
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1678

    
1679
                int size = 256;
1680
                BufferedImage image = new BufferedImage(size, size,
1681
                                BufferedImage.TYPE_4BYTE_ABGR);
1682

    
1683
                ViewPort vp = new ViewPort(_viewProjection);
1684
                vp.setEnvelope(envelope); // the real extent of the tile
1685

    
1686
                vp.setAdjustable(false);
1687
                vp.setImageSize(new Dimension(size, size));
1688
                vp.setDist1pixel(0.000000001);
1689

    
1690
                Graphics2D graphics = image.createGraphics();
1691
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1692
                // background
1693
                graphics.setColor(backgColor);
1694
                graphics.fillRect(0, 0, size, size);
1695

    
1696
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1697

    
1698
                try {
1699
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1700

    
1701
                } catch (Exception e) {
1702
                        return null;
1703
                }
1704

    
1705
                return image;
1706

    
1707
        }
1708

    
1709
        public void nameChanged(LayerEvent e) {
1710
                System.out.println("Name change");
1711

    
1712
        }
1713

    
1714
        public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) {
1715

    
1716
                System.out.println("Refresh");
1717
                if (props == null)
1718
                        return;
1719

    
1720
                if (_terrain == null)
1721
                        return; // view not opened yet
1722

    
1723
                // clear cache
1724

    
1725
                // refresh layer in terrain
1726
                int type = props.getType();
1727
                if ((type == Layer3DProps.layer3DImage)
1728
                                || (type == Layer3DProps.layer3DElevation)
1729
                                || (type == Layer3DProps.layer3DVectorMR)) {
1730

    
1731
                        try {
1732
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
1733
                        } catch (LayerManagementException e) {
1734
                                // TODO Auto-generated catch block
1735
                                e.printStackTrace();
1736
                        }
1737
                } else if (type == Layer3DProps.layer3DVector) {
1738
                        invalidateVectorLayer(props);
1739
                }
1740

    
1741
        }
1742

    
1743
        public boolean removeCache(File path) {
1744
                if (path.exists()) {
1745
                        File[] files = path.listFiles();
1746
                        for (int i = 0; i < files.length; i++) {
1747
                                if (files[i].isDirectory()) {
1748
                                        removeCache(files[i]);
1749
                                } else {
1750
                                        files[i].delete();
1751
                                }
1752
                        }
1753
                }
1754
                return (path.delete());
1755
        }
1756

    
1757
        public void removeLayerToTerrain(FLayer layer) {
1758

    
1759
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1760
                if (terrainLayer != null) {
1761

    
1762
                        _terrainLayerMap.remove(terrainLayer.getLayerID());
1763
                        _terrainFLayerMap.remove(layer);
1764

    
1765
                        try {
1766
                                _terrainLayerManager.removeLayer(terrainLayer);
1767
                        } catch (LayerManagementException e) {
1768
                                // TODO Auto-generated catch block
1769
                                e.printStackTrace();
1770
                        }
1771
                }
1772

    
1773
        }
1774

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

    
1808
        }
1809

    
1810
        public void setDataManager(JavaDataDriver manager) {
1811
                _terrainDataManager = manager;
1812
                _terrainDataManager.setDataLoader(this);
1813

    
1814
        }
1815

    
1816
        public void setLayerManager(LayerManager manager) {
1817
                _terrainLayerManager = manager;
1818

    
1819
        }
1820

    
1821
        public void setLoading(boolean bLoading) {
1822
                _bLoading = bLoading;
1823

    
1824
        }
1825

    
1826
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1827
                _renewCanvasOff = renewCanvasOff;
1828

    
1829
        }
1830

    
1831
        public void setTerrain(Terrain terrain) {
1832
                if (_terrain == terrain)
1833
                        return;
1834

    
1835
                _terrain = terrain;
1836

    
1837
                // add layers to terrain necessary when we are loading
1838
                addCurrentLayers();
1839

    
1840
        }
1841

    
1842
        public void setVerticalExaggeration(float verticalExaggeration) {
1843
                _verticalExaggeration = verticalExaggeration;
1844

    
1845
        }
1846

    
1847
        public void setViewProjection(IProjection projection) {
1848
                _viewProjection = projection;
1849

    
1850
        }
1851

    
1852
        public void setViewer(IViewerContainer canvas) {
1853
                _canvas3d = canvas;
1854
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
1855

    
1856
        }
1857

    
1858
        public void visibilityChanged(LayerEvent e) {
1859
                FLayer lyr = e.getSource();
1860

    
1861
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
1862
                // refreshLayerVectorsVisibility(lyr);
1863
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1864
                // refreshLayer3DOSGVisibility(lyr);
1865
                // } else {
1866
                refreshLayerVisibility(lyr);
1867
                // }
1868
                visibilityChange = true;
1869

    
1870
        }
1871

    
1872
        private void refreshLayerVisibility(FLayer layer) {
1873

    
1874
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1875
                terrainLayer.setEnabled(layer.isVisible());
1876
                // _terrainLayerManager.updateLayers();
1877

    
1878
        }
1879

    
1880
        public void zoomToEnvelope(Envelope geoEnvelope) {
1881
                if (geoEnvelope == null)
1882
                        return;
1883
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
1884
                        return;
1885

    
1886
                double maxHeight = 0.0;
1887

    
1888
                // Getting envelope positions
1889
                double minLat = geoEnvelope.getMinimum(0);
1890
                double maxLat = geoEnvelope.getMaximum(0);
1891
                double cenLon = geoEnvelope.getCenter(0);
1892
                double cenLat = geoEnvelope.getCenter(1);
1893

    
1894
                double elevation = 0;
1895

    
1896
                // calculate altitude
1897
                double avLat = 0;
1898
                if (minLat > 0.0 || maxLat < 0.0)
1899
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1900
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
1901

    
1902
                double terrainRadius = _terrain.getRadiusEquatorial();
1903
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
1904
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1905
                                * (1 - Math.cos(Math.toRadians(avLon))));
1906
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
1907
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
1908

    
1909
                // Calculate XYZ positions for camera.
1910

    
1911
                int terrainType = _terrain.getCoordinateSystemType();
1912

    
1913
                double zoomFactor = 1.5;
1914
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
1915
                        zoomFactor = 1.3;
1916
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1917

    
1918
                Vec3 eye = new Vec3();
1919
                Vec3 center = new Vec3();
1920
                Vec3 up = new Vec3();
1921
                // Calculate positions for PLAIN MODE.
1922
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
1923

    
1924
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
1925
                                        .getMinimum(1)) / 1.2d;
1926
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
1927
                                        .getMinimum(0)) / 1.2d;
1928
                        double height;
1929

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

    
1962
                _terrainViewer.setCamera(cam);
1963

    
1964
        }
1965

    
1966
        public void editionChanged(LayerEvent e) {
1967
                // TODO Auto-generated method stub
1968

    
1969
        }
1970

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

    
1974
        }
1975

    
1976
        public boolean symbolChanged(SymbolLegendEvent e) {
1977

    
1978
                System.out.println("Symbol changed");
1979
                return false;
1980
        }
1981

    
1982
        public void legendCleared(LegendClearEvent event) {
1983
                // TODO Auto-generated method stub
1984

    
1985
        }
1986

    
1987
        public static class RegisterPersistence implements Callable {
1988

    
1989
                public Object call() throws Exception {
1990
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
1991
                        if (manager.getDefinition(MapContext.class) == null) {
1992
                                MapContext.registerPersistent();
1993
                        }
1994
                        DynStruct definition = manager.addDefinition(
1995
                                        MapContext3DImpl.class, "MapContext3DImpl",
1996
                                        "MapContext3DImpl Persistence definition", null, null);
1997
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
1998
                                        "MapContext");
1999

    
2000
                        return Boolean.TRUE;
2001
                }
2002
        }
2003

    
2004
}