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

History | View | Annotate | Download (65.9 KB)

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

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

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

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

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

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

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

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

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

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

    
173
        private boolean visibilityChange = false;
174

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

    
178
        int maxBands = 3;
179

    
180
        public MapContext3DImpl() {
181

    
182
        }
183

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

    
187
        }
188

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

    
191
                super(fLayers, vp);
192
        }
193

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

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

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

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

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

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

    
238
                }
239

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

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

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

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

    
277
                }
278
        }
279

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

    
296
        }
297

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

    
309
        }
310

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

    
330
        public void activationChanged(LayerEvent e) {
331

    
332
        }
333

    
334
        public void addCurrentLayers() {
335

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

    
345
        }
346

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

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

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

    
361
                geoMan = GeometryLocator.getGeometryManager();
362

    
363
                if (layerEnvelope == null) {
364

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

    
374
                                else {
375

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

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

    
391
                }
392

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

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

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

    
408
                }
409

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

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

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

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

    
464
                                _cachedLayers.remove(layer);
465

    
466
                        }
467

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

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

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

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

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

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

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

    
537
                                _cachedLayers.remove(layer);
538

    
539
                        }
540

    
541
                }
542

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

    
550
        }
551

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

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

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

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

    
688
                // return null;
689
        }
690

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

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

    
701
                }
702
                return specialNode;
703
        }
704

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

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

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

    
717
        public void invalidateVectorLayer(Layer3DProps props) {
718

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

    
730
        }
731

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

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

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

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

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

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

    
791
                }
792

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

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

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

    
821
        }
822

    
823
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
824

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

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

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

    
833
                int coordinates = CacheStruct.FLAT;
834

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

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

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

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

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

    
852
                int resolution = 256;
853

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

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

    
859
                        resolution = 32;
860

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

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

    
870
                return struct;
871

    
872
        }
873

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

    
888
        }
889

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

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

    
909
                int type = props3D.getType();
910

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

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

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

    
939
                }
940

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

    
958
                // PrintDebugLayers();
959

    
960
        }
961

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

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

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

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

    
983
                removeLayerToTerrain(layer);
984

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

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

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

    
1000
                }
1001

    
1002
                // PrintDebugLayers();
1003

    
1004
        }
1005

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

    
1037
                                        }
1038
                                }
1039
                        }
1040

    
1041
                        // IWindow f = PluginServices.getMDIManager().getActiveWindow();
1042
                        // if (f instanceof BaseView) {
1043
                        // BaseView view3D = (BaseView) f;
1044
                        // view3D.getTOC().refresh();
1045
                        // }
1046
                }
1047
                visibilityChange = false;
1048

    
1049
        }
1050

    
1051
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1052

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

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

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

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

    
1099
                // Case of Raster data
1100

    
1101
                UpdateDataEvent ude = null;
1102

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

    
1106
                if (rde.getLayer().getLayerType() == Layer.LayerType.VECTORLAYER) {
1107
                        // NodeMarker3DSymbol n = new NodeMarker3DSymbol();
1108
                        // n.setNodeFileURL("/home/jtorres/Projects/OpenSceneGraph/OpenSceneGraph-Data/dumptruck.osg");
1109
                        // n.setSize(25.0f);
1110
                        ude = loadVectorData(layer, envelope, rde);
1111
                }
1112
                if (rde.getLayer().getLayerType() == Layer.LayerType.HEIGHTFIELDLAYER)
1113
                        ude = loadElevationData(layer, envelope, rde);
1114

    
1115
                return ude;
1116
        }
1117

    
1118
        private UpdateDataEvent loadRasterData(FLayer layer, Envelope envelope,
1119
                        RequestDataEvent rde) {
1120

    
1121
                UpdateDataEvent ude = new UpdateDataEvent();
1122
                ude.copyDataFromRequest(rde);
1123
                if (layer instanceof DefaultFLyrRaster) {
1124
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1125

    
1126
                        if (rLayer.getDataStore().isTiled()) {
1127

    
1128
                                rLayer = (DefaultFLyrRaster) layer;
1129

    
1130
                                RasterQuery query = RasterLocator.getManager().createQuery();
1131

    
1132
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1133
                                                .getManager()
1134
                                                .getDataStructFactory()
1135
                                                .createExtent(envelope.getLowerCorner().getX(),
1136
                                                                envelope.getUpperCorner().getY(),
1137
                                                                envelope.getUpperCorner().getX(),
1138
                                                                envelope.getLowerCorner().getY());
1139

    
1140
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1141
                                                rde.getTileY(), extent, null);
1142

    
1143
                                try {
1144
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1145
                                        Buffer rBuff = (Buffer) result[0];
1146

    
1147
                                        Buffer transparencyBuffer = (result != null && result.length > 1) ? (Buffer) result[1]
1148
                                                        : null;
1149

    
1150
                                        ColorTable tileColorTable = (result != null && result.length > 2) ? (ColorTable) result[2]
1151
                                                        : null;
1152
                                        int addAlpha = 0;
1153

    
1154
                                        Transparency lastTransparency = rLayer.getDataStore()
1155
                                                        .getRender().getLastTransparency();
1156

    
1157
                                        lastTransparency.setAlphaBand(transparencyBuffer);
1158

    
1159
                                        addTileColorTable(tileColorTable, rLayer);
1160

    
1161
                                        Buffer procBuffer = processBufferFilters(rBuff, rLayer);
1162

    
1163
                                        if (lastTransparency.getAlphaBand() != null)
1164
                                                addAlpha = 1;
1165

    
1166
                                        // Si el numero de bandas es mayor que 3 (RGB) no se pueden
1167
                                        // dibujar todas
1168
                                        int numBands = rLayer.getDataStore().getBandCount();
1169

    
1170
                                        if (numBands > (maxBands))
1171
                                                numBands = maxBands;
1172

    
1173
                                        ColorInterpretation cInt = rLayer.getDataStore()
1174
                                                        .getColorInterpretation();
1175

    
1176
                                        ColorTable colorTable = rLayer.getDataStore()
1177
                                                        .getColorTable();
1178

    
1179
                                        int rgba[] = { 0, 1, 2, 3 };
1180

    
1181
                                        rgba = setBandsInColors(cInt);
1182

    
1183
                                        int pixelFormat = 0;
1184
                                        boolean isPalette = (cInt
1185
                                                        .getBand(ColorInterpretation.PAL_BAND) != -1);
1186

    
1187
                                        if (isPalette) {
1188

    
1189
                                                pixelFormat = org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1190

    
1191
                                        }
1192

    
1193
                                        else
1194
                                                pixelFormat = convertPixelFormat(numBands + addAlpha);
1195

    
1196
                                        switch (procBuffer.getDataType()) {
1197
                                        case Buffer.TYPE_BYTE:
1198

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

    
1256
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1257

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

    
1272
                        }
1273
                        // Not tiled raster
1274
                        else {
1275
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1276
                        }
1277

    
1278
                }
1279

    
1280
                // Vectorial rasterized
1281
                else if (layer instanceof FLyrVect) {
1282
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1283
                }
1284
                // unrecognized layer type
1285
                else {
1286
                        ude.setFailData();
1287
                }
1288

    
1289
                // System.out.println("Returning UDE");
1290

    
1291
                return ude;
1292
        }
1293

    
1294
        private void addTileColorTable(ColorTable tileColorTable,
1295
                        DefaultFLyrRaster rLayer) {
1296
                if (tileColorTable == null)
1297
                        return;
1298

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

    
1318
        private Buffer processBufferFilters(Buffer rBuffer, DefaultFLyrRaster rLayer) {
1319

    
1320
                RasterDataStore store = rLayer.getDataStore();
1321
                Transparency transparency = rLayer.getDataStore().getRender()
1322
                                .getLastTransparency();
1323

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

    
1337
                // Aplicamos los filtros
1338

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

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

    
1367
                return grid.getRasterBuf();
1368

    
1369
        }
1370

    
1371
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1372
                        RequestDataEvent rde) {
1373

    
1374
                UpdateDataEvent ude = new UpdateDataEvent();
1375
                ude.copyDataFromRequest(rde);
1376
                Group g = new Group();
1377
                // Hack for polylines and polygons to only render them rasterized
1378
                // till gvSIG architects solve geometries problem
1379
                Layer3DProps layerprops = getLayer3DProps(layer);
1380
                try {
1381
                        if (((FLyrVect) layer).getShapeType() != 1
1382
                                        && ((FLyrVect) layer).getShapeType() != 7) {
1383
                                removeLayerToTerrain(layer);
1384
                                layerprops.setType(Layer3DPropsImpl.layer3DImage);
1385
                                addLayerToTerrain(layer, true);
1386
                                return null;
1387
                        }
1388
                } catch (ReadException e1) {
1389
                        // TODO Auto-generated catch block
1390
                        e1.printStackTrace();
1391

    
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
                                for (int i = 0; i < symbolList.length; i++) {
1418
                                        ((SimpleMarker3DSymbol) (symbolList[i])).resetGeometry();
1419
                                }
1420
                                layer.draw(null, null, getViewPort(), new MyCancel(), scale);
1421
                                // setGeometryDirty to false to avoid unnecessary repaints
1422
                                layerprops.setDirtyGeometry(false);
1423
                        } catch (ReadException e) {
1424
                                // TODO Auto-generated catch block
1425
                                e.printStackTrace();
1426
                        }
1427
                }
1428
                // OSG Layers
1429
                Node n = null;
1430

    
1431
                if (ds.getProviderName() == "OSG") {
1432
                        try {
1433
                                n = (Node) ds.invokeDynMethod("getNode", null);
1434
                                g.addChild(n);
1435
                        } catch (DynMethodException e) {
1436
                                // TODO Auto-generated catch block
1437
                                e.printStackTrace();
1438
                        } catch (NodeException e) {
1439
                                // TODO Auto-generated catch block
1440
                                e.printStackTrace();
1441
                        }
1442
                        System.out.println("OSG Layer added");
1443
                        // Change properties to OSG layer
1444
                        layerprops.setType(Layer3DProps.layer3DOSG);
1445
                }
1446
                // Vectorial layers
1447
                else {
1448
                        for (int i = 0; i < symbolList.length; i++) {
1449
                                n = ((SimpleMarker3DSymbol) symbolList[i]).getRenderNode();
1450
                                try {
1451
                                        g.addChild(n);
1452
                                } catch (NodeException e) {
1453
                                        // TODO Auto-generated catch block
1454
                                        e.printStackTrace();
1455
                                }
1456
                        }
1457

    
1458
                }
1459
                ude.setVectorData(g);
1460
                return ude;
1461
        }
1462

    
1463
        private ISymbol[] fillSymbolList(ILegend legend) {
1464
                ISymbol[] symbolList = null;
1465
                if (legend instanceof ISingleSymbolLegend) {
1466
                        symbolList = new ISymbol[1];
1467
                        I3DSymbol sy = (I3DSymbol) ((ISingleSymbolLegend) (legend))
1468
                                        .getDefaultSymbol();
1469
                        symbolList[0] = sy;
1470
                }
1471
                if (legend instanceof AbstractIntervalLegend)
1472
                        symbolList = ((AbstractIntervalLegend) (legend)).getSymbols();
1473
                if (legend instanceof VectorialUniqueValueLegend) {
1474
                        ((VectorialUniqueValueLegend) (legend))
1475
                                        .setDomain("project.document.view3d");
1476
                        symbolList = ((VectorialUniqueValueLegend) (legend)).getSymbols();
1477
                }
1478
                return symbolList;
1479

    
1480
        }
1481

    
1482
        // private Node buildVectors(I3DSymbol symbol) {
1483
        // Node n = null;
1484
        //
1485
        // ISymbol3D sym = null;
1486
        // try {
1487
        // sym = Symbol3DFactory.getSymbol3D(symbol);
1488
        // } catch (NodeException e) {
1489
        // // TODO Auto-generated catch block
1490
        // e.printStackTrace();
1491
        // }
1492
        // // sm.setPointSize((float) sy.getSize());
1493
        // n = sym.buildSceneGraph(symbol.getGeometry());
1494
        // return n;
1495
        // }
1496

    
1497
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1498
                        RequestDataEvent rde) {
1499

    
1500
                UpdateDataEvent ude = new UpdateDataEvent();
1501
                ude.copyDataFromRequest(rde);
1502

    
1503
                if (layer instanceof DefaultFLyrRaster) {
1504
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1505
                        if (rLayer.getDataStore().isTiled()) {
1506

    
1507
                                rLayer = (DefaultFLyrRaster) layer;
1508
                                // boolean exists = _cachedLayers.containsKey(rLayer);
1509
                                //
1510
                                // if (!exists) {
1511
                                //
1512
                                // _cachedLayers.put(rLayer, getCacheStruct(rLayer));
1513
                                //
1514
                                // }
1515
                                //
1516
                                // CacheStruct cacheStruct = _cachedLayers.get(rLayer);
1517

    
1518
                                RasterQuery query = RasterLocator.getManager().createQuery();
1519

    
1520
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1521
                                                .getManager()
1522
                                                .getDataStructFactory()
1523
                                                .createExtent(envelope.getLowerCorner().getX(),
1524
                                                                envelope.getUpperCorner().getY(),
1525
                                                                envelope.getUpperCorner().getX(),
1526
                                                                envelope.getLowerCorner().getY());
1527

    
1528
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1529
                                                rde.getTileY(), extent, null);
1530

    
1531
                                // query.setAreaOfInterest(extent, 512, 512);
1532

    
1533
                                // System.out.println("Tile Parameters:");
1534
                                // System.out.println("TileLevel: " + rde.getTileLevel());
1535
                                // System.out.println("TileX = " + rde.getTileX());
1536
                                // System.out.println("TileY = " + rde.getTileY());
1537
                                // System.out.println("Extent = " + extent.getULX() + " "
1538
                                // + extent.getULY() + " " + extent.getLRX() + " "
1539
                                // + extent.getLRY());
1540

    
1541
                                try {
1542
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1543
                                        Buffer rBuff = (Buffer) result[0];
1544
                                        Buffer transparencyBuffer;
1545

    
1546
                                        if (result.length < 2)
1547
                                                transparencyBuffer = null;
1548
                                        else
1549
                                                transparencyBuffer = (Buffer) result[1];
1550

    
1551
                                        int numBands = rBuff.getBandCount();
1552
                                        if (transparencyBuffer != null) {
1553

    
1554
                                                // System.out
1555
                                                // .println("Tengo Transparency buffer con "
1556
                                                // + transparencyBuffer.getBandCount()
1557
                                                // + " bandas");
1558
                                                numBands++;
1559

    
1560
                                        }
1561

    
1562
                                        // System.out.println("Tile ancho: " + rBuff.getWidth()
1563
                                        // + " alto: " + rBuff.getHeight()
1564
                                        // + " bandas totales incluyendo alpha (si tiene): "
1565
                                        // + numBands);
1566

    
1567
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1568
                                                        .getHeight())];
1569

    
1570
                                        int pixelFormat = convertPixelFormat(numBands);
1571

    
1572
                                        // K hay que setearlo en el dialogo
1573
                                        int cont = 0;
1574

    
1575
                                        int k = getLayer3DProps(rLayer).getElevationBand();
1576

    
1577
                                        for (int i = rBuff.getWidth() - 1; i >= 0; i--) {
1578
                                                // Vertical Flip needed
1579
                                                for (int j = 0; j < rBuff.getHeight(); j++) {
1580

    
1581
                                                        switch (rBuff.getDataType()) {
1582
                                                        case Buffer.TYPE_BYTE:
1583
                                                                data[cont] = (float) (rBuff
1584
                                                                                .getElemByte(i, j, k));
1585
                                                                cont++;
1586
                                                                break;
1587
                                                        case Buffer.TYPE_DOUBLE:
1588
                                                                data[cont] = (float) (Math.round(rBuff
1589
                                                                                .getElemDouble(i, j, k)));
1590
                                                                cont++;
1591
                                                                break;
1592
                                                        case Buffer.TYPE_FLOAT:
1593
                                                                data[cont] = (float) (Math.round(rBuff
1594
                                                                                .getElemFloat(i, j, k)));
1595
                                                                cont++;
1596
                                                                break;
1597
                                                        case Buffer.TYPE_INT:
1598
                                                                data[cont] = (float) (rBuff.getElemInt(i, j, k) & 0xffffffff);
1599
                                                                cont++;
1600
                                                                break;
1601
                                                        case Buffer.TYPE_SHORT:
1602
                                                        case Buffer.TYPE_USHORT:
1603
                                                                data[cont] = (float) (rBuff.getElemShort(i, j,
1604
                                                                                k) & 0xffff);
1605
                                                                cont++;
1606
                                                                break;
1607
                                                        }
1608

    
1609
                                                }
1610

    
1611
                                        }
1612
                                        ude.setHeightfieldData(data, rBuff.getWidth(),
1613
                                                        rBuff.getHeight());
1614

    
1615
                                        data = null;
1616
                                        result = null;
1617
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1618

    
1619
                                } catch (ProcessInterruptedException e) {
1620
                                        // TODO Auto-generated catch block
1621
                                        e.printStackTrace();
1622
                                } catch (RasterDriverException e) {
1623
                                        e.printStackTrace();
1624
                                } catch (InvalidSetViewException e) {
1625
                                        // TODO Auto-generated catch block
1626
                                        e.printStackTrace();
1627
                                } catch (NullPointerException e) {
1628
                                        // ude.setFailData();
1629
                                        System.out.println("Problem getting the tile");
1630
                                }
1631

    
1632
                        }
1633
                        // No cache
1634
                        else {
1635
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1636
                        }
1637

    
1638
                }
1639
                // unrecognized layer type
1640
                else {
1641
                        ude.setFailData();
1642
                }
1643

    
1644
                return ude;
1645

    
1646
        }
1647

    
1648
        protected byte[] buildByteBuffer(UpdateDataEvent ude, Buffer rBuff,
1649
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1650

    
1651
                int cont = 0;
1652
                int colorBands = numBands;
1653

    
1654
                if (transparencyBuffer != null) {
1655
                        // colorBands--;
1656
                        numBands = numBands + 1;
1657
                }
1658

    
1659
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * numBands];
1660

    
1661
                for (int i = 0; i < rBuff.getWidth(); i++) {
1662

    
1663
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1664

    
1665
                                for (int k = 0; k < colorBands; k++) {
1666
                                        data[cont] = (byte) rBuff.getElemByte(i, j, rgba[k]);
1667
                                        // if(data[cont]!=-1)
1668
                                        // System.out.println("Banda: " + k + " " + data[cont]);
1669
                                        cont++;
1670

    
1671
                                }
1672
                                if (transparencyBuffer != null) {
1673
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1674
                                        // data[cont] = (byte) 0;
1675
                                        // else
1676
                                        // data[cont] = (byte) 255;
1677
                                        data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1678
                                        cont++;
1679

    
1680
                                }
1681

    
1682
                        }
1683
                }
1684

    
1685
                return data;
1686
        }
1687

    
1688
        protected byte[] buildByteBufferPalette(UpdateDataEvent ude, Buffer rBuff,
1689
                        ColorTable colorTable, Buffer transparencyBuffer) {
1690

    
1691
                int cont = 0;
1692

    
1693
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * 4];
1694

    
1695
                for (int i = 0; i < rBuff.getWidth(); i++) {
1696

    
1697
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1698

    
1699
                                byte index = rBuff.getElemByte(i, j, 0);
1700

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

    
1703
                                for (int k = 0; k < 4; k++) {
1704
                                        data[cont] = rgba[k];
1705
                                        if (k == 3 && transparencyBuffer != null)
1706
                                                data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1707
                                        cont++;
1708
                                }
1709
                        }
1710
                }
1711

    
1712
                return data;
1713
        }
1714

    
1715
        protected short[] buildShortBuffer(UpdateDataEvent ude, Buffer rBuff,
1716
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1717
                int cont = 0;
1718
                int colorBands = numBands;
1719

    
1720
                if (transparencyBuffer != null) {
1721
                        // colorBands--;
1722
                        numBands = numBands + 1;
1723
                }
1724

    
1725
                short[] data = new short[rBuff.getWidth() * rBuff.getHeight()
1726
                                * numBands];
1727

    
1728
                for (int i = 0; i < rBuff.getWidth(); i++) {
1729

    
1730
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1731

    
1732
                                for (int k = 0; k < colorBands; k++) {
1733
                                        // En lugar de k se deben usar las bandas asociadas al
1734
                                        // componente
1735
                                        data[cont] = (short) rBuff.getElemShort(i, j, rgba[k]);
1736
                                        cont++;
1737

    
1738
                                }
1739
                                if (transparencyBuffer != null) {
1740
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1741
                                        // data[cont] = (byte) 0;
1742
                                        // else
1743
                                        // data[cont] = (byte) 255;
1744
                                        data[cont] = transparencyBuffer.getElemShort(i, j, 0);
1745

    
1746
                                        cont++;
1747

    
1748
                                }
1749
                        }
1750
                }
1751

    
1752
                return data;
1753
        }
1754

    
1755
        protected int[] buildIntBuffer(UpdateDataEvent ude, Buffer rBuff,
1756
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1757
                int cont = 0;
1758
                int colorBands = numBands;
1759

    
1760
                if (transparencyBuffer != null) {
1761
                        // colorBands--;
1762
                        numBands = numBands + 1;
1763
                }
1764

    
1765
                int[] data = new int[rBuff.getWidth() * rBuff.getHeight() * numBands];
1766

    
1767
                for (int i = 0; i < rBuff.getWidth(); i++) {
1768

    
1769
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1770

    
1771
                                for (int k = 0; k < colorBands; k++) {
1772
                                        // En lugar de k se deben usar las bandas asociadas al
1773
                                        // componente
1774
                                        data[cont] = rBuff.getElemInt(i, j, rgba[k]);
1775
                                        cont++;
1776

    
1777
                                }
1778
                                if (transparencyBuffer != null) {
1779
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1780
                                        // data[cont] = (byte) 0;
1781
                                        // else
1782
                                        // data[cont] = (byte) 255;
1783
                                        data[cont] = transparencyBuffer.getElemInt(i, j, 0);
1784

    
1785
                                        cont++;
1786

    
1787
                                }
1788
                        }
1789
                }
1790

    
1791
                return data;
1792
        }
1793

    
1794
        protected float[] buildFloatBuffer(UpdateDataEvent ude, Buffer rBuff,
1795
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1796

    
1797
                int cont = 0;
1798
                int colorBands = numBands;
1799

    
1800
                if (transparencyBuffer != null) {
1801
                        // colorBands--;
1802
                        numBands = numBands + 1;
1803
                }
1804

    
1805
                float[] data = new float[rBuff.getWidth() * rBuff.getHeight()
1806
                                * numBands];
1807

    
1808
                for (int i = 0; i < rBuff.getWidth(); i++) {
1809

    
1810
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1811

    
1812
                                for (int k = 0; k < colorBands; k++) {
1813
                                        // En lugar de k se deben usar las bandas asociadas al
1814
                                        // componente
1815
                                        data[cont] = rBuff.getElemFloat(i, j, rgba[k]);
1816
                                        cont++;
1817

    
1818
                                }
1819
                                if (transparencyBuffer != null) {
1820
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1821
                                        // data[cont] = (byte) 0;
1822
                                        // else
1823
                                        // data[cont] = (byte) 255;
1824
                                        data[cont] = transparencyBuffer.getElemFloat(i, j, 0);
1825

    
1826
                                        cont++;
1827

    
1828
                                }
1829
                        }
1830
                }
1831

    
1832
                return data;
1833
        }
1834

    
1835
        protected double[] buildDoubleBuffer(UpdateDataEvent ude, Buffer rBuff,
1836
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1837
                int cont = 0;
1838
                int colorBands = numBands;
1839

    
1840
                if (transparencyBuffer != null) {
1841
                        // colorBands--;
1842
                        numBands = numBands + 1;
1843
                }
1844

    
1845
                double[] data = new double[rBuff.getWidth() * rBuff.getHeight()
1846
                                * numBands];
1847

    
1848
                for (int i = 0; i < rBuff.getWidth(); i++) {
1849

    
1850
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1851

    
1852
                                for (int k = 0; k < colorBands; k++) {
1853
                                        // En lugar de k se deben usar las bandas asociadas al
1854
                                        // componente
1855
                                        data[cont] = rBuff.getElemDouble(i, j, rgba[k]);
1856
                                        cont++;
1857

    
1858
                                }
1859
                                if (transparencyBuffer != null) {
1860
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1861
                                        // data[cont] = (byte) 0;
1862
                                        // else
1863
                                        // data[cont] = (byte) 255;
1864
                                        data[cont] = transparencyBuffer.getElemDouble(i, j, 0);
1865

    
1866
                                        cont++;
1867

    
1868
                                }
1869
                        }
1870
                }
1871

    
1872
                return data;
1873
        }
1874

    
1875
        protected int convertPixelFormat(int type) {
1876

    
1877
                switch (type) {
1878

    
1879
                case 1:
1880
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1881

    
1882
                case 2:
1883
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1884

    
1885
                case 3:
1886
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1887

    
1888
                case 4:
1889
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1890

    
1891
                }
1892

    
1893
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1894

    
1895
        }
1896

    
1897
        protected int[] setBandsInColors(ColorInterpretation cInt) {
1898

    
1899
                int rgba[] = new int[4];
1900

    
1901
                rgba[0] = cInt.getBand(ColorInterpretation.RED_BAND);
1902
                if (rgba[0] == -1)
1903
                        rgba[0] = 0;
1904
                rgba[1] = cInt.getBand(ColorInterpretation.GREEN_BAND);
1905
                if (rgba[1] == -1)
1906
                        rgba[1] = 1;
1907
                rgba[2] = cInt.getBand(ColorInterpretation.BLUE_BAND);
1908
                if (rgba[2] == -1)
1909
                        rgba[2] = 2;
1910
                rgba[3] = cInt.getBand(ColorInterpretation.ALPHA_BAND);
1911
                if (rgba[3] == -1)
1912
                        rgba[3] = 3;
1913

    
1914
                return rgba;
1915

    
1916
        }
1917

    
1918
        protected class MyCancel implements Cancellable {
1919
                private boolean cancel = false;
1920

    
1921
                public MyCancel() {
1922
                }
1923

    
1924
                public void setCanceled(boolean canceled) {
1925
                        cancel = canceled;
1926
                }
1927

    
1928
                public boolean isCanceled() {
1929
                        return cancel;
1930
                }
1931
        }
1932

    
1933
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1934

    
1935
                int size = 256;
1936
                BufferedImage image = new BufferedImage(size, size,
1937
                                BufferedImage.TYPE_4BYTE_ABGR);
1938

    
1939
                ViewPort vp = new ViewPort(_viewProjection);
1940
                vp.setEnvelope(envelope); // the real extent of the tile
1941

    
1942
                vp.setAdjustable(false);
1943
                vp.setImageSize(new Dimension(size, size));
1944
                vp.setDist1pixel(0.000000001);
1945

    
1946
                Graphics2D graphics = image.createGraphics();
1947
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1948
                // background
1949
                graphics.setColor(backgColor);
1950
                graphics.fillRect(0, 0, size, size);
1951

    
1952
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1953

    
1954
                try {
1955
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1956

    
1957
                } catch (Exception e) {
1958
                        return null;
1959
                }
1960

    
1961
                return image;
1962

    
1963
        }
1964

    
1965
        public void nameChanged(LayerEvent e) {
1966
                System.out.println("Name change");
1967

    
1968
        }
1969

    
1970
        public void refreshLayerInTerrain(FLayer layer, Layer3DProps props,
1971
                        boolean bRemoveCache) {
1972

    
1973
                System.out.println("Refresh");
1974
                if (props == null)
1975
                        return;
1976

    
1977
                if (_terrain == null)
1978
                        return; // view not opened yet
1979

    
1980
                // clear cache
1981

    
1982
                // refresh layer in terrain
1983
                int type = props.getType();
1984
                if ((type == Layer3DProps.layer3DImage)
1985
                                || (type == Layer3DProps.layer3DElevation)
1986
                                || (type == Layer3DProps.layer3DVectorMR)) {
1987

    
1988
                        try {
1989
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
1990
                        } catch (LayerManagementException e) {
1991
                                // TODO Auto-generated catch block
1992
                                e.printStackTrace();
1993
                        }
1994
                } else if (type == Layer3DProps.layer3DVector) {
1995
                        // ILegend legend = ((FLyrVect) layer).getLegend();
1996
                        //
1997
                        // try {
1998
                        // RequestDataEvent rde = new RequestDataEvent();
1999
                        // loadVectorData(layer, layer.getFullEnvelope(),
2000
                        // new RequestDataEvent(), (I3DSymbol) legend.getDefaultSymbol());
2001
                        // } catch (ReadException e) {
2002
                        // // TODO Auto-generated catch block
2003
                        // e.printStackTrace();
2004
                        // }
2005

    
2006
                }
2007

    
2008
        }
2009

    
2010
        public boolean removeCache(File path) {
2011
                if (path.exists()) {
2012
                        File[] files = path.listFiles();
2013
                        for (int i = 0; i < files.length; i++) {
2014
                                if (files[i].isDirectory()) {
2015
                                        removeCache(files[i]);
2016
                                } else {
2017
                                        files[i].delete();
2018
                                }
2019
                        }
2020
                }
2021
                return (path.delete());
2022
        }
2023

    
2024
        public void removeLayerToTerrain(FLayer layer) {
2025

    
2026
                Layer terrainLayer = _terrainFLayerMap.get(layer);
2027
                if (terrainLayer != null) {
2028

    
2029
                        _terrainLayerMap.remove(terrainLayer.getLayerID());
2030
                        _terrainFLayerMap.remove(layer);
2031

    
2032
                        try {
2033
                                _terrainLayerManager.removeLayer(terrainLayer);
2034
                        } catch (LayerManagementException e) {
2035
                                // TODO Auto-generated catch block
2036
                                e.printStackTrace();
2037
                        }
2038
                }
2039

    
2040
        }
2041

    
2042
        public void selectionChanged(SelectionEvent e) {
2043
                // TODO Auto-generated method stub
2044
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
2045
                // while (lyrIterator.hasNext()) {
2046
                // FLayer layer = lyrIterator.next();
2047
                // Layer3DProps props3D = getLayer3DProps(layer);
2048
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
2049
                // if (layer.getClass().equals(FLyrVect.class)) {
2050
                // FLyrVect lyr = (FLyrVect) layer;
2051
                //
2052
                // FBitSet selection = null;
2053
                // try {
2054
                // selection = lyr.getRecordset().getSelectionSupport()
2055
                // .getSelection();
2056
                // } catch (ReadDriverException e1) {
2057
                // // TODO Auto-generated catch block
2058
                // e1.printStackTrace();
2059
                // }
2060
                //
2061
                // if ((selection.cardinality() == 0)
2062
                // || (!(selection.isEmpty()))) {
2063
                // Layer3DProps props = Layer3DProps
2064
                // .getLayer3DProps(layer);
2065
                // refreshLayerInTerrain(props, true);
2066
                // if (layer instanceof FLyrVect) {
2067
                // FLyrVect fvect = (FLyrVect) layer;
2068
                // props.drawVersion = fvect.getDrawVersion();
2069
                // }
2070
                // }
2071
                // }
2072
                // }
2073
                // }
2074

    
2075
        }
2076

    
2077
        public void setDataManager(JavaDataDriver manager) {
2078
                _terrainDataManager = manager;
2079
                _terrainDataManager.setDataLoader(this);
2080

    
2081
        }
2082

    
2083
        public void setLayerManager(LayerManager manager) {
2084
                _terrainLayerManager = manager;
2085

    
2086
        }
2087

    
2088
        public void setLoading(boolean bLoading) {
2089
                _bLoading = bLoading;
2090

    
2091
        }
2092

    
2093
        public void setRenewCanvasOff(boolean renewCanvasOff) {
2094
                _renewCanvasOff = renewCanvasOff;
2095

    
2096
        }
2097

    
2098
        public void setTerrain(Terrain terrain) {
2099
                if (_terrain == terrain)
2100
                        return;
2101

    
2102
                _terrain = terrain;
2103

    
2104
                // add layers to terrain necessary when we are loading
2105
                addCurrentLayers();
2106

    
2107
        }
2108

    
2109
        public void setVerticalExaggeration(float verticalExaggeration) {
2110
                _verticalExaggeration = verticalExaggeration;
2111

    
2112
        }
2113

    
2114
        public void setViewProjection(IProjection projection) {
2115
                _viewProjection = projection;
2116

    
2117
        }
2118

    
2119
        public void setViewer(IViewerContainer canvas) {
2120
                _canvas3d = canvas;
2121
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
2122

    
2123
        }
2124

    
2125
        public void visibilityChanged(LayerEvent e) {
2126
                FLayer lyr = e.getSource();
2127

    
2128
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
2129
                // refreshLayerVectorsVisibility(lyr);
2130
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
2131
                // refreshLayer3DOSGVisibility(lyr);
2132
                // } else {
2133
                refreshLayerVisibility(lyr);
2134
                // }
2135
                visibilityChange = true;
2136

    
2137
        }
2138

    
2139
        private void refreshLayerVisibility(FLayer layer) {
2140

    
2141
                Layer terrainLayer = _terrainFLayerMap.get(layer);
2142
                terrainLayer.setEnabled(layer.isVisible());
2143
                getEditionManager(layer).setEnabledNode(layer.isVisible());
2144
                // _terrainLayerManager.updateLayers();
2145

    
2146
        }
2147

    
2148
        public void zoomToEnvelope(Envelope geoEnvelope) {
2149
                if (geoEnvelope == null)
2150
                        return;
2151
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
2152
                        return;
2153

    
2154
                double maxHeight = 0.0;
2155

    
2156
                // Getting envelope positions
2157
                double minLat = geoEnvelope.getMinimum(0);
2158
                double maxLat = geoEnvelope.getMaximum(0);
2159

    
2160
                double cenLon = geoEnvelope.getCenter(0);
2161
                double cenLat = geoEnvelope.getCenter(1);
2162

    
2163
                double elevation = 0;
2164

    
2165
                // calculate altitude
2166
                double avLat = 0;
2167
                if (minLat > 0.0 || maxLat < 0.0)
2168
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
2169
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
2170

    
2171
                double terrainRadius = _terrain.getRadiusEquatorial();
2172
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
2173
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
2174
                                * (1 - Math.cos(Math.toRadians(avLon))));
2175
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
2176
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
2177

    
2178
                // Calculate XYZ positions for camera.
2179

    
2180
                int terrainType = _terrain.getCoordinateSystemType();
2181

    
2182
                double zoomFactor = 1.5;
2183
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
2184
                        zoomFactor = 1.3;
2185
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
2186

    
2187
                Vec3 eye = new Vec3();
2188
                Vec3 center = new Vec3();
2189
                Vec3 up = new Vec3();
2190
                // Calculate positions for PLAIN MODE.
2191
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
2192

    
2193
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
2194
                                        .getMinimum(1)) / 1.2d;
2195
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
2196
                                        .getMinimum(0)) / 1.2d;
2197
                        double height;
2198

    
2199
                        height = Math.sqrt(difx * difx + dify * dify);
2200
                        double fullWindowFactor = 1.7;
2201
                        // EYE
2202
                        eye.setX(cenLon);
2203
                        eye.setY(cenLat);
2204
                        eye.setZ(height * fullWindowFactor);
2205
                        // CENTER
2206
                        center.setX(cenLon);
2207
                        center.setY(cenLat);
2208
                        center.setZ(0.0);
2209
                        // UP
2210
                        up.setX(0.0);
2211
                        up.setY(1.0);
2212
                        up.setZ(0.0);
2213
                } else
2214
                // Calculate positions for SPHERICAL MODE.
2215
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
2216
                        // EYE
2217
                        Vec3 aux = new Vec3(cenLon, cenLat, elevation);
2218
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
2219
                        // CENTER
2220
                        center.setX(0.0);
2221
                        center.setY(0.0);
2222
                        center.setZ(0.0);
2223
                        // UP
2224
                        up.setX(0.0);
2225
                        up.setY(0.0);
2226
                        up.setZ(1.0);
2227
                }
2228
                Camera cam = new Camera();
2229
                cam.setViewByLookAt(eye, center, up);
2230

    
2231
                _terrainViewer.setCamera(cam);
2232

    
2233
        }
2234

    
2235
        public void editionChanged(LayerEvent e) {
2236
                // TODO Auto-generated method stub
2237

    
2238
        }
2239

    
2240
        public void drawValueChanged(LayerEvent e) {
2241
                // TODO Auto-generated method stub
2242

    
2243
        }
2244

    
2245
        public boolean symbolChanged(SymbolLegendEvent e) {
2246

    
2247
                System.out.println("Symbol changed");
2248
                return false;
2249
        }
2250

    
2251
        public void legendCleared(LegendClearEvent event) {
2252
                // TODO Auto-generated method stub
2253

    
2254
        }
2255

    
2256
        public static class RegisterPersistence implements Callable {
2257

    
2258
                public Object call() throws Exception {
2259
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
2260
                        if (manager.getDefinition(MapContext.class) == null) {
2261
                                MapContext.registerPersistent();
2262
                        }
2263
                        DynStruct definition = manager.addDefinition(
2264
                                        MapContext3DImpl.class, "MapContext3DImpl",
2265
                                        "MapContext3DImpl Persistence definition", null, null);
2266
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
2267
                                        "MapContext");
2268

    
2269
                        return Boolean.TRUE;
2270
                }
2271
        }
2272

    
2273
        @Override
2274
        public EditionManager getEditionManager(FLayer layer) {
2275

    
2276
                EditionManager eManager = _layersEditionMap.get(layer);
2277

    
2278
                if (eManager == null) {
2279

    
2280
                        try {
2281
                                DataStore ds = ((SingleLayer) layer).getDataStore();
2282

    
2283
                                Node n = null;
2284

    
2285
                                if (ds.getProviderName() == "OSG") {
2286

    
2287
                                        n = (Node) ds.invokeDynMethod("getNode", null);
2288

    
2289
                                } else
2290
                                        n = new Group();
2291

    
2292
                                eManager = new EditionManager();
2293

    
2294
                                Group loadedScene = new Group(n.getCPtr());
2295

    
2296
                                for (int i = 0; i < loadedScene.getNumChildren(); i++) {
2297

    
2298
                                        eManager.setScene(loadedScene.getChild(i));
2299

    
2300
                                }
2301

    
2302
                                BasicInputHandler handler = new BasicInputHandler(eManager,
2303
                                                (OSGViewer) _canvas3d.getOSGViewer());
2304

    
2305
                                _canvas3d.getOSGViewer().addEventHandler(handler);
2306
                                ((TerrainViewer) _canvas3d.getOSGViewer()).addFeature(eManager);
2307

    
2308
                                _layersEditionMap.put(layer, eManager);
2309
                                _layersHandlerMap.put(layer, handler);
2310

    
2311
                        } catch (NodeException e2) {
2312
                                // TODO Auto-generated catch block
2313
                                e2.printStackTrace();
2314
                        } catch (DynMethodException e) {
2315
                                // TODO Auto-generated catch block
2316
                                e.printStackTrace();
2317
                        }
2318

    
2319
                }
2320

    
2321
                return eManager;
2322
        }
2323

    
2324
        public BasicInputHandler getEditionHandler(FLayer layer) {
2325

    
2326
                return _layersHandlerMap.get(layer);
2327

    
2328
        }
2329
}