Statistics
| Revision:

gvsig-3d / 2.1 / trunk / doc / dt-visor-3d.rst @ 482

History | View | Annotate | Download (38.2 KB)

1
=================================================================
2
 Visor 3D básico que integra Nasa WW SDK
3
=================================================================
4

    
5
-------------------
6
 Diseño técnico
7
-------------------
8

    
9
:Company:   gvSIG Association 
10
:Author:    DiSiD Corporation, S.L.
11
:Revision:  $Rev: $
12
:Date:      $Date: $
13
:Copyright: All rigths reserved
14

    
15
.. contents::
16
   :depth: 2
17
   :backlinks: none
18

    
19
.. sectnum::
20
   :depth: 1
21
   :start: 1
22

    
23
.. |year| date:: %Y
24

    
25
.. header:: 
26
      
27
   .. class:: headertable
28

    
29
   +-----------------------+-------------------------+
30
   |.. class:: left        |.. class:: right         |
31
   |                       |                         |
32
   | Diseño técnico        |###Page###               |
33
   +-----------------------+-------------------------+ 
34

    
35

    
36
.. footer:: 
37

    
38
    .. include:: <isonum.txt>
39

    
40
    .. class:: left
41

    
42
    *Visor 3D básico que integra Nasa WW SDK - Diseño técnico*
43

    
44
    |copy| |year| ** 
45

    
46

    
47
Introducción
48
=============
49

    
50
.. note::
51
 Este documento esta en continua construcción. A medida que se avance en el proyecto se irá añadiendo nueva información y refinando la existente.
52

    
53
Este documento detalla el diseño técnico de las funcionalidades definidas y la arquitectura del nuevo visor 3D basado en la librería NASA WW SDK para gvSIG 2.1+. Para más información consulte:
54

    
55
* http://worldwind.arc.nasa.gov/java/
56
* http://goworldwind.org/
57

    
58
El diseño técnico tendrá en cuenta el análisis de requisitos y el análisis funcional realizados en:
59

    
60
* http://devel.gvsig.org/svn/gvsig-3d/2.1/trunk/doc/re-visor-3d.rst
61
* http://devel.gvsig.org/svn/gvsig-3d/2.1/trunk/doc/af-visor-3d.rst
62

    
63
Diseño técnico
64
=====================
65

    
66
Para tener un poco del contexto del diseño técnico, se expone como debería de funcionar de forma resumida el visor 3D. Seguidamente se detallará como se estructura la librería y la arquitectura de plugins.
67

    
68
Ejemplo de caso de uso
69
-------------------------------
70

    
71
A partir de una vista 2D, se desea representar la información cargada de forma tridimensional. Para ello, el usuario dispondrá de dos entradas de menú / botones para crear los dos tipos de visores: esférico y plano definidos en TYPE.SPHERE y TYPE.FLAT. Las dos entradas de menú ejecutarán una misma extensión, View3DExtension, la cual dependiendo del *action command* realizará una acción u otra. Pero antes de explicar la creación de visor el usuario debe definir parámetros o propiedades para la carga y gestión de las capas dentro del visor 3D.
72

    
73
Las capas tienen propiedades comunes, definidas en `LayerProperties3D`_, y especificas que varían en función del tipo de capa, definidas en las subclases ``RasterLayerProperties3D`` y ``VectorialLayerProperties3D``. La propiedades comunes son las siguientes:
74

    
75
* Nivel máximo de detalle: nivel máximo de detalle en la visualización de la capa. Cuanto más alto sea el número máximo de nivel de detalle más tiles se generarán y más espacio ocuparán en el disco.
76
* Nivel mínimo de detalle: nivel mínimo de detalle en la visualización de la capa. Cuanto más pequeño sea el número mínimo de nivel de detalle menos tiles se generarán y menos espacio ocuparán en el disco.
77

    
78
La librería WW permite dividir un raster, ya sea normal o de elevación, en varios niveles de detalle que se muestran dependiendo de lo cerca o lejos se encuentre el enfoque de la capa raster. Los niveles de detalle se estructuran en forma de pirámide, de menor resolución y número de tiles (nivel mínimo) a mayor nivel de resolución y número de tiles (nivel máximo). Para más información de como se gestionan los niveles de detalle y los tiles dentro de la librería WW consulte:
79

    
80
 http://www.microimages.com/documentation/TechGuides/78Worldwind.pdf
81

    
82
Además de las propiedades descritas anteriormente si la capa es de tipo vectorial tiene las siguientes propiedades:
83

    
84
* Modo de carga rasterizado: permite indicar si la capa vectorial se va a cargar en el visor de forma rasterizada. La rasterización de una capa vectorial consiste en la conversión de una imagen vectorial a una imagen formada por píxeles. Por defecto las capas vectoriales se cargan en el visor rasterizadas debido a que la carga de capas vectoriales sin rasterizar se abordará más adelante.  
85

    
86
Si la capa es de tipo raster tiene las siguientes propiedades:
87

    
88
* Modo de carga elevación: permite indicar si el raster es de tipo elevación o no. 
89

    
90
Una vez definidas las propiedades 3D de la capas, se procede a la creación de un visor 3D. La extensión obtendrá la instancia única mediante el Locator y ejecutará el método ``ViewPanel3DManager#createViewPanel3D(MapContext, TYPE)`` pasándole como parámetro el mapContext de la vista activa y el tipo de visor dependiendo del *action command*. En la creación del visor, se accederá a la capas del MapContext para cargarlas obteniendo las propiedades asociadas a las capas mediante ``ViewPanel3D#getLayerProperties3D(FLayer)`` para determinar que tipo de ``LayerConverter`` instanciar.
91

    
92
Instanciado el conversor para la obtención de una capa WW se ejecutará el método ``LayerConverter#convertToLayer(FLayer)`` o ``LayerConverter#convertToElevationModel(FLayer flayer)`` dependiendo del tipo de capa y el modo de carga. Estos método realizarán todo lo necesario para obtener la capa WW correspondiente. Una vez obtenida la capa se debe de añadir al componente WW y mostrar la ventana mediante ``ViewPanel3D#show()``.
93

    
94
Por otra parte cuando se activa un visor, se activan dos entradas de menú adicionales: Refrescar visor y Sincronizar enfoques. La entrada de menú Refrescar visor esta asociada a la extensión ``RefreshView3DExtension`` la cual obtendrá el `MapControl3D`_ del visor activo y ejecutará el método ``MapControl3D#synchronizeLayers()``. La entrada de menú Sincronizar enfoques esta asociada a la extensión ``SynchronizeView3DExtension`` la cual obtendrá el `MapControl3D`_ de la vista activa y ejecutará el método ``MapControl3D#synchronizeViewPorts()``.
95

    
96
Integración con la librería NASA WW SDK
97
----------------------------------------
98

    
99
World Wind es una colección de componentes que de forma interactiva muestran información geográfica en 3D. Las aplicaciones o applets que usen la librería deberá integrar uno o más componentes dentro de su interfaz gráfica. World wind sigue el siguiente esquema:
100

    
101
.. image:: images/world-wind-diagram.png
102

    
103
* Globe: representa la forma del planeta y el terreno. Contiene un Tessellator el cual es el encargado de generar el terreno.
104
* Layer: las capas añaden las imágenes, objetos u otra información al globo. La capas se ajustan a la forma del globo y se mueven junto a el cuando el usuario navega por el espacio tridimensional.
105
* Model: junta el globo y las capas.
106
* View: determina la vista del usuario sobre el modelo. La vista se va modificando en base a los eventos de usuario que recibe.
107
* SceneController: asocia la vista con el modelo. Controla el tiempo y el renderizado del modelo.
108

    
109
Se pretende crear una nivel de abstracción que ofrezca a los consumidores de la librería la funcionalidades descritas en el análisis funcional de forma que no tengan que interactuar con la librería WW. La integración del plugin con la librería World Wind se ha diseñado del siguiente modo:
110

    
111
* El componente `ViewPanel3D`_ integra un componente ``WorldWindowGLJPanel``. ``WorldWindowGLJPanel`` es autocontenido y su propósito es servir la aplicación WorldWind mostrando el modelo definido (globo y capas).
112
* La librería posee unos archivos de configuración en XML que son cargados cuando la librería se registra. Estos archivos de configuración por un lado definen la clases que implementan los distintos servicios que ofrece la librería y por otro las capas que se cargan por defecto al crear un modelo básico.
113
* Además de esta configuración, es necesario configurar unos parámetros especificados para crear un ``WorldWindowGLJPanel`` esférico o plano. Esta configuración se realiza al instanciar un objeto `ViewPanel3D`_. Dependiendo del modo indicado como parámetro, se establece una configuración u otra.
114
* La obtención de las capas WW a partir de capas de gvSIG se realiza mediante la clase `LayerConverter`_ la cual permite obtener la capa equivalente en WW a partir de una capa de gvSIG para añadirla a las capas del modelo WW. Se ha implementa un nuevo tipo de capa llamado RasterTiledImageLayer la cual gestiona la peticiones de tiles en tiempo para que se obtengan los datos directamente desde el DAL de gvSIG. Esta gestión se realiza mediante los objetos ``DefaultRetrieverFactory``, ``DefaultRasterRetriever``, ``DefaultRasterServer``, ``DefaultDataRasterReaderFactory``, ``DefaultDataRasterReader`` y ``DefaultDataRaster``.
115

    
116
LIB API
117
---------
118

    
119
Este es el API de la lógica de la librería, la cual esta basada en el modelo de implementación simple API/IMPL
120

    
121
* Project: org.gvsig.view3d/org.gvsig.view3d.lib/org.gvsig.view3d.lib.api
122
* Package: org.gvsig.view3d.lib.api
123

    
124
LayerProperties3D
125
~~~~~~~~~~~~~~~~~~~~~~
126

    
127
Clase que representa la propiedades 3D de una capa.
128

    
129
* getFormat() : String
130

    
131
  Obtiene el formato MIME de las teselas. El valor por defecto del modo de carga "Imagen raster" o "Vectorial rasterizada" es **image/png** y el formato por defecto del modo "Modelo digital del terreno" es **image/bil16**.
132

    
133
* setFormat(String theFormat) : void
134

    
135
  Asigna el formato de tipo MIME de las teselas. Dependiendo del modo de carga admite unos formatos u otros. Para el modo de carga "Imagen raster" o "Vecotiral raserizada" admite los formatos: image/png, image/jpg, image/jpeg y image/dds. Para el modo de carga "Modelo digital del terreno" acepta los formatos: image/bil16 y image/bil32.
136

    
137
* setMaxLevel(int maxLevel) : void
138

    
139
  Asigna el máximo nivel de detalle de la capa. Si el valor recibido como parámetro es igual a 0 o cadena vacía se asigna el valor óptimo dependiendo del tamaño del raster y del pixel.
140

    
141
* getMaxLevel() : int
142

    
143
  Obtiene el máximo nivel de detalle de la capa. 
144

    
145
* setMinLevel(int minLevel) : void
146

    
147
  Asigna el mínimo nivel de detalle de la capa. Si el valor recibido como parámetro es igual a 0 o cadena vacía se asigna el valor óptimo dependiendo del tamaño del raster y del pixel.
148

    
149
* getMinLevel() : int
150

    
151
  Obtiene el mínimo nivel de detalle de la capa.
152

    
153
* getLevelZeroResolutionMultiplier() : double
154

    
155
  Obtiene el multiplicador de resolución del nivel cero de detalle. 
156

    
157
* setLevelZeroresolutionMultiplier(double multiplier) : void
158

    
159
  Asigna el multiplicador de resolución al nivel cero de detalle. Admite como valor mínimo 0.5 y como valor máximo 1.5. 
160

    
161
* getTileWidth() : int
162

    
163
  Obtiene el ancho en píxeles de una tesela.
164

    
165
* setTileWidth(int width) : void
166

    
167
  Asigna el ancho en píxeles de una tesela.
168

    
169
* getTileHeight() : int
170

    
171
  Obtiene el alto en píxles de una tesela.
172

    
173
* setTileHeight(int height) : void
174

    
175
  Asigna el ancho en píxeles de una tesela.
176

    
177
ElevationLayerProperties3D  
178
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
179

    
180
* setElevation(boolean elevation) : void
181

    
182
  Asigna a la capa si el modo de carga de la capa es de elevación o no.
183

    
184
* getElevation() : boolean
185

    
186
  Obtiene si el modo de carga de la capa raster es de elevación o no.
187

    
188
* getNoDataValue() : double
189

    
190
  Obtiene el valor tomado como No Data.
191

    
192
* setNoDataValue(double noDataValue) : void
193

    
194
  Asigna el valor No Data. Si no se asigna ningún valor se obtiene el valor por defecto -99999.0.
195

    
196
* getElevationField() : String
197

    
198
  Obtiene el atributo del *FeatureType* que contiene la información de elevación. Solo se aplica cuando la capa es de tipo vectorial.
199

    
200
* setElevationField(String field) : void
201

    
202
  Asgina que atributo del *FeatureType* contiene la información de elevación. Solo se aplica cuando la capa es de tipo vectorial.
203

    
204
* getElevationUnits() : String
205

    
206
  Obtiene en que unidades se encuentra el valor de elevación.
207

    
208
* setElevationUnits(String units) : void
209

    
210
  Asigna en que unidades se encuentra el valor de elvación. Solo acepta dos unidades: metros y pies.
211

    
212
RasterLayerProperties3D extends LayerProperties3D
213
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
214

    
215
Clase que representa la propiedades 3D de una capa raster. De momento no tiene ninguna propiedad específica.
216

    
217
VectorialLayerProperties3D extends LayerProperties3D
218
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
219

    
220
Clase que representa la propiedades 3D de una capa vectorial.
221

    
222
* setRasterized(boolean rasterized) : void
223

    
224
  Asigna a la capa si el modo de carga de la capa es rasterizado o no. Hay que tener en cuenta si ya se ha definido como elevación. Una capa solo puede ser o de elevación o rasterizada. Las dos propiedades a la vez es un estado inconsistente.
225

    
226
* getRasterized() : boolean
227

    
228
  Obtiene si el modo de carga de la capa vectorial es rasterizado o no.
229

    
230
.. note::
231
  Falta añadir la propiedades de vista y propiedades generales.
232

    
233
LIB IMPL
234
---------
235

    
236
Esta es la implementación de la lógica de la librería.
237

    
238
BasicLayerProperties3D implements LayerProperties3D, ElevationLayerProperties3D
239
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
240

    
241
Implementación básica de las propiedades 3D de capas.
242

    
243
DefaulRasterLayerProperties3D extends BasicLayerProperties3D implements RasterLayerProperties3D
244
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
245

    
246
Implementación por defecto de las propiedades de las capas raster.
247

    
248
DefaultVectorialLayerProperties3D extends BasicLayerProperties3D RasterLayerProperties3D
249
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
250

    
251
Implementación por defecto de la propiedades de las capas vectoriales.
252

    
253
SWING API
254
----------
255

    
256
Este es el API de la interfaz de usuario de la librería del visor 3D, la cual esta basada en el modelo de implementación simple API/IMPL.
257

    
258
* Project: org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.api
259
* Package: org.gvsig.view3d.swing.api
260

    
261
View3DSwingManager
262
~~~~~~~~~~~~~~~~~~~~~~
263

    
264
Punto de entrada a la librería view3D. Proporciona métodos para la creación de visores, paneles de propiedades y obtención de las propiedades 3D de una capa.
265

    
266
* createViewPanel3D(MapContext theMapContext, TYPE type) : ViewPanel3D
267

    
268
  Crea un objeto `ViewPanel3D`_ pasándole como parámetro el MapContext y el tipo de panel.
269

    
270
* createMapControl3D(MapContext mapContext, TYPE type) : MapControl3D
271

    
272
  Crea un objeto `MapControl3D`_ a partir del MapContext y el tipo.
273

    
274
* getLayerProperties3D(FLayer layer) : LayerProperties3D
275

    
276
  Obtiene las propiedades asociadas a un capa.
277

    
278
* setLayerProperties3D(FLayer layer, LayerProperties3D properties) : void
279

    
280
  Asigna las propiedades a la capa que recibe como parámetro.
281

    
282
* getMapControl3D(MapContext theMapContext, TYPE type) : MapControl3D
283

    
284
  Obtiene el `MapControl3D`_ del tipo indicado mediante el parámetro ``TYPE`` registrado al ``MapContext``. Si no hay ningún `MapControl3D`_ registrado devuelve ``null``.  
285

    
286

    
287
.. note::
288
  Falta especificar las propiedades relacionadas con la vista, las propiedades generales y sus interfaces.
289

    
290
MapControl3D
291
~~~~~~~~~~~~~~~~~~~~~~
292

    
293
Define el API del componente 3D.  Esta clase representa el componente 3D del visor. Permite añadir y quitar capas, sincronizar capas y enfoques con la vista 2D enlazada, configurar la visibilidad de los componentes del visor. Además, a partir de un MapContext obtiene las capas y las convierte en capas WW para añadirlas al componente WorldWind.
294

    
295
* getCancellable() : Cancellable
296

    
297
  Obtiene el objeto compartido el cual permite cancelar todas las ordenes de pintado que se están ejecutando en un momento dado.
298
 
299
* getMapContext() : MapContext
300

    
301
  Obtiene el ``MapContext`` asociado al visor. Del ``MapContext`` asociado se extrae la información necesaria para la representación de los datos en 3D y la sincronización de enfoques.
302

    
303
* getType() : TYPE
304

    
305
  Obtiene el tipo del visor. Devuelve un objeto enum que puede ser TPYE.SPHERE o TYPE.FLAT (ver `TYPE`_).
306

    
307
* getVerticalExaggeration() : double
308

    
309
  Obtiene la exageración vertical del visor.
310

    
311
* reloadLayers() : void
312

    
313
  Elimina las capas cargadas. Accede al MapContext asociado al visor y carga de nuevo las capas. Se usa para actualizar el visor con los posibles cambios realizados sobre la vista 2D.
314

    
315
* setMapContext(MapContext theMapContext) : void
316

    
317
  Establece el MapContext al visor y recarga la información mediante reloadLayers().
318

    
319
* setVerticalExaggeration(double verticalExaggeration) : void
320

    
321
  Establece las exageración vertical del visor.
322

    
323
* showAtmosphere() : void
324

    
325
  Si no esta añadida la capa que representa la Atmosphera la añade al componente ``WorldWind``.
326

    
327
* showNortIndicator() : void
328

    
329
  Si no esta añadido el componente que representa el indicador del norte lo añade al componente ``WorldWind``.
330

    
331
* showMiniMap() : void
332

    
333
  Si no esta añadido el componente que representa el minimapa lo añade al componente ``WorldWind``.
334

    
335
* showScale() : void
336

    
337
  Si no esta añadido el componente que representa la escala lo añade al componente ``WorldWind``.
338

    
339
* showStarBackground() : void
340

    
341
  Si no esta añadido el componente que representa el fondo de estrellas lo añade al componente ``WorldWind``.
342

    
343
* synchronizeViewPorts() : void
344

    
345
  Obtiene el ``ViewPort`` de la vista y realiza las transformaciones necesarias para el enfoque del visor 3D muestra la misma región. Hay que tener en cuenta si la opción "Animación en la sincronización de enfoques" esta marcada o no. En caso de que este marcada la sincronización se debe animar, en caso contrario, no.
346

    
347
* synchronizeLayers() : void
348

    
349
  Comprueba que capas han sufrido cambios mediante el versionado del MapContext y la vuelve a recargar en el modelo del componente WW. Para la comprobación de cambios será necesario guardar las versiones de pintado de las capas en el momento de la instanciación del ``MapContext`` para que cuando este método se ejecute se compruebe con el valor actual de la capa para decidir si se sincroniza o no. Para recargar la capa se debe de eliminar y volver a añadir. Cuando se añade se debe de actualizar el registro de las verisones de pintado para futuras sincronizaciones.
350

    
351
* hideAtmosphere() : void
352

    
353
  Si esta añadido, elimina el componente que representa la atmósfera del componente ``WorldWind``.
354

    
355
* hideMiniMapVisibility() : void
356

    
357
  Si esta añadido, elimina el componente que representa el minimapa del componente ``WorldWind`` si esta añadido.
358

    
359
* hideStarBackgroun() : void
360

    
361
  Si esta añadido, elimina el componente que representa el fondo de estrellas del componente ``WorldWind`` si esta añadido.
362

    
363
* hideNorthIndicator() : void
364

    
365
  Si esta añadido, elimina el componente que representa el indicador del norte del componente ``WorldWind`` si esta añadido.
366

    
367
* hideScale() : void
368

    
369
  Si esta añadido, elimina el componente que representa las escala  del componente ``WorldWind`` si esta añadido.
370

    
371
* isAtmosphereVisible(): boolean
372

    
373
  Obtiene si esta visible o no la capa que representa la Atmosfera.
374
    
375
* isMinimapVisible(): boolean
376

    
377
  Obtiene si esta visible o no el Minimapa.
378
    
379
* isNorthIndicatorVisible(): boolean
380

    
381
  Obtiene si esta visible o no el indicador del Norte.
382
    
383
* isStartBackgroundVisible(): boolean
384

    
385
  Obtiene si esta visible o no el fondo de estrellas.
386
    
387
* isScaleVisible(): boolean
388

    
389
  Obtiene si esta visible o no la escala.
390

    
391
DefaultTiledImageLayer
392
________________________
393

    
394
Los pasos para obtener una capa RasterTiledImageLayer son los siguientes:
395

    
396
* Configuración de los parámetros necesarios en un fichero XML para crear una capa del tipo RasterTileImageLayer. Los parámetros necesarios son:
397

    
398
 * DATASET_NAME: Nombre del dataset.
399
 * DATA_CACHE_NAME: Nombre de la carpeta dentro de la cache donde se alojará los tiles generados en tiempo de ejecución. Este nombre debe ser único.
400
 * SERVICE_NAME: En nuestro caso siempre será *Offline*.
401
 * SECTOR: Zona geográfica del raster especificada en grados sobre la proyección EPSG:4326.
402
 * WIDTH: Ancho en píxeles de la imagen raster.
403
 * HEIGHT: Alto en píxeles de la imagen raster.
404
 * DISPLAY_NAME: Nombre de la capa.
405
 * IMAGE_FORMAT: Formato de los tiles que se generan. Se indican en formato MIME y se aceptan cuatro tipos: PNG, JPG, JPEG y DDS.
406
 * PIXEL_FORMAT: Formato del pixel. Puede tener dos valores: AVKey.IMAGE y AVKey.ELEVATION. En caso de DefaultTiledImageLayer siempre será AVKey.IMAGE.
407
 * TEXTURE_FORMAT: Tipo MIME del formato de la texturas. Se indican en formato MIME y se aceptan cuatro tipos: PNG, JPG, JPEG y DDS.
408
 * FORMAT_SUFFIX: sufijo de archivo de los tiles generados. Debe corresponderse al formato de imagen indicado.
409
 * AVAILABLE_IMAGE_FORMATS: Formatos de imagen disponibles.
410
 * TILE_ORIGIN: Origen desde donde se empiezan a crear los tiles.
411
 * TILE_WIDTH: Ancho en píxeles del tile.
412
 * TILE_HEIGHT: Alto en píxeles del tile.
413
 * NUM_LEVELS: Numero de niveles de detalle. Por defecto se calcular el valor óptimo dependiendo de la resolución del raster.
414
 * LEVEL_ZERO_DELTA: Objeto LatLon con valores en grados. Define que resolución corresponde a que nivel de detalle. Si el valor es muy pequeño (~1º) muestra en niveles de detalle bajos (0 o 1) resoluciones muy altas haciendo el proceso de pintado muy costoso. Es cambio si se asignan valores muy grandes (entre 36 y valores máximos) en niveles bajos de detalle se muestra una resolución muy pequeña haciendo que el proceso de pintado sea muy rápido. Por defecto en capas raster se calcula el valor óptimo y en capas rasterizadas se asigna el valor 20º.
415
 * NETWORK_RETRIEVAL_ENABLED: En nuestro caso siempre será ``false`` ya que para la libería los datos siempre están en local.
416
 * USE_MIP_MAPS: En este caso siempre tendrá el valor ``true`` debido a que mejora la visualización del raster.
417
 * USE_TRANSPARENT_TEXTURES: En este caso siempre tendrá el valor ``true`` debido a que mejora la visualización del raster.
418

    
419

    
420
Además de estos parámetros también es necesario añadir en tiempo de ejecución la capa gvSIG que se desea convertir de la cual se obtendrá la información para la creación de tiles mediante la clave GVSIG_LAYER. Por otra parte, existen parámetros opcionales que si no se asigna ningún valor la librería asigna el valor por defecto.
421

    
422
* Crear la capa de tipo RasterTileImageLayer a partir de los parámetros y añadirla al modelo. Al instanciar una nueva capa RasterTileImageLayer, se configura una factoría del tipo DefaultRetrieverFactory la cual permite la creación de objetos DefaultRasterRetriever. Dichos objetos son los encargados de realizar la distintas peticiones a un objeto DefaultRasterServer el cual es el encargado de servir la información procedente de un DataRaster genérico.
423

    
424
DefaultElevationModel
425
________________________
426

    
427
Los pasos para obtener una capa RasterTiledImageLayer son los siguientes:
428

    
429
* Configuración de los parámetros necesarios en un fichero XML para crear una modelo de elevación ElevationModel. Los parámetros necesarios son:
430

    
431
  * DISPLAY_NAME: Nombre del modelo de elevación
432
  * SECTOR: Zona geográfica del raster especificada en grados sobre la proyección EPSG:4326.
433
  * WIDTH: ancho en píxeles de la imagen raster.
434
  * HEIGHT: alto en píxeles de la imagen raster.
435
  * FILE_STORE: almacén de archivos de la cache. Proporciona métodos para añadir / quitar localizaciones, buscar archivos, borra archivos...
436
  * IMAGE_FORMAT: formato de los tiles genera
437
  * DATA_TYPE: tipo de dato de la información del raster.
438
  * PIXEL_FORMAT: formato del pixel: AVKey.ELEVATION o AVKey.IMAGE
439
  * FORMAT_SUFFIX: sufijo de archivo de los tiles generados.
440

    
441
    Además de estos parámetros también es necesario añadir en tiempo de ejecución la capa gvSIG que se desea convertir de la cual se obtendrá la información para la creación de tiles mediante la clave GVSIG_LAYER. Por otra parte, existen parámetros opcionales que si no se asigna ningún valor la librería asigna el valor por defecto. Los parámetros opcionales son:
442

    
443
  * BYTE_ORDER: orden de los bytes. Little endian o big endian.
444
  * ELEVATION_MAX: elevación máxima y mínima.
445
  * ELEVATION_MIN: elevación mínima del raster.
446
  * EXPIRY_TIME: tiempo de expiración de un tile dentro de la cache.
447
  * MISSING_DATA_SIGNAL: Valor "no data"
448
  * MISSING_DATA_REPLACEMENT: Valor que se obtiene al obtener la elevación sobre un punto "no data".
449
  * NETWORK_RETRIEVAL_ENABLED: Indica el modo de trabajo online o offline.
450
  * ELEVATION_EXTREMES_FILE: ruta al fichero que contiene información sobre las elevaciones extremas.
451

    
452
* Crear el modelo de elevación DefaultElevationModel a partir de lo parámetros y añadirlo al modelo ya existente. El modelo existente será de tipo CompoundElevationModel el cual permite añadir varios modelos de elevación y mostrarlos a la vez. Al instanciar un nuevo modelo de elevación, se configura una factoría del tipo DefaultRetrieverFactory la cual permite la creación de objetos DefaultRasterRetriever. Dichos objetos son los encargados de realizar las distintas peticiones a un objeto DefaultRasterServer el cual es el encargado de servir la información procedente de un DataRaster genérico. 
453

    
454
ViewPanel3D
455
~~~~~~~~~~~~~~~~~~~~~~
456

    
457
Representa la ventana que contiene el componente `MapControl3D`_.
458

    
459
* show() : void
460

    
461
  Invoca al WindowManager para mostrar el visor en modo ventana.
462

    
463
* getMapControl3D() : MapControl3D
464

    
465
  Devuelve el componente asociado a la ventana.
466

    
467
TYPE
468
~~~~~~~~~~~~~~~~~~~~~~
469

    
470
Enumerado que representa los dos tipos posibles de un visor 3D. Los dos tipos son: SPHERE y FLAT.
471

    
472
SWING IMPL
473
--------------
474

    
475
Este es la implementación de la interfaz de usuario de la librería del visor 3D.
476

    
477
* Project: org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.impl
478
* Package: or.gvsig.view3d.swing.impl
479

    
480
DefaultView3DManager implements View3DManager
481
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
482

    
483
Implementación por defecto del manager View3DManager
484

    
485
DefaultViewPanel3D implements ViewPanel3D
486
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
487

    
488
Implementación por defecto de los métodos descritos en la interfaz ViewPanel3D. Esta clase tendrá asociado un MapContext que permitirá obtener información acerca del enfoque, escucha eventos de cambio sobre capas y enfoque, versionado... 
489

    
490
* public DefaultViewPanel3D(MapContext mapContext, TYPE type);
491

    
492
  Constructor que permite instancia un nuevo visor 3D a partir de un MapContext y el tipo. Este constructor accederá a las capas del mapContext para añadirlas al componente de la librería WW. Para añadir una capa al componente WW es necesaria una transformación (``LayerConverter#convertToLayer(layer)``) de la capa gvSIG a una capa WW en base al modo de carga asociado especificado por el usuario.
493

    
494
LayerConverter
495
~~~~~~~~~~~~~~~~~~~~~~
496

    
497
Interfaz que permite convertir una capa gvSIG en una capa WW o en un modelo de elevación. Este proceso depende del tipo de capa y el modo de carga definido.
498

    
499
* convertToLayer(FLayer layer) : gov.nasa.worldwind.layers.Layer
500

    
501
  Método que a partir de una capa gvSIG obtiene una capa WW.
502

    
503
* convertToElevationModel(FLayer layer) : gov.nasa.worldwind.globes.ElevationModel
504

    
505
  Método que permite convertir una capa de gvSIG en un ElevationModel el cual representa una elevación del terreno.
506

    
507
DefaultLayerConverter
508
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
509

    
510
Implementación por defecto de la interfaz LayerConverter. Esta clase permite convertir una capa de gvSIG en un DataRaster genérico el cual permitirá pintar la zona requeridas mediante el método ``FLayer#draw(image,graphics,viewport,scale)``. 
511

    
512
RasterTiledImageLayer extends BasicTiledImageLayer
513
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
514

    
515
Implementación de una capa WW. Entre otras funcionalidades, esta capa gestiona las peticiones de texturas e imágenes que recibe por parte de la aplicación así como la composición de tiles para un sector en concreto, las diferentes resoluciones por nivel de detalle y la creación de tareas para la recuperación / generación de tiles.
516

    
517
Esta capa tiene enlazado un objeto DefaultRetrieverFactory que le permite a la capa crear objetos DefaultRasterRetriever para gestionar las peticiones de datos para la creación de tiles.
518

    
519
En principio solo que habrá que sobrescribir los constructores de la clase BasicTiledImageLayer para que cuando se instancie una capa RasterTiledImageLayer se instancie también un DefaultretrieverFactory a partir de los parámetros.
520

    
521
DefaultRetrieverFactory implements RetrieverFactory
522
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
523

    
524
Implementación por defecto de un RetrieverFactory. Representa la factoría para la creación de instancias de objetos Retriever.
525

    
526
* createRetriever(AVList params, RetrievalPostProcessor postProcessor) : Retriever
527

    
528
  Instancia una implementación de la interfaz Retriever a partir de una lista de parámetros y un RetrievalPostProcessor que recibe como parámetro y una instancia local de RasterServer.
529

    
530
DefaultRasterRetriever implements Retriever
531
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
532

    
533
Implementación por defecto de Retriever. Esta clase gestiona las peticiones de imágenes que recibe por parte de la capa. Permite configurar tiempos de respuesta como timeouts, tiempo de expiración... además permite saber el estado en que se encuentra el retriever.
534

    
535
DefaultRasterServer implements RasterServer
536
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
537

    
538
Implementación por defecto de la interfaz RasterServer. Como su nombre indica esta clase representa un servidor de raster que atiende a las peticiones realizadas por objetos Retriever. Cuando recibe una petición mediante el método ``RasterServer#getRasterAsByteBuffer()`` accede al DataRaster que tiene asociado obtiene la información que precisa y la devuelve en un objeto de tipo java.nio.ByteBuffer.
539

    
540
* getRasterAsByteBuffer(AVList params) : ByteBuffer
541

    
542
  Obtiene del DataRaster asociado la información definida en los parámetros que recibe y la devuelve en un objeto java.nio.ByteBuffer.
543

    
544
* getSector() : Sector
545

    
546
  Obtiene el sector del data raster asociado.
547

    
548
DefaulDataRasterReaderFactory extends BasicDataRasterReaderFactory
549
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
550

    
551
Factoría que permite la creación de nuestra implementación DefaultDataReaderRasterReader a partir de un objeto de tipo DataStore.
552

    
553
* findReaderFor(Object source, AVList params) : DataRasterReader
554

    
555
  Obtiene la instancia de DataRasterReader apropiada para la lectura de la fuente de datos.
556

    
557
DefaultDataRasterReader extends AbstractDataRasterReader
558
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
559

    
560
Permite saber si se puede leer y obtener objetos DataRaster a partir de DataStore validando lo parámetros y metadatos del almacén.
561

    
562
* canRead(Object source, AVList params) : boolean
563

    
564
  Obtiene si este DataRasterReader es capaz de leer la fuente de datos y crear objetos DataRaster.
565

    
566
* read(Object source, AVList params) throws java.io.IOException : DataRaster[]
567

    
568
  Lee de la fuente de datos y crea objetos DataRaster
569

    
570
* readMetadata(Object source, AVList params) throws java.io.IOException : AVList
571

    
572
  Obtiene los metadatos asociados a las fuente de datos. Los metadatos varían en función de la fuente y el DataRasterReader.
573

    
574
* isImageryRaster(Object source, AVList params) : boolean
575

    
576
  Obtiene si la fuente de datos es de tipo raster imagen.
577

    
578
* isElevationsRaster(Object source, AVList params) : boolean
579

    
580
  Obtiene si la fuente de datos es de tipo imagen
581

    
582
GvSIGLayerDataRaster implements DataRaster
583
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
584

    
585
Representa información raster. Esta clase recibe peticiones de datos para la generación de tiles por lo que es la encargada de mediante el método ``FLayer#draw()`` de la capa que tiene asociada pintar la sección requerida.
586

    
587
* getWidth() : int
588

    
589
  Obtiene el ancho en píxeles del raster.
590

    
591
* getHeiht() : int
592

    
593
  Obtiene el alto en píxeles del raster.
594

    
595
* drawOnTo(DataRaster canvas) : void
596

    
597
  Copia la información de este raster al especificado por parámetro. Es usado para hacer peticiones de datos sobre zonas determinadas por el tamaño y posición del DataRaster especificado.
598

    
599
* getSubRaster(AVList params) : DataRaster
600

    
601
  A partir de los parámetros que recibe obtiene una sección del raster.
602

    
603
* getSubRaster(int with, int height, Sector sector, AVList params) : DataRaster
604

    
605
  A partir de los parámetros que recibe obtiene una sección del raster.
606

    
607
View3D APP
608
----------------
609

    
610
Este es el módulo donde se encuentran los diferentes plugins de la librería. Se deben implementar en total cinco plugins. Por un lado, habrá un plugin llamada **org.gvsig.view3d.app.common** el cual contiene todas las extensiones de la librería y los paneles de preferencias de aplicación y de propiedades de vista. Además, debe de tener las dependencias comunes a todas las plataformas y el archivo de configuración "config.xml" para la creación de las entradas de menú y botones en gvSIG. Por otro lado, debe de haber un plugin por cada plataforma el cual no debe de contener ninguna clase debido a que ya se encuentran en el plugin "common". Este plugin solo debe de gestionar las dependencias nativas con la plataforma correspondiente y preparar el empaquetado JAR para que se despliegue como si fuera un plugin normal usando el archivo de configuración del plugin org.gvsig.view3d.app.common así como sus dependencias junto con las dependencias nativas. El resultado esperado debería ser:
611

    
612
* org.gvsig.view3d.app
613

    
614
  - about
615
  - i18n
616
  - images
617
  - lib
618

    
619
    + dependencias comunes
620
    + dependencias nativas de la plataforma
621

    
622
  - config.xml
623
  - package.info
624

    
625
Plugin common
626
~~~~~~~~~~~~~~~~~~~~~~
627

    
628
El plugin common (org.gvsig.view3d.app.common) estará compuesto por tres extensiones: View3DExtension, RefreshView3DExtension y SynchronizeView3DExtension. Además, gestionará la persistencia de las opciones establecidas por el usuario.
629

    
630
* View3DExtension: extensión de Andami asociada a dos acciones: "flat-view3d" y "sphere-view3d". Esta extensión deberá estar siempre visible y activa solo cuando se active una vista 2D con un capa o más. Las dos acciones obtendrán la instancia del View3DSwingManager, crearán el panel, añadirán las capas de la vista activa, y lo mostrarán.
631
* RefreshView3DExtension: extensión de Andami asociada a la acción: "refresh-view3d". Esta extensión deberá estar visible cuando se active un visor 3D y siempre activa. La extensión obtendrá la instancia de tipo ViewPanel3D y ejecutará la operación ``ViewPanel3D#synchronizeLayers()``.
632
* SynchronizeView3DExtension: extensión de Andami asociada a la acción: "synchronize-view3d". Esta extensión deberá estar visible cuando se active una vista3D y siempre activa. La extensión obtendrá la instancia de tipo ViewPanel3D y ejecutará la operación ``ViewPanel3D#synchronizeViewPorts()``.
633

    
634
Preferencias
635
~~~~~~~~~~~~~~~~~~~~~~
636

    
637
El plugin view3D maneja diferentes tipos de preferencias que dependiendo de a que afecten se sitúan en un lugar u otro. Existen tres tipos: preferencias 3D de capa, preferencias de vista y preferencias generales.
638

    
639
Preferencias 3D de capa
640
________________________
641

    
642
La preferecias de capa afectan solo a una capa. Esta preferencias serán accesibles desde la propiedades de capa del menu contextual del TOC. Para añadir una nueva pestaña a las propiedades de una capa, nuestro panel de propiedades 3D debe extender de la clase ``AbstractThemeManagePage``. La clase que representa la vista se creará dentro de `Plugin common`_ y usuará como modelo la clase `LayerProperties3D`_. A continuación se muestra dos *mockups* de los paneles. El primero representa los parámetros configurables cuando el modo de carga es *Vectorial rasterizada* e *Imagen raster* mientras que el segundo *mockup* representa las opciones configurables cuando el modo de carga es *Modelo ditital del terreno*.
643

    
644
.. image:: images/layer-properties-raster.jpg
645

    
646
Mockup 1: Panel de propiedades cuando el modo de carga es *Vectorial rasterizada* o *Imagen raster*.
647
Explicación de las propiedades:
648

    
649
* Formato de imagen: formato de los tiles generados. Las opciones disponibles son png, jpg, jpeg y dds.
650
* Nivel de detalle: numero mínimo y máximo de nivel de detalle. Para el valor óptimo dejar en blanco.
651
* Resolución nivel cero: resolución en el nivel cero. Por defecto se calcula el valor óptimo teniendo en cuenta el número de niveles de detalle y el tamaño del pixel del raster. En la posición central se situa el valor por defecto, el cual es aumentado o reducido si el usuario establece una resolución baja o alta en el nivel cero.
652
* Tamaño de tesela: tamaño en pixeles de los tiles generados.
653

    
654
.. image:: images/layer-properties-mdt.jpg
655

    
656
Mockup 2: Panel de propiedades cuando el modo de carga es *Modelo digital del terreno*.
657
Explicación de las propiedades disponibles:
658

    
659
* Formato de la imagen: formato de los tiles de elevación generados. Se puede elegir entre Bil16 o Bil32.
660
* Campo altura: al elegir sobre una capa vectorial el modo de cargar MDT, este campo se activa para indicar que campo del FeatureType representa la altura. Si la capa no es de tipo vectorial este campo aparecerá deshabilitado.
661
* Unidades del valor altura: Unidades del valor alutura. Dos opciones: metros y pies.
662
* Valor No Data: Valor del No Data. Todos los pixeles con este valor no se representarán en el visor.
663
* Nivel de detalle: numero mínimo y máximo de nivel de detalle. Para el valor óptimo dejar en blanco.
664
* Resolución nivel cero: resolución en el nivel cero. Por defecto se calcula el valor óptimo teniendo en cuenta el número de niveles de detalle y el tamaño del pixel del raster. En la posición central se situa el valor por defecto, el cual es aumentado o reducido si el usuario establece una resolución baja o alta en el nivel cero.
665
* Tamaño de tesela: tamaño en pixeles de los tiles.
666

    
667

    
668
Properties3DManager extends AbstractThemeManagerPage
669
''''''''''''''''''''''''''''''''''''''''''''''''''''
670

    
671
* getName()
672

    
673
  Obtiene el nombre de la pestaña que mostrará el panel. En este caso "3D".
674

    
675
* getPriority()
676

    
677
  Obtiene la priporidad del panel. Cuanta más prioridad más a la izquierda aparecerá.
678

    
679
* acceptAction()
680

    
681
  Método ejecutado cuando el botón "Aceptar" es pulsado. Delega en el método Properties3DManager#applyAction().
682

    
683
* applyAction()
684

    
685
  Método ejecutado cuando el botón "Aplicar" es pulsado. Se debe obtener los valores de los campos del panel de propiedades y actualizar el modelo de la capa correspondiente.
686

    
687
* cancelAction()
688

    
689
  Método ejecutado cuando el botón "Cancelar" es pulsado. Se deben de descartar todos los cambios efectuados sobre el modelo de la capa.
690

    
691
* setModel(FLayer)
692

    
693
  Método ejecutado al abrir el panel de propiedades. Debe de obtener el modelo a partir de la capa y actualizar los campos del panel.
694

    
695
Preferencias 3D de vista
696
________________________
697

    
698

    
699

    
700

    
701

    
702
Persistencia
703
~~~~~~~~~~~~~~~~~~~~~~
704

    
705
.. note::
706
   TODO