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

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

    
140
/**
141
 * @author gvSIG Team
142
 * @version $Id$
143
 * 
144
 */
145
public class MapContext3DImpl extends MapContext3D {
146

    
147
        private Terrain _terrain;
148
        private IViewerContainer _canvas3d;
149
        private TerrainViewer _terrainViewer;
150
        private LayerManager _terrainLayerManager;
151
        private JavaDataDriver _terrainDataManager = null;
152

    
153
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
154
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
155

    
156
        private Hashtable<FLayer, EditionManager> _layersEditionMap = new Hashtable<FLayer, EditionManager>();
157
        private Hashtable<FLayer, BasicInputHandler> _layersHandlerMap = new Hashtable<FLayer, BasicInputHandler>();
158

    
159
        private Hashtable<DefaultFLyrRaster, CacheStruct> _cachedLayers = new Hashtable<DefaultFLyrRaster, CacheStruct>();
160

    
161
        private IProjection _viewProjection;
162
        private float _verticalExaggeration;
163
        private boolean _bEmptyView = true;
164
        private boolean _bListenToLegend = true;
165
        private boolean _bLoading = false;
166
        private TerrainViewer _canvasoff = null;
167
        private boolean _renewCanvasOff = false;
168

    
169
        TerrainViewer _printViewer = null;
170
        Layer _testRasterLayer = null;
171

    
172
        private boolean visibilityChange = false;
173

    
174
        TileCacheManager tileMan = TileCacheLocator.getManager();
175
        TileCache tileCache = tileMan.getTileCache(RasterLibrary.pathTileCache);
176

    
177
        int maxBands = 3;
178

    
179
        public MapContext3DImpl() {
180

    
181
        }
182

    
183
        public MapContext3DImpl(ViewPort vp) {
184
                super(vp);
185

    
186
        }
187

    
188
        public MapContext3DImpl(FLayers fLayers, ViewPort vp) {
189

    
190
                super(fLayers, vp);
191
        }
192

    
193
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
194
                        double scale) {
195

    
196
                if (_canvas3d == null || _canvas3d.getOSGViewer() == null)
197
                        return;
198
                double x = getViewPort().getOffset().getX();
199
                double y = getViewPort().getOffset().getY();
200
                double w = image.getWidth();
201
                double h = image.getHeight();
202

    
203
                if (_canvasoff == null) {
204
                        try {
205
                                _canvasoff = new TerrainViewer();
206
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
207

    
208
                                Terrain planetView3D = ((TerrainViewer) _canvas3d
209
                                                .getOSGViewer()).getTerrain(0);
210
                                Terrain terrain = new Terrain();
211
                                terrain.setCoordinateSystemType(planetView3D
212
                                                .getCoordinateSystemType());
213
                                terrain.setCoordinateSystemName(planetView3D
214
                                                .getCoordinateSystemName());
215
                                terrain.setCoordinateSystemFormat(planetView3D
216
                                                .getCoordinateSystemFormat());
217
                                terrain.setExtent(planetView3D.xMin(), planetView3D.yMin(),
218
                                                planetView3D.xMax(), planetView3D.yMax());
219
                                terrain.setTerrainName(planetView3D.getTerrainName());
220

    
221
                                terrain.init();
222
                                terrain.setLayerManager(_terrainLayerManager);
223

    
224
                                _canvasoff.addTerrain(terrain);
225
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
226
                                                .getOSGViewer()).getFeatures()));
227
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
228
                                                .getClearColor();
229
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(),
230
                                                color.w());
231
                                this.setRenewCanvasOff(false);
232
                        } catch (NodeException e) {
233
                                // TODO Auto-generated catch block
234
                                e.printStackTrace();
235
                        }
236

    
237
                }
238

    
239
                Camera refCam = _canvas3d.getOSGViewer().getCamera();
240
                Matrix refView = refCam.getViewMatrix();
241
                Matrix refProy = refCam.getProjectionMatrix();
242
                Matrix.Perspective pers = refProy.getPerspective();
243
                Camera viewCam = new Camera();
244
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
245
                                pers.zFar);
246
                viewCam.setViewMatrix(refView);
247
                _canvasoff.setViewport(0, 0, (int) w, (int) h);
248
                _canvasoff.setCamera(viewCam);
249
                _canvasoff.takeScreenshotToMemory();
250
                _canvasoff.frame();
251

    
252
                org.gvsig.osgvp.core.osg.Image OSGimage = _canvasoff
253
                                .getScreenshotImage();
254

    
255
                BufferedImage img = null;
256
                try {
257
                        img = OSGimage.getBufferedImage();
258
                } catch (ImageConversionException e1) {
259
                        // TODO Auto-generated catch block
260
                        e1.printStackTrace();
261
                } catch (IOException e1) {
262
                        // TODO Auto-generated catch block
263
                        e1.printStackTrace();
264
                }
265

    
266
                double scalex = w / img.getWidth(null);
267
                double scaley = h / img.getHeight(null);
268
                try {
269
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
270
                                        scaley);
271
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
272
                        xpos.concatenate(xform);
273
                        g.drawRenderedImage(img, xpos);
274
                } catch (ImagingOpException e) {
275

    
276
                }
277
        }
278

    
279
        public void CreateOSGLayer(FLayer layer, Layer3DProps props3d) {
280
                // if (_terrain == null || _viewProjection == null)
281
                // return;
282
                //
283
                // OSGCacheService cacheService = (OSGCacheService) props3D
284
                // .getCacheService();
285
                // if (cacheService == null) {
286
                // cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
287
                // .getCacheName(), layer, _viewProjection);
288
                // cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
289
                // props3D.setCacheService(cacheService);
290
                // }
291
                //
292
                // // use VectorCacheService to add features to planet
293
                // cacheService.AddFeaturesToTerrain();
294

    
295
        }
296

    
297
        public void DeleteOSGLayer(FLayer layer, Layer3DProps props3d) {
298
                // if (_terrain == null || _viewProjection == null)
299
                // return;
300
                //
301
                // OSGCacheService cacheService = (OSGCacheService) props3D
302
                // .getCacheService();
303
                // if (cacheService != null) {
304
                // // use VectorCacheService to delete features to terrain
305
                // cacheService.DeleteFeaturesToTerrain();
306
                // }
307

    
308
        }
309

    
310
        public void PrintDebugLayers() {
311
                if (_terrainLayerManager != null) {
312
                        System.out.println("===========================");
313
                        System.out.println("Total terrain layers: "
314
                                        + _terrainLayerManager.getNumLayers());
315
                        System.out.println("===========================");
316
                }
317
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
318
                int pos = 0;
319
                while (lyrIterator.hasNext()) {
320
                        FLayer layer = lyrIterator.next();
321
                        System.out.println("  Layer " + layer.getName());
322
                        Layer3DProps props3D = getLayer3DProps(layer);
323
                        System.out.println("    Type " + props3D.getType());
324
                        System.out.println("    Order " + pos);
325
                        pos++;
326
                }
327
        }
328

    
329
        public void activationChanged(LayerEvent e) {
330

    
331
        }
332

    
333
        public void addCurrentLayers() {
334

    
335
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
336
                while (lyrIterator.hasNext()) {
337
                        FLayer layer = lyrIterator.next();
338
                        Layer3DProps props = getLayer3DProps(layer);
339
                        layerAdded((FLayers3D) layer.getParentLayer(), layer);
340
//                        addLayerToTerrain(layer, false);
341
                        
342
                }
343

    
344
        }
345

    
346
        public void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) {
347

    
348
                System.out.println("ADD LAYER TO TERRAIN METHOD!");
349
                Envelope layerEnvelope = null;
350
                try {
351
                        layerEnvelope = layer.getFullEnvelope();
352
                } catch (ReadException e1) {
353
                        // TODO Auto-generated catch block
354
                        e1.printStackTrace();
355
                }
356

    
357
                Layer3DProps props = getLayer3DProps(layer);
358
                GeometryManager geoMan;
359

    
360
                geoMan = GeometryLocator.getGeometryManager();
361

    
362
                if (layerEnvelope == null) {
363

    
364
                        try {
365
                                layerEnvelope = geoMan.createEnvelope(Geometry.SUBTYPES.GEOM2D);
366
                                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC) {
367
                                        layerEnvelope.setLowerCorner(geoMan.createPoint(-180.0,
368
                                                        -90.0, Geometry.SUBTYPES.GEOM2D));
369
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(360.0,
370
                                                        180.0, Geometry.SUBTYPES.GEOM2D));
371
                                }
372

    
373
                                else {
374

    
375
                                        layerEnvelope.setLowerCorner(geoMan
376
                                                        .createPoint(-20000000.0, -10000000.00,
377
                                                                        Geometry.SUBTYPES.GEOM2D));
378
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(40000000.0,
379
                                                        20000000.0, Geometry.SUBTYPES.GEOM2D));
380

    
381
                                }
382
                        } catch (CreateEnvelopeException e) {
383
                                // TODO Auto-generated catch block
384
                                e.printStackTrace();
385
                        } catch (CreateGeometryException e) {
386
                                // TODO Auto-generated catch block
387
                                e.printStackTrace();
388
                        }
389

    
390
                }
391

    
392
                Extent extent = null;
393
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
394

    
395
                        extent = new Extent(layerEnvelope.getLowerCorner().getX(),
396
                                        layerEnvelope.getLowerCorner().getY(), layerEnvelope
397
                                                        .getUpperCorner().getX(), layerEnvelope
398
                                                        .getUpperCorner().getY());
399

    
400
                } else {
401
                        extent = new Extent(Math.toRadians(layerEnvelope.getLowerCorner()
402
                                        .getX()), Math.toRadians(layerEnvelope.getLowerCorner()
403
                                        .getY()), Math.toRadians(layerEnvelope.getUpperCorner()
404
                                        .getX()), Math.toRadians(layerEnvelope.getUpperCorner()
405
                                        .getY()));
406

    
407
                }
408

    
409
                // Raster Layers
410
                if (props.getType() == Layer3DPropsImpl.layer3DImage)
411
                // || props.reasterized()==true) {
412
                {
413
                        TextureLayer rlayer = new TextureLayer();
414
                        rlayer.setEnabled(layer.isVisible());
415
                        // Here we use extent because the older osgvp version. The new will
416
                        // be
417
                        // named envelope
418
                        rlayer.setExtent(extent);
419
                        rlayer.setOpacity(props.getOpacity());
420
                        rlayer.setDataDriver(_terrainDataManager);
421
                        // rlayer.setMaxLevel(20);
422
                        // rlayer.setMaxResolution(16);
423
                        // _logger.warn("computed optimum level = "
424
                        // + computeOptimumLevel(layer, 20, 256));
425
                        // rlayer.setMaxResolution(computeOptimumLevel(layer, 21, 256));
426
                        try {
427
                                _terrainLayerManager.addLayer(rlayer);
428
                        } catch (LayerManagementException e) {
429
                                // TODO Auto-generated catch block
430
                                e.printStackTrace();
431
                        }
432
                        _terrainFLayerMap.put(layer, rlayer);
433
                        _terrainLayerMap.put(rlayer.getLayerID(), layer);
434
                        props.setTerrainLayer(rlayer);
435

    
436
                        // if rasterizing layers set Default 2D symbology
437
                        if (layer instanceof FLyrVect) {
438
                                // Create a 2D Legend for jess
439
                                if (((FLyrVect) (layer)).getLegend().getDefaultSymbol() instanceof I3DSymbol)
440
                                        try {
441
                                                ((FLyrVect) layer)
442
                                                                .setLegend((IVectorLegend) MapContextLocator
443
                                                                                .getMapContextManager()
444
                                                                                .getLegend(
445
                                                                                                ((FLyrVect) layer)
446
                                                                                                                .getDataStore(),
447
                                                                                                MapContextLocator
448
                                                                                                                .getMapContextManager()
449
                                                                                                                .getDefaultSymbologyDomain()));
450
                                        } catch (LegendLayerException e) {
451
                                                // TODO Auto-generated catch block
452
                                                e.printStackTrace();
453
                                        } catch (LocatorException e) {
454
                                                // TODO Auto-generated catch block
455
                                                e.printStackTrace();
456
                                        }
457
                        }
458

    
459
                        // Delete the cachestruct if it exists, and create a new one.
460

    
461
                        if (_cachedLayers.containsKey(layer)) {
462

    
463
                                _cachedLayers.remove(layer);
464

    
465
                        }
466

    
467
                }
468
                // Vector layers
469
                if (props.getType() == Layer3DProps.layer3DVector) {
470
                        // if (layer instanceof FLyrVect) {
471
                        // Set a 3D Legend
472
                        // TODO We don't need to create always a new Legend. We need to
473
                        if (((FLyrVect) layer).getLegend() instanceof ISingleSymbolLegend)
474
                                if (!(((FLyrVect) layer).getLegend().getDefaultSymbol() instanceof I3DSymbol)) {
475
                                        try {
476
                                                ((FLyrVect) layer)
477
                                                                .setLegend((IVectorLegend) MapContextLocator
478
                                                                                .getMapContextManager().getLegend(
479
                                                                                                ((FLyrVect) layer)
480
                                                                                                                .getDataStore(),
481
                                                                                                "project.document.view3d"));
482
                                        } catch (LegendLayerException e) {
483
                                                // TODO Auto-generated catch block
484
                                                e.printStackTrace();
485
                                        } catch (LocatorException e) {
486
                                                // TODO Auto-generated catch block
487
                                                e.printStackTrace();
488
                                        }
489
                                }
490

    
491
                        VectorLayer vlayer = new VectorLayer();
492
                        vlayer.setEnabled(layer.isVisible());
493
                        vlayer.setExtent(extent);
494
                        vlayer.setDataDriver(_terrainDataManager);
495
                        try {
496
                                _terrainLayerManager.addLayer(vlayer);
497
                        } catch (LayerManagementException e) {
498
                                // TODO Auto-generated catch block
499
                                e.printStackTrace();
500
                        }
501
                        _terrainFLayerMap.put(layer, vlayer);
502
                        _terrainLayerMap.put(vlayer.getLayerID(), layer);
503
                        props.setTerrainLayer(vlayer);
504
                }
505
                // OsgLayers
506

    
507
                // Elevation layers
508
                if (props.getType() == Layer3DPropsImpl.layer3DElevation) {
509

    
510
                        HeightfieldLayer hLayer = new HeightfieldLayer();
511
                        hLayer.setEnabled(layer.isVisible());
512
                        hLayer.setExtent(extent);
513
                        hLayer.setDataDriver(_terrainDataManager);
514
                        hLayer.setMaxLevel(20);
515
                        hLayer.setMaxResolution(18);
516
                        hLayer.setScaleFactor(props.getVerticalEx());
517

    
518
                        hLayer.setValidDataValues(new Vec2(-9999, 9999));
519
                        // _logger.warn("computed optimum level = "
520
                        // + computeOptimumLevel(layer, 20, 256));
521
                        // rlayer.setMaxResolution(computeOptimumLevel(layer, 21, 256));
522
                        try {
523
                                _terrainLayerManager.addLayer(hLayer);
524
                        } catch (LayerManagementException e) {
525
                                // TODO Auto-generated catch block
526
                                e.printStackTrace();
527
                        }
528
                        _terrainFLayerMap.put(layer, hLayer);
529
                        _terrainLayerMap.put(hLayer.getLayerID(), layer);
530
                        props.setTerrainLayer(hLayer);
531

    
532
                        // Delete the cachestruct if it exists, and create a new one.
533

    
534
                        if (_cachedLayers.containsKey(layer)) {
535

    
536
                                _cachedLayers.remove(layer);
537

    
538
                        }
539

    
540
                }
541

    
542
                // if (bVerifyLegend) {
543
                // _bListenToLegend = false;
544
                // props3D.VerifyLegend(_terrain.getTerrainName());
545
                // _bListenToLegend = true;
546
                // }
547
                // }
548

    
549
        }
550

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

    
641
        public IViewerContainer getCanvas3d() {
642
                return _canvas3d;
643
        }
644

    
645
        public JavaDataDriver getDataManager() {
646
                return _terrainDataManager;
647
        }
648

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

    
687
                // return null;
688
        }
689

    
690
        public LayerManager getLayerManager() {
691
                return _terrainLayerManager;
692
        }
693

    
694
        public Node getSpecialNode() {
695
                Node specialNode = null;
696
                try {
697
                        specialNode = _terrainViewer.getFeature(0);
698
                } catch (ChildIndexOutOfBoundsExceptions e) {
699

    
700
                }
701
                return specialNode;
702
        }
703

    
704
        public Terrain getTerrain() {
705
                return _terrain;
706
        }
707

    
708
        public float getVerticalExaggeration() {
709
                return _verticalExaggeration;
710
        }
711

    
712
        public IProjection getViewProjection() {
713
                return _viewProjection;
714
        }
715

    
716
        public void invalidateVectorLayer(Layer3DProps props) {
717

    
718
                // TODO Auto-generated method stub
719
                // if (_terrain == null || _viewProjection == null)
720
                // return;
721
                //
722
                // VectorCacheService cacheService = (VectorCacheService) props
723
                // .getCacheService();
724
                // if (cacheService != null) {
725
                // // use VectorCacheService to add features to terrain
726
                // cacheService.refreshFeaturesToTerrain();
727
                // }
728

    
729
        }
730

    
731
        public boolean isRenewCanvasOff() {
732
                return _renewCanvasOff;
733
        }
734

    
735
        public void layerAdded(FLayers3D parent, FLayer layer) {
736

    
737
                System.out.println("A?adida capa. Evento Capturado");
738
                // to add group layers to 3D, just add recursively child data layers
739
                if (layer instanceof FLayers) {
740
                        FLayers group = (FLayers) layer;
741
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
742
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
743
                        }
744
                        getLayer3DProps(layer).setHooked(true);
745
                        return;
746
                }
747
                //
748
                if (layer instanceof Classifiable) {
749
                        Classifiable legendLyr = (Classifiable) layer;
750
                        legendLyr.addLegendListener((LegendListener) this);
751
                        this.addLayerListener(this);
752
                }
753
                layer.addLayerListener((LayerListener) this);
754

    
755
                // listener to manage the selection for the layers
756
                // if (layer.getClass().equals(FLyrVect.class)) {
757
                // FLyrVect lyr = (FLyrVect) layer;
758
                // refreshLayerVectorsVisibility(lyr);
759
                // try {
760
                // SelectableDataSource recordSet = lyr.getRecordset();
761
                // if (recordSet != null) {
762
                // SelectionSupport selectionSupport = recordSet
763
                // .getSelectionSupport();
764
                // selectionSupport.addSelectionListener(this);
765
                // }
766
                // } catch (ReadDriverException e) {
767
                // // TODO Auto-generated catch block
768
                // e.printStackTrace();
769
                // }
770
                // }
771

    
772
                // if (!_bLoading)
773
                Layer3DProps props3D = getLayer3DProps(layer);
774

    
775
                if (layer instanceof DefaultFLyrRaster) {
776
                        try {
777
                                // If DefaultFLayerRaster we must init the layer for the
778
                                // persistence to
779
                                // work
780
                                ((DefaultFLyrRaster) layer).init();
781
                                props3D.setType(Layer3DProps.layer3DImage);
782
                        } catch (LoadLayerException e) {
783
                                // TODO Auto-generated catch block
784
                                e.printStackTrace();
785
                        } catch (FilePaletteException e) {
786
                                // TODO Auto-generated catch block
787
                                e.printStackTrace();
788
                        }
789

    
790
                }
791

    
792
                // If it's a vectorial layer we load it as 3D by default
793
                else if (layer instanceof FLyrVect) {
794

    
795
                        props3D.setType(Layer3DProps.layer3DVector);
796
                }
797
                addLayerToTerrain(layer, true);
798

    
799
                // Only do this the first time to add layer
800
                // if (_bEmptyView && !_bLoading) {
801
                // if (layers.getLayersCount() > 0) {
802
                // try {
803
                try {
804
                        zoomToEnvelope(layer.getFullEnvelope());
805
                } catch (ReadException e) {
806
                        // TODO Auto-generated catch block
807
                        e.printStackTrace();
808
                }
809
                // } catch (ExpansionFileReadException e) {
810
                // e.printStackTrace();
811
                // } catch (ReadDriverException e) {
812
                // e.printStackTrace();
813
                // }
814
                // _bEmptyView = false;
815
                // }
816
                // }
817
                //
818
                // // PrintDebugLayers();
819

    
820
        }
821

    
822
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
823

    
824
                // System.out.println("Creando estructura de cache");
825

    
826
                // Se obtiene el datastore de la capa
827
                RasterDataStore dataStore = layer.getDataStore();
828

    
829
                // Creais la estructura de cach?
830
                TileCacheManager manager = TileCacheLocator.getManager();
831

    
832
                int coordinates = CacheStruct.FLAT;
833

    
834
                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOGRAPHIC)
835
                        coordinates = CacheStruct.GEOGRAFIC;
836

    
837
                DefaultRasterProvider provider = (DefaultRasterProvider) dataStore
838
                                .getProvider();
839

    
840
                provider.setProjection(layer.getProjection());
841

    
842
                // El epsg suele tener la forma EPSG:4326
843
                String epsg = null;
844
                IProjection proj = provider.getProjection();
845
                if (proj != null)
846
                        epsg = proj.getAbrev();
847

    
848
                // HACK
849
                epsg = "EPSG:23030";
850

    
851
                int resolution = 256;
852

    
853
                int type = getLayer3DProps(layer).getType();
854

    
855
                // if elevation layer, lower the tile resolution
856
                if (type == Layer3DProps.layer3DElevation)
857

    
858
                        resolution = 32;
859

    
860
                CacheStruct struct = manager.createCacheStructure(coordinates,
861
                                TileCacheLibrary.DEFAULT_LEVELS, provider.getExtent()
862
                                                .toRectangle2D(), provider.getCellSize(), resolution,
863
                                resolution, provider.getFullName(),
864
                                TileCacheLibrary.DEFAULT_STRUCTURE,
865

    
866
                                RasterLibrary.pathTileCache, provider.getFileSuffix(), provider
867
                                                .getProjection().getAbrev(), provider.getFileSize());
868

    
869
                return struct;
870

    
871
        }
872

    
873
        private void refreshLayerVectorsVisibility(FLayer lyr) {
874
                // if (_terrain == null || _viewProjection == null)
875
                // return;
876
                //
877
                // Layer3DProps props3D = getLayer3DProps(lyr);
878
                //
879
                // VectorCacheService cacheService = (VectorCacheService) props3D
880
                // .getCacheService();
881
                // if (cacheService != null) {
882
                // // use VectorCacheService to add features to terrain
883
                // cacheService.refreshFeaturesToTerrain(lyr.isVisible());
884
                // props3D.drawVersion = lyr.getDrawVersion();
885
                // }
886

    
887
        }
888

    
889
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
890
                        int newPos) {
891
                if (layer instanceof FLayers) {
892
                        FLayers group = (FLayers) layer;
893
                        if (newPos > oldPos) {
894
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
895
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
896
                                                        oldPos, newPos);
897
                        } else {
898
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
899
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
900
                                                        oldPos, newPos);
901
                        }
902
                        return;
903
                }
904

    
905
                Layer3DProps props3D = getLayer3DProps(layer);
906
                refreshLayerInTerrain(layer, props3D, false);
907

    
908
                int type = props3D.getType();
909

    
910
                // Now reorder in layer manager only for terrain layer types
911
                if ((type == Layer3DProps.layer3DOSG)
912
                                || ((type == Layer3DProps.layer3DVector)))
913
                        return;
914

    
915
                // Obtain the old position in the layer
916
                Layer terrainLayer = _terrainFLayerMap.get(layer);
917
                Vector<Integer> terrainOldPos = null;
918
                try {
919
                        terrainOldPos = _terrainLayerManager.getOrder(terrainLayer);
920
                } catch (LayerManagementException e) {
921
                        // TODO Auto-generated catch block
922
                        e.printStackTrace();
923
                }
924

    
925
                int terrainNewPos = 0;
926
                // Compute the new position.
927
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
928
                while (lyrIterator.hasNext()) {
929
                        FLayer auxLayer = lyrIterator.next();
930
                        if (auxLayer == layer)
931
                                break;
932
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
933
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
934
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
935
                                terrainNewPos++;
936
                        }
937

    
938
                }
939

    
940
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
941
                        return;
942
                if (terrainOldPos.get(0) != terrainNewPos)
943
                        try {
944
                                _terrainLayerManager.moveLayer(terrainOldPos.get(0),
945
                                                terrainNewPos);
946
                        } catch (LayerManagementException e) {
947
                                // TODO Auto-generated catch block
948
                                e.printStackTrace();
949
                        }
950
                //
951
                // System.out.println("En el toc antes era el " + oldPos +
952
                // " y ahora el "
953
                // + newPos);
954
                // System.out.println("En el terrain antes era el " + terrainOldPos
955
                // + " y ahora el " + terrainNewPos);
956

    
957
                // PrintDebugLayers();
958

    
959
        }
960

    
961
        public void layerRemoved(FLayers3D parent, FLayer layer) {
962
                System.out.println("Removed layer");
963

    
964
                // to remove group layers to 3D, just remove recursively child data
965
                // layers
966
                if (layer instanceof FLayers) {
967
                        FLayers group = (FLayers) layer;
968
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
969
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
970
                        }
971
                        getLayer3DProps(layer).setHooked(false);
972
                        return;
973
                }
974

    
975
                if (layer instanceof Classifiable) {
976
                        Classifiable legendLyr = (Classifiable) layer;
977
                        legendLyr.removeLegendListener((LegendListener) this);
978
                }
979

    
980
                layer.removeLayerListener((LayerListener) this);
981

    
982
                removeLayerToTerrain(layer);
983

    
984
                // All layers are removed
985
                if (layers.getLayersCount() == 0) {
986
                        _bEmptyView = true;
987
                }
988

    
989
                if (getLayer3DProps(layer).getType() == Layer3DProps.layer3DOSG) {
990

    
991
                        try {
992
                                ((TerrainViewer) _canvas3d.getOSGViewer())
993
                                                .removeFeature(getEditionManager(layer));
994
                        } catch (NodeException e) {
995
                                // TODO Auto-generated catch block
996
                                e.printStackTrace();
997
                        }
998

    
999
                }
1000

    
1001
                // PrintDebugLayers();
1002

    
1003
        }
1004

    
1005
        public void legendChanged(LegendChangedEvent e) {
1006
                if (!_bListenToLegend)
1007
                        return;
1008
                if ((e == null) && (!visibilityChange) ) {
1009
                        // find layer whose legend changed
1010
                        FLayer found = null;
1011
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1012
                        Layer3DProps props3D = getLayer3DProps(layers);
1013
                        while (lyrIterator.hasNext()) {
1014
                                FLayer lyr = lyrIterator.next();
1015
                                if (lyr instanceof FLyrVect
1016
                                                && props3D.getType() != Layer3DProps.layer3DOSG) {
1017
                                        FLyrVect lyrVect = (FLyrVect) lyr;
1018
                                        System.out
1019
                                                        .println("Changeando la simbologia de la capa vectorial: "
1020
                                                                        + lyrVect);
1021
                                        long newDrawVersion = layers.getDrawVersion();
1022
                                        Layer3DProps vectProps = getLayer3DProps(lyrVect);
1023
                                        if ((newDrawVersion - props3D.getDrawVersion()) >= 1) {
1024
                                                props3D.setDrawVersion(lyrVect.getDrawVersion());
1025
                                                
1026
                                                // if layer is vectorized remove and add the layer
1027
                                                if (vectProps.getType() == Layer3DProps.layer3DVector) {
1028
                                                        removeLayerToTerrain(lyr);
1029
                                                        addLayerToTerrain(lyr, true);
1030
                                                }
1031
                                                if(vectProps.getType() == Layer3DProps.layer3DImage)
1032
                                                         refreshLayerInTerrain(lyrVect, vectProps, true);
1033
                                                // refreshLayerVectorsVisibility(lyrVect);
1034
                                                // props3D.VerifyLegend(_terrain.getTerrainName());
1035
                                                _bListenToLegend = true;
1036
                                        }
1037
                                }
1038
                        }
1039
                        
1040
                        // IWindow f = PluginServices.getMDIManager().getActiveWindow();
1041
                        // if (f instanceof BaseView) {
1042
                        // BaseView view3D = (BaseView) f;
1043
                        // view3D.getTOC().refresh();
1044
                        // }
1045
                }
1046
                visibilityChange = false;
1047

    
1048
        }
1049

    
1050
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1051

    
1052
                if (_terrainLayerMap.size() == 0)
1053
                        return null;
1054
                if (rde == null)
1055
                        return null;
1056
                if (rde.getExtent() == null || rde.getLayer() == null
1057
                                || rde.getLayerManager() == null)
1058
                        return null;
1059

    
1060
                String layerID = rde.getLayer().getLayerID();
1061
                FLayer layer = (FLayer) _terrainLayerMap.get(layerID);
1062
                if (layer == null)
1063
                        return null;
1064
                if (!layer.isVisible())
1065
                        return null;
1066
                double minX, minY, width, height;
1067

    
1068
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
1069
                        minX = rde.getExtent().xMin();
1070
                        minY = rde.getExtent().yMin();
1071
                        width = rde.getExtent().xMax() - rde.getExtent().xMin();
1072
                        height = rde.getExtent().yMax() - rde.getExtent().yMin();
1073

    
1074
                } else {
1075
                        minX = Math.toDegrees(rde.getExtent().xMin());
1076
                        minY = Math.toDegrees(rde.getExtent().yMin());
1077
                        width = Math.toDegrees(rde.getExtent().xMax()
1078
                                        - rde.getExtent().xMin());
1079
                        height = Math.toDegrees(rde.getExtent().yMax()
1080
                                        - rde.getExtent().yMin());
1081
                }
1082
                GeometryManager geoMan = GeometryLocator.getGeometryManager();
1083
                Envelope envelope = null;
1084
                try {
1085
                        envelope = geoMan.createEnvelope(Geometry.SUBTYPES.GEOM2D);
1086
                        envelope.setLowerCorner(geoMan.createPoint(minX, minY,
1087
                                        Geometry.SUBTYPES.GEOM2D));
1088
                        envelope.setUpperCorner(geoMan.createPoint(minX + width, minY
1089
                                        + height, Geometry.SUBTYPES.GEOM2D));
1090
                } catch (CreateGeometryException e) {
1091
                        // TODO Auto-generated catch block
1092
                        e.printStackTrace();
1093
                } catch (CreateEnvelopeException e) {
1094
                        // TODO Auto-generated catch block
1095
                        e.printStackTrace();
1096
                }
1097

    
1098
                // Case of Raster data
1099

    
1100
                UpdateDataEvent ude = null;
1101

    
1102
                if (rde.getLayer().getLayerType() == Layer.LayerType.TEXTURELAYER)
1103
                        ude = loadRasterData(layer, envelope, rde);
1104

    
1105
                if (rde.getLayer().getLayerType() == Layer.LayerType.VECTORLAYER) 
1106
                        ude = loadVectorData(layer, envelope, rde);
1107
                
1108
                if (rde.getLayer().getLayerType() == Layer.LayerType.HEIGHTFIELDLAYER)
1109
                        ude = loadElevationData(layer, envelope, rde);
1110

    
1111
                return ude;
1112
        }
1113

    
1114
        private UpdateDataEvent loadRasterData(FLayer layer, Envelope envelope,
1115
                        RequestDataEvent rde) {
1116

    
1117
                UpdateDataEvent ude = new UpdateDataEvent();
1118
                ude.copyDataFromRequest(rde);
1119
                if (layer instanceof DefaultFLyrRaster) {
1120
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1121

    
1122
                        if (rLayer.getDataStore().isTiled()) {
1123

    
1124
                                rLayer = (DefaultFLyrRaster) layer;
1125

    
1126
                                RasterQuery query = RasterLocator.getManager().createQuery();
1127

    
1128
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1129
                                                .getManager()
1130
                                                .getDataStructFactory()
1131
                                                .createExtent(envelope.getLowerCorner().getX(),
1132
                                                                envelope.getUpperCorner().getY(),
1133
                                                                envelope.getUpperCorner().getX(),
1134
                                                                envelope.getLowerCorner().getY());
1135

    
1136
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1137
                                                rde.getTileY(), extent, null);
1138

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

    
1143
                                        Buffer transparencyBuffer = (result != null && result.length > 1) ? (Buffer) result[1]
1144
                                                        : null;
1145

    
1146
                                        ColorTable tileColorTable = (result != null && result.length > 2) ? (ColorTable) result[2]
1147
                                                        : null;
1148
                                        int addAlpha = 0;
1149

    
1150
                                        Transparency lastTransparency = rLayer.getDataStore()
1151
                                                        .getRender().getLastTransparency();
1152

    
1153
                                        lastTransparency.setAlphaBand(transparencyBuffer);
1154

    
1155
                                        addTileColorTable(tileColorTable, rLayer);
1156

    
1157
                                        Buffer procBuffer = processBufferFilters(rBuff, rLayer);
1158

    
1159
                                        if (lastTransparency.getAlphaBand() != null)
1160
                                                addAlpha = 1;
1161

    
1162
                                        // Si el numero de bandas es mayor que 3 (RGB) no se pueden
1163
                                        // dibujar todas
1164
                                        int numBands = rLayer.getDataStore().getBandCount();
1165

    
1166
                                        if (numBands > (maxBands))
1167
                                                numBands = maxBands;
1168

    
1169
                                        ColorInterpretation cInt = rLayer.getDataStore()
1170
                                                        .getColorInterpretation();
1171

    
1172
                                        ColorTable colorTable = rLayer.getDataStore()
1173
                                                        .getColorTable();
1174

    
1175
                                        int rgba[] = { 0, 1, 2, 3 };
1176

    
1177
                                        rgba = setBandsInColors(cInt);
1178

    
1179
                                        int pixelFormat = 0;
1180
                                        boolean isPalette = (cInt
1181
                                                        .getBand(ColorInterpretation.PAL_BAND) != -1);
1182

    
1183
                                        if (isPalette) {
1184

    
1185
                                                pixelFormat = org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1186

    
1187
                                        }
1188

    
1189
                                        else
1190
                                                pixelFormat = convertPixelFormat(numBands + addAlpha);
1191

    
1192
                                        switch (procBuffer.getDataType()) {
1193
                                        case Buffer.TYPE_BYTE:
1194

    
1195
                                                byte[] byteBuffer = null;
1196
                                                if (isPalette) {
1197
                                                        byteBuffer = buildByteBufferPalette(ude, rBuff,
1198
                                                                        colorTable, transparencyBuffer);
1199
                                                        ude.setRasterData(byteBuffer,
1200
                                                                        procBuffer.getWidth(),
1201
                                                                        procBuffer.getHeight(), 4, pixelFormat,
1202
                                                                        Image.DataType.GL_UNSIGNED_BYTE);
1203
                                                } else {
1204
                                                        byteBuffer = buildByteBuffer(ude, procBuffer,
1205
                                                                        lastTransparency.getAlphaBand(), numBands,
1206
                                                                        rgba);
1207
                                                        ude.setRasterData(byteBuffer,
1208
                                                                        procBuffer.getWidth(),
1209
                                                                        procBuffer.getHeight(),
1210
                                                                        numBands + addAlpha, pixelFormat,
1211
                                                                        Image.DataType.GL_UNSIGNED_BYTE);
1212
                                                }
1213
                                                break;
1214
                                        case Buffer.TYPE_SHORT:
1215
                                                ude.setRasterData(
1216
                                                                buildShortBuffer(ude, rBuff,
1217
                                                                                transparencyBuffer, numBands, rgba),
1218
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands,
1219
                                                                pixelFormat, Image.DataType.GL_SHORT);
1220
                                                break;
1221
                                        case Buffer.TYPE_USHORT:
1222
                                                ude.setRasterData(
1223
                                                                buildShortBuffer(ude, rBuff,
1224
                                                                                transparencyBuffer, numBands, rgba),
1225
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands,
1226
                                                                pixelFormat, Image.DataType.GL_UNSIGNED_SHORT);
1227
                                                break;
1228
                                        case Buffer.TYPE_INT:
1229
                                                ude.setRasterData(
1230
                                                                buildIntBuffer(ude, rBuff, transparencyBuffer,
1231
                                                                                numBands, rgba), rBuff.getWidth(),
1232
                                                                rBuff.getHeight(), numBands, pixelFormat,
1233
                                                                Image.DataType.GL_INT);
1234
                                                break;
1235
                                        case Buffer.TYPE_FLOAT:
1236
                                                ude.setRasterData(
1237
                                                                buildFloatBuffer(ude, rBuff,
1238
                                                                                transparencyBuffer, numBands, rgba),
1239
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands
1240
                                                                                + addAlpha, pixelFormat,
1241
                                                                Image.DataType.GL_FLOAT);
1242
                                                break;
1243
                                        case Buffer.TYPE_DOUBLE:
1244
                                                ude.setRasterData(
1245
                                                                buildDoubleBuffer(ude, rBuff,
1246
                                                                                transparencyBuffer, numBands, rgba),
1247
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands,
1248
                                                                pixelFormat, Image.DataType.GL_DOUBLE);
1249
                                                break;
1250
                                        }
1251

    
1252
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1253

    
1254
                                } catch (ProcessInterruptedException e) {
1255
                                        // TODO Auto-generated catch block
1256
                                        e.printStackTrace();
1257
                                } catch (RasterDriverException e) {
1258
                                        System.out.println("QueryArray failed");
1259
                                        // e.printStackTrace();
1260
                                } catch (InvalidSetViewException e) {
1261
                                        // TODO Auto-generated catch block
1262
                                        e.printStackTrace();
1263
                                } catch (NullPointerException e) {
1264
                                        // ude.setFailData();
1265
                                        System.out.println("Problem getting the tile. NullPointer");
1266
                                }
1267

    
1268
                        }
1269
                        // Not tiled raster
1270
                        else {
1271
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1272
                        }
1273

    
1274
                }
1275

    
1276
                // Vectorial rasterized
1277
                else if (layer instanceof FLyrVect) {
1278
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1279
                }
1280
                // unrecognized layer type
1281
                else {
1282
                        ude.setFailData();
1283
                }
1284

    
1285
                // System.out.println("Returning UDE");
1286

    
1287
                return ude;
1288
        }
1289

    
1290
        private void addTileColorTable(ColorTable tileColorTable,
1291
                        DefaultFLyrRaster rLayer) {
1292
                if (tileColorTable == null)
1293
                        return;
1294

    
1295
                else {
1296
                        RasterFilterList filterList = rLayer.getDataStore().getRender()
1297
                                        .getFilterList();
1298
                        if (filterList.getFilterClassByID("ColorTable") == null) {
1299
                                try {
1300
                                        RasterFilterListManager colorTableManager = filterList
1301
                                                        .getManagerByID("ColorTable");
1302
                                        Params params = filterList.createEmptyFilterParams();
1303
                                        params.setParam("colorTable", tileColorTable);
1304
                                        colorTableManager.addFilter(params);
1305
                                } catch (FilterManagerException e) {
1306
                                        e.printStackTrace();
1307
                                } catch (FilterTypeException e) {
1308
                                        e.printStackTrace();
1309
                                }
1310
                        }
1311
                }
1312
        }
1313

    
1314
        private Buffer processBufferFilters(Buffer rBuffer, DefaultFLyrRaster rLayer) {
1315

    
1316
                RasterDataStore store = rLayer.getDataStore();
1317
                Transparency transparency = rLayer.getDataStore().getRender()
1318
                                .getLastTransparency();
1319

    
1320
                if (rLayer.getDataStore() != null) {
1321
                        // Asignamos los datos al objeto transparencia antes de aplicar la
1322
                        // pila de filtros para que el valor NoData sea efectivo
1323
                        if (store.getTransparency().getNoData().isNoDataTransparent()
1324
                                        || transparency.existAlphaBand())
1325
                                transparency.setDataBuffer(rBuffer);
1326
                        else {
1327
                                transparency.setDataBuffer(null);
1328
                        }
1329
                        transparency.activeTransparency();
1330
                } else
1331
                        return null;
1332

    
1333
                // Aplicamos los filtros
1334

    
1335
                Grid grid = new GridImpl(rBuffer, store, true);
1336
                RasterFilterList filterList = rLayer.getRender().getFilterList();
1337
                if (filterList != null) {
1338
                        filterList.addEnvParam("Transparency", transparency);
1339
                        grid.setFilterList(filterList);
1340
                        ColorTable cTable = grid.getPalette();
1341
                        try {
1342
                                grid.applyFilters();
1343
                        } catch (ProcessInterruptedException e) {
1344
                                // TODO Auto-generated catch block
1345
                                e.printStackTrace();
1346
                        }
1347
                }
1348

    
1349
                // Si la lista de filtros genera bandas de transparencia se mezclan con
1350
                // la actual
1351
                if (grid.getFilterList().getAlphaBand() != null) {
1352
                        Buffer t = grid.getFilterList().getAlphaBand();
1353
                        if (transparency.getAlphaBand() != null)
1354
                                t = RasterLocator
1355
                                                .getManager()
1356
                                                .getColorConversion()
1357
                                                .mergeTransparencyBuffers(t,
1358
                                                                transparency.getAlphaBand());
1359
                        transparency.setAlphaBand(t);
1360
                        transparency.activeTransparency();
1361
                }
1362

    
1363
                return grid.getRasterBuf();
1364

    
1365
        }
1366

    
1367
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1368
                        RequestDataEvent rde) {
1369
                
1370
                UpdateDataEvent ude = new UpdateDataEvent();
1371
                ude.copyDataFromRequest(rde);
1372

    
1373
                Group g= new Group();
1374
                Layer3DProps layerprops = getLayer3DProps(layer);
1375
                //                 Hack for polylines and polygons to only render them rasterized
1376
                //                 till gvSIG architects solve geometries problem
1377

    
1378
                
1379
        //Hack for polygons
1380
        
1381
//                try {
1382
//                        if (((FLyrVect) layer).getShapeType()!=1 &&((FLyrVect) layer).getShapeType()!=7) 
1383
//                        {
1384
//                                removeLayerToTerrain(layer);
1385
//                                layerprops.setType(Layer3DPropsImpl.layer3DImage);
1386
//                                addLayerToTerrain(layer, true);
1387
//                                return null;
1388
//                        }
1389
//                } catch (ReadException e1) {
1390
//                        // TODO Auto-generated catch block
1391
//                        e1.printStackTrace();
1392
//                }// End hack
1393

    
1394
                // Set ViewPort
1395
                ViewPort vp = getViewPort();
1396
                vp.setEnvelope(envelope); // the real extent of the tile
1397
                vp.setAdjustable(false);
1398
                vp.setImageSize(new Dimension(256, 256));
1399
                vp.setDist1pixel(0.000000001);
1400
                ILegend legend = ((FLyrVect) layer).getLegend();
1401
                ISymbol[] symbolList = fillSymbolList(legend);
1402
                for (int i = 0; i < symbolList.length; i++) {
1403
                        I3DSymbol sy = (I3DSymbol) symbolList[i];
1404
                        sy.setCoordinateSystemType(_terrain.getCoordinateSystemType());
1405
                        if (layerprops.isZEnable() == false)
1406
                                sy.setFixedHeight(layerprops.getHeight());
1407
                }
1408

    
1409
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1410

    
1411
                DataStore ds = ((SingleLayer) layer).getDataStore();
1412

    
1413
                if (((I3DSymbol) symbolList[0]).getGeometry().getSize() == 0
1414
                                || ds.getProviderName() == "NetCDFVectorial"
1415
                                || layerprops.isGeometryDirty() == true) {
1416
                        try {
1417

    
1418
                                for(int i=0;i<symbolList.length;i++)
1419
                                {        
1420
                                        ((I3DSymbol)(symbolList[i])).resetGeometry();
1421

    
1422
                        
1423

    
1424
                                }
1425
                                layer.draw(null, null, getViewPort(), new MyCancel(), scale);
1426
                                // setGeometryDirty to false to avoid unnecessary repaints
1427
                                layerprops.setDirtyGeometry(false);
1428
                        } catch (ReadException e) {
1429
                                // TODO Auto-generated catch block
1430
                                e.printStackTrace();
1431
                        }
1432
                }
1433
                // OSG Layers
1434
                Node n = null;
1435

    
1436
                if (ds.getProviderName() == "OSG") {
1437
                        try {
1438
                                n = (Node) ds.invokeDynMethod("getNode", null);
1439
                                g.addChild(n);
1440
                        } catch (DynMethodException e) {
1441
                                // TODO Auto-generated catch block
1442
                                e.printStackTrace();
1443
                        } catch (NodeException e) {
1444
                                // TODO Auto-generated catch block
1445
                                e.printStackTrace();
1446
                        }
1447
                        System.out.println("OSG Layer added");
1448
                        // Change properties to OSG layer
1449
                        layerprops.setType(Layer3DProps.layer3DOSG);
1450
                }
1451
                // Vectorial layers
1452
                else {
1453

    
1454
                        for(int i=0;i<symbolList.length;i++)
1455
                        {
1456
                                n=((I3DSymbol) symbolList[i]).getRenderNode();
1457

    
1458

    
1459
                                try {
1460
                                        g.addChild(n);
1461
                                } catch (NodeException e) {
1462
                                        // TODO Auto-generated catch block
1463
                                        e.printStackTrace();
1464
                                }
1465
                        }
1466

    
1467
                }
1468
                ude.setVectorData(g);
1469
                return ude;
1470
        }
1471

    
1472

    
1473

    
1474
                private ISymbol[] fillSymbolList(ILegend legend) {
1475
                        ISymbol[] symbolList = null;
1476
                        if (legend instanceof ISingleSymbolLegend) {
1477
                                symbolList = new ISymbol[1];
1478
                                I3DSymbol sy = (I3DSymbol) ((ISingleSymbolLegend) (legend))
1479
                                .getDefaultSymbol();
1480
                                
1481
                                
1482
                                symbolList[0] = sy;
1483
                        }
1484
                        if (legend instanceof AbstractIntervalLegend)
1485
                                symbolList = ((AbstractIntervalLegend) (legend)).getSymbols();
1486
                        if (legend instanceof VectorialUniqueValueLegend) {
1487
                                ((VectorialUniqueValueLegend) (legend))
1488
                                .setDomain("project.document.view3d");
1489
                                symbolList = ((VectorialUniqueValueLegend) (legend)).getSymbols();
1490
                        }
1491
                        return symbolList;
1492

    
1493
        }
1494

    
1495

    
1496
        // private Node buildVectors(I3DSymbol symbol) {
1497
        // Node n = null;
1498
        //
1499
        // ISymbol3D sym = null;
1500
        // try {
1501
        // sym = Symbol3DFactory.getSymbol3D(symbol);
1502
        // } catch (NodeException e) {
1503
        // // TODO Auto-generated catch block
1504
        // e.printStackTrace();
1505
        // }
1506
        // // sm.setPointSize((float) sy.getSize());
1507
        // n = sym.buildSceneGraph(symbol.getGeometry());
1508
        // return n;
1509
        // }
1510

    
1511
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1512
                        RequestDataEvent rde) {
1513

    
1514
                UpdateDataEvent ude = new UpdateDataEvent();
1515
                ude.copyDataFromRequest(rde);
1516

    
1517
                if (layer instanceof DefaultFLyrRaster) {
1518
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1519
                        if (rLayer.getDataStore().isTiled()) {
1520

    
1521
                                rLayer = (DefaultFLyrRaster) layer;
1522
                                // boolean exists = _cachedLayers.containsKey(rLayer);
1523
                                //
1524
                                // if (!exists) {
1525
                                //
1526
                                // _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1527
                                //
1528
                                // }
1529
                                //
1530
                                // CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1531

    
1532
                                RasterQuery query = RasterLocator.getManager().createQuery();
1533

    
1534
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1535
                                                .getManager()
1536
                                                .getDataStructFactory()
1537
                                                .createExtent(envelope.getLowerCorner().getX(),
1538
                                                                envelope.getUpperCorner().getY(),
1539
                                                                envelope.getUpperCorner().getX(),
1540
                                                                envelope.getLowerCorner().getY());
1541

    
1542
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1543
                                                rde.getTileY(), extent, null);
1544

    
1545
                                // query.setAreaOfInterest(extent, 512, 512);
1546

    
1547
                                // System.out.println("Tile Parameters:");
1548
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1549
                                // System.out.println("TileX = " + rde.getTileX());
1550
                                // System.out.println("TileY = " + rde.getTileY());
1551
                                // System.out.println("Extent = " + extent.getULX() + " "
1552
                                // + extent.getULY() + " " + extent.getLRX() + " "
1553
                                // + extent.getLRY());
1554

    
1555
                                try {
1556
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1557
                                        Buffer rBuff = (Buffer) result[0];
1558
                                        Buffer transparencyBuffer;
1559

    
1560
                                        if (result.length < 2)
1561
                                                transparencyBuffer = null;
1562
                                        else
1563
                                                transparencyBuffer = (Buffer) result[1];
1564

    
1565
                                        int numBands = rBuff.getBandCount();
1566
                                        if (transparencyBuffer != null) {
1567

    
1568
                                                // System.out
1569
                                                // .println("Tengo Transparency buffer con "
1570
                                                // + transparencyBuffer.getBandCount()
1571
                                                // + " bandas");
1572
                                                numBands++;
1573

    
1574
                                        }
1575

    
1576
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1577
                                        // + " alto: " + rBuff.getHeight()
1578
                                        // + " bandas totales incluyendo alpha (si tiene): "
1579
                                        // + numBands);
1580

    
1581
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1582
                                                        .getHeight())];
1583

    
1584
                                        int pixelFormat = convertPixelFormat(numBands);
1585

    
1586
                                        // K hay que setearlo en el dialogo
1587
                                        int cont = 0;
1588

    
1589
                                        int k = getLayer3DProps(rLayer).getElevationBand();
1590

    
1591
                                        for (int i = rBuff.getWidth() - 1; i >= 0; i--) {
1592
                                                // Vertical Flip needed
1593
                                                for (int j = 0; j < rBuff.getHeight(); j++) {
1594

    
1595
                                                        switch (rBuff.getDataType()) {
1596
                                                        case Buffer.TYPE_BYTE:
1597
                                                                data[cont] = (float) (rBuff
1598
                                                                                .getElemByte(i, j, k));
1599
                                                                cont++;
1600
                                                                break;
1601
                                                        case Buffer.TYPE_DOUBLE:
1602
                                                                data[cont] = (float) (Math.round(rBuff
1603
                                                                                .getElemDouble(i, j, k)));
1604
                                                                cont++;
1605
                                                                break;
1606
                                                        case Buffer.TYPE_FLOAT:
1607
                                                                data[cont] = (float) (Math.round(rBuff
1608
                                                                                .getElemFloat(i, j, k)));
1609
                                                                cont++;
1610
                                                                break;
1611
                                                        case Buffer.TYPE_INT:
1612
                                                                data[cont] = (float) (rBuff.getElemInt(i, j, k) & 0xffffffff);
1613
                                                                cont++;
1614
                                                                break;
1615
                                                        case Buffer.TYPE_SHORT:
1616
                                                        case Buffer.TYPE_USHORT:
1617
                                                                data[cont] = (float) (rBuff.getElemShort(i, j,
1618
                                                                                k) & 0xffff);
1619
                                                                cont++;
1620
                                                                break;
1621
                                                        }
1622

    
1623
                                                }
1624

    
1625
                                        }
1626
                                        ude.setHeightfieldData(data, rBuff.getWidth(),
1627
                                                        rBuff.getHeight());
1628

    
1629
                                        data = null;
1630
                                        result = null;
1631
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1632

    
1633
                                } catch (ProcessInterruptedException e) {
1634
                                        // TODO Auto-generated catch block
1635
                                        e.printStackTrace();
1636
                                } catch (RasterDriverException e) {
1637
                                        e.printStackTrace();
1638
                                } catch (InvalidSetViewException e) {
1639
                                        // TODO Auto-generated catch block
1640
                                        e.printStackTrace();
1641
                                } catch (NullPointerException e) {
1642
                                        // ude.setFailData();
1643
                                        System.out.println("Problem getting the tile");
1644
                                }
1645

    
1646
                        }
1647
                        // No cache
1648
                        else {
1649
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1650
                        }
1651

    
1652
                }
1653
                // unrecognized layer type
1654
                else {
1655
                        ude.setFailData();
1656
                }
1657

    
1658
                return ude;
1659

    
1660
        }
1661

    
1662
        protected byte[] buildByteBuffer(UpdateDataEvent ude, Buffer rBuff,
1663
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1664

    
1665
                int cont = 0;
1666
                int colorBands = numBands;
1667

    
1668
                if (transparencyBuffer != null) {
1669
                        // colorBands--;
1670
                        numBands = numBands + 1;
1671
                }
1672

    
1673
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * numBands];
1674

    
1675
                for (int i = 0; i < rBuff.getWidth(); i++) {
1676

    
1677
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1678

    
1679
                                for (int k = 0; k < colorBands; k++) {
1680
                                        data[cont] = (byte) rBuff.getElemByte(i, j, rgba[k]);
1681
                                        // if(data[cont]!=-1)
1682
                                        // System.out.println("Banda: " + k + " " + data[cont]);
1683
                                        cont++;
1684

    
1685
                                }
1686
                                if (transparencyBuffer != null) {
1687
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1688
                                        // data[cont] = (byte) 0;
1689
                                        // else
1690
                                        // data[cont] = (byte) 255;
1691
                                        data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1692
                                        cont++;
1693

    
1694
                                }
1695

    
1696
                        }
1697
                }
1698

    
1699
                return data;
1700
        }
1701

    
1702
        protected byte[] buildByteBufferPalette(UpdateDataEvent ude, Buffer rBuff,
1703
                        ColorTable colorTable, Buffer transparencyBuffer) {
1704

    
1705
                int cont = 0;
1706

    
1707
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * 4];
1708

    
1709
                for (int i = 0; i < rBuff.getWidth(); i++) {
1710

    
1711
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1712

    
1713
                                byte index = rBuff.getElemByte(i, j, 0);
1714

    
1715
                                byte[] rgba = colorTable.getRGBAByBand((double) (index & 0xff));
1716

    
1717
                                for (int k = 0; k < 4; k++) {
1718
                                        data[cont] = rgba[k];
1719
                                        if (k == 3 && transparencyBuffer != null)
1720
                                                data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1721
                                        cont++;
1722
                                }
1723
                        }
1724
                }
1725

    
1726
                return data;
1727
        }
1728

    
1729
        protected short[] buildShortBuffer(UpdateDataEvent ude, Buffer rBuff,
1730
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1731
                int cont = 0;
1732
                int colorBands = numBands;
1733

    
1734
                if (transparencyBuffer != null) {
1735
                        // colorBands--;
1736
                        numBands = numBands + 1;
1737
                }
1738

    
1739
                short[] data = new short[rBuff.getWidth() * rBuff.getHeight()
1740
                                * numBands];
1741

    
1742
                for (int i = 0; i < rBuff.getWidth(); i++) {
1743

    
1744
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1745

    
1746
                                for (int k = 0; k < colorBands; k++) {
1747
                                        // En lugar de k se deben usar las bandas asociadas al
1748
                                        // componente
1749
                                        data[cont] = (short) rBuff.getElemShort(i, j, rgba[k]);
1750
                                        cont++;
1751

    
1752
                                }
1753
                                if (transparencyBuffer != null) {
1754
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1755
                                        // data[cont] = (byte) 0;
1756
                                        // else
1757
                                        // data[cont] = (byte) 255;
1758
                                        data[cont] = transparencyBuffer.getElemShort(i, j, 0);
1759

    
1760
                                        cont++;
1761

    
1762
                                }
1763
                        }
1764
                }
1765

    
1766
                return data;
1767
        }
1768

    
1769
        protected int[] buildIntBuffer(UpdateDataEvent ude, Buffer rBuff,
1770
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1771
                int cont = 0;
1772
                int colorBands = numBands;
1773

    
1774
                if (transparencyBuffer != null) {
1775
                        // colorBands--;
1776
                        numBands = numBands + 1;
1777
                }
1778

    
1779
                int[] data = new int[rBuff.getWidth() * rBuff.getHeight() * numBands];
1780

    
1781
                for (int i = 0; i < rBuff.getWidth(); i++) {
1782

    
1783
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1784

    
1785
                                for (int k = 0; k < colorBands; k++) {
1786
                                        // En lugar de k se deben usar las bandas asociadas al
1787
                                        // componente
1788
                                        data[cont] = rBuff.getElemInt(i, j, rgba[k]);
1789
                                        cont++;
1790

    
1791
                                }
1792
                                if (transparencyBuffer != null) {
1793
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1794
                                        // data[cont] = (byte) 0;
1795
                                        // else
1796
                                        // data[cont] = (byte) 255;
1797
                                        data[cont] = transparencyBuffer.getElemInt(i, j, 0);
1798

    
1799
                                        cont++;
1800

    
1801
                                }
1802
                        }
1803
                }
1804

    
1805
                return data;
1806
        }
1807

    
1808
        protected float[] buildFloatBuffer(UpdateDataEvent ude, Buffer rBuff,
1809
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1810

    
1811
                int cont = 0;
1812
                int colorBands = numBands;
1813

    
1814
                if (transparencyBuffer != null) {
1815
                        // colorBands--;
1816
                        numBands = numBands + 1;
1817
                }
1818

    
1819
                float[] data = new float[rBuff.getWidth() * rBuff.getHeight()
1820
                                * numBands];
1821

    
1822
                for (int i = 0; i < rBuff.getWidth(); i++) {
1823

    
1824
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1825

    
1826
                                for (int k = 0; k < colorBands; k++) {
1827
                                        // En lugar de k se deben usar las bandas asociadas al
1828
                                        // componente
1829
                                        data[cont] = rBuff.getElemFloat(i, j, rgba[k]);
1830
                                        cont++;
1831

    
1832
                                }
1833
                                if (transparencyBuffer != null) {
1834
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1835
                                        // data[cont] = (byte) 0;
1836
                                        // else
1837
                                        // data[cont] = (byte) 255;
1838
                                        data[cont] = transparencyBuffer.getElemFloat(i, j, 0);
1839

    
1840
                                        cont++;
1841

    
1842
                                }
1843
                        }
1844
                }
1845

    
1846
                return data;
1847
        }
1848

    
1849
        protected double[] buildDoubleBuffer(UpdateDataEvent ude, Buffer rBuff,
1850
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1851
                int cont = 0;
1852
                int colorBands = numBands;
1853

    
1854
                if (transparencyBuffer != null) {
1855
                        // colorBands--;
1856
                        numBands = numBands + 1;
1857
                }
1858

    
1859
                double[] data = new double[rBuff.getWidth() * rBuff.getHeight()
1860
                                * numBands];
1861

    
1862
                for (int i = 0; i < rBuff.getWidth(); i++) {
1863

    
1864
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1865

    
1866
                                for (int k = 0; k < colorBands; k++) {
1867
                                        // En lugar de k se deben usar las bandas asociadas al
1868
                                        // componente
1869
                                        data[cont] = rBuff.getElemDouble(i, j, rgba[k]);
1870
                                        cont++;
1871

    
1872
                                }
1873
                                if (transparencyBuffer != null) {
1874
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1875
                                        // data[cont] = (byte) 0;
1876
                                        // else
1877
                                        // data[cont] = (byte) 255;
1878
                                        data[cont] = transparencyBuffer.getElemDouble(i, j, 0);
1879

    
1880
                                        cont++;
1881

    
1882
                                }
1883
                        }
1884
                }
1885

    
1886
                return data;
1887
        }
1888

    
1889
        protected int convertPixelFormat(int type) {
1890

    
1891
                switch (type) {
1892

    
1893
                case 1:
1894
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1895

    
1896
                case 2:
1897
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1898

    
1899
                case 3:
1900
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1901

    
1902
                case 4:
1903
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1904

    
1905
                }
1906

    
1907
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1908

    
1909
        }
1910

    
1911
        protected int[] setBandsInColors(ColorInterpretation cInt) {
1912

    
1913
                int rgba[] = new int[4];
1914

    
1915
                rgba[0] = cInt.getBand(ColorInterpretation.RED_BAND);
1916
                if (rgba[0] == -1)
1917
                        rgba[0] = 0;
1918
                rgba[1] = cInt.getBand(ColorInterpretation.GREEN_BAND);
1919
                if (rgba[1] == -1)
1920
                        rgba[1] = 1;
1921
                rgba[2] = cInt.getBand(ColorInterpretation.BLUE_BAND);
1922
                if (rgba[2] == -1)
1923
                        rgba[2] = 2;
1924
                rgba[3] = cInt.getBand(ColorInterpretation.ALPHA_BAND);
1925
                if (rgba[3] == -1)
1926
                        rgba[3] = 3;
1927

    
1928
                return rgba;
1929

    
1930
        }
1931

    
1932
        protected class MyCancel implements Cancellable {
1933
                private boolean cancel = false;
1934

    
1935
                public MyCancel() {
1936
                }
1937

    
1938
                public void setCanceled(boolean canceled) {
1939
                        cancel = canceled;
1940
                }
1941

    
1942
                public boolean isCanceled() {
1943
                        return cancel;
1944
                }
1945
        }
1946

    
1947
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1948

    
1949
                int size = 256;
1950
                BufferedImage image = new BufferedImage(size, size,
1951
                                BufferedImage.TYPE_4BYTE_ABGR);
1952

    
1953
                ViewPort vp = new ViewPort(_viewProjection);
1954
                vp.setEnvelope(envelope); // the real extent of the tile
1955

    
1956
                vp.setAdjustable(false);
1957
                vp.setImageSize(new Dimension(size, size));
1958
                vp.setDist1pixel(0.000000001);
1959

    
1960
                Graphics2D graphics = image.createGraphics();
1961
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1962
                // background
1963
                graphics.setColor(backgColor);
1964
                graphics.fillRect(0, 0, size, size);
1965

    
1966
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1967

    
1968
                try {
1969
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1970

    
1971
                } catch (Exception e) {
1972
                        return null;
1973
                }
1974

    
1975
                return image;
1976

    
1977
        }
1978

    
1979
        public void nameChanged(LayerEvent e) {
1980
                System.out.println("Name change");
1981

    
1982
        }
1983

    
1984
        public void refreshLayerInTerrain(FLayer layer, Layer3DProps props,
1985
                        boolean bRemoveCache) {
1986

    
1987
                System.out.println("Refresh");
1988
                if (props == null)
1989
                        return;
1990

    
1991
                if (_terrain == null)
1992
                        return; // view not opened yet
1993

    
1994
                // clear cache
1995

    
1996
                // refresh layer in terrain
1997
                int type = props.getType();
1998
                if ((type == Layer3DProps.layer3DImage)
1999
                                || (type == Layer3DProps.layer3DElevation)
2000
                                || (type == Layer3DProps.layer3DVectorMR)) {
2001

    
2002
                        try {
2003
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
2004
                        } catch (LayerManagementException e) {
2005
                                // TODO Auto-generated catch block
2006
                                e.printStackTrace();
2007
                        }
2008
                } else if (type == Layer3DProps.layer3DVector) {
2009
                        // ILegend legend = ((FLyrVect) layer).getLegend();
2010
                        //
2011
                        // try {
2012
                        // RequestDataEvent rde = new RequestDataEvent();
2013
                        // loadVectorData(layer, layer.getFullEnvelope(),
2014
                        // new RequestDataEvent(), (I3DSymbol) legend.getDefaultSymbol());
2015
                        // } catch (ReadException e) {
2016
                        // // TODO Auto-generated catch block
2017
                        // e.printStackTrace();
2018
                        // }
2019

    
2020
                }
2021

    
2022
        }
2023

    
2024
        public boolean removeCache(File path) {
2025
                if (path.exists()) {
2026
                        File[] files = path.listFiles();
2027
                        for (int i = 0; i < files.length; i++) {
2028
                                if (files[i].isDirectory()) {
2029
                                        removeCache(files[i]);
2030
                                } else {
2031
                                        files[i].delete();
2032
                                }
2033
                        }
2034
                }
2035
                return (path.delete());
2036
        }
2037

    
2038
        public void removeLayerToTerrain(FLayer layer) {
2039

    
2040
                Layer terrainLayer = _terrainFLayerMap.get(layer);
2041
                if (terrainLayer != null) {
2042

    
2043
                        _terrainLayerMap.remove(terrainLayer.getLayerID());
2044
                        _terrainFLayerMap.remove(layer);
2045

    
2046
                        try {
2047
                                _terrainLayerManager.removeLayer(terrainLayer);
2048
                        } catch (LayerManagementException e) {
2049
                                // TODO Auto-generated catch block
2050
                                e.printStackTrace();
2051
                        }
2052
                }
2053

    
2054
        }
2055

    
2056
        public void selectionChanged(SelectionEvent e) {
2057
                // TODO Auto-generated method stub
2058
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
2059
                // while (lyrIterator.hasNext()) {
2060
                // FLayer layer = lyrIterator.next();
2061
                // Layer3DProps props3D = getLayer3DProps(layer);
2062
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
2063
                // if (layer.getClass().equals(FLyrVect.class)) {
2064
                // FLyrVect lyr = (FLyrVect) layer;
2065
                //
2066
                // FBitSet selection = null;
2067
                // try {
2068
                // selection = lyr.getRecordset().getSelectionSupport()
2069
                // .getSelection();
2070
                // } catch (ReadDriverException e1) {
2071
                // // TODO Auto-generated catch block
2072
                // e1.printStackTrace();
2073
                // }
2074
                //
2075
                // if ((selection.cardinality() == 0)
2076
                // || (!(selection.isEmpty()))) {
2077
                // Layer3DProps props = Layer3DProps
2078
                // .getLayer3DProps(layer);
2079
                // refreshLayerInTerrain(props, true);
2080
                // if (layer instanceof FLyrVect) {
2081
                // FLyrVect fvect = (FLyrVect) layer;
2082
                // props.drawVersion = fvect.getDrawVersion();
2083
                // }
2084
                // }
2085
                // }
2086
                // }
2087
                // }
2088

    
2089
        }
2090

    
2091
        public void setDataManager(JavaDataDriver manager) {
2092
                _terrainDataManager = manager;
2093
                _terrainDataManager.setDataLoader(this);
2094

    
2095
        }
2096

    
2097
        public void setLayerManager(LayerManager manager) {
2098
                _terrainLayerManager = manager;
2099

    
2100
        }
2101

    
2102
        public void setLoading(boolean bLoading) {
2103
                _bLoading = bLoading;
2104

    
2105
        }
2106

    
2107
        public void setRenewCanvasOff(boolean renewCanvasOff) {
2108
                _renewCanvasOff = renewCanvasOff;
2109

    
2110
        }
2111

    
2112
        public void setTerrain(Terrain terrain) {
2113
                if (_terrain == terrain)
2114
                        return;
2115

    
2116
                _terrain = terrain;
2117

    
2118
                // add layers to terrain necessary when we are loading
2119
                addCurrentLayers();
2120

    
2121
        }
2122

    
2123
        public void setVerticalExaggeration(float verticalExaggeration) {
2124
                _verticalExaggeration = verticalExaggeration;
2125

    
2126
        }
2127

    
2128
        public void setViewProjection(IProjection projection) {
2129
                _viewProjection = projection;
2130

    
2131
        }
2132

    
2133
        public void setViewer(IViewerContainer canvas) {
2134
                _canvas3d = canvas;
2135
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
2136

    
2137
        }
2138

    
2139
        public void visibilityChanged(LayerEvent e) {
2140
                FLayer lyr = e.getSource();
2141

    
2142
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
2143
                // refreshLayerVectorsVisibility(lyr);
2144
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
2145
                // refreshLayer3DOSGVisibility(lyr);
2146
                // } else {
2147
                refreshLayerVisibility(lyr);
2148
                // }
2149
                visibilityChange = true;
2150

    
2151
        }
2152

    
2153
        private void refreshLayerVisibility(FLayer layer) {
2154

    
2155
                Layer terrainLayer = _terrainFLayerMap.get(layer);
2156
                terrainLayer.setEnabled(layer.isVisible());
2157
                getEditionManager(layer).setEnabledNode(layer.isVisible());
2158
                // _terrainLayerManager.updateLayers();
2159

    
2160
        }
2161

    
2162
        public void zoomToEnvelope(Envelope geoEnvelope) {
2163
                if (geoEnvelope == null)
2164
                        return;
2165
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
2166
                        return;
2167

    
2168
                double maxHeight = 0.0;
2169

    
2170
                // Getting envelope positions
2171
                double minLat = geoEnvelope.getMinimum(0);
2172
                double maxLat = geoEnvelope.getMaximum(0);
2173

    
2174
                double cenLon = geoEnvelope.getCenter(0);
2175
                double cenLat = geoEnvelope.getCenter(1);
2176

    
2177
                double elevation = 0;
2178

    
2179
                // calculate altitude
2180
                double avLat = 0;
2181
                if (minLat > 0.0 || maxLat < 0.0)
2182
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
2183
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
2184

    
2185
                double terrainRadius = _terrain.getRadiusEquatorial();
2186
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
2187
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
2188
                                * (1 - Math.cos(Math.toRadians(avLon))));
2189
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
2190
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
2191

    
2192
                // Calculate XYZ positions for camera.
2193

    
2194
                int terrainType = _terrain.getCoordinateSystemType();
2195

    
2196
                double zoomFactor = 1.5;
2197
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
2198
                        zoomFactor = 1.3;
2199
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
2200

    
2201
                Vec3 eye = new Vec3();
2202
                Vec3 center = new Vec3();
2203
                Vec3 up = new Vec3();
2204
                // Calculate positions for PLAIN MODE.
2205
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
2206

    
2207
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
2208
                                        .getMinimum(1)) / 1.2d;
2209
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
2210
                                        .getMinimum(0)) / 1.2d;
2211
                        double height;
2212

    
2213
                        height = Math.sqrt(difx * difx + dify * dify);
2214
                        double fullWindowFactor = 1.7;
2215
                        // EYE
2216
                        eye.setX(cenLon);
2217
                        eye.setY(cenLat);
2218
                        eye.setZ(height * fullWindowFactor);
2219
                        // CENTER
2220
                        center.setX(cenLon);
2221
                        center.setY(cenLat);
2222
                        center.setZ(0.0);
2223
                        // UP
2224
                        up.setX(0.0);
2225
                        up.setY(1.0);
2226
                        up.setZ(0.0);
2227
                } else
2228
                // Calculate positions for SPHERICAL MODE.
2229
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
2230
                        // EYE
2231
                        Vec3 aux = new Vec3(cenLon, cenLat, elevation);
2232
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
2233
                        // CENTER
2234
                        center.setX(0.0);
2235
                        center.setY(0.0);
2236
                        center.setZ(0.0);
2237
                        // UP
2238
                        up.setX(0.0);
2239
                        up.setY(0.0);
2240
                        up.setZ(1.0);
2241
                }
2242
                Camera cam = new Camera();
2243
                cam.setViewByLookAt(eye, center, up);
2244

    
2245
                _terrainViewer.setCamera(cam);
2246

    
2247
        }
2248

    
2249
        public void editionChanged(LayerEvent e) {
2250
                // TODO Auto-generated method stub
2251

    
2252
        }
2253

    
2254
        public void drawValueChanged(LayerEvent e) {
2255
                // TODO Auto-generated method stub
2256

    
2257
        }
2258

    
2259
        public boolean symbolChanged(SymbolLegendEvent e) {
2260

    
2261
                System.out.println("Symbol changed");
2262
                return false;
2263
        }
2264

    
2265
        public void legendCleared(LegendClearEvent event) {
2266
                // TODO Auto-generated method stub
2267

    
2268
        }
2269

    
2270
        public static class RegisterPersistence implements Callable {
2271

    
2272
                public Object call() throws Exception {
2273
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
2274
                        if (manager.getDefinition(MapContext.class) == null) {
2275
                                MapContext.registerPersistent();
2276
                        }
2277
                        DynStruct definition = manager.addDefinition(
2278
                                        MapContext3DImpl.class, "MapContext3DImpl",
2279
                                        "MapContext3DImpl Persistence definition", null, null);
2280
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
2281
                                        "MapContext");
2282

    
2283
                        return Boolean.TRUE;
2284
                }
2285
        }
2286

    
2287
        @Override
2288
        public EditionManager getEditionManager(FLayer layer) {
2289

    
2290
                EditionManager eManager = _layersEditionMap.get(layer);
2291

    
2292
                if (eManager == null) {
2293

    
2294
                        try {
2295
                                DataStore ds = ((SingleLayer) layer).getDataStore();
2296

    
2297
                                Node n = null;
2298

    
2299
                                if (ds.getProviderName() == "OSG") {
2300

    
2301
                                        n = (Node) ds.invokeDynMethod("getNode", null);
2302

    
2303
                                } else
2304
                                        n = new Group();
2305

    
2306
                                eManager = new EditionManager();
2307

    
2308
                                Group loadedScene = new Group(n.getCPtr());
2309

    
2310
                                for (int i = 0; i < loadedScene.getNumChildren(); i++) {
2311

    
2312
                                        eManager.setScene(loadedScene.getChild(i));
2313

    
2314
                                }
2315

    
2316
                                BasicInputHandler handler = new BasicInputHandler(eManager,
2317
                                                (OSGViewer) _canvas3d.getOSGViewer());
2318

    
2319
                                _canvas3d.getOSGViewer().addEventHandler(handler);
2320
                                ((TerrainViewer) _canvas3d.getOSGViewer()).addFeature(eManager);
2321

    
2322
                                _layersEditionMap.put(layer, eManager);
2323
                                _layersHandlerMap.put(layer, handler);
2324

    
2325
                        } catch (NodeException e2) {
2326
                                // TODO Auto-generated catch block
2327
                                e2.printStackTrace();
2328
                        } catch (DynMethodException e) {
2329
                                // TODO Auto-generated catch block
2330
                                e.printStackTrace();
2331
                        }
2332

    
2333
                }
2334

    
2335
                return eManager;
2336
        }
2337

    
2338
        public BasicInputHandler getEditionHandler(FLayer layer) {
2339

    
2340
                return _layersHandlerMap.get(layer);
2341

    
2342
        }
2343
}