svn-gvsig-desktop / branches / gvSIG_19_ext3D_osgVP_2_2_0 / libraries / lib3DMap / src / org / gvsig / gvsig3d / map3d / MapContext3D.java @ 31879
History | View | Annotate | Download (36.9 KB)
1 | 21940 | jcampos | package org.gvsig.gvsig3d.map3d; |
---|---|---|---|
2 | 14901 | salva | |
3 | 15321 | salva | import java.awt.Dimension; |
4 | 20125 | jcampos | import java.awt.Graphics2D; |
5 | 15308 | salva | import java.awt.Point; |
6 | 20893 | jcampos | import java.awt.geom.AffineTransform; |
7 | 14949 | salva | import java.awt.geom.Rectangle2D; |
8 | 20125 | jcampos | import java.awt.image.BufferedImage; |
9 | 20893 | jcampos | import java.awt.image.ImagingOpException; |
10 | 22350 | jcampos | import java.awt.image.RenderedImage; |
11 | 15308 | salva | import java.io.File; |
12 | 20125 | jcampos | import java.io.IOException; |
13 | 31642 | mten | import java.util.Hashtable; |
14 | 31669 | rgaitan | import java.util.Iterator; |
15 | 31732 | rgaitan | import java.util.Timer; |
16 | 31666 | mten | import java.util.Vector; |
17 | 14949 | salva | |
18 | 21525 | jcampos | import javax.print.attribute.PrintRequestAttributeSet; |
19 | 15308 | salva | |
20 | 20893 | jcampos | import org.apache.log4j.Logger; |
21 | 15308 | salva | import org.cresques.cts.IProjection; |
22 | import org.gvsig.cacheservice.TileNum; |
||
23 | 21940 | jcampos | import org.gvsig.gvsig3d.cacheservices.FLayerCacheService; |
24 | 22470 | jcampos | import org.gvsig.gvsig3d.cacheservices.OSGCacheService; |
25 | 21940 | jcampos | import org.gvsig.gvsig3d.cacheservices.VectorCacheService; |
26 | 22662 | afraile | import org.gvsig.gvsig3d.drivers.GvsigDriverOSG; |
27 | 21940 | jcampos | import org.gvsig.gvsig3d.map3d.layers.FLayers3D; |
28 | 31057 | jtorres | import org.gvsig.osgvp.core.osg.Image; |
29 | import org.gvsig.osgvp.core.osg.Matrix; |
||
30 | import org.gvsig.osgvp.core.osg.Node; |
||
31 | import org.gvsig.osgvp.core.osg.Vec3; |
||
32 | import org.gvsig.osgvp.core.osg.Vec4; |
||
33 | 21095 | jcampos | import org.gvsig.osgvp.exceptions.image.ImageConversionException; |
34 | 20893 | jcampos | import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions; |
35 | 22171 | jcampos | import org.gvsig.osgvp.exceptions.node.NodeException; |
36 | 31642 | mten | import org.gvsig.osgvp.terrain.DataLoader; |
37 | import org.gvsig.osgvp.terrain.Extent; |
||
38 | import org.gvsig.osgvp.terrain.HeightfieldLayer; |
||
39 | import org.gvsig.osgvp.terrain.JavaDataDriver; |
||
40 | import org.gvsig.osgvp.terrain.Layer; |
||
41 | import org.gvsig.osgvp.terrain.LayerManager; |
||
42 | import org.gvsig.osgvp.terrain.RasterLayer; |
||
43 | import org.gvsig.osgvp.terrain.RequestDataEvent; |
||
44 | 31394 | mten | import org.gvsig.osgvp.terrain.Terrain; |
45 | import org.gvsig.osgvp.terrain.TerrainViewer; |
||
46 | 31642 | mten | import org.gvsig.osgvp.terrain.UpdateDataEvent; |
47 | 31652 | mten | import org.gvsig.osgvp.terrain.VectorLayer; |
48 | import org.gvsig.osgvp.terrain.Terrain.CoordinateSystemType; |
||
49 | 20893 | jcampos | import org.gvsig.osgvp.viewer.Camera; |
50 | import org.gvsig.osgvp.viewer.IViewerContainer; |
||
51 | 21908 | jcampos | import org.gvsig.osgvp.viewer.PrintUtilities; |
52 | 15308 | salva | |
53 | 22674 | jcampos | import com.hardcode.driverManager.Driver; |
54 | 15333 | julio | import com.hardcode.gdbms.driver.exceptions.ReadDriverException; |
55 | 22171 | jcampos | import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps; |
56 | 15308 | salva | import com.iver.andami.PluginServices; |
57 | 20893 | jcampos | import com.iver.andami.messages.NotificationManager; |
58 | 25001 | jcampos | import com.iver.andami.ui.mdiManager.IWindow; |
59 | 15333 | julio | import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException; |
60 | 14901 | salva | import com.iver.cit.gvsig.fmap.MapContext; |
61 | import com.iver.cit.gvsig.fmap.ViewPort; |
||
62 | 18328 | jcampos | import com.iver.cit.gvsig.fmap.layers.FBitSet; |
63 | 15264 | julio | import com.iver.cit.gvsig.fmap.layers.FLayer; |
64 | 14901 | salva | import com.iver.cit.gvsig.fmap.layers.FLayers; |
65 | 15308 | salva | import com.iver.cit.gvsig.fmap.layers.FLyrDefault; |
66 | 15322 | salva | import com.iver.cit.gvsig.fmap.layers.FLyrVect; |
67 | 15441 | julio | import com.iver.cit.gvsig.fmap.layers.FLyrWCS; |
68 | 15236 | julio | import com.iver.cit.gvsig.fmap.layers.GraphicLayer; |
69 | 15308 | salva | import com.iver.cit.gvsig.fmap.layers.LayerEvent; |
70 | import com.iver.cit.gvsig.fmap.layers.LayerListener; |
||
71 | 18954 | jcampos | import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent; |
72 | 24882 | jcampos | import com.iver.cit.gvsig.fmap.layers.SelectableDataSource; |
73 | 18328 | jcampos | import com.iver.cit.gvsig.fmap.layers.SelectionEvent; |
74 | import com.iver.cit.gvsig.fmap.layers.SelectionListener; |
||
75 | 24882 | jcampos | import com.iver.cit.gvsig.fmap.layers.SelectionSupport; |
76 | 15264 | julio | import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator; |
77 | 14901 | salva | import com.iver.cit.gvsig.fmap.layers.XMLException; |
78 | 15308 | salva | import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable; |
79 | 18954 | jcampos | import com.iver.cit.gvsig.fmap.rendering.LegendListener; |
80 | 25001 | jcampos | import com.iver.cit.gvsig.project.documents.view.gui.BaseView; |
81 | 14901 | salva | import com.iver.utiles.XMLEntity; |
82 | 20125 | jcampos | import com.iver.utiles.swing.threads.Cancellable; |
83 | 14901 | salva | |
84 | 31642 | mten | public class MapContext3D extends MapContext implements DataLoader, |
85 | 20893 | jcampos | LayerListener, LegendListener, SelectionListener { |
86 | 14901 | salva | |
87 | 15333 | julio | // JOSG library objects
|
88 | 31669 | rgaitan | private Terrain _terrain;
|
89 | private IViewerContainer _canvas3d;
|
||
90 | private TerrainViewer _terrainViewer;
|
||
91 | private LayerManager _terrainLayerManager;
|
||
92 | private JavaDataDriver _terrainDataManager = null; |
||
93 | 15308 | salva | |
94 | 31669 | rgaitan | private Hashtable<FLayer, Layer> _terrainFLayerMap = new Hashtable<FLayer, Layer>(); |
95 | private Hashtable<String, FLayer> _terrainLayerMap = new Hashtable<String, FLayer>(); |
||
96 | |||
97 | private IProjection _viewProjection;
|
||
98 | 31863 | mten | private float _verticalExaggeration; |
99 | 31669 | rgaitan | private boolean _bEmptyView = true; |
100 | private boolean _bListenToLegend = true; |
||
101 | private boolean _bLoading = false; |
||
102 | private TerrainViewer _canvasoff = null; |
||
103 | private boolean _renewCanvasOff = false; |
||
104 | private static Logger _logger = Logger.getLogger(MapContext3D.class |
||
105 | .getName()); |
||
106 | TerrainViewer _printViewer = null;
|
||
107 | Layer _testRasterLayer = null;
|
||
108 | |||
109 | 25845 | jcampos | private boolean visibilityChange = false; |
110 | |||
111 | 20125 | jcampos | @Override
|
112 | public void draw(BufferedImage image, Graphics2D g, Cancellable cancel, |
||
113 | double scale) throws ReadDriverException { |
||
114 | 21525 | jcampos | |
115 | 22171 | jcampos | double x = getViewPort().getOffset().getX();
|
116 | double y = getViewPort().getOffset().getY();
|
||
117 | double w = image.getWidth();
|
||
118 | double h = image.getHeight();
|
||
119 | 21525 | jcampos | |
120 | 31394 | mten | if (_canvasoff == null) { |
121 | 22171 | jcampos | try {
|
122 | 31394 | mten | _canvasoff = new TerrainViewer();
|
123 | _canvasoff.setUpViewerInBackground(0, 0, 512, 512); |
||
124 | 31878 | jtorres | |
125 | |||
126 | Terrain planetView3D = ((TerrainViewer) _canvas3d.getOSGViewer()).getTerrain(0);
|
||
127 | Terrain terrain = new Terrain();
|
||
128 | terrain.setCoordinateSystemType(planetView3D |
||
129 | .getCoordinateSystemType()); |
||
130 | terrain.setCoordinateSystemName(planetView3D |
||
131 | .getCoordinateSystemName()); |
||
132 | terrain.setCoordinateSystemFormat(planetView3D |
||
133 | .getCoordinateSystemFormat()); |
||
134 | terrain.setExtent(planetView3D.getExtent()); |
||
135 | terrain.setTerrainName(planetView3D.getTerrainName()); |
||
136 | |||
137 | |||
138 | terrain.init(); |
||
139 | terrain.setLayerManager(_terrainLayerManager); |
||
140 | |||
141 | |||
142 | 31669 | rgaitan | _canvasoff |
143 | 31878 | jtorres | .addTerrain(terrain); |
144 | 31669 | rgaitan | _canvasoff.addFeature((((TerrainViewer) _canvas3d |
145 | .getOSGViewer()).getFeatures())); |
||
146 | 31394 | mten | Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer()) |
147 | 22470 | jcampos | .getClearColor(); |
148 | 31669 | rgaitan | _canvasoff.setClearColor(color.x(), color.y(), color.z(), color |
149 | .w()); |
||
150 | 22171 | jcampos | this.setRenewCanvasOff(false); |
151 | } catch (NodeException e) {
|
||
152 | // TODO Auto-generated catch block
|
||
153 | e.printStackTrace(); |
||
154 | } |
||
155 | 21525 | jcampos | |
156 | 22171 | jcampos | } |
157 | 20125 | jcampos | |
158 | 31394 | mten | Camera refCam = _canvas3d.getOSGViewer().getCamera(); |
159 | 22171 | jcampos | Matrix refView = refCam.getViewMatrix(); |
160 | Matrix refProy = refCam.getProjectionMatrix(); |
||
161 | Matrix.Perspective pers = refProy.getPerspective(); |
||
162 | Camera viewCam = new Camera();
|
||
163 | viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear, |
||
164 | pers.zFar); |
||
165 | viewCam.setViewMatrix(refView); |
||
166 | 31394 | mten | _canvasoff.setViewport(0, 0, (int) w, (int) h); |
167 | _canvasoff.setCamera(viewCam); |
||
168 | _canvasoff.takeScreenshotToMemory(); |
||
169 | _canvasoff.frame(); |
||
170 | 21095 | jcampos | |
171 | 31394 | mten | Image OSGimage = _canvasoff.getScreenshotImage();
|
172 | 21095 | jcampos | |
173 | BufferedImage img = null; |
||
174 | try {
|
||
175 | img = OSGimage.getBufferedImage(); |
||
176 | } catch (ImageConversionException e1) {
|
||
177 | // TODO Auto-generated catch block
|
||
178 | e1.printStackTrace(); |
||
179 | } catch (IOException e1) { |
||
180 | // TODO Auto-generated catch block
|
||
181 | e1.printStackTrace(); |
||
182 | } |
||
183 | |||
184 | 20893 | jcampos | double scalex = w / img.getWidth(null); |
185 | double scaley = h / img.getHeight(null); |
||
186 | try {
|
||
187 | AffineTransform xform = AffineTransform.getScaleInstance(scalex, |
||
188 | scaley); |
||
189 | AffineTransform xpos = AffineTransform.getTranslateInstance(x, y); |
||
190 | xpos.concatenate(xform); |
||
191 | g.drawRenderedImage(img, xpos); |
||
192 | } catch (ImagingOpException e) { |
||
193 | NotificationManager.addError("Dibujando FFramePicture", e);
|
||
194 | } |
||
195 | |||
196 | 20125 | jcampos | } |
197 | |||
198 | 21525 | jcampos | public void print(Graphics2D g, double scale, PrintRequestAttributeSet arg2) |
199 | throws ReadDriverException {
|
||
200 | 22350 | jcampos | |
201 | 21525 | jcampos | int x = (int) getViewPort().getOffset().getX(); |
202 | int y = (int) getViewPort().getOffset().getY(); |
||
203 | int w = (int) g.getClipBounds().getWidth(); |
||
204 | int h = (int) g.getClipBounds().getHeight(); |
||
205 | 22350 | jcampos | System.err.println("x " + x + "; y " + y + "; w " + w + "; h" + h); |
206 | 20125 | jcampos | |
207 | 31394 | mten | Camera viewerCam = _canvas3d.getOSGViewer().getCamera(); |
208 | 22350 | jcampos | BufferedImage s = null; |
209 | 22470 | jcampos | |
210 | 22350 | jcampos | try {
|
211 | int minw = (int) w / 10; |
||
212 | int minh = (int) h / 10; |
||
213 | System.out.println("minw" + minw + " minh" + minh); |
||
214 | 21908 | jcampos | |
215 | 31394 | mten | _printViewer = new TerrainViewer();
|
216 | 31879 | jtorres | // Terrain planetView3D = ((TerrainViewer) _canvas3d.getOSGViewer()).getTerrain(0);
|
217 | // Terrain terrain = new Terrain();
|
||
218 | // terrain.setCoordinateSystemType(planetView3D
|
||
219 | // .getCoordinateSystemType());
|
||
220 | // terrain.setCoordinateSystemName(planetView3D
|
||
221 | // .getCoordinateSystemName());
|
||
222 | // terrain.setCoordinateSystemFormat(planetView3D
|
||
223 | // .getCoordinateSystemFormat());
|
||
224 | // terrain.setExtent(planetView3D.getExtent());
|
||
225 | // terrain.setTerrainName(planetView3D.getTerrainName());
|
||
226 | //
|
||
227 | //
|
||
228 | // terrain.init();
|
||
229 | // terrain.setLayerManager(_terrainLayerManager);
|
||
230 | 31878 | jtorres | |
231 | 31879 | jtorres | _printViewer.addTerrain((((TerrainViewer) _canvas3d.getOSGViewer()) |
232 | .getTerrain(0)));
|
||
233 | 31669 | rgaitan | _printViewer.addFeature((((TerrainViewer) _canvas3d.getOSGViewer()) |
234 | .getFeatures())); |
||
235 | Vec4 color = ((TerrainViewer) _canvas3d.getOSGViewer()) |
||
236 | .getClearColor(); |
||
237 | _printViewer.setClearColor(color.x(), color.y(), color.z(), color |
||
238 | .w()); |
||
239 | 31394 | mten | _printViewer.setUpViewerInBackground(0, 0, minw, minh); |
240 | 22350 | jcampos | |
241 | PrintUtilities util = new PrintUtilities();
|
||
242 | 31394 | mten | util.setViewer(_printViewer); |
243 | 22350 | jcampos | s = util.getHighResolutionImage(viewerCam, w, h); |
244 | |||
245 | RenderedImage render = s;
|
||
246 | } catch (NodeException e1) {
|
||
247 | // TODO Auto-generated catch block
|
||
248 | e1.printStackTrace(); |
||
249 | 22470 | jcampos | } |
250 | 22350 | jcampos | |
251 | 22171 | jcampos | double scalex = w / s.getWidth(null); |
252 | double scaley = h / s.getHeight(null); |
||
253 | 21908 | jcampos | try {
|
254 | AffineTransform xform = AffineTransform.getScaleInstance(scalex, |
||
255 | scaley); |
||
256 | AffineTransform xpos = AffineTransform.getTranslateInstance(x, y); |
||
257 | xpos.concatenate(xform); |
||
258 | 22171 | jcampos | g.drawRenderedImage(s, xpos); |
259 | 21908 | jcampos | // g.drawRenderedImage(img, new AffineTransform());
|
260 | } catch (ImagingOpException e) { |
||
261 | NotificationManager.addError("Dibujando FFramePicture", e);
|
||
262 | } |
||
263 | 31394 | mten | _printViewer.releaseGLContext(); |
264 | _printViewer.dispose(); |
||
265 | 22171 | jcampos | System.gc();
|
266 | 21525 | jcampos | } |
267 | |||
268 | 14901 | salva | public MapContext3D(ViewPort vp) {
|
269 | super(vp);
|
||
270 | } |
||
271 | |||
272 | public MapContext3D(FLayers fLayers, ViewPort vp) {
|
||
273 | super(fLayers, vp);
|
||
274 | } |
||
275 | 15333 | julio | |
276 | 31394 | mten | public void setTerrain(Terrain terrain) { |
277 | 31669 | rgaitan | if (_terrain == terrain)
|
278 | return;
|
||
279 | |||
280 | 31394 | mten | _terrain = terrain; |
281 | 15264 | julio | |
282 | 31683 | rgaitan | // add layers to terrain necessary when we are loading
|
283 | 31669 | rgaitan | addCurrentLayers(); |
284 | 15308 | salva | } |
285 | |||
286 | 31394 | mten | public Terrain getTerrain() {
|
287 | return _terrain;
|
||
288 | 15308 | salva | } |
289 | 31669 | rgaitan | |
290 | 31642 | mten | public void setDataManager(JavaDataDriver manager) { |
291 | _terrainDataManager = manager; |
||
292 | _terrainDataManager.setDataLoader(this);
|
||
293 | } |
||
294 | |||
295 | public JavaDataDriver getDataManager() {
|
||
296 | return _terrainDataManager;
|
||
297 | } |
||
298 | 31669 | rgaitan | |
299 | 31642 | mten | public void setLayerManager(LayerManager manager) { |
300 | _terrainLayerManager = manager; |
||
301 | } |
||
302 | |||
303 | public LayerManager getLayerManager() {
|
||
304 | return _terrainLayerManager;
|
||
305 | } |
||
306 | |||
307 | 15308 | salva | public void setViewer(IViewerContainer canvas) { |
308 | 31394 | mten | _canvas3d = canvas; |
309 | _terrainViewer = (TerrainViewer) _canvas3d.getOSGViewer(); |
||
310 | 15308 | salva | } |
311 | 15333 | julio | |
312 | 15308 | salva | public IProjection getViewProjection() {
|
313 | 31394 | mten | return _viewProjection;
|
314 | 15308 | salva | } |
315 | |||
316 | public void setViewProjection(IProjection projection) { |
||
317 | 31394 | mten | _viewProjection = projection; |
318 | 15308 | salva | } |
319 | 15333 | julio | |
320 | 15308 | salva | public IViewerContainer getCanvas3d() {
|
321 | 31394 | mten | return _canvas3d;
|
322 | 15308 | salva | } |
323 | 31863 | mten | |
324 | public float getVerticalExaggeration() { |
||
325 | return _verticalExaggeration;
|
||
326 | } |
||
327 | 15308 | salva | |
328 | 31863 | mten | public void setVerticalExaggeration(float verticalExaggeration) { |
329 | _verticalExaggeration = verticalExaggeration; |
||
330 | } |
||
331 | |||
332 | 15308 | salva | public void setLoading(boolean bLoading) { |
333 | 31394 | mten | _bLoading = bLoading; |
334 | 15308 | salva | } |
335 | 15333 | julio | |
336 | 15308 | salva | public FLayers getNewGroupLayer(FLayers parent) {
|
337 | 15333 | julio | return new FLayers3D(this, parent, getViewPort()); |
338 | 15308 | salva | } |
339 | |||
340 | 15333 | julio | /** * LAYER CHANGES called by FLayers3D ** */
|
341 | |||
342 | 31695 | rgaitan | public synchronized void layerMoved(FLayers3D parent, FLayer layer, int oldPos, |
343 | 15333 | julio | int newPos) {
|
344 | |||
345 | 15308 | salva | if (layer instanceof FLayers) { |
346 | 15333 | julio | FLayers group = (FLayers) layer; |
347 | 15308 | salva | if (newPos > oldPos) {
|
348 | 15333 | julio | for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--) |
349 | layerMoved((FLayers3D) group, group.getLayer(iChild), |
||
350 | oldPos, newPos); |
||
351 | } else {
|
||
352 | for (int iChild = 0; iChild < group.getLayersCount(); iChild++) |
||
353 | layerMoved((FLayers3D) group, group.getLayer(iChild), |
||
354 | oldPos, newPos); |
||
355 | 15308 | salva | } |
356 | return;
|
||
357 | } |
||
358 | 31669 | rgaitan | |
359 | 15308 | salva | Layer3DProps props3D = getLayer3DProps(layer); |
360 | 31666 | mten | int type = props3D.getType();
|
361 | 31669 | rgaitan | |
362 | 31666 | mten | // Now reorder in layer manager only for terrain layer types
|
363 | 31669 | rgaitan | if ((type == Layer3DProps.layer3DOSG)
|
364 | || ((type == Layer3DProps.layer3DVector))) |
||
365 | return;
|
||
366 | |||
367 | 31666 | mten | // Obtain the old position in the layer
|
368 | Layer terrainLayer = _terrainFLayerMap.get(layer); |
||
369 | 31669 | rgaitan | Vector<Integer> terrainOldPos = _terrainLayerManager |
370 | .getOrder(terrainLayer); |
||
371 | |||
372 | 31666 | mten | int terrainNewPos = 0; |
373 | 31669 | rgaitan | // Compute the new position.
|
374 | 31666 | mten | SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
|
375 | while (lyrIterator.hasNext()) {
|
||
376 | FLayer auxLayer = lyrIterator.next(); |
||
377 | 31669 | rgaitan | if (auxLayer == layer)
|
378 | break;
|
||
379 | 31666 | mten | Layer3DProps auxProps3D = getLayer3DProps(auxLayer); |
380 | 31669 | rgaitan | if ((auxProps3D.getType() != Layer3DProps.layer3DOSG)
|
381 | && (auxProps3D.getType() != Layer3DProps.layer3DVector)) { |
||
382 | 31666 | mten | terrainNewPos++; |
383 | 15333 | julio | } |
384 | 31669 | rgaitan | |
385 | 15333 | julio | } |
386 | 31669 | rgaitan | |
387 | if ((terrainOldPos == null) || (terrainOldPos.size() == 0)) |
||
388 | return;
|
||
389 | 31692 | mten | if (terrainOldPos.get(0) != terrainNewPos) |
390 | 31689 | mten | _terrainLayerManager.moveLayer(terrainOldPos.get(0), terrainNewPos);
|
391 | 15333 | julio | |
392 | 31669 | rgaitan | System.out.println("En el toc antes era el " + oldPos + " y ahora el " |
393 | + newPos); |
||
394 | System.out.println("En el terrain antes era el " + terrainOldPos |
||
395 | + " y ahora el " + terrainNewPos);
|
||
396 | |||
397 | 15333 | julio | PrintDebugLayers(); |
398 | 15308 | salva | } |
399 | 15333 | julio | |
400 | 15308 | salva | public void layerAdded(FLayers3D parent, FLayer layer) { |
401 | |||
402 | // to add group layers to 3D, just add recursively child data layers
|
||
403 | if (layer instanceof FLayers) { |
||
404 | 15333 | julio | FLayers group = (FLayers) layer; |
405 | for (int iChild = 0; iChild < group.getLayersCount(); iChild++) { |
||
406 | layerAdded((FLayers3D) group, group.getLayer(iChild)); |
||
407 | 15308 | salva | } |
408 | getLayer3DProps(layer).setHooked(true);
|
||
409 | return;
|
||
410 | } |
||
411 | |||
412 | if (layer instanceof Classifiable) { |
||
413 | Classifiable legendLyr = (Classifiable) layer; |
||
414 | 24882 | jcampos | // legendLyr.addLegendListener((LegendListener) this);
|
415 | this.addLayerListener(this); |
||
416 | 15308 | salva | } |
417 | 25001 | jcampos | layer.addLayerListener((LayerListener) this);
|
418 | 20125 | jcampos | |
419 | 18328 | jcampos | // listener to manage the selection for the layers
|
420 | if (layer.getClass().equals(FLyrVect.class)) {
|
||
421 | FLyrVect lyr = (FLyrVect) layer; |
||
422 | try {
|
||
423 | 24882 | jcampos | SelectableDataSource recordSet = lyr.getRecordset(); |
424 | 25001 | jcampos | if (recordSet != null) { |
425 | SelectionSupport selectionSupport = recordSet |
||
426 | .getSelectionSupport(); |
||
427 | selectionSupport.addSelectionListener(this);
|
||
428 | } |
||
429 | 18328 | jcampos | } catch (ReadDriverException e) {
|
430 | // TODO Auto-generated catch block
|
||
431 | e.printStackTrace(); |
||
432 | } |
||
433 | } |
||
434 | 15308 | salva | |
435 | 31394 | mten | if (!_bLoading)
|
436 | 31642 | mten | addLayerToTerrain(layer, true);
|
437 | 31669 | rgaitan | |
438 | 15308 | salva | // Only do this the first time to add layer
|
439 | 31652 | mten | if (_bEmptyView && !_bLoading) {
|
440 | 31666 | mten | if (layers.getLayersCount() > 0) { |
441 | try {
|
||
442 | zoomToExtent(layer.getFullExtent()); |
||
443 | } catch (ExpansionFileReadException e) {
|
||
444 | e.printStackTrace(); |
||
445 | } catch (ReadDriverException e) {
|
||
446 | e.printStackTrace(); |
||
447 | 15308 | salva | } |
448 | 31394 | mten | _bEmptyView = false;
|
449 | 15308 | salva | } |
450 | 31652 | mten | } |
451 | 31642 | mten | |
452 | 15308 | salva | PrintDebugLayers(); |
453 | } |
||
454 | 15333 | julio | |
455 | 15308 | salva | public void layerRemoved(FLayers3D parent, FLayer layer) { |
456 | 15333 | julio | |
457 | // to remove group layers to 3D, just remove recursively child data
|
||
458 | // layers
|
||
459 | 15308 | salva | if (layer instanceof FLayers) { |
460 | 15333 | julio | FLayers group = (FLayers) layer; |
461 | for (int iChild = 0; iChild < group.getLayersCount(); iChild++) { |
||
462 | layerRemoved((FLayers3D) group, group.getLayer(iChild)); |
||
463 | 15308 | salva | } |
464 | getLayer3DProps(layer).setHooked(false);
|
||
465 | return;
|
||
466 | } |
||
467 | 15333 | julio | |
468 | 15308 | salva | if (layer instanceof Classifiable) { |
469 | Classifiable legendLyr = (Classifiable) layer; |
||
470 | legendLyr.removeLegendListener((LegendListener) this);
|
||
471 | } |
||
472 | 31669 | rgaitan | |
473 | 15308 | salva | layer.removeLayerListener((LayerListener) this);
|
474 | 15333 | julio | |
475 | 31666 | mten | removeLayerToTerrain(layer); |
476 | 15333 | julio | |
477 | 15308 | salva | // All layers are removed
|
478 | 31666 | mten | if (layers.getLayersCount() == 0) { |
479 | 31394 | mten | _bEmptyView = true;
|
480 | 15308 | salva | } |
481 | 15333 | julio | |
482 | 15308 | salva | PrintDebugLayers(); |
483 | 15333 | julio | } |
484 | |||
485 | 14949 | salva | /**
|
486 | 15308 | salva | * DOCUMENT ME!
|
487 | *
|
||
488 | * @param e
|
||
489 | * DOCUMENT ME!
|
||
490 | */
|
||
491 | public void legendChanged(LegendChangedEvent e) { |
||
492 | |||
493 | 31394 | mten | if (!_bListenToLegend)
|
494 | 15308 | salva | return;
|
495 | 31669 | rgaitan | if ((e == null) && (!visibilityChange)) { |
496 | 24882 | jcampos | // find layer whose legend changed
|
497 | FLayer found = null;
|
||
498 | SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
|
||
499 | while (lyrIterator.hasNext()) {
|
||
500 | FLayer lyr = lyrIterator.next(); |
||
501 | if (lyr instanceof FLyrVect) { |
||
502 | FLyrVect lyrVect = (FLyrVect) lyr; |
||
503 | long newDrawVersion = lyrVect.getDrawVersion();
|
||
504 | Layer3DProps props3D = getLayer3DProps(lyrVect); |
||
505 | 25001 | jcampos | if (newDrawVersion != props3D.drawVersion) {
|
506 | 24882 | jcampos | props3D.drawVersion = lyrVect.getDrawVersion(); |
507 | 31394 | mten | refreshLayerInTerrain(props3D, true);
|
508 | _bListenToLegend = false;
|
||
509 | props3D.VerifyLegend(_terrain.getTerrainName()); |
||
510 | _bListenToLegend = true;
|
||
511 | 15308 | salva | } |
512 | } |
||
513 | } |
||
514 | 25001 | jcampos | |
515 | IWindow f = PluginServices.getMDIManager().getActiveWindow(); |
||
516 | if (f instanceof BaseView) { |
||
517 | BaseView view3D = (BaseView) f; |
||
518 | view3D.getTOC().refresh(); |
||
519 | } |
||
520 | 15308 | salva | } |
521 | 25845 | jcampos | visibilityChange = false;
|
522 | 15308 | salva | } |
523 | |||
524 | public void visibilityChanged(LayerEvent e) { |
||
525 | FLayer lyr = e.getSource(); |
||
526 | |||
527 | Layer3DProps props3D = getLayer3DProps(lyr); |
||
528 | |||
529 | if (props3D.getType() == Layer3DProps.layer3DVector) {
|
||
530 | refreshLayerVectorsVisibility(lyr); |
||
531 | 25330 | afraile | } else if (props3D.getType() == Layer3DProps.layer3DOSG) { |
532 | refreshLayer3DOSGVisibility(lyr); |
||
533 | 31669 | rgaitan | } else {
|
534 | 15308 | salva | refreshLayerVisibility(lyr); |
535 | } |
||
536 | 25845 | jcampos | visibilityChange = true;
|
537 | 15308 | salva | } |
538 | |||
539 | 25330 | afraile | private void refreshLayer3DOSGVisibility(FLayer lyr) { |
540 | 31394 | mten | if (_terrain == null || _viewProjection == null) |
541 | 25330 | afraile | return;
|
542 | |||
543 | Layer3DProps props3D = getLayer3DProps(lyr); |
||
544 | 31669 | rgaitan | |
545 | 25330 | afraile | OSGCacheService cacheService = (OSGCacheService) props3D |
546 | .getCacheService(); |
||
547 | if (cacheService != null) { |
||
548 | 31394 | mten | // use VectorCacheService to add features to terrain
|
549 | cacheService.refreshFeaturesToTerrain(lyr.isVisible()); |
||
550 | 25330 | afraile | } |
551 | 31669 | rgaitan | |
552 | 25330 | afraile | } |
553 | 31394 | mten | |
554 | 15308 | salva | private void refreshLayerVisibility(FLayer layer) { |
555 | 31669 | rgaitan | |
556 | 31666 | mten | Layer terrainLayer = _terrainFLayerMap.get(layer); |
557 | terrainLayer.setEnabled(layer.isVisible()); |
||
558 | 31689 | mten | _terrainLayerManager.updateLayers(); |
559 | 31692 | mten | |
560 | 15308 | salva | } |
561 | 15333 | julio | |
562 | 15308 | salva | private void refreshLayerVectorsVisibility(FLayer lyr) { |
563 | 31394 | mten | if (_terrain == null || _viewProjection == null) |
564 | 15308 | salva | return;
|
565 | |||
566 | Layer3DProps props3D = getLayer3DProps(lyr); |
||
567 | |||
568 | VectorCacheService cacheService = (VectorCacheService) props3D |
||
569 | .getCacheService(); |
||
570 | if (cacheService != null) { |
||
571 | 31394 | mten | // use VectorCacheService to add features to terrain
|
572 | cacheService.refreshFeaturesToTerrain(lyr.isVisible()); |
||
573 | 31819 | jtorres | props3D.drawVersion = lyr.getDrawVersion(); |
574 | 15308 | salva | } |
575 | |||
576 | } |
||
577 | |||
578 | public void activationChanged(LayerEvent e) { |
||
579 | 15405 | julio | // TODO Implement this method
|
580 | 15308 | salva | } |
581 | |||
582 | public void nameChanged(LayerEvent e) { |
||
583 | 15405 | julio | // TODO Implement this method
|
584 | 15308 | salva | } |
585 | |||
586 | public void editionChanged(LayerEvent e) { |
||
587 | 15405 | julio | // TODO Implement this method
|
588 | 20125 | jcampos | |
589 | 15308 | salva | } |
590 | |||
591 | 31394 | mten | public void refreshLayerInTerrain(Layer3DProps props, boolean bRemoveCache) { |
592 | 15308 | salva | if (props == null) |
593 | return;
|
||
594 | |||
595 | 31394 | mten | if (_terrain == null) |
596 | 15308 | salva | return; // view not opened yet |
597 | |||
598 | 15333 | julio | // clear cache
|
599 | 15308 | salva | |
600 | if (bRemoveCache) {
|
||
601 | String layerCacheDir = Layer3DProps.m_cacheDir + "/" |
||
602 | 31394 | mten | + _terrain.getTerrainName() + "/" + props.getCacheName();
|
603 | 15308 | salva | removeCache(layerCacheDir); |
604 | } |
||
605 | 15333 | julio | |
606 | 31394 | mten | // refresh layer in terrain
|
607 | 15308 | salva | int type = props.getType();
|
608 | 31692 | mten | if ((type == Layer3DProps.layer3DImage)||(type == Layer3DProps.layer3DElevation)||
|
609 | (type == Layer3DProps.layer3DVectorMR)) { |
||
610 | _terrainLayerManager.invalidateLayer(props.getTerrainLayer()); |
||
611 | 15308 | salva | } else if (type == Layer3DProps.layer3DVector) { |
612 | invalidateVectorLayer(props); |
||
613 | } |
||
614 | } |
||
615 | |||
616 | private void invalidateVectorLayer(Layer3DProps props) { |
||
617 | // TODO Auto-generated method stub
|
||
618 | 31394 | mten | if (_terrain == null || _viewProjection == null) |
619 | 15308 | salva | return;
|
620 | |||
621 | VectorCacheService cacheService = (VectorCacheService) props |
||
622 | .getCacheService(); |
||
623 | if (cacheService != null) { |
||
624 | 31394 | mten | // use VectorCacheService to add features to terrain
|
625 | 31414 | jtorres | cacheService.refreshFeaturesToTerrain(); |
626 | 15308 | salva | } |
627 | } |
||
628 | |||
629 | private boolean removeCache(String folder) { |
||
630 | File dir = new File(folder); |
||
631 | if (dir.isDirectory()) {
|
||
632 | String[] children = dir.list(); |
||
633 | for (int i = 0; i < children.length; i++) { |
||
634 | boolean success = removeCache(folder + "/" + children[i]); |
||
635 | 15333 | julio | // Do not interrupt if it can't delete one file
|
636 | // if (!success) {
|
||
637 | // return false;
|
||
638 | // }
|
||
639 | 15308 | salva | } |
640 | } |
||
641 | |||
642 | // The directory is now empty so delete it
|
||
643 | return dir.delete();
|
||
644 | } |
||
645 | |||
646 | protected Layer3DProps getLayer3DProps(FLayer layer) {
|
||
647 | 31669 | rgaitan | |
648 | 15308 | salva | Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer); |
649 | 31669 | rgaitan | |
650 | 31642 | mten | // Create instance of props for osg layers.
|
651 | 15308 | salva | if (props3D == null) { |
652 | props3D = new Layer3DProps();
|
||
653 | 22674 | jcampos | if (layer instanceof FLyrVect) { |
654 | FLyrVect nLayer = (FLyrVect) layer; |
||
655 | Driver driver;
|
||
656 | try {
|
||
657 | driver = nLayer.getRecordset().getDriver(); |
||
658 | if (driver instanceof GvsigDriverOSG) { |
||
659 | props3D.setChooseType(false);
|
||
660 | 31736 | jtorres | props3D.setType(Layer3DProps.layer3DOSG); |
661 | 22674 | jcampos | } |
662 | } catch (ReadDriverException e) {
|
||
663 | // TODO Auto-generated catch block
|
||
664 | e.printStackTrace(); |
||
665 | } |
||
666 | |||
667 | } |
||
668 | 31642 | mten | // Set the properties
|
669 | 15308 | salva | props3D.setLayer(layer); |
670 | 24882 | jcampos | |
671 | 31394 | mten | props3D.initCacheName(_terrain.getCoordinateSystemType(), |
672 | _viewProjection, Terrain.CoordinateSystemType.GEOCENTRIC); |
||
673 | 15308 | salva | FLyrDefault baseLayer = (FLyrDefault) layer; |
674 | baseLayer.setProperty("3DLayerExtension", props3D);
|
||
675 | 31863 | mten | props3D.setVerticalEx(getVerticalExaggeration()); |
676 | 15308 | salva | } else {
|
677 | 31394 | mten | if (_bLoading)
|
678 | 15308 | salva | props3D.setChooseType(false);
|
679 | props3D.setLayer(layer); |
||
680 | } |
||
681 | |||
682 | return props3D;
|
||
683 | } |
||
684 | 15333 | julio | |
685 | 31669 | rgaitan | public void addCurrentLayers() { |
686 | SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
|
||
687 | while (lyrIterator.hasNext()) {
|
||
688 | FLayer layer = lyrIterator.next(); |
||
689 | Layer3DProps props = getLayer3DProps(layer); |
||
690 | 31692 | mten | // props.setTerrainOrder(props.getTocOrder());
|
691 | 31669 | rgaitan | addLayerToTerrain(layer, false);
|
692 | 25619 | rgaitan | } |
693 | 31669 | rgaitan | } |
694 | 25619 | rgaitan | |
695 | 31695 | rgaitan | public synchronized void addLayerToTerrain(FLayer layer, boolean bVerifyLegend) { |
696 | 15308 | salva | Layer3DProps props3D = getLayer3DProps(layer); |
697 | 31669 | rgaitan | |
698 | 22470 | jcampos | if (props3D.getType() == Layer3DProps.layer3DVector) {
|
699 | 15308 | salva | CreateVectors(layer, props3D); // special case for now without
|
700 | 22470 | jcampos | // disk cache
|
701 | } else if (props3D.getType() == Layer3DProps.layer3DOSG) { |
||
702 | CreateOSGLayer(layer, props3D); |
||
703 | } else {
|
||
704 | 15333 | julio | Rectangle2D layerExtent = null; |
705 | 15308 | salva | try {
|
706 | 15333 | julio | layerExtent = layer.getFullExtent(); |
707 | } catch (ExpansionFileReadException e) {
|
||
708 | 15308 | salva | e.printStackTrace(); |
709 | 15333 | julio | } catch (ReadDriverException e) {
|
710 | e.printStackTrace(); |
||
711 | 15308 | salva | } |
712 | 15333 | julio | if (layerExtent == null) { // hack for missing extents |
713 | 31642 | mten | if (_terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC)
|
714 | 15333 | julio | layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0, |
715 | 180.0);
|
||
716 | else
|
||
717 | layerExtent = new Rectangle2D.Double(-20000000.0, |
||
718 | -10000000.0, 40000000.0, 20000000.0); |
||
719 | 15492 | julio | // TODO toggle comment because this code use WCS extension. When
|
720 | // WCS extension runs correctly uncoment!!!
|
||
721 | |||
722 | 15333 | julio | if (layer instanceof FLyrWCS) |
723 | ((FLyrWCS) layer).setFullExtent(layerExtent); |
||
724 | } |
||
725 | 31669 | rgaitan | |
726 | 31652 | mten | Extent extent = null;
|
727 | 31669 | rgaitan | if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
|
728 | extent = new Extent(layerExtent.getMinX(), layerExtent
|
||
729 | .getMinY(), layerExtent.getMaxX(), layerExtent |
||
730 | .getMaxY()); |
||
731 | 31652 | mten | } else {
|
732 | 31669 | rgaitan | extent = new Extent(Math.toRadians(layerExtent.getMinX()), Math |
733 | .toRadians(layerExtent.getMinY()), Math
|
||
734 | .toRadians(layerExtent.getMaxX()), Math
|
||
735 | .toRadians(layerExtent.getMaxY())); |
||
736 | 31652 | mten | } |
737 | 31669 | rgaitan | |
738 | if (props3D.getType() == Layer3DProps.layer3DImage) {
|
||
739 | 31642 | mten | RasterLayer rlayer = new RasterLayer();
|
740 | 31669 | rgaitan | rlayer.setEnabled(layer.isVisible()); |
741 | 31642 | mten | rlayer.setExtent(extent); |
742 | 31669 | rgaitan | rlayer.setOpacity(props3D.getOpacity()); |
743 | 31642 | mten | rlayer.setDataDriver(_terrainDataManager); |
744 | _terrainLayerManager.addLayer(rlayer); |
||
745 | 31652 | mten | _terrainFLayerMap.put(layer, rlayer); |
746 | _terrainLayerMap.put(rlayer.getLayerID(), layer); |
||
747 | 31689 | mten | props3D.setTerrainLayer(rlayer); |
748 | 31669 | rgaitan | } else if (props3D.getType() == Layer3DProps.layer3DElevation) { |
749 | 31642 | mten | HeightfieldLayer hlayer = new HeightfieldLayer();
|
750 | 31669 | rgaitan | hlayer.setEnabled(layer.isVisible()); |
751 | 31642 | mten | hlayer.setExtent(extent); |
752 | 31669 | rgaitan | hlayer.setVerticalExaggeration(props3D.getVerticalEx()); |
753 | 31642 | mten | hlayer.setDataDriver(_terrainDataManager); |
754 | _terrainLayerManager.addLayer(hlayer); |
||
755 | 31652 | mten | _terrainFLayerMap.put(layer, hlayer); |
756 | _terrainLayerMap.put(hlayer.getLayerID(), layer); |
||
757 | 31689 | mten | props3D.setTerrainLayer(hlayer); |
758 | 31669 | rgaitan | } else if (props3D.getType() == Layer3DProps.layer3DVectorMR) { |
759 | 31652 | mten | VectorLayer vlayer = new VectorLayer();
|
760 | vlayer.setEnabled(true);
|
||
761 | vlayer.setExtent(extent); |
||
762 | vlayer.setDensity(1.0f);
|
||
763 | vlayer.setDataDriver(_terrainDataManager); |
||
764 | _terrainLayerManager.addLayer(vlayer); |
||
765 | _terrainFLayerMap.put(layer, vlayer); |
||
766 | _terrainLayerMap.put(vlayer.getLayerID(), layer); |
||
767 | 31689 | mten | props3D.setTerrainLayer(vlayer); |
768 | 15333 | julio | } |
769 | 15308 | salva | |
770 | if (bVerifyLegend) {
|
||
771 | 31394 | mten | _bListenToLegend = false;
|
772 | 31642 | mten | props3D.VerifyLegend(_terrain.getTerrainName()); |
773 | 31394 | mten | _bListenToLegend = true;
|
774 | 15308 | salva | } |
775 | } |
||
776 | } |
||
777 | |||
778 | 22470 | jcampos | private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) { |
779 | 31394 | mten | if (_terrain == null || _viewProjection == null) |
780 | 22470 | jcampos | return;
|
781 | |||
782 | OSGCacheService cacheService = (OSGCacheService) props3D |
||
783 | .getCacheService(); |
||
784 | if (cacheService == null) { |
||
785 | 31394 | mten | cacheService = new OSGCacheService(_canvas3d, _terrain, props3D
|
786 | .getCacheName(), layer, _viewProjection); |
||
787 | 22470 | jcampos | cacheService.setCacheRootDir(Layer3DProps.m_cacheDir); |
788 | props3D.setCacheService(cacheService); |
||
789 | } |
||
790 | |||
791 | // use VectorCacheService to add features to planet
|
||
792 | 31394 | mten | cacheService.AddFeaturesToTerrain(); |
793 | 22470 | jcampos | |
794 | } |
||
795 | |||
796 | 25581 | jcampos | @Override
|
797 | public XMLEntity getXMLEntity() throws XMLException { |
||
798 | // TODO Auto-generated method stub
|
||
799 | XMLEntity xml = super.getXMLEntity();
|
||
800 | 31669 | rgaitan | |
801 | 25581 | jcampos | SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
|
802 | while (lyrIterator.hasNext()) {
|
||
803 | FLayer lyr = lyrIterator.next(); |
||
804 | Layer3DProps props3D = getLayer3DProps(lyr); |
||
805 | int type = props3D.getType();
|
||
806 | 31669 | rgaitan | if (type == Layer3DProps.layer3DOSG) {
|
807 | |||
808 | 25581 | jcampos | OSGCacheService cacheService = (OSGCacheService) props3D |
809 | 31669 | rgaitan | .getCacheService(); |
810 | 25581 | jcampos | if (cacheService != null) { |
811 | // use VectorCacheService to add features to planet
|
||
812 | 31669 | rgaitan | if (props3D.isEditing()) {
|
813 | 25581 | jcampos | // TODO: PONER AKI EL CODIGO DE SALVAR
|
814 | } |
||
815 | } |
||
816 | } |
||
817 | } |
||
818 | 31669 | rgaitan | |
819 | 25581 | jcampos | return xml;
|
820 | 31669 | rgaitan | |
821 | 25581 | jcampos | } |
822 | |||
823 | 15308 | salva | private void CreateVectors(FLayer layer, Layer3DProps props3D) { |
824 | 31394 | mten | if (_terrain == null || _viewProjection == null) |
825 | 15308 | salva | return;
|
826 | |||
827 | VectorCacheService cacheService = (VectorCacheService) props3D |
||
828 | .getCacheService(); |
||
829 | if (cacheService == null) { |
||
830 | 31394 | mten | cacheService = new VectorCacheService(_canvas3d, _terrain, props3D
|
831 | .getCacheName(), layer, _viewProjection); |
||
832 | 15308 | salva | cacheService.setCacheRootDir(Layer3DProps.m_cacheDir); |
833 | props3D.setCacheService(cacheService); |
||
834 | } |
||
835 | |||
836 | 31394 | mten | // use VectorCacheService to add features to terrain
|
837 | 31414 | jtorres | cacheService.addFeaturesToTerrain(); |
838 | 15308 | salva | } |
839 | |||
840 | private void DeleteVectors(FLayer layer, Layer3DProps props3D) { |
||
841 | 31394 | mten | if (_terrain == null || _viewProjection == null) |
842 | 15308 | salva | return;
|
843 | |||
844 | VectorCacheService cacheService = (VectorCacheService) props3D |
||
845 | .getCacheService(); |
||
846 | if (cacheService != null) { |
||
847 | 31394 | mten | // use VectorCacheService to delete features to terrain
|
848 | 31414 | jtorres | cacheService.deleteFeaturesToTerrain(); |
849 | 15308 | salva | } |
850 | } |
||
851 | |||
852 | /**
|
||
853 | 14949 | salva | * Sets the given zoom extent to the view
|
854 | 15264 | julio | *
|
855 | 14949 | salva | * @param extent
|
856 | * The extent to zoom to.
|
||
857 | */
|
||
858 | 15308 | salva | public void zoomToExtent(Rectangle2D geoExtent) { |
859 | double maxHeight = 0.0; |
||
860 | |||
861 | // Getting extent positions
|
||
862 | double minLat = geoExtent.getMinY();
|
||
863 | double maxLat = geoExtent.getMaxY();
|
||
864 | double cenLon = geoExtent.getCenterX();
|
||
865 | double cenLat = geoExtent.getCenterY();
|
||
866 | |||
867 | double elevation = 0; |
||
868 | |||
869 | // calculate altitude
|
||
870 | double avLat = 0; |
||
871 | if (minLat > 0.0 || maxLat < 0.0) |
||
872 | avLat = Math.min(Math.abs(minLat), Math.abs(maxLat)); |
||
873 | double avLon = Math.min(180.0, geoExtent.getWidth()); |
||
874 | |||
875 | 31394 | mten | double terrainRadius = _terrain.getRadiusEquatorial();
|
876 | double radiusLat = terrainRadius * Math.cos(Math.toRadians(avLat)); |
||
877 | 15308 | salva | double deltaLon = Math.sqrt(2 * radiusLat * radiusLat |
878 | * (1 - Math.cos(Math.toRadians(avLon)))); |
||
879 | 31394 | mten | double deltaLat = Math.sqrt(2 * terrainRadius * terrainRadius |
880 | 15308 | salva | * (1 - Math.cos(Math.toRadians(geoExtent.getHeight())))); |
881 | |||
882 | 15663 | jcampos | double zoomFactor = 1.5; |
883 | 15308 | salva | elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
|
884 | |||
885 | // Calculate XYZ positions for camera.
|
||
886 | |||
887 | 31394 | mten | int terrainType = _terrain.getCoordinateSystemType();
|
888 | 15308 | salva | |
889 | Vec3 eye = new Vec3();
|
||
890 | Vec3 center = new Vec3();
|
||
891 | Vec3 up = new Vec3();
|
||
892 | // Calculate positions for PLAIN MODE.
|
||
893 | 31394 | mten | if (terrainType == Terrain.CoordinateSystemType.PROJECTED) {
|
894 | 15308 | salva | |
895 | double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d; |
||
896 | double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d; |
||
897 | double height;
|
||
898 | |||
899 | height = Math.sqrt(difx * difx + dify * dify);
|
||
900 | 25552 | afraile | double fullWindowFactor = 1.7; |
901 | 15308 | salva | // EYE
|
902 | eye.setX(cenLon); |
||
903 | eye.setY(cenLat); |
||
904 | 25552 | afraile | eye.setZ(height * fullWindowFactor); |
905 | 15308 | salva | // CENTER
|
906 | center.setX(cenLon); |
||
907 | center.setY(cenLat); |
||
908 | center.setZ(0.0);
|
||
909 | // UP
|
||
910 | up.setX(0.0);
|
||
911 | up.setY(1.0);
|
||
912 | up.setZ(0.0);
|
||
913 | } else
|
||
914 | // Calculate positions for SPHERICAL MODE.
|
||
915 | 31394 | mten | if (terrainType == Terrain.CoordinateSystemType.GEOCENTRIC) {
|
916 | 15308 | salva | // EYE
|
917 | Vec3 aux = new Vec3(cenLat, cenLon, elevation);
|
||
918 | 31394 | mten | eye = _terrain.convertLatLongHeightToXYZ(aux); |
919 | 15308 | salva | // CENTER
|
920 | center.setX(0.0);
|
||
921 | center.setY(0.0);
|
||
922 | center.setZ(0.0);
|
||
923 | // UP
|
||
924 | up.setX(0.0);
|
||
925 | up.setY(0.0);
|
||
926 | up.setZ(1.0);
|
||
927 | } |
||
928 | Camera cam = new Camera();
|
||
929 | cam.setViewByLookAt(eye, center, up); |
||
930 | |||
931 | 31394 | mten | _terrainViewer.setCamera(cam); |
932 | 15333 | julio | |
933 | 14949 | salva | } |
934 | 15333 | julio | |
935 | 15308 | salva | private void PrintDebugLayers() { |
936 | 31669 | rgaitan | if (_terrainLayerManager != null) { |
937 | System.out.println("==========================="); |
||
938 | System.out.println("Total terrain layers: " |
||
939 | + _terrainLayerManager.getNumLayers()); |
||
940 | System.out.println("==========================="); |
||
941 | } |
||
942 | 31666 | mten | SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
|
943 | int pos = 0; |
||
944 | while (lyrIterator.hasNext()) {
|
||
945 | FLayer layer = lyrIterator.next(); |
||
946 | System.out.println(" Layer " + layer.getName()); |
||
947 | Layer3DProps props3D = getLayer3DProps(layer); |
||
948 | System.out.println(" Type " + props3D.getType()); |
||
949 | 31669 | rgaitan | System.out.println(" Order " + pos); |
950 | 31666 | mten | pos++; |
951 | 15308 | salva | } |
952 | } |
||
953 | |||
954 | 14901 | salva | /**
|
955 | * Crea un nuevo MapContext(3D) a partir del XMLEntity.
|
||
956 | 15264 | julio | *
|
957 | 14901 | salva | * @param xml
|
958 | * XMLEntity
|
||
959 | 15264 | julio | *
|
960 | 14901 | salva | * @return Nuevo MapContext3D.
|
961 | 15264 | julio | *
|
962 | 14901 | salva | * @throws XMLException
|
963 | */
|
||
964 | public static MapContext createFromXML(XMLEntity xml) throws XMLException { |
||
965 | 15333 | julio | ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
|
966 | 14901 | salva | |
967 | FLayers layers = new FLayers3D(null, null, vp); |
||
968 | layers.setXMLEntity(xml.getChild(1));
|
||
969 | |||
970 | 15264 | julio | MapContext fmap = layers.getMapContext(); |
971 | 14901 | salva | |
972 | return fmap;
|
||
973 | } |
||
974 | |||
975 | public static MapContext createFromXML03(XMLEntity xml) throws XMLException { |
||
976 | ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
|
||
977 | |||
978 | FLayers layers = new FLayers3D(null, null, vp); |
||
979 | layers.setXMLEntity03(xml.getChild(1));
|
||
980 | |||
981 | 15264 | julio | MapContext fmap = layers.getMapContext(); |
982 | 14901 | salva | |
983 | return fmap;
|
||
984 | } |
||
985 | 15264 | julio | |
986 | 15236 | julio | public GraphicLayer getGraphicsLayer() {
|
987 | 31394 | mten | GraphicLayer3D gra3D = new GraphicLayer3D(_terrainViewer, getTerrain());
|
988 | 15236 | julio | return gra3D;
|
989 | } |
||
990 | 14901 | salva | |
991 | 15308 | salva | public Node getSpecialNode() {
|
992 | 20893 | jcampos | Node specialNode = null;
|
993 | try {
|
||
994 | 31394 | mten | specialNode = _terrainViewer.getFeature(0);
|
995 | 20893 | jcampos | } catch (ChildIndexOutOfBoundsExceptions e) {
|
996 | 31394 | mten | _logger.error("Command: " + "Error child index out of bound.", e); |
997 | 20893 | jcampos | } |
998 | return specialNode;
|
||
999 | 15264 | julio | } |
1000 | 15333 | julio | |
1001 | 15317 | julio | public ViewPort getViewPort() {
|
1002 | 15333 | julio | |
1003 | ViewPort3D vp = (ViewPort3D) super.getViewPort();
|
||
1004 | |||
1005 | 31394 | mten | if (_canvas3d != null) |
1006 | 31669 | rgaitan | vp.setImageSize(new Dimension(_terrainViewer.getWidth(), |
1007 | _terrainViewer.getHeight())); |
||
1008 | 31394 | mten | vp.setTerrain(this.getTerrain());
|
1009 | vp.setViewer(this._canvas3d);
|
||
1010 | 15333 | julio | |
1011 | 15324 | julio | return vp;
|
1012 | 15317 | julio | } |
1013 | 15333 | julio | |
1014 | 15317 | julio | /**
|
1015 | 15587 | rgaitan | * M�todo de conveniencia que se usa provisionalmente para solicitar un
|
1016 | 31692 | mten | * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
|
1017 | * un evento de cambio de orden de capas que obligar� a redibujar todo lo
|
||
1018 | * que depende de FMap (TOC, MapControl, FFrameView, etc).
|
||
1019 | 15317 | julio | */
|
1020 | 31394 | mten | |
1021 | 31669 | rgaitan | /*
|
1022 | * public void invalidate() { ViewPort3D vp = (ViewPort3D)
|
||
1023 | * super.getViewPort(); if (vp.getDirty()) { vp.setDirty(false); } FLayer[]
|
||
1024 | * selectedExtent = getLayers().getActives();
|
||
1025 | *
|
||
1026 | * if (selectedExtent.length > 0) { for (int i = 0; i <
|
||
1027 | * selectedExtent.length; i++) { if (selectedExtent[0].isAvailable()) {
|
||
1028 | *
|
||
1029 | * FLayer lyr3D = selectedExtent[i]; Layer3DProps layer3DProps =
|
||
1030 | * Layer3DProps .getLayer3DProps(lyr3D);
|
||
1031 | *
|
||
1032 | * Layer terrainLayer = _terrainFLayerMap.get(lyr3D); float opacity =
|
||
1033 | * (((FLyrDefault) lyr3D).getTransparency()) / (float) 255; if()
|
||
1034 | * //_terrain.setTextureOpacityLayer(order, opacity); } }
|
||
1035 | *
|
||
1036 | * } }
|
||
1037 | */
|
||
1038 | 20125 | jcampos | |
1039 | 18328 | jcampos | public void selectionChanged(SelectionEvent e) { |
1040 | // TODO Auto-generated method stub
|
||
1041 | 31666 | mten | SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
|
1042 | while (lyrIterator.hasNext()) {
|
||
1043 | FLayer layer = lyrIterator.next(); |
||
1044 | Layer3DProps props3D = getLayer3DProps(layer); |
||
1045 | 31669 | rgaitan | if (props3D.getType() != Layer3DProps.layer3DOSG) {
|
1046 | 18328 | jcampos | if (layer.getClass().equals(FLyrVect.class)) {
|
1047 | FLyrVect lyr = (FLyrVect) layer; |
||
1048 | 20125 | jcampos | |
1049 | FBitSet selection = null;
|
||
1050 | try {
|
||
1051 | selection = lyr.getRecordset().getSelectionSupport() |
||
1052 | .getSelection(); |
||
1053 | } catch (ReadDriverException e1) {
|
||
1054 | // TODO Auto-generated catch block
|
||
1055 | e1.printStackTrace(); |
||
1056 | } |
||
1057 | |||
1058 | if ((selection.cardinality() == 0) |
||
1059 | || (!(selection.isEmpty()))) { |
||
1060 | Layer3DProps props = Layer3DProps |
||
1061 | .getLayer3DProps(layer); |
||
1062 | 31394 | mten | refreshLayerInTerrain(props, true);
|
1063 | 24882 | jcampos | if (layer instanceof FLyrVect) { |
1064 | FLyrVect fvect = (FLyrVect) layer; |
||
1065 | props.drawVersion = fvect.getDrawVersion(); |
||
1066 | } |
||
1067 | 20125 | jcampos | } |
1068 | 18328 | jcampos | } |
1069 | } |
||
1070 | } |
||
1071 | } |
||
1072 | 20893 | jcampos | |
1073 | 31695 | rgaitan | public synchronized void removeLayerToTerrain(FLayer layer) { |
1074 | 21545 | afraile | // TODO Auto-generated method stub
|
1075 | Layer3DProps props3D = getLayer3DProps(layer); |
||
1076 | |||
1077 | if (props3D.getType() == Layer3DProps.layer3DVector) {
|
||
1078 | DeleteVectors(layer, props3D); |
||
1079 | 22470 | jcampos | } else if (props3D.getType() == Layer3DProps.layer3DOSG) { |
1080 | DeleteOSGLayer(layer, props3D); |
||
1081 | 31652 | mten | } else {
|
1082 | Layer terrainLayer = _terrainFLayerMap.get(layer); |
||
1083 | 31669 | rgaitan | if (terrainLayer != null) { |
1084 | 31654 | rgaitan | _terrainLayerMap.remove(terrainLayer.getLayerID()); |
1085 | _terrainFLayerMap.remove(layer); |
||
1086 | 31692 | mten | |
1087 | 31689 | mten | _terrainLayerManager.removeLayer(terrainLayer); |
1088 | 31654 | rgaitan | } |
1089 | 21545 | afraile | } |
1090 | |||
1091 | } |
||
1092 | |||
1093 | 22470 | jcampos | private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) { |
1094 | 31394 | mten | if (_terrain == null || _viewProjection == null) |
1095 | 22470 | jcampos | return;
|
1096 | |||
1097 | OSGCacheService cacheService = (OSGCacheService) props3D |
||
1098 | .getCacheService(); |
||
1099 | if (cacheService != null) { |
||
1100 | 31394 | mten | // use VectorCacheService to delete features to terrain
|
1101 | cacheService.DeleteFeaturesToTerrain(); |
||
1102 | 22470 | jcampos | } |
1103 | } |
||
1104 | |||
1105 | 22171 | jcampos | public boolean isRenewCanvasOff() { |
1106 | 31394 | mten | return _renewCanvasOff;
|
1107 | 22171 | jcampos | } |
1108 | |||
1109 | public void setRenewCanvasOff(boolean renewCanvasOff) { |
||
1110 | 31394 | mten | _renewCanvasOff = renewCanvasOff; |
1111 | 22171 | jcampos | } |
1112 | |||
1113 | 24239 | rgaitan | public void drawValueChanged(LayerEvent arg0) { |
1114 | 24882 | jcampos | // TODO Auto-generated method stub
|
1115 | |||
1116 | 24239 | rgaitan | } |
1117 | |||
1118 | 31726 | rgaitan | public UpdateDataEvent loadData(RequestDataEvent rde) {
|
1119 | 31669 | rgaitan | |
1120 | if (_terrainLayerMap.size() == 0) |
||
1121 | return null; |
||
1122 | if (rde == null) |
||
1123 | return null; |
||
1124 | if (rde.getExtent() == null) |
||
1125 | return null; |
||
1126 | if (rde.getLayer() == null) |
||
1127 | return null; |
||
1128 | if (rde.getLayerManager() == null) |
||
1129 | return null; |
||
1130 | |||
1131 | 31642 | mten | UpdateDataEvent ude = new UpdateDataEvent();
|
1132 | ude.copyDataFromRequest(rde); |
||
1133 | 31732 | rgaitan | |
1134 | 31669 | rgaitan | |
1135 | 31642 | mten | String layerID = rde.getLayer().getLayerID();
|
1136 | 31652 | mten | FLayer layer = (FLayer) _terrainLayerMap.get(layerID); |
1137 | 31669 | rgaitan | if (layer == null) |
1138 | return null; |
||
1139 | if (!layer.isVisible())
|
||
1140 | return null; |
||
1141 | |||
1142 | 31642 | mten | Layer3DProps props3D = getLayer3DProps(layer); |
1143 | 31669 | rgaitan | |
1144 | 31642 | mten | // get/create cache service
|
1145 | FLayerCacheService cacheService = (FLayerCacheService) props3D |
||
1146 | .getCacheService(); |
||
1147 | if (cacheService == null) { |
||
1148 | cacheService = new FLayerCacheService(_terrain, props3D
|
||
1149 | .getCacheName(), layer, _viewProjection); |
||
1150 | cacheService.setCacheRootDir(Layer3DProps.m_cacheDir); |
||
1151 | props3D.setCacheService(cacheService); |
||
1152 | } |
||
1153 | |||
1154 | int dataType = props3D.getType();
|
||
1155 | Point tileIndices = new Point(rde.getTileX(), rde.getTileY()); |
||
1156 | TileNum tileNum = new TileNum(rde.getTileLevel(), tileIndices);
|
||
1157 | |||
1158 | 31692 | mten | String tileFileName = ""; |
1159 | 31669 | rgaitan | |
1160 | 31652 | mten | double minX, minY, width, height;
|
1161 | 31669 | rgaitan | |
1162 | if (_terrain.getCoordinateSystemType() == CoordinateSystemType.PROJECTED) {
|
||
1163 | 31652 | mten | minX = rde.getExtent().xMin(); |
1164 | minY = rde.getExtent().yMin(); |
||
1165 | width = rde.getExtent().xMax() - rde.getExtent().xMin(); |
||
1166 | height = rde.getExtent().yMax() - rde.getExtent().yMin(); |
||
1167 | } else {
|
||
1168 | minX = Math.toDegrees(rde.getExtent().xMin());
|
||
1169 | minY = Math.toDegrees(rde.getExtent().yMin());
|
||
1170 | 31669 | rgaitan | width = Math.toDegrees(rde.getExtent().xMax()
|
1171 | - rde.getExtent().xMin()); |
||
1172 | height = Math.toDegrees(rde.getExtent().yMax()
|
||
1173 | - rde.getExtent().yMin()); |
||
1174 | 31652 | mten | } |
1175 | 31692 | mten | boolean failData = false; |
1176 | 31642 | mten | |
1177 | Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height); |
||
1178 | if (cacheService.intersectsLayer(extent)) { // extent test |
||
1179 | try {
|
||
1180 | tileFileName = cacheService.getTileAsFName(tileNum, extent); |
||
1181 | 31726 | rgaitan | if(tileFileName == null) |
1182 | failData = true;
|
||
1183 | 31642 | mten | } catch (Exception e) { |
1184 | 31692 | mten | failData = true;
|
1185 | 31726 | rgaitan | NotificationManager.addInfo("Problem reading tile:" + tileNum, e);
|
1186 | e.printStackTrace(); |
||
1187 | 31642 | mten | } |
1188 | 31669 | rgaitan | |
1189 | 31692 | mten | if (failData) {
|
1190 | 31732 | rgaitan | return null; |
1191 | //ude.setFailData();
|
||
1192 | 31692 | mten | } else {
|
1193 | switch (dataType) {
|
||
1194 | case Layer3DProps.layer3DImage:
|
||
1195 | ude.setRasterData(tileFileName, "gdal");
|
||
1196 | break;
|
||
1197 | case Layer3DProps.layer3DElevation:
|
||
1198 | ude.setHeightfieldData(tileFileName, "gdal");
|
||
1199 | break;
|
||
1200 | case Layer3DProps.layer3DVectorMR:
|
||
1201 | ude.setVectorData(tileFileName, "osg");
|
||
1202 | break;
|
||
1203 | } |
||
1204 | 31652 | mten | } |
1205 | 31669 | rgaitan | } |
1206 | |||
1207 | 31642 | mten | return ude;
|
1208 | } |
||
1209 | 14901 | salva | } |