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

History | View | Annotate | Download (63.8 KB)

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

    
24
import java.awt.Color;
25
import java.awt.Dimension;
26
import java.awt.Graphics2D;
27
import java.awt.geom.AffineTransform;
28
import java.awt.image.BufferedImage;
29
import java.awt.image.ImagingOpException;
30
import java.io.File;
31
import java.io.IOException;
32
import java.util.ArrayList;
33
import java.util.Hashtable;
34
import java.util.Vector;
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.legend3d.ExtrusionLegend;
86
import org.gvsig.gvsig3d.impl.symbology3d.Symbol3DFactory;
87
import org.gvsig.gvsig3d.impl.symbology3d.extrusion.impl.ExtrusionPolygonSymbol;
88
import org.gvsig.gvsig3d.impl.symbology3d.fill.impl.SimpleFill3DSymbol;
89
import org.gvsig.gvsig3d.impl.symbology3d.marker.impl.SimpleMarker3DSymbol;
90
import org.gvsig.gvsig3d.map3d.Layer3DProps;
91
import org.gvsig.gvsig3d.map3d.MapContext3D;
92
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
93
import org.gvsig.gvsig3d.symbology3d.I3DSymbol;
94
import org.gvsig.gvsig3d.symbology3d.marker.ISimpleMarker3DSymbol;
95
import org.gvsig.osgvp.core.osg.Group;
96
import org.gvsig.osgvp.core.osg.Image;
97
import org.gvsig.osgvp.core.osg.Matrix;
98
import org.gvsig.osgvp.core.osg.Node;
99
import org.gvsig.osgvp.core.osg.Vec2;
100
import org.gvsig.osgvp.core.osg.Vec3;
101
import org.gvsig.osgvp.core.osg.Vec4;
102
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
103
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
104
import org.gvsig.osgvp.exceptions.node.NodeException;
105
import org.gvsig.osgvp.manipulator.BasicInputHandler;
106
import org.gvsig.osgvp.manipulator.EditionManager;
107
import org.gvsig.osgvp.symbology.ISymbol3D;
108
import org.gvsig.osgvp.terrain.Extent;
109
import org.gvsig.osgvp.terrain.HeightfieldLayer;
110
import org.gvsig.osgvp.terrain.JavaDataDriver;
111
import org.gvsig.osgvp.terrain.Layer;
112
import org.gvsig.osgvp.terrain.LayerManager;
113
import org.gvsig.osgvp.terrain.RequestDataEvent;
114
import org.gvsig.osgvp.terrain.Terrain;
115
import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType;
116
import org.gvsig.osgvp.terrain.TerrainViewer;
117
import org.gvsig.osgvp.terrain.TextureLayer;
118
import org.gvsig.osgvp.terrain.UpdateDataEvent;
119
import org.gvsig.osgvp.terrain.VectorLayer;
120
import org.gvsig.osgvp.terrain.exceptions.LayerManagementException;
121
import org.gvsig.osgvp.viewer.Camera;
122
import org.gvsig.osgvp.viewer.IViewerContainer;
123
import org.gvsig.osgvp.viewer.OSGViewer;
124
import org.gvsig.raster.cache.tile.TileCache;
125
import org.gvsig.raster.cache.tile.TileCacheLibrary;
126
import org.gvsig.raster.cache.tile.TileCacheLocator;
127
import org.gvsig.raster.cache.tile.TileCacheManager;
128
import org.gvsig.raster.cache.tile.provider.CacheStruct;
129
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
130
import org.gvsig.raster.impl.grid.GridImpl;
131
import org.gvsig.raster.impl.provider.DefaultRasterProvider;
132
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl.AbstractIntervalLegend;
133
import org.gvsig.symbology.fmap.mapcontext.rendering.legend.impl.VectorialUniqueValueLegend;
134
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.fill.IFillSymbol;
135
import org.gvsig.symbology.fmap.mapcontext.rendering.symbol.line.ILineSymbol;
136
import org.gvsig.tools.ToolsLocator;
137
import org.gvsig.tools.dynobject.DynStruct;
138
import org.gvsig.tools.dynobject.exception.DynMethodException;
139
import org.gvsig.tools.locator.LocatorException;
140
import org.gvsig.tools.persistence.PersistenceManager;
141
import org.gvsig.tools.task.Cancellable;
142
import org.gvsig.tools.util.Callable;
143

    
144
/**
145
 * @author AI2
146
 * @version $Id$
147
 * 
148
 */
149
public class MapContext3DImpl extends MapContext3D {
150

    
151
        private Terrain _terrain;
152
        private IViewerContainer _canvas3d;
153
        private TerrainViewer _terrainViewer;
154
        private LayerManager _terrainLayerManager;
155
        private JavaDataDriver _terrainDataManager = null;
156

    
157
        private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>();
158
        private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>();
159

    
160
        private Hashtable<FLayer, EditionManager> _layersEditionMap = new Hashtable<FLayer, EditionManager>();
161
        private Hashtable<FLayer, BasicInputHandler> _layersHandlerMap = new Hashtable<FLayer, BasicInputHandler>();
162

    
163
        private Hashtable<DefaultFLyrRaster, CacheStruct> _cachedLayers = new Hashtable<DefaultFLyrRaster, CacheStruct>();
164

    
165
        private IProjection _viewProjection;
166
        private float _verticalExaggeration;
167
        private boolean _bListenToLegend = true;
168
        private boolean _bLoading = false;
169
        private TerrainViewer _canvasoff = null;
170
        private boolean _renewCanvasOff = false;
171

    
172
        TerrainViewer _printViewer = null;
173
        Layer _testRasterLayer = null;
174

    
175
        private boolean visibilityChange = false;
176

    
177
        TileCacheManager tileMan = TileCacheLocator.getManager();
178
        TileCache tileCache = tileMan.getTileCache(RasterLibrary.pathTileCache);
179

    
180
        int maxBands = 3;
181
        private boolean _bEmptyView;
182

    
183
        public MapContext3DImpl() {
184

    
185
        }
186

    
187
        public MapContext3DImpl(ViewPort vp) {
188
                super(vp);
189

    
190
        }
191

    
192
        public MapContext3DImpl(FLayers fLayers, ViewPort vp) {
193

    
194
                super(fLayers, vp);
195
        }
196

    
197
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
198
                        double scale) {
199

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

    
207
                if (_canvasoff == null) {
208
                        try {
209
                                _canvasoff = new TerrainViewer();
210
                                _canvasoff.setUpViewerInBackground(0, 0, 512, 512);
211

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

    
225
                                terrain.init();
226
                                terrain.setLayerManager(_terrainLayerManager);
227

    
228
                                _canvasoff.addTerrain(terrain);
229
                                _canvasoff.addFeature((((TerrainViewer) _canvas3d
230
                                                .getOSGViewer()).getFeatures()));
231
                                Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer())
232
                                                .getClearColor();
233
                                _canvasoff.setClearColor(color.x(), color.y(), color.z(),
234
                                                color.w());
235
                                this.setRenewCanvasOff(false);
236
                        } catch (NodeException e) {
237
                                e.printStackTrace();
238
                        }
239

    
240
                }
241

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

    
255
                org.gvsig.osgvp.core.osg.Image OSGimage = _canvasoff
256
                                .getScreenshotImage();
257

    
258
                BufferedImage img = null;
259
                try {
260
                        img = OSGimage.getBufferedImage();
261
                } catch (ImageConversionException e1) {
262
                        e1.printStackTrace();
263
                } catch (IOException e1) {
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
        }
282

    
283
        public void DeleteOSGLayer(FLayer layer, Layer3DProps props3d) {
284
        }
285

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

    
305
        public void activationChanged(LayerEvent e) {
306

    
307
        }
308

    
309
        public void addCurrentLayers() {
310

    
311
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
312
                while (lyrIterator.hasNext()) {
313
                        FLayer layer = lyrIterator.next();
314
                        Layer3DProps props = getLayer3DProps(layer);
315
                        layerAdded((FLayers3D) layer.getParentLayer(), layer);
316
                }
317

    
318
        }
319

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

    
322
                Envelope layerEnvelope = null;
323
                try {
324
                        layerEnvelope = layer.getFullEnvelope();
325
                } catch (ReadException e1) {
326
                        e1.printStackTrace();
327
                }
328

    
329
                Layer3DProps props = getLayer3DProps(layer);
330
                GeometryManager geoMan;
331

    
332
                geoMan = GeometryLocator.getGeometryManager();
333

    
334
                if (layerEnvelope == null) {
335

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

    
345
                                else {
346

    
347
                                        layerEnvelope.setLowerCorner(geoMan
348
                                                        .createPoint(-20000000.0, -10000000.00,
349
                                                                        Geometry.SUBTYPES.GEOM2D));
350
                                        layerEnvelope.setUpperCorner(geoMan.createPoint(40000000.0,
351
                                                        20000000.0, Geometry.SUBTYPES.GEOM2D));
352

    
353
                                }
354
                        } catch (CreateEnvelopeException e) {
355
                                e.printStackTrace();
356
                        } catch (CreateGeometryException e) {
357
                                e.printStackTrace();
358
                        }
359

    
360
                }
361

    
362
                Extent extent = null;
363
                if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
364

    
365
                        extent = new Extent(layerEnvelope.getLowerCorner().getX(),
366
                                        layerEnvelope.getLowerCorner().getY(), layerEnvelope
367
                                                        .getUpperCorner().getX(), layerEnvelope
368
                                                        .getUpperCorner().getY());
369

    
370
                } else {
371
                        extent = new Extent(Math.toRadians(layerEnvelope.getLowerCorner()
372
                                        .getX()), Math.toRadians(layerEnvelope.getLowerCorner()
373
                                        .getY()), Math.toRadians(layerEnvelope.getUpperCorner()
374
                                        .getX()), Math.toRadians(layerEnvelope.getUpperCorner()
375
                                        .getY()));
376

    
377
                }
378

    
379
                // Raster Layers
380
                if (props.getType() == Layer3DPropsImpl.layer3DImage) {
381
                        TextureLayer rlayer = new TextureLayer();
382
                        rlayer.setEnabled(layer.isVisible());
383
                        rlayer.setExtent(extent);
384
                        rlayer.setOpacity(props.getOpacity());
385
                        rlayer.setDataDriver(_terrainDataManager);
386
                        // _logger.warn("computed optimum level = "
387
                        // + computeOptimumLevel(layer, 20, 256));
388
                        // rlayer.setMaxResolution(computeOptimumLevel(layer, 21, 256));
389
                        try {
390
                                _terrainLayerManager.addLayer(rlayer);
391
                        } catch (LayerManagementException e) {
392
                                e.printStackTrace();
393
                        }
394
                        _terrainFLayerMap.put(layer, rlayer);
395
                        _terrainLayerMap.put(rlayer.getLayerID(), layer);
396
                        props.setTerrainLayer(rlayer);
397

    
398
                        // if rasterizing layers set Default 2D symbology
399
                        if (layer instanceof FLyrVect) {
400
                                // Create a 2D Legend for jess
401
                                if (((FLyrVect) (layer)).getLegend().getDefaultSymbol() instanceof I3DSymbol)
402
                                        try {
403
                                                ((FLyrVect) layer)
404
                                                                .setLegend((IVectorLegend) MapContextLocator
405
                                                                                .getMapContextManager()
406
                                                                                .getLegend(
407
                                                                                                ((FLyrVect) layer)
408
                                                                                                                .getDataStore(),
409
                                                                                                MapContextLocator
410
                                                                                                                .getMapContextManager()
411
                                                                                                                .getDefaultSymbologyDomain()));
412
                                        } catch (LegendLayerException e) {
413
                                                e.printStackTrace();
414
                                        } catch (LocatorException e) {
415
                                                e.printStackTrace();
416
                                        }
417
                        }
418

    
419
                        // Delete the cachestruct if it exists, and create a new one.
420
                        if (_cachedLayers.containsKey(layer)) {
421
                                _cachedLayers.remove(layer);
422
                        }
423

    
424
                }
425
                // Vector layers
426
                if (props.getType() == Layer3DProps.layer3DVector) {
427
                        // Set a 3D Legend
428
                        // TODO We don't need to create always a new Legend. We need to
429
                        if (((FLyrVect) layer).getLegend() instanceof ISingleSymbolLegend)
430
                                if (!(((FLyrVect) layer).getLegend().getDefaultSymbol() instanceof I3DSymbol)) {
431
                                        try {
432
                                                ((FLyrVect) layer)
433
                                                                .setLegend((IVectorLegend) MapContextLocator
434
                                                                                .getMapContextManager().getLegend(
435
                                                                                                ((FLyrVect) layer)
436
                                                                                                                .getDataStore(),
437
                                                                                                "project.document.view3d"));
438
                                        } catch (LegendLayerException e) {
439
                                                // TODO Auto-generated catch block
440
                                                e.printStackTrace();
441
                                        } catch (LocatorException e) {
442
                                                // TODO Auto-generated catch block
443
                                                e.printStackTrace();
444
                                        }
445
                                }
446

    
447
                        VectorLayer vlayer = new VectorLayer();
448
                        vlayer.setEnabled(layer.isVisible());
449
                        vlayer.setExtent(extent);
450
                        vlayer.setDataDriver(_terrainDataManager);
451
                        try {
452
                                _terrainLayerManager.addLayer(vlayer);
453
                        } catch (LayerManagementException e) {
454
                                // TODO Auto-generated catch block
455
                                e.printStackTrace();
456
                        }
457
                        _terrainFLayerMap.put(layer, vlayer);
458
                        _terrainLayerMap.put(vlayer.getLayerID(), layer);
459
                        props.setTerrainLayer(vlayer);
460
                }
461
                // Elevation layers
462
                if (props.getType() == Layer3DPropsImpl.layer3DElevation) {
463

    
464
                        HeightfieldLayer hLayer = new HeightfieldLayer();
465
                        hLayer.setEnabled(layer.isVisible());
466
                        hLayer.setExtent(extent);
467
                        hLayer.setDataDriver(_terrainDataManager);
468

    
469
                        hLayer.setMaxLevel(20);
470
                        hLayer.setMaxResolution(computeOptimumLevel(layer, 20, 256));
471

    
472
                        hLayer.setScaleFactor(props.getVerticalEx());
473

    
474
                        hLayer.setValidDataValues(new Vec2(-9999, 9999));
475
                        // _logger.warn("computed optimum level = "
476
                        // + computeOptimumLevel(layer, 20, 256));
477
                        // rlayer.setMaxResolution(computeOptimumLevel(layer, 21, 256));
478
                        try {
479
                                _terrainLayerManager.addLayer(hLayer);
480
                        } catch (LayerManagementException e) {
481
                                // TODO Auto-generated catch block
482
                                e.printStackTrace();
483
                        }
484
                        _terrainFLayerMap.put(layer, hLayer);
485
                        _terrainLayerMap.put(hLayer.getLayerID(), layer);
486
                        props.setTerrainLayer(hLayer);
487

    
488
                        if (_cachedLayers.containsKey(layer)) {
489
                                _cachedLayers.remove(layer);
490
                        }
491

    
492
                }
493

    
494
        }
495

    
496
        public int computeOptimumLevel(FLayer layer, int maxLevel, double tileSize) {
497
                int level = maxLevel;
498
                if (!(layer instanceof DefaultFLyrRaster))
499
                        return level;
500

    
501
                Envelope enve = null;
502

    
503
                try {
504
                        enve = layer.getFullEnvelope();
505

    
506
                        ArrayList attr = ((DefaultFLyrRaster) layer).getAttributes();
507
                        if (attr == null) {
508
                                return level;
509
                        }
510
                        int width = 0, height = 0;
511

    
512
                        for (int i = 0; i < attr.size(); i++) {
513
                                Object[] a = (Object[]) attr.get(i);
514
                                if (a[0].toString().equals("Width"))
515
                                        width = ((Integer) a[1]).intValue();
516
                                if (a[0].toString().equals("Height"))
517
                                        height = ((Integer) a[1]).intValue();
518
                        }
519

    
520
                        if (enve != null && width != 0 && height != 0) {
521

    
522
                                double xMax = _terrain.xMax();
523
                                double xMin = _terrain.xMin();
524
                                double yMax = _terrain.yMax();
525
                                double yMin = _terrain.yMin();
526
                                int terrainType = _terrain.getCoordinateSystemType();
527
                                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
528
                                        xMax = Math.toDegrees(xMax);
529
                                        xMin = Math.toDegrees(xMin);
530
                                        yMax = Math.toDegrees(yMax);
531
                                        yMin = Math.toDegrees(yMin);
532
                                }
533

    
534
                                double destination_xRange = xMax - xMin;
535
                                double destination_yRange = yMax - yMin;
536
                                double AR = destination_xRange / destination_yRange;
537
                                int C1 = 1;
538
                                int R1 = 1;
539

    
540
                                boolean swapAxis = AR < 1.0;
541
                                if (swapAxis)
542
                                        AR = 1.0 / AR;
543

    
544
                                double lower_AR = Math.floor(AR);
545
                                double upper_AR = Math.ceil(AR);
546

    
547
                                if (AR < Math.sqrt(lower_AR * upper_AR)) {
548
                                        C1 = (int) (lower_AR);
549
                                        R1 = 1;
550
                                } else {
551
                                        C1 = (int) (upper_AR);
552
                                        R1 = 1;
553
                                }
554

    
555
                                if (swapAxis) {
556
                                        // std::swap(C1,R1);
557
                                        int t = C1;
558
                                        C1 = R1;
559
                                        R1 = t;
560
                                }
561

    
562
                                double source_xRange = enve.getLength(0);
563
                                double source_yRange = enve.getLength(1);
564

    
565
                                float sourceResolutionX = ((float) source_xRange)
566
                                                / (float) width;
567
                                float sourceResolutionY = ((float) source_yRange)
568
                                                / (float) height;
569

    
570
                                //
571
                                // log(osg::NOTICE,"Source %s resX %f resY %f",source->getFileName().c_str(),
572
                                // sourceResolutionX, sourceResolutionX);
573

    
574
                                int k_cols = (int) (Math.ceil(1.0
575
                                                + Math.log(destination_xRange
576
                                                                / (C1 * sourceResolutionX * tileSize))
577
                                                / Math.log(2.0)));
578
                                int k_rows = (int) (Math.ceil(1.0
579
                                                + Math.log(destination_yRange
580
                                                                / (R1 * sourceResolutionY * tileSize))
581
                                                / Math.log(2.0)));
582
                                level = Math.max(k_cols, k_rows);
583
                                level = Math.min(level, maxLevel);
584
                                level = Math.max(level, 0);
585

    
586
                        }
587
                } catch (ReadException e) {
588
                        // TODO Auto-generated catch block
589
                        e.printStackTrace();
590
                }
591

    
592
                // System.out.println("Nivel optimo calculado: " + level);
593
                return level;
594
        }
595

    
596
        public IViewerContainer getCanvas3d() {
597
                return _canvas3d;
598
        }
599

    
600
        public JavaDataDriver getDataManager() {
601
                return _terrainDataManager;
602
        }
603

    
604
        public Layer3DProps getLayer3DProps(FLayer layer) {
605
                Layer3DProps props3D = (Layer3DProps) layer
606
                                .getProperty("3DLayerExtension");
607
                //
608
                // // Create instance of props for osg layers.
609
                if (props3D == null) {
610
                        props3D = new Layer3DPropsImpl(layer);
611
                        // if (layer instanceof FLyrVect) {
612
                        // FLyrVect nLayer = (FLyrVect) layer;
613
                        // Driver driver;
614
                        // try {
615
                        // driver = nLayer.getRecordset().getDriver();
616
                        // if (driver instanceof GvsigDriverOSG) {
617
                        // props3D.setChooseType(false);
618
                        // props3D.setType(Layer3DProps.layer3DOSG);
619
                        // }
620
                        // } catch (ReadDriverException e) {
621
                        // // TODO Auto-generated catch block
622
                        // e.printStackTrace();
623
                        // }
624
                        //
625
                        // }
626
                        // // Set the properties
627
                        props3D.setLayer(layer);
628
                        //
629
                        // props3D.initCacheName(_terrain.getCoordinateSystemType(),
630
                        // _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC);
631
                        FLyrDefault baseLayer = (FLyrDefault) layer;
632
                        baseLayer.setProperty("3DLayerExtension", props3D);
633
                        props3D.setVerticalEx(getVerticalExaggeration());
634
                } else {
635
                        if (_bLoading)
636
                                props3D.setChooseType(false);
637
                        props3D.setLayer(layer);
638
                }
639
                //
640
                return props3D;
641

    
642
                // return null;
643
        }
644

    
645
        public LayerManager getLayerManager() {
646
                return _terrainLayerManager;
647
        }
648

    
649
        public Node getSpecialNode() {
650
                Node specialNode = null;
651
                try {
652
                        specialNode = _terrainViewer.getFeature(0);
653
                } catch (ChildIndexOutOfBoundsExceptions e) {
654

    
655
                }
656
                return specialNode;
657
        }
658

    
659
        public Terrain getTerrain() {
660
                return _terrain;
661
        }
662

    
663
        public float getVerticalExaggeration() {
664
                return _verticalExaggeration;
665
        }
666

    
667
        public IProjection getViewProjection() {
668
                return _viewProjection;
669
        }
670

    
671
        public void invalidateVectorLayer(Layer3DProps props) {
672

    
673
                // TODO Auto-generated method stub
674
                // if (_terrain == null || _viewProjection == null)
675
                // return;
676
                //
677
                // VectorCacheService cacheService = (VectorCacheService) props
678
                // .getCacheService();
679
                // if (cacheService != null) {
680
                // // use VectorCacheService to add features to terrain
681
                // cacheService.refreshFeaturesToTerrain();
682
                // }
683

    
684
        }
685

    
686
        public boolean isRenewCanvasOff() {
687
                return _renewCanvasOff;
688
        }
689

    
690
        public void layerAdded(FLayers3D parent, FLayer layer) {
691

    
692
                // System.out.println("A?adida capa. Evento Capturado");
693
                // to add group layers to 3D, just add recursively child data layers
694
                if (layer instanceof FLayers) {
695
                        FLayers group = (FLayers) layer;
696
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
697
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
698
                        }
699
                        getLayer3DProps(layer).setHooked(true);
700
                        return;
701
                }
702
                //
703
                if (layer instanceof Classifiable) {
704
                        Classifiable legendLyr = (Classifiable) layer;
705
                        legendLyr.addLegendListener((LegendListener) this);
706
                        this.addLayerListener(this);
707
                }
708
                layer.addLayerListener((LayerListener) this);
709

    
710
                // listener to manage the selection for the layers
711
                // if (layer.getClass().equals(FLyrVect.class)) {
712
                // FLyrVect lyr = (FLyrVect) layer;
713
                // refreshLayerVectorsVisibility(lyr);
714
                // try {
715
                // SelectableDataSource recordSet = lyr.getRecordset();
716
                // if (recordSet != null) {
717
                // SelectionSupport selectionSupport = recordSet
718
                // .getSelectionSupport();
719
                // selectionSupport.addSelectionListener(this);
720
                // }
721
                // } catch (ReadDriverException e) {
722
                // // TODO Auto-generated catch block
723
                // e.printStackTrace();
724
                // }
725
                // }
726

    
727
                // if (!_bLoading)
728
                Layer3DProps props3D = getLayer3DProps(layer);
729

    
730
                if (layer instanceof DefaultFLyrRaster) {
731
                        try {
732
                                // If DefaultFLayerRaster we must init the layer for the
733
                                // persistence to
734
                                // work
735
                                ((DefaultFLyrRaster) layer).init();
736
                                props3D.setType(Layer3DProps.layer3DImage);
737
                        } catch (LoadLayerException e) {
738
                                // TODO Auto-generated catch block
739
                                e.printStackTrace();
740
                        } catch (FilePaletteException e) {
741
                                // TODO Auto-generated catch block
742
                                e.printStackTrace();
743
                        }
744

    
745
                }
746

    
747
                // If it's a vectorial layer we load it as 3D by default
748
                else if (layer instanceof FLyrVect) {
749

    
750
                        props3D.setType(Layer3DProps.layer3DVector);
751
                }
752
                addLayerToTerrain(layer, true);
753

    
754
                // Only do this the first time to add layer
755
                // if (_bEmptyView && !_bLoading) {
756
                // if (layers.getLayersCount() > 0) {
757
                // try {
758
                try {
759
                        zoomToEnvelope(layer.getFullEnvelope());
760
                } catch (ReadException e) {
761
                        // TODO Auto-generated catch block
762
                        e.printStackTrace();
763
                }
764
                // } catch (ExpansionFileReadException e) {
765
                // e.printStackTrace();
766
                // } catch (ReadDriverException e) {
767
                // e.printStackTrace();
768
                // }
769
                // _bEmptyView = false;
770
                // }
771
                // }
772
                //
773
                // // PrintDebugLayers();
774

    
775
        }
776

    
777
        private CacheStruct getCacheStruct(DefaultFLyrRaster layer) {
778

    
779
                // System.out.println("Creando estructura de cache");
780

    
781
                // Se obtiene el datastore de la capa
782
                RasterDataStore dataStore = layer.getDataStore();
783

    
784
                // Creais la estructura de cach?
785
                TileCacheManager manager = TileCacheLocator.getManager();
786

    
787
                int coordinates = CacheStruct.FLAT;
788

    
789
                if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOGRAPHIC)
790
                        coordinates = CacheStruct.GEOGRAFIC;
791

    
792
                DefaultRasterProvider provider = (DefaultRasterProvider) dataStore
793
                                .getProvider();
794

    
795
                provider.setProjection(layer.getProjection());
796

    
797
                // El epsg suele tener la forma EPSG:4326
798
                String epsg = null;
799
                IProjection proj = provider.getProjection();
800
                if (proj != null)
801
                        epsg = proj.getAbrev();
802

    
803
                // HACK
804
                epsg = "EPSG:23030";
805

    
806
                int resolution = 256;
807

    
808
                int type = getLayer3DProps(layer).getType();
809

    
810
                // if elevation layer, lower the tile resolution
811
                if (type == Layer3DProps.layer3DElevation)
812

    
813
                        resolution = 32;
814

    
815
                CacheStruct struct = manager.createCacheStructure(coordinates,
816
                                TileCacheLibrary.DEFAULT_LEVELS, provider.getExtent()
817
                                                .toRectangle2D(), provider.getCellSize(), resolution,
818
                                resolution, provider.getFullName(),
819
                                TileCacheLibrary.DEFAULT_STRUCTURE,
820

    
821
                                RasterLibrary.pathTileCache, provider.getFileSuffix(), provider
822
                                                .getProjection().getAbrev(), provider.getFileSize());
823

    
824
                return struct;
825

    
826
        }
827

    
828
        private void refreshLayerVectorsVisibility(FLayer lyr) {
829
                // if (_terrain == null || _viewProjection == null)
830
                // return;
831
                //
832
                // Layer3DProps props3D = getLayer3DProps(lyr);
833
                //
834
                // VectorCacheService cacheService = (VectorCacheService) props3D
835
                // .getCacheService();
836
                // if (cacheService != null) {
837
                // // use VectorCacheService to add features to terrain
838
                // cacheService.refreshFeaturesToTerrain(lyr.isVisible());
839
                // props3D.drawVersion = lyr.getDrawVersion();
840
                // }
841

    
842
        }
843

    
844
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
845
                        int newPos) {
846
                if (layer instanceof FLayers) {
847
                        FLayers group = (FLayers) layer;
848
                        if (newPos > oldPos) {
849
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
850
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
851
                                                        oldPos, newPos);
852
                        } else {
853
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
854
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
855
                                                        oldPos, newPos);
856
                        }
857
                        return;
858
                }
859

    
860
                Layer3DProps props3D = getLayer3DProps(layer);
861
                refreshLayerInTerrain(layer, props3D, false);
862

    
863
                int type = props3D.getType();
864

    
865
                // Now reorder in layer manager only for terrain layer types
866
                if ((type == Layer3DProps.layer3DOSG)
867
                                || ((type == Layer3DProps.layer3DVector)))
868
                        return;
869

    
870
                // Obtain the old position in the layer
871
                Layer terrainLayer = _terrainFLayerMap.get(layer);
872
                Vector<Integer> terrainOldPos = null;
873
                try {
874
                        terrainOldPos = _terrainLayerManager.getOrder(terrainLayer);
875
                } catch (LayerManagementException e) {
876
                        // TODO Auto-generated catch block
877
                        e.printStackTrace();
878
                }
879

    
880
                int terrainNewPos = 0;
881
                // Compute the new position.
882
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
883
                while (lyrIterator.hasNext()) {
884
                        FLayer auxLayer = lyrIterator.next();
885
                        if (auxLayer == layer)
886
                                break;
887
                        Layer3DProps auxProps3D = getLayer3DProps(auxLayer);
888
                        if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
889
                                        && (auxProps3D.getType() != Layer3DProps.layer3DVector)) {
890
                                terrainNewPos++;
891
                        }
892

    
893
                }
894

    
895
                if ((terrainOldPos == null) || (terrainOldPos.size() == 0))
896
                        return;
897
                if (terrainOldPos.get(0) != terrainNewPos)
898
                        try {
899
                                _terrainLayerManager.moveLayer(terrainOldPos.get(0),
900
                                                terrainNewPos);
901
                        } catch (LayerManagementException e) {
902
                                // TODO Auto-generated catch block
903
                                e.printStackTrace();
904
                        }
905
                //
906
                // System.out.println("En el toc antes era el " + oldPos +
907
                // " y ahora el "
908
                // + newPos);
909
                // System.out.println("En el terrain antes era el " + terrainOldPos
910
                // + " y ahora el " + terrainNewPos);
911

    
912
                // PrintDebugLayers();
913

    
914
        }
915

    
916
        public void layerRemoved(FLayers3D parent, FLayer layer) {
917
                System.out.println("Removed layer");
918

    
919
                // to remove group layers to 3D, just remove recursively child data
920
                // layers
921
                if (layer instanceof FLayers) {
922
                        FLayers group = (FLayers) layer;
923
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
924
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
925
                        }
926
                        getLayer3DProps(layer).setHooked(false);
927
                        return;
928
                }
929

    
930
                if (layer instanceof Classifiable) {
931
                        Classifiable legendLyr = (Classifiable) layer;
932
                        legendLyr.removeLegendListener((LegendListener) this);
933
                }
934

    
935
                layer.removeLayerListener((LayerListener) this);
936

    
937
                removeLayerToTerrain(layer);
938

    
939
                // All layers are removed
940
                if (layers.getLayersCount() == 0) {
941
                        _bEmptyView = true;
942
                }
943

    
944
                if (getLayer3DProps(layer).getType() == Layer3DProps.layer3DOSG) {
945

    
946
                        try {
947
                                ((TerrainViewer) _canvas3d.getOSGViewer())
948
                                                .removeFeature(getEditionManager(layer));
949
                        } catch (NodeException e) {
950
                                // TODO Auto-generated catch block
951
                                e.printStackTrace();
952
                        }
953

    
954
                }
955

    
956
                // PrintDebugLayers();
957

    
958
        }
959

    
960
        public void legendChanged(LegendChangedEvent e) {
961
                if (!_bListenToLegend)
962
                        return;
963
                if ((e == null) && (!visibilityChange)) {
964
                        // find layer whose legend changed
965
                        FLayer found = null;
966
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
967
                        Layer3DProps props3D = getLayer3DProps(layers);
968
                        while (lyrIterator.hasNext()) {
969
                                FLayer lyr = lyrIterator.next();
970
                                if (lyr instanceof FLyrVect
971
                                                && props3D.getType() != Layer3DProps.layer3DOSG) {
972
                                        FLyrVect lyrVect = (FLyrVect) lyr;
973
                                        // System.out
974
                                        // .println("Changeando la simbologia de la capa vectorial: "
975
                                        // + lyrVect);
976
                                        long newDrawVersion = layers.getDrawVersion();
977
                                        Layer3DProps vectProps = getLayer3DProps(lyrVect);
978
                                        if ((newDrawVersion - props3D.getDrawVersion()) >= 1) {
979
                                                props3D.setDrawVersion(lyrVect.getDrawVersion());
980

    
981
                                                // if layer is vectorized remove and add the layer
982
                                                if (vectProps.getType() == Layer3DProps.layer3DVector) {
983
                                                        removeLayerToTerrain(lyr);
984
                                                        addLayerToTerrain(lyr, true);
985
                                                }
986
                                                if (vectProps.getType() == Layer3DProps.layer3DImage)
987
                                                        refreshLayerInTerrain(lyrVect, vectProps, true);
988
                                                // refreshLayerVectorsVisibility(lyrVect);
989
                                                // props3D.VerifyLegend(_terrain.getTerrainName());
990
                                                _bListenToLegend = true;
991
                                        }
992
                                }
993
                        }
994

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

    
1003
        }
1004

    
1005
        public UpdateDataEvent loadData(RequestDataEvent rde) {
1006

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

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

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

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

    
1053
                // Case of Raster data
1054

    
1055
                UpdateDataEvent ude = null;
1056

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

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

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

    
1066
                return ude;
1067
        }
1068

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

    
1072
                UpdateDataEvent ude = new UpdateDataEvent();
1073
                ude.copyDataFromRequest(rde);
1074

    
1075
                if (layer instanceof DefaultFLyrRaster) {
1076

    
1077
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1078

    
1079
                        if (rLayer.getDataStore().isTiled()) {
1080

    
1081
                                rLayer = (DefaultFLyrRaster) layer;
1082

    
1083
                                RasterQuery query = RasterLocator.getManager().createQuery();
1084

    
1085
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1086
                                                .getManager()
1087
                                                .getDataStructFactory()
1088
                                                .createExtent(envelope.getLowerCorner().getX(),
1089
                                                                envelope.getUpperCorner().getY(),
1090
                                                                envelope.getUpperCorner().getX(),
1091
                                                                envelope.getLowerCorner().getY());
1092

    
1093
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1094
                                                rde.getTileY(), extent, null);
1095

    
1096
                                try {
1097
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1098
                                        Buffer rBuff = (Buffer) result[0];
1099

    
1100
                                        Buffer transparencyBuffer = (result != null && result.length > 1) ? (Buffer) result[1]
1101
                                                        : null;
1102

    
1103
                                        ColorTable tileColorTable = (result != null && result.length > 2) ? (ColorTable) result[2]
1104
                                                        : null;
1105

    
1106
                                        int addAlpha = 0;
1107

    
1108
                                        Transparency lastTransparency = rLayer.getDataStore()
1109
                                                        .getRender().getLastTransparency();
1110

    
1111
                                        lastTransparency.setAlphaBand(transparencyBuffer);
1112

    
1113
                                        addTileColorTable(tileColorTable, rLayer);
1114

    
1115
                                        Buffer procBuffer = processBufferFilters(rBuff, rLayer);
1116

    
1117
                                        if (lastTransparency.getAlphaBand() != null)
1118
                                                addAlpha = 1;
1119

    
1120
                                        // Si el numero de bandas es mayor que 3 (RGB) no se pueden
1121
                                        // dibujar todas
1122
                                        int numBands = rLayer.getDataStore().getBandCount();
1123

    
1124
                                        if (numBands > (maxBands))
1125
                                                numBands = maxBands;
1126

    
1127
                                        ColorInterpretation cInt = rLayer.getDataStore()
1128
                                                        .getColorInterpretation();
1129

    
1130
                                        ColorTable colorTable = rLayer.getDataStore()
1131
                                                        .getColorTable();
1132

    
1133
                                        int rgba[] = { 0, 1, 2, 3 };
1134

    
1135
                                        rgba = setBandsInColors(cInt);
1136

    
1137
                                        int pixelFormat = 0;
1138
                                        boolean isPalette = (cInt
1139
                                                        .getBand(ColorInterpretation.PAL_BAND) != -1);
1140

    
1141
                                        if (isPalette) {
1142
                                                pixelFormat = org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1143
                                        }
1144

    
1145
                                        else
1146
                                                pixelFormat = convertPixelFormat(numBands + addAlpha);
1147

    
1148
                                        switch (procBuffer.getDataType()) {
1149
                                        case Buffer.TYPE_BYTE:
1150

    
1151
                                                byte[] byteBuffer = null;
1152
                                                if (isPalette) {
1153
                                                        byteBuffer = buildByteBufferPalette(ude, rBuff,
1154
                                                                        colorTable, transparencyBuffer);
1155
                                                        ude.setRasterData(byteBuffer,
1156
                                                                        procBuffer.getWidth(),
1157
                                                                        procBuffer.getHeight(), 4, pixelFormat,
1158
                                                                        Image.DataType.GL_UNSIGNED_BYTE);
1159
                                                } else {
1160
                                                        byteBuffer = buildByteBuffer(ude, procBuffer,
1161
                                                                        lastTransparency.getAlphaBand(), numBands,
1162
                                                                        rgba);
1163
                                                        ude.setRasterData(byteBuffer,
1164
                                                                        procBuffer.getWidth(),
1165
                                                                        procBuffer.getHeight(),
1166
                                                                        numBands + addAlpha, pixelFormat,
1167
                                                                        Image.DataType.GL_UNSIGNED_BYTE);
1168
                                                }
1169
                                                break;
1170

    
1171
                                        case Buffer.TYPE_SHORT:
1172
                                                ude.setRasterData(
1173
                                                                buildShortBuffer(ude, rBuff,
1174
                                                                                transparencyBuffer, numBands, rgba),
1175
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands,
1176
                                                                pixelFormat, Image.DataType.GL_SHORT);
1177
                                                break;
1178

    
1179
                                        case Buffer.TYPE_USHORT:
1180
                                                ude.setRasterData(
1181
                                                                buildShortBuffer(ude, rBuff,
1182
                                                                                transparencyBuffer, numBands, rgba),
1183
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands,
1184
                                                                pixelFormat, Image.DataType.GL_UNSIGNED_SHORT);
1185
                                                break;
1186

    
1187
                                        case Buffer.TYPE_INT:
1188
                                                ude.setRasterData(
1189
                                                                buildIntBuffer(ude, rBuff, transparencyBuffer,
1190
                                                                                numBands, rgba), rBuff.getWidth(),
1191
                                                                rBuff.getHeight(), numBands, pixelFormat,
1192
                                                                Image.DataType.GL_INT);
1193
                                                break;
1194

    
1195
                                        case Buffer.TYPE_FLOAT:
1196
                                                ude.setRasterData(
1197
                                                                buildFloatBuffer(ude, rBuff,
1198
                                                                                transparencyBuffer, numBands, rgba),
1199
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands
1200
                                                                                + addAlpha, pixelFormat,
1201
                                                                Image.DataType.GL_FLOAT);
1202
                                                break;
1203

    
1204
                                        case Buffer.TYPE_DOUBLE:
1205
                                                ude.setRasterData(
1206
                                                                buildDoubleBuffer(ude, rBuff,
1207
                                                                                transparencyBuffer, numBands, rgba),
1208
                                                                rBuff.getWidth(), rBuff.getHeight(), numBands,
1209
                                                                pixelFormat, Image.DataType.GL_DOUBLE);
1210
                                                break;
1211

    
1212
                                        }
1213

    
1214
                                        // ude.setRasterData(getLayerDrawImage(layer, envelope));
1215

    
1216
                                } catch (ProcessInterruptedException e) {
1217
                                        // TODO Auto-generated catch block
1218
                                        e.printStackTrace();
1219
                                } catch (RasterDriverException e) {
1220
                                        System.out.println("QueryArray failed");
1221
                                        // e.printStackTrace();
1222
                                } catch (InvalidSetViewException e) {
1223
                                        // TODO Auto-generated catch block
1224
                                        e.printStackTrace();
1225
                                } catch (NullPointerException e) {
1226
                                        System.out.println("NullPointer exception");
1227
                                }
1228

    
1229
                        }
1230
                        // Not tiled raster
1231
                        else {
1232
                                ude.setRasterData(getLayerDrawImage(layer, envelope));
1233
                        }
1234

    
1235
                }
1236

    
1237
                // Vectorial rasterized
1238
                else if (layer instanceof FLyrVect) {
1239
                        ude.setRasterData(getLayerDrawImage(layer, envelope));
1240
                }
1241
                // unrecognized layer type
1242
                else {
1243
                        ude.setFailData();
1244
                }
1245

    
1246
                // System.out.println("Returning UDE");
1247

    
1248
                return ude;
1249
        }
1250

    
1251
        private void addTileColorTable(ColorTable tileColorTable,
1252
                        DefaultFLyrRaster rLayer) {
1253
                if (tileColorTable == null)
1254
                        return;
1255

    
1256
                else {
1257
                        RasterFilterList filterList = rLayer.getDataStore().getRender()
1258
                                        .getFilterList();
1259
                        if (filterList.getFilterClassByID("ColorTable") == null) {
1260
                                try {
1261
                                        RasterFilterListManager colorTableManager = filterList
1262
                                                        .getManagerByID("ColorTable");
1263
                                        Params params = filterList.createEmptyFilterParams();
1264
                                        params.setParam("colorTable", tileColorTable);
1265
                                        colorTableManager.addFilter(params);
1266
                                } catch (FilterManagerException e) {
1267
                                        e.printStackTrace();
1268
                                } catch (FilterTypeException e) {
1269
                                        e.printStackTrace();
1270
                                }
1271
                        }
1272
                }
1273
        }
1274

    
1275
        private Buffer processBufferFilters(Buffer rBuffer, DefaultFLyrRaster rLayer) {
1276

    
1277
                RasterDataStore store = rLayer.getDataStore();
1278
                Transparency transparency = rLayer.getDataStore().getRender()
1279
                                .getLastTransparency();
1280

    
1281
                if (rLayer.getDataStore() != null) {
1282
                        // Asignamos los datos al objeto transparencia antes de aplicar la
1283
                        // pila de filtros para que el valor NoData sea efectivo
1284
                        if (store.getTransparency().getNoData().isNoDataTransparent()
1285
                                        || transparency.existAlphaBand())
1286
                                transparency.setDataBuffer(rBuffer);
1287
                        else {
1288
                                transparency.setDataBuffer(null);
1289
                        }
1290
                        transparency.activeTransparency();
1291
                } else
1292
                        return null;
1293

    
1294
                // Aplicamos los filtros
1295

    
1296
                Grid grid = new GridImpl(rBuffer, store, true);
1297
                RasterFilterList filterList = rLayer.getRender().getFilterList();
1298
                if (filterList != null) {
1299
                        filterList.addEnvParam("Transparency", transparency);
1300
                        grid.setFilterList(filterList);
1301
                        ColorTable cTable = grid.getPalette();
1302
                        try {
1303
                                grid.applyFilters();
1304
                        } catch (ProcessInterruptedException e) {
1305
                                // TODO Auto-generated catch block
1306
                                e.printStackTrace();
1307
                        }
1308
                }
1309

    
1310
                // Si la lista de filtros genera bandas de transparencia se mezclan con
1311
                // la actual
1312
                if (grid.getFilterList().getAlphaBand() != null) {
1313
                        Buffer t = grid.getFilterList().getAlphaBand();
1314
                        if (transparency.getAlphaBand() != null)
1315
                                t = RasterLocator
1316
                                                .getManager()
1317
                                                .getColorConversion()
1318
                                                .mergeTransparencyBuffers(t,
1319
                                                                transparency.getAlphaBand());
1320
                        transparency.setAlphaBand(t);
1321
                        transparency.activeTransparency();
1322
                }
1323

    
1324
                return grid.getRasterBuf();
1325

    
1326
        }
1327

    
1328
        private UpdateDataEvent loadVectorData(FLayer layer, Envelope envelope,
1329
                        RequestDataEvent rde) {
1330

    
1331
                UpdateDataEvent ude = new UpdateDataEvent();
1332
                ude.copyDataFromRequest(rde);
1333

    
1334
                Group g = new Group();
1335
                Layer3DProps layerprops = getLayer3DProps(layer);
1336
                // Hack for polylines and polygons to only render them rasterized
1337
                // till gvSIG architects solve geometries problem
1338

    
1339
                // Hack for polygons
1340

    
1341
                // try {
1342
                // if (((FLyrVect) layer).getShapeType()!=1 &&((FLyrVect)
1343
                // layer).getShapeType()!=7)
1344
                // {
1345
                // removeLayerToTerrain(layer);
1346
                // layerprops.setType(Layer3DPropsImpl.layer3DImage);
1347
                // addLayerToTerrain(layer, true);
1348
                // return null;
1349
                // }
1350
                // } catch (ReadException e1) {
1351
                // // TODO Auto-generated catch block
1352
                // e1.printStackTrace();
1353
                // }// End hack
1354

    
1355
                // Set ViewPort
1356
                ViewPort vp = getViewPort();
1357
                vp.setEnvelope(envelope); // the real extent of the tile
1358
                vp.setAdjustable(false);
1359
                vp.setImageSize(new Dimension(256, 256));
1360
                vp.setDist1pixel(0.000000001);
1361
                ILegend legend = ((FLyrVect) layer).getLegend();
1362
                ISymbol[] symbolList = fillSymbolList(legend);
1363
                for (int i = 0; i < symbolList.length; i++) {
1364
                        I3DSymbol sy = (I3DSymbol) symbolList[i];
1365
                        sy.setCoordinateSystemType(_terrain.getCoordinateSystemType());
1366
                        if (layerprops.isZEnable() == false)
1367
                                sy.setFixedHeight(layerprops.getHeight());
1368
                }
1369

    
1370
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1371

    
1372
                DataStore ds = ((SingleLayer) layer).getDataStore();
1373

    
1374
                if (((I3DSymbol) symbolList[0]).getGeometry().getSize() == 0
1375
                                || ds.getProviderName() == "NetCDFVectorial"
1376
                                || layerprops.isGeometryDirty() == true) {
1377
                        try {
1378

    
1379
                                for (int i = 0; i < symbolList.length; i++) {
1380
                                        ((I3DSymbol) (symbolList[i])).resetGeometry();
1381

    
1382
                                }
1383
                                layer.draw(null, null, getViewPort(), new MyCancel(), scale);
1384
                                // setGeometryDirty to false to avoid unnecessary repaints
1385
                                layerprops.setDirtyGeometry(false);
1386
                        } catch (ReadException e) {
1387
                                // TODO Auto-generated catch block
1388
                                e.printStackTrace();
1389
                        }
1390
                }
1391
                // OSG Layers
1392
                Node n = null;
1393

    
1394
                if (ds.getProviderName() == "OSG") {
1395
                        try {
1396
                                n = (Node) ds.invokeDynMethod("getNode", null);
1397
                                g.addChild(n);
1398
                        } catch (DynMethodException e) {
1399
                                // TODO Auto-generated catch block
1400
                                e.printStackTrace();
1401
                        } catch (NodeException e) {
1402
                                // TODO Auto-generated catch block
1403
                                e.printStackTrace();
1404
                        }
1405
                        // System.out.println("OSG Layer added");
1406
                        // Change properties to OSG layer
1407
                        layerprops.setType(Layer3DProps.layer3DOSG);
1408
                }
1409
                // Vectorial layers
1410
                else {
1411

    
1412
                        if (legend instanceof ExtrusionLegend) {
1413

    
1414
                                symbolList = convertFillToExtruded(symbolList);
1415

    
1416
                        }
1417
                        for (int i = 0; i < symbolList.length; i++) {
1418
                                n = ((I3DSymbol) symbolList[i]).getRenderNode();
1419

    
1420
                                try {
1421
                                        g.addChild(n);
1422
                                } catch (NodeException e) {
1423
                                        // TODO Auto-generated catch block
1424
                                        e.printStackTrace();
1425
                                }
1426
                        }
1427

    
1428
                }
1429
                ude.setVectorData(g);
1430
                return ude;
1431
        }
1432

    
1433
        private ISymbol[] fillSymbolList(ILegend legend) {
1434
                ISymbol[] symbolList = null;
1435
                if (legend instanceof ISingleSymbolLegend) {
1436
                        symbolList = new ISymbol[1];
1437
                        I3DSymbol sy = (I3DSymbol) ((ISingleSymbolLegend) (legend))
1438
                                        .getDefaultSymbol();
1439

    
1440
                        symbolList[0] = sy;
1441
                }
1442
                if (legend instanceof AbstractIntervalLegend)
1443
                        symbolList = ((AbstractIntervalLegend) (legend)).getSymbols();
1444
                if (legend instanceof VectorialUniqueValueLegend) {
1445
                        ((VectorialUniqueValueLegend) (legend))
1446
                                        .setDomain("project.document.view3d");
1447
                        symbolList = ((VectorialUniqueValueLegend) (legend)).getSymbols();
1448
                }
1449
                return symbolList;
1450

    
1451
        }
1452

    
1453
        private ISymbol[] convertFillToExtruded(ISymbol[] symbols) {
1454

    
1455
                ISymbol[] symbolList = new ISymbol[symbols.length];
1456
                for (int i = 0; i < symbols.length; ++i) {
1457
                        ExtrusionPolygonSymbol sym = new ExtrusionPolygonSymbol();
1458
                        sym.setColor(symbols[i].getColor());
1459
                        sym.setExtrusion(Float.parseFloat(symbols[i].getDescription()));
1460
                        sym.setGeometry(((SimpleFill3DSymbol) symbols[i]).getGeometry());
1461
                        symbolList[i] = sym;
1462

    
1463
                }
1464
                return symbolList;
1465

    
1466
        }
1467

    
1468
        // private Node buildVectors(I3DSymbol symbol) {
1469
        // Node n = null;
1470
        //
1471
        // ISymbol3D sym = null;
1472
        // try {
1473
        // sym = Symbol3DFactory.getSymbol3D(symbol);
1474
        // } catch (NodeException e) {
1475
        // // TODO Auto-generated catch block
1476
        // e.printStackTrace();
1477
        // }
1478
        // // sm.setPointSize((float) sy.getSize());
1479
        // n = sym.buildSceneGraph(symbol.getGeometry());
1480
        // return n;
1481
        // }
1482

    
1483
        private UpdateDataEvent loadElevationData(FLayer layer, Envelope envelope,
1484
                        RequestDataEvent rde) {
1485

    
1486
                UpdateDataEvent ude = new UpdateDataEvent();
1487
                ude.copyDataFromRequest(rde);
1488

    
1489
                if (layer instanceof DefaultFLyrRaster) {
1490
                        DefaultFLyrRaster rLayer = (DefaultFLyrRaster) layer;
1491
                        if (rLayer.getDataStore().isTiled()) {
1492

    
1493
                                rLayer = (DefaultFLyrRaster) layer;
1494

    
1495
                                RasterQuery query = RasterLocator.getManager().createQuery();
1496

    
1497
                                org.gvsig.fmap.dal.coverage.datastruct.Extent extent = RasterLocator
1498
                                                .getManager()
1499
                                                .getDataStructFactory()
1500
                                                .createExtent(envelope.getLowerCorner().getX(),
1501
                                                                envelope.getUpperCorner().getY(),
1502
                                                                envelope.getUpperCorner().getX(),
1503
                                                                envelope.getLowerCorner().getY());
1504

    
1505
                                query.setTileParameters(rde.getTileLevel(), rde.getTileX(),
1506
                                                rde.getTileY(), extent, null);
1507

    
1508
                                try {
1509
                                        Object[] result = rLayer.getDataStore().queryArray(query);
1510
                                        Buffer rBuff = (Buffer) result[0];
1511
                                        Buffer transparencyBuffer;
1512

    
1513
                                        if (result.length < 2)
1514
                                                transparencyBuffer = null;
1515
                                        else
1516
                                                transparencyBuffer = (Buffer) result[1];
1517

    
1518
                                        int numBands = rBuff.getBandCount();
1519
                                        if (transparencyBuffer != null) {
1520
                                                numBands++;
1521

    
1522
                                        }
1523

    
1524
                                        float[] data = new float[(rBuff.getWidth() * rBuff
1525
                                                        .getHeight()) / 64];
1526

    
1527
                                        int pixelFormat = convertPixelFormat(numBands);
1528

    
1529
                                        // K hay que setearlo en el dialogo
1530
                                        int cont = 0;
1531

    
1532
                                        int k = getLayer3DProps(rLayer).getElevationBand();
1533

    
1534
                                        for (int i = rBuff.getWidth() - 8; i >= 0; i = i - 8) {
1535
                                                // Vertical Flip needed
1536
                                                for (int j = 0; j < rBuff.getHeight(); j = j + 8) {
1537

    
1538
                                                        switch (rBuff.getDataType()) {
1539
                                                        case Buffer.TYPE_BYTE:
1540
                                                                data[cont] = (float) (rBuff
1541
                                                                                .getElemByte(i, j, k));
1542
                                                                cont++;
1543
                                                                break;
1544
                                                        case Buffer.TYPE_DOUBLE:
1545
                                                                data[cont] = (float) (Math.round(rBuff
1546
                                                                                .getElemDouble(i, j, k)));
1547
                                                                cont++;
1548
                                                                break;
1549
                                                        case Buffer.TYPE_FLOAT:
1550
                                                                data[cont] = (float) (Math.round(rBuff
1551
                                                                                .getElemFloat(i, j, k)));
1552
                                                                cont++;
1553
                                                                break;
1554
                                                        case Buffer.TYPE_INT:
1555
                                                                data[cont] = (float) (rBuff.getElemInt(i, j, k) & 0xffffffff);
1556
                                                                cont++;
1557
                                                                break;
1558
                                                        case Buffer.TYPE_SHORT:
1559
                                                        case Buffer.TYPE_USHORT:
1560
                                                                data[cont] = (float) (rBuff.getElemShort(i, j,
1561
                                                                                k) & 0xffff);
1562
                                                                cont++;
1563
                                                                break;
1564
                                                        }
1565

    
1566
                                                }
1567

    
1568
                                        }
1569
                                        ude.setHeightfieldData(data, rBuff.getWidth() / 8,
1570
                                                        rBuff.getHeight() / 8);
1571

    
1572
                                        data = null;
1573
                                        result = null;
1574

    
1575
                                } catch (ProcessInterruptedException e) {
1576
                                        // TODO Auto-generated catch block
1577
                                        e.printStackTrace();
1578
                                } catch (RasterDriverException e) {
1579
                                        e.printStackTrace();
1580
                                } catch (InvalidSetViewException e) {
1581
                                        // TODO Auto-generated catch block
1582
                                        e.printStackTrace();
1583
                                } catch (NullPointerException e) {
1584
                                        // ude.setFailData();
1585
                                        // System.out.println("Problem getting the tile");
1586
                                }
1587

    
1588
                        }
1589
                        // No cache
1590
                        else {
1591
                                ude.setHeightfieldData(getLayerDrawImage(layer, envelope));
1592
                        }
1593

    
1594
                }
1595
                // unrecognized layer type
1596
                else {
1597
                        ude.setFailData();
1598
                }
1599

    
1600
                return ude;
1601

    
1602
        }
1603

    
1604
        protected byte[] buildByteBuffer(UpdateDataEvent ude, Buffer rBuff,
1605
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1606

    
1607
                int cont = 0;
1608
                int colorBands = numBands;
1609

    
1610
                if (transparencyBuffer != null) {
1611
                        // colorBands--;
1612
                        numBands = numBands + 1;
1613
                }
1614

    
1615
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * numBands];
1616

    
1617
                for (int i = 0; i < rBuff.getWidth(); i++) {
1618

    
1619
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1620

    
1621
                                for (int k = 0; k < colorBands; k++) {
1622
                                        data[cont] = (byte) rBuff.getElemByte(i, j, rgba[k]);
1623
                                        // if(data[cont]!=-1)
1624
                                        // System.out.println("Banda: " + k + " " + data[cont]);
1625
                                        cont++;
1626

    
1627
                                }
1628
                                if (transparencyBuffer != null) {
1629
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1630
                                        // data[cont] = (byte) 0;
1631
                                        // else
1632
                                        // data[cont] = (byte) 255;
1633
                                        data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1634
                                        cont++;
1635

    
1636
                                }
1637

    
1638
                        }
1639
                }
1640

    
1641
                return data;
1642
        }
1643

    
1644
        protected byte[] buildByteBufferPalette(UpdateDataEvent ude, Buffer rBuff,
1645
                        ColorTable colorTable, Buffer transparencyBuffer) {
1646

    
1647
                int cont = 0;
1648

    
1649
                byte[] data = new byte[rBuff.getWidth() * rBuff.getHeight() * 4];
1650

    
1651
                for (int i = 0; i < rBuff.getWidth(); i++) {
1652

    
1653
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1654

    
1655
                                byte index = rBuff.getElemByte(i, j, 0);
1656

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

    
1659
                                for (int k = 0; k < 4; k++) {
1660
                                        data[cont] = rgba[k];
1661
                                        if (k == 3 && transparencyBuffer != null)
1662
                                                data[cont] = transparencyBuffer.getElemByte(i, j, 0);
1663
                                        cont++;
1664
                                }
1665
                        }
1666
                }
1667

    
1668
                return data;
1669
        }
1670

    
1671
        protected short[] buildShortBuffer(UpdateDataEvent ude, Buffer rBuff,
1672
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1673
                int cont = 0;
1674
                int colorBands = numBands;
1675

    
1676
                if (transparencyBuffer != null) {
1677
                        // colorBands--;
1678
                        numBands = numBands + 1;
1679
                }
1680

    
1681
                short[] data = new short[rBuff.getWidth() * rBuff.getHeight()
1682
                                * numBands];
1683

    
1684
                for (int i = 0; i < rBuff.getWidth(); i++) {
1685

    
1686
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1687

    
1688
                                for (int k = 0; k < colorBands; k++) {
1689
                                        // En lugar de k se deben usar las bandas asociadas al
1690
                                        // componente
1691
                                        data[cont] = (short) rBuff.getElemShort(i, j, rgba[k]);
1692
                                        cont++;
1693

    
1694
                                }
1695
                                if (transparencyBuffer != null) {
1696
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1697
                                        // data[cont] = (byte) 0;
1698
                                        // else
1699
                                        // data[cont] = (byte) 255;
1700
                                        data[cont] = transparencyBuffer.getElemShort(i, j, 0);
1701

    
1702
                                        cont++;
1703

    
1704
                                }
1705
                        }
1706
                }
1707

    
1708
                return data;
1709
        }
1710

    
1711
        protected int[] buildIntBuffer(UpdateDataEvent ude, Buffer rBuff,
1712
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1713
                int cont = 0;
1714
                int colorBands = numBands;
1715

    
1716
                if (transparencyBuffer != null) {
1717
                        // colorBands--;
1718
                        numBands = numBands + 1;
1719
                }
1720

    
1721
                int[] data = new int[rBuff.getWidth() * rBuff.getHeight() * numBands];
1722

    
1723
                for (int i = 0; i < rBuff.getWidth(); i++) {
1724

    
1725
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1726

    
1727
                                for (int k = 0; k < colorBands; k++) {
1728
                                        // En lugar de k se deben usar las bandas asociadas al
1729
                                        // componente
1730
                                        data[cont] = rBuff.getElemInt(i, j, rgba[k]);
1731
                                        cont++;
1732

    
1733
                                }
1734
                                if (transparencyBuffer != null) {
1735
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1736
                                        // data[cont] = (byte) 0;
1737
                                        // else
1738
                                        // data[cont] = (byte) 255;
1739
                                        data[cont] = transparencyBuffer.getElemInt(i, j, 0);
1740

    
1741
                                        cont++;
1742

    
1743
                                }
1744
                        }
1745
                }
1746

    
1747
                return data;
1748
        }
1749

    
1750
        protected float[] buildFloatBuffer(UpdateDataEvent ude, Buffer rBuff,
1751
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1752

    
1753
                int cont = 0;
1754
                int colorBands = numBands;
1755

    
1756
                if (transparencyBuffer != null) {
1757
                        // colorBands--;
1758
                        numBands = numBands + 1;
1759
                }
1760

    
1761
                float[] data = new float[rBuff.getWidth() * rBuff.getHeight()
1762
                                * numBands];
1763

    
1764
                for (int i = 0; i < rBuff.getWidth(); i++) {
1765

    
1766
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1767

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

    
1774
                                }
1775
                                if (transparencyBuffer != null) {
1776
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1777
                                        // data[cont] = (byte) 0;
1778
                                        // else
1779
                                        // data[cont] = (byte) 255;
1780
                                        data[cont] = transparencyBuffer.getElemFloat(i, j, 0);
1781

    
1782
                                        cont++;
1783

    
1784
                                }
1785
                        }
1786
                }
1787

    
1788
                return data;
1789
        }
1790

    
1791
        protected double[] buildDoubleBuffer(UpdateDataEvent ude, Buffer rBuff,
1792
                        Buffer transparencyBuffer, int numBands, int[] rgba) {
1793
                int cont = 0;
1794
                int colorBands = numBands;
1795

    
1796
                if (transparencyBuffer != null) {
1797
                        // colorBands--;
1798
                        numBands = numBands + 1;
1799
                }
1800

    
1801
                double[] data = new double[rBuff.getWidth() * rBuff.getHeight()
1802
                                * numBands];
1803

    
1804
                for (int i = 0; i < rBuff.getWidth(); i++) {
1805

    
1806
                        for (int j = 0; j < rBuff.getHeight(); j++) {
1807

    
1808
                                for (int k = 0; k < colorBands; k++) {
1809
                                        // En lugar de k se deben usar las bandas asociadas al
1810
                                        // componente
1811
                                        data[cont] = rBuff.getElemDouble(i, j, rgba[k]);
1812
                                        cont++;
1813

    
1814
                                }
1815
                                if (transparencyBuffer != null) {
1816
                                        // if (transparencyBuffer.getElemByte(i, j, 0) == 0)
1817
                                        // data[cont] = (byte) 0;
1818
                                        // else
1819
                                        // data[cont] = (byte) 255;
1820
                                        data[cont] = transparencyBuffer.getElemDouble(i, j, 0);
1821

    
1822
                                        cont++;
1823

    
1824
                                }
1825
                        }
1826
                }
1827

    
1828
                return data;
1829
        }
1830

    
1831
        protected int convertPixelFormat(int type) {
1832

    
1833
                switch (type) {
1834

    
1835
                case 1:
1836
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE;
1837

    
1838
                case 2:
1839
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_LUMINANCE_ALPHA;
1840

    
1841
                case 3:
1842
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGB;
1843

    
1844
                case 4:
1845
                        return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_RGBA;
1846

    
1847
                }
1848

    
1849
                return org.gvsig.osgvp.core.osg.Image.PixelFormat.GL_COLOR_INDEX;
1850

    
1851
        }
1852

    
1853
        protected int[] setBandsInColors(ColorInterpretation cInt) {
1854

    
1855
                int rgba[] = new int[4];
1856

    
1857
                rgba[0] = cInt.getBand(ColorInterpretation.RED_BAND);
1858
                if (rgba[0] == -1)
1859
                        rgba[0] = 0;
1860
                rgba[1] = cInt.getBand(ColorInterpretation.GREEN_BAND);
1861
                if (rgba[1] == -1)
1862
                        rgba[1] = 1;
1863
                rgba[2] = cInt.getBand(ColorInterpretation.BLUE_BAND);
1864
                if (rgba[2] == -1)
1865
                        rgba[2] = 2;
1866
                rgba[3] = cInt.getBand(ColorInterpretation.ALPHA_BAND);
1867
                if (rgba[3] == -1)
1868
                        rgba[3] = 3;
1869

    
1870
                return rgba;
1871

    
1872
        }
1873

    
1874
        protected class MyCancel implements Cancellable {
1875
                private boolean cancel = false;
1876

    
1877
                public MyCancel() {
1878
                }
1879

    
1880
                public void setCanceled(boolean canceled) {
1881
                        cancel = canceled;
1882
                }
1883

    
1884
                public boolean isCanceled() {
1885
                        return cancel;
1886
                }
1887
        }
1888

    
1889
        private BufferedImage getLayerDrawImage(FLayer layer, Envelope envelope) {
1890

    
1891
                int size = 256;
1892
                BufferedImage image = new BufferedImage(size, size,
1893
                                BufferedImage.TYPE_4BYTE_ABGR);
1894

    
1895
                ViewPort vp = new ViewPort(_viewProjection);
1896
                vp.setEnvelope(envelope); // the real extent of the tile
1897

    
1898
                vp.setAdjustable(false);
1899
                vp.setImageSize(new Dimension(size, size));
1900
                vp.setDist1pixel(0.000000001);
1901

    
1902
                Graphics2D graphics = image.createGraphics();
1903
                Color backgColor = new Color(255, 255, 255, 0); // transparent
1904
                // background
1905
                graphics.setColor(backgColor);
1906
                graphics.fillRect(0, 0, size, size);
1907

    
1908
                double scale = 0.5 * (layer.getMaxScale() + layer.getMinScale());
1909

    
1910
                try {
1911
                        layer.draw(image, graphics, vp, new MyCancel(), scale);
1912

    
1913
                } catch (Exception e) {
1914
                        return null;
1915
                }
1916

    
1917
                return image;
1918

    
1919
        }
1920

    
1921
        public void nameChanged(LayerEvent e) {
1922
                // System.out.println("Name change");
1923

    
1924
        }
1925

    
1926
        public void refreshLayerInTerrain(FLayer layer, Layer3DProps props,
1927
                        boolean bRemoveCache) {
1928

    
1929
                if (props == null)
1930
                        return;
1931

    
1932
                if (_terrain == null)
1933
                        return; // view not opened yet
1934

    
1935
                // clear cache
1936

    
1937
                // refresh layer in terrain
1938
                int type = props.getType();
1939
                if ((type == Layer3DProps.layer3DImage)
1940
                                || (type == Layer3DProps.layer3DElevation)
1941
                                || (type == Layer3DProps.layer3DVectorMR)) {
1942

    
1943
                        try {
1944
                                _terrainLayerManager.invalidateLayer(props.getTerrainLayer());
1945
                        } catch (LayerManagementException e) {
1946
                                // TODO Auto-generated catch block
1947
                                e.printStackTrace();
1948
                        }
1949
                } else if (type == Layer3DProps.layer3DVector) {
1950
                        // ILegend legend = ((FLyrVect) layer).getLegend();
1951
                        //
1952
                        // try {
1953
                        // RequestDataEvent rde = new RequestDataEvent();
1954
                        // loadVectorData(layer, layer.getFullEnvelope(),
1955
                        // new RequestDataEvent(), (I3DSymbol) legend.getDefaultSymbol());
1956
                        // } catch (ReadException e) {
1957
                        // // TODO Auto-generated catch block
1958
                        // e.printStackTrace();
1959
                        // }
1960

    
1961
                }
1962

    
1963
        }
1964

    
1965
        public boolean removeCache(File path) {
1966
                if (path.exists()) {
1967
                        File[] files = path.listFiles();
1968
                        for (int i = 0; i < files.length; i++) {
1969
                                if (files[i].isDirectory()) {
1970
                                        removeCache(files[i]);
1971
                                } else {
1972
                                        files[i].delete();
1973
                                }
1974
                        }
1975
                }
1976
                return (path.delete());
1977
        }
1978

    
1979
        public void removeLayerToTerrain(FLayer layer) {
1980

    
1981
                Layer terrainLayer = _terrainFLayerMap.get(layer);
1982
                if (terrainLayer != null) {
1983

    
1984
                        _terrainLayerMap.remove(terrainLayer.getLayerID());
1985
                        _terrainFLayerMap.remove(layer);
1986

    
1987
                        try {
1988
                                _terrainLayerManager.removeLayer(terrainLayer);
1989
                        } catch (LayerManagementException e) {
1990
                                // TODO Auto-generated catch block
1991
                                e.printStackTrace();
1992
                        }
1993
                }
1994

    
1995
        }
1996

    
1997
        public void selectionChanged(SelectionEvent e) {
1998
                // TODO Auto-generated method stub
1999
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
2000
                // while (lyrIterator.hasNext()) {
2001
                // FLayer layer = lyrIterator.next();
2002
                // Layer3DProps props3D = getLayer3DProps(layer);
2003
                // if (props3D.getType() != Layer3DProps.layer3DOSG) {
2004
                // if (layer.getClass().equals(FLyrVect.class)) {
2005
                // FLyrVect lyr = (FLyrVect) layer;
2006
                //
2007
                // FBitSet selection = null;
2008
                // try {
2009
                // selection = lyr.getRecordset().getSelectionSupport()
2010
                // .getSelection();
2011
                // } catch (ReadDriverException e1) {
2012
                // // TODO Auto-generated catch block
2013
                // e1.printStackTrace();
2014
                // }
2015
                //
2016
                // if ((selection.cardinality() == 0)
2017
                // || (!(selection.isEmpty()))) {
2018
                // Layer3DProps props = Layer3DProps
2019
                // .getLayer3DProps(layer);
2020
                // refreshLayerInTerrain(props, true);
2021
                // if (layer instanceof FLyrVect) {
2022
                // FLyrVect fvect = (FLyrVect) layer;
2023
                // props.drawVersion = fvect.getDrawVersion();
2024
                // }
2025
                // }
2026
                // }
2027
                // }
2028
                // }
2029

    
2030
        }
2031

    
2032
        public void setDataManager(JavaDataDriver manager) {
2033
                _terrainDataManager = manager;
2034
                _terrainDataManager.setDataLoader(this);
2035

    
2036
        }
2037

    
2038
        public void setLayerManager(LayerManager manager) {
2039
                _terrainLayerManager = manager;
2040

    
2041
        }
2042

    
2043
        public void setLoading(boolean bLoading) {
2044
                _bLoading = bLoading;
2045

    
2046
        }
2047

    
2048
        public void setRenewCanvasOff(boolean renewCanvasOff) {
2049
                _renewCanvasOff = renewCanvasOff;
2050

    
2051
        }
2052

    
2053
        public void setTerrain(Terrain terrain) {
2054
                if (_terrain == terrain)
2055
                        return;
2056

    
2057
                _terrain = terrain;
2058

    
2059
                // add layers to terrain necessary when we are loading
2060
                addCurrentLayers();
2061

    
2062
        }
2063

    
2064
        public void setVerticalExaggeration(float verticalExaggeration) {
2065
                _verticalExaggeration = verticalExaggeration;
2066

    
2067
        }
2068

    
2069
        public void setViewProjection(IProjection projection) {
2070
                _viewProjection = projection;
2071

    
2072
        }
2073

    
2074
        public void setViewer(IViewerContainer canvas) {
2075
                _canvas3d = canvas;
2076
                _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer();
2077

    
2078
        }
2079

    
2080
        public void visibilityChanged(LayerEvent e) {
2081
                FLayer lyr = e.getSource();
2082

    
2083
                // if (props3D.getType() == Layer3DProps.layer3DVector) {
2084
                // refreshLayerVectorsVisibility(lyr);
2085
                // } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
2086
                // refreshLayer3DOSGVisibility(lyr);
2087
                // } else {
2088
                refreshLayerVisibility(lyr);
2089
                // }
2090
                visibilityChange = true;
2091

    
2092
        }
2093

    
2094
        private void refreshLayerVisibility(FLayer layer) {
2095

    
2096
                Layer terrainLayer = _terrainFLayerMap.get(layer);
2097
                terrainLayer.setEnabled(layer.isVisible());
2098
                getEditionManager(layer).setEnabledNode(layer.isVisible());
2099
                // _terrainLayerManager.updateLayers();
2100

    
2101
        }
2102

    
2103
        public void zoomToEnvelope(Envelope geoEnvelope) {
2104
                if (geoEnvelope == null)
2105
                        return;
2106
                if ((geoEnvelope.getLength(0) == 0) || (geoEnvelope.getLength(1) == 0))
2107
                        return;
2108

    
2109
                double maxHeight = 0.0;
2110

    
2111
                // Getting envelope positions
2112
                double minLat = geoEnvelope.getMinimum(0);
2113
                double maxLat = geoEnvelope.getMaximum(0);
2114

    
2115
                double cenLon = geoEnvelope.getCenter(0);
2116
                double cenLat = geoEnvelope.getCenter(1);
2117

    
2118
                double elevation = 0;
2119

    
2120
                // calculate altitude
2121
                double avLat = 0;
2122
                if (minLat > 0.0 || maxLat < 0.0)
2123
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
2124
                double avLon = Math.min(180.0, geoEnvelope.getLength(1));
2125

    
2126
                double terrainRadius = _terrain.getRadiusEquatorial();
2127
                double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat));
2128
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
2129
                                * (1 - Math.cos(Math.toRadians(avLon))));
2130
                double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius
2131
                                * (1 - Math.cos(Math.toRadians(geoEnvelope.getLength(0)))));
2132

    
2133
                // Calculate XYZ positions for camera.
2134

    
2135
                int terrainType = _terrain.getCoordinateSystemType();
2136

    
2137
                double zoomFactor = 1.5;
2138
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED)
2139
                        zoomFactor = 1.3;
2140
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
2141

    
2142
                Vec3 eye = new Vec3();
2143
                Vec3 center = new Vec3();
2144
                Vec3 up = new Vec3();
2145
                // Calculate positions for PLAIN MODE.
2146
                if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
2147

    
2148
                        double difx = (geoEnvelope.getMaximum(1) - geoEnvelope
2149
                                        .getMinimum(1)) / 1.2d;
2150
                        double dify = (geoEnvelope.getMaximum(0) - geoEnvelope
2151
                                        .getMinimum(0)) / 1.2d;
2152
                        double height;
2153

    
2154
                        height = Math.sqrt(difx * difx + dify * dify);
2155
                        double fullWindowFactor = 1.7;
2156
                        // EYE
2157
                        eye.setX(cenLon);
2158
                        eye.setY(cenLat);
2159
                        eye.setZ(height * fullWindowFactor);
2160
                        // CENTER
2161
                        center.setX(cenLon);
2162
                        center.setY(cenLat);
2163
                        center.setZ(0.0);
2164
                        // UP
2165
                        up.setX(0.0);
2166
                        up.setY(1.0);
2167
                        up.setZ(0.0);
2168
                } else
2169
                // Calculate positions for SPHERICAL MODE.
2170
                if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
2171
                        // EYE
2172
                        Vec3 aux = new Vec3(cenLon, cenLat, elevation);
2173
                        eye = _terrain.convertLatLongHeightToXYZ(aux);
2174
                        // CENTER
2175
                        center.setX(0.0);
2176
                        center.setY(0.0);
2177
                        center.setZ(0.0);
2178
                        // UP
2179
                        up.setX(0.0);
2180
                        up.setY(0.0);
2181
                        up.setZ(1.0);
2182
                }
2183
                Camera cam = new Camera();
2184
                cam.setViewByLookAt(eye, center, up);
2185

    
2186
                _terrainViewer.setCamera(cam);
2187

    
2188
        }
2189

    
2190
        public void editionChanged(LayerEvent e) {
2191
                // TODO Auto-generated method stub
2192

    
2193
        }
2194

    
2195
        public void drawValueChanged(LayerEvent e) {
2196
                // TODO Auto-generated method stub
2197

    
2198
        }
2199

    
2200
        public boolean symbolChanged(SymbolLegendEvent e) {
2201

    
2202
                // System.out.println("Symbol changed");
2203
                return false;
2204
        }
2205

    
2206
        public void legendCleared(LegendClearEvent event) {
2207
                // TODO Auto-generated method stub
2208

    
2209
        }
2210

    
2211
        public static class RegisterPersistence implements Callable {
2212

    
2213
                public Object call() throws Exception {
2214
                        PersistenceManager manager = ToolsLocator.getPersistenceManager();
2215
                        if (manager.getDefinition(MapContext.class) == null) {
2216
                                MapContext.registerPersistent();
2217
                        }
2218
                        DynStruct definition = manager.addDefinition(
2219
                                        MapContext3DImpl.class, "MapContext3DImpl",
2220
                                        "MapContext3DImpl Persistence definition", null, null);
2221
                        definition.extend(PersistenceManager.PERSISTENCE_NAMESPACE,
2222
                                        "MapContext");
2223

    
2224
                        return Boolean.TRUE;
2225
                }
2226
        }
2227

    
2228
        @Override
2229
        public EditionManager getEditionManager(FLayer layer) {
2230

    
2231
                EditionManager eManager = _layersEditionMap.get(layer);
2232

    
2233
                if (eManager == null) {
2234

    
2235
                        try {
2236
                                DataStore ds = ((SingleLayer) layer).getDataStore();
2237

    
2238
                                Node n = null;
2239

    
2240
                                if (ds.getProviderName() == "OSG") {
2241

    
2242
                                        n = (Node) ds.invokeDynMethod("getNode", null);
2243

    
2244
                                } else
2245
                                        n = new Group();
2246

    
2247
                                eManager = new EditionManager();
2248

    
2249
                                Group loadedScene = new Group(n.getCPtr());
2250

    
2251
                                for (int i = 0; i < loadedScene.getNumChildren(); i++) {
2252

    
2253
                                        eManager.setScene(loadedScene.getChild(i));
2254

    
2255
                                }
2256

    
2257
                                BasicInputHandler handler = new BasicInputHandler(eManager,
2258
                                                (OSGViewer) _canvas3d.getOSGViewer());
2259

    
2260
                                _canvas3d.getOSGViewer().addEventHandler(handler);
2261
                                ((TerrainViewer) _canvas3d.getOSGViewer()).addFeature(eManager);
2262

    
2263
                                _layersEditionMap.put(layer, eManager);
2264
                                _layersHandlerMap.put(layer, handler);
2265

    
2266
                        } catch (NodeException e2) {
2267
                                // TODO Auto-generated catch block
2268
                                e2.printStackTrace();
2269
                        } catch (DynMethodException e) {
2270
                                // TODO Auto-generated catch block
2271
                                e.printStackTrace();
2272
                        }
2273

    
2274
                }
2275

    
2276
                return eManager;
2277
        }
2278

    
2279
        public BasicInputHandler getEditionHandler(FLayer layer) {
2280

    
2281
                return _layersHandlerMap.get(layer);
2282

    
2283
        }
2284
}