Revision 484 2.1/trunk/doc/dt-visor-3d.rst

View differences:

dt-visor-3d.rst
63 63
Diseño técnico
64 64
=====================
65 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.
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, la arquitectura de plugins, las gestión de preferencias y por último la persistencia.
67 67

  
68 68
Ejemplo de caso de uso
69 69
-------------------------------
70 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.
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 72

  
73 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 74

  
75 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 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
* Formato: formato de los tiles generados. Depedendido del modo de carga y de las preferencias establecidas por el usuario puede variar entre estos formatos.
78
* Resolución en el nivel cero de detalle: permite aumentar la resolución o diminuirla en el nivel cero. Al aumentar la resolución al nivel cero los niveles posteriores también aumentan la resolución. Al contrario ocurre si disminuimos la resolución al nivel cero. 
79
* Tamaño de tesela: tamaño de los tiles generados.
80
* Elevación: indica si la capa es de elevación o no.
81
* Valor No Data: valor No Data.
82
* Unidades de elevación: unidades en las que esta representada el valor altura. Admite dos tipos de unidades: metros y pies.
77 83

  
78 84
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 85

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

  
84 90
* 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.  
91
* Campo altura: indica el campo que contiene los valores de altura.
85 92

  
86
Si la capa es de tipo raster tiene las siguientes propiedades:
93
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.
87 94

  
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 95
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 96

  
94 97
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()``.
......
198 201

  
199 202
  Asigna en que unidades se encuentra el valor de elvación. Solo acepta dos unidades: metros y pies.
200 203

  
201
RasterLayerProperties3D extends LayerProperties3D
202
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
204
RasterLayerProperties3D implements LayerProperties3D
205
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
203 206

  
204 207
Clase que representa la propiedades 3D de una capa raster. De momento no tiene ninguna propiedad específica.
205 208

  
206
VectorialLayerProperties3D extends LayerProperties3D
207
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
209
VectorialLayerProperties3D implements LayerProperties3D
210
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
208 211

  
209 212
Clase que representa la propiedades 3D de una capa vectorial.
210 213

  
......
224 227

  
225 228
  Asgina que atributo del *FeatureType* contiene la información de elevación. Solo se aplica cuando la capa es de tipo vectorial.
226 229

  
227
.. note::
228
  Falta añadir la propiedades de vista y propiedades generales.
230
MapControlProperties3D
231
~~~~~~~~~~~~~~~~~~~~~~
229 232

  
233
Clase que representa las propiedades 3D de un MapControl3D.
234

  
235
* getVerticalExageration() : double
236

  
237
  Obtiene la exageración vertical del `MapControl3D`_.
238

  
239
* setVerticalExageration(double verticalExageration) : void
240

  
241
  Asigna la exagearación vertical al `MapControl3D`_.
242

  
243
* getAutoViewPortSynchronize() : boolean
244

  
245
  Obtiene si esta activada o no la sincronización automática de enfoques. 
246

  
247
* setAutoViewPortSynchronize(boolean flag) : void
248

  
249
  Asigna un valor a la sincronización automática de enfoques. ``True`` activa la sincronización automática mientras que ``False`` lo esactiva.
250

  
251
* getAutoLayerSynchronize() : boolean
252

  
253
  Obtiene si esta activa o no la sincronización de capas con cambios cuando se activa un visor.
254

  
255
* setAutoLayerSynchronize(boolean flag) : void
256

  
257
  Asigna un valor a la sincronización automática de capas. ``True`` activa la sincronización automática mientras que ``False`` lo esactiva.
258

  
259
* getBlueMarbleLayerVisibility() : boolean
260

  
261
  Obtiene si esta visible o no la capa de fondo BlueMarble.
262

  
263
* setBlueMarbleLayerVisibility(boolean visibility) : void
264

  
265
  Asigna una visibilidad a la capa BlueMarble.
266

  
267
* getNasaLandsatLayerVisibility() : boolean
268

  
269
  Obtiene si esta visible o no la capa Nasa Landsat.
270

  
271
* setNasaLansatLayerVisibility() : boolean
272

  
273
  Asigna una visibilidad a la capa Nasa Landsat.
274

  
275
* getElevationVisiblity() : boolean
276

  
277
  Obtiene si esta visible o no la capa la capa de elevación global.
278

  
279
* setElevationVisibility(boolean visiblity) : void
280

  
281
  Asigna una visibilidad a la capa de elevaciones por defecto.
282

  
283
ViewProperties3D
284
~~~~~~~~~~~~~~~~~~~~~~
285

  
286
* getDefaultViewDimension() : Dimension
287

  
288
  Obtiene el tamaño por defecto de un visor 3D.
289

  
290
* setDefaultViewDimension(Dimension dimension) : void 
291

  
292
  Asigna el tamaño por defecto de un visor 3D.
293

  
294
* getAtmosphereVisibility() : boolean
295

  
296
  Obtiene si es visible o no la capa que representa la atmósfera.
297

  
298
* setAtmosphereVisiblity(boolean visibility) : void
299

  
300
  Asigna una visibilidad a la capa que representa la atmósfera.
301

  
302
* getNorthIndicatorVisibility() : boolean
303

  
304
  Obtiene si es visible o no la capa que representa el indicador del norte.
305

  
306
* setNorthIndicatorVisiblity(boolean visibility) : void
307

  
308
  Asigna una visibilidad a la capa que representa el indicado del norte.
309

  
310
* getScaleVisibility() : boolean
311

  
312
  Obtiene si es visible o no la capa que representa la escala.
313

  
314
* setScaleVisiblity(boolean visibility) : void
315

  
316
  Asigna una visibilidad a la capa que representa la escala.
317

  
318
* getStarBackgroundVisibility() : boolean
319

  
320
  Obtiene si es visible o no la capa que representa el fondo de estrellas.
321

  
322
* setStarBackgroundVisiblity(boolean visibility) : void
323

  
324
  Asigna una visibilidad a la capa que representa el fondo de estrellas.
325

  
326
* getMinimapVisibility() : boolean
327

  
328
  Obtiene si es visible o no la capa que representa el minimapa.
329

  
330
* setMinimapVisiblity(boolean visibility) : void
331

  
332
  Asigna una visibilidad a la capa que representa el minimapa
333

  
334
* getAnimationViewPortSynchronize() : boolean
335

  
336
  Obtiene si esta activa o no la animación de sincronización de enfoques.
337

  
338
* setAnimationViewPortSynchronize(boolean flag) : void
339

  
340
  Asigna un valor para activar o desactivar la animación en la sincronización automática.
341

  
342
* getCachePath() : String
343

  
344
  Obtiene la ruta a la caché.
345

  
346
* setCachePath(String path) : void
347

  
348
  Asigna la ruta que recibe como parámetro a la caché.
349

  
350
View3DManager
351
~~~~~~~~~~~~~~~~~
352

  
353
* getLayerProperties3D(FLayer layer) : LayerProperties3D
354

  
355
  Obtiene las propiedades asociadas a un capa.
356

  
357
* setLayerProperties3D(FLayer layer, LayerProperties3D properties) : void
358

  
359
  Asigna las propiedades a la capa que recibe como parámetro.
360

  
361
* getViewProperties3D() : ViewProperties3D
362

  
363
  Obtiene las propiedades 3D generales de la aplicación.
364

  
230 365
LIB IMPL
231 366
---------
232 367

  
......
234 369

  
235 370
DefaulRasterLayerProperties3D implements RasterLayerProperties3D
236 371
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
372

  
237 373
Implementación por defecto de las propiedades de las capas raster.
238 374

  
239 375
DefaultVectorialLayerProperties3D implements VectorialLayerProperties3D
240
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
376
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
241 377

  
242 378
Implementación por defecto de la propiedades de las capas vectoriales.
243 379

  
......
262 398

  
263 399
  Crea un objeto `MapControl3D`_ a partir del MapContext y el tipo.
264 400

  
265
* getLayerProperties3D(FLayer layer) : LayerProperties3D
266

  
267
  Obtiene las propiedades asociadas a un capa.
268

  
269
* setLayerProperties3D(FLayer layer, LayerProperties3D properties) : void
270

  
271
  Asigna las propiedades a la capa que recibe como parámetro.
272

  
273 401
* getMapControl3D(MapContext theMapContext, TYPE type) : MapControl3D
274 402

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

  
277

  
278
.. note::
279
  Falta especificar las propiedades relacionadas con la vista, las propiedades generales y sus interfaces.
280

  
281 405
MapControl3D
282 406
~~~~~~~~~~~~~~~~~~~~~~
283 407

  
284 408
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.
285 409

  
286
* getCancellable() : Cancellable
410
* getCancellable() : Cancellabl
287 411

  
288 412
  Obtiene el objeto compartido el cual permite cancelar todas las ordenes de pintado que se están ejecutando en un momento dado.
289 413
 
......
293 417

  
294 418
* getType() : TYPE
295 419

  
296
  Obtiene el tipo del visor. Devuelve un objeto enum que puede ser TPYE.SPHERE o TYPE.FLAT (ver `TYPE`_).
420
  Obtiene el tipo del visor. Devuelve un objeto enum que puede ser ``TPYE.SPHERE`` o ``TYPE.FLAT`` (ver `TYPE`_).
297 421

  
298 422
* getVerticalExaggeration() : double
299 423

  
......
505 629

  
506 630
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.
507 631

  
508
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.
632
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.
509 633

  
510
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.
634
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.
511 635

  
512 636
DefaultRetrieverFactory implements RetrieverFactory
513 637
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
514 638

  
515
Implementación por defecto de un RetrieverFactory. Representa la factoría para la creación de instancias de objetos Retriever.
639
Implementación por defecto de un ``RetrieverFactory``. Representa la factoría para la creación de instancias de objetos ``Retriever``.
516 640

  
517 641
* createRetriever(AVList params, RetrievalPostProcessor postProcessor) : Retriever
518 642

  
519
  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.
643
  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``.
520 644

  
521 645
DefaultRasterRetriever implements Retriever
522 646
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
523 647

  
524
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.
648
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.
525 649

  
526 650
DefaultRasterServer implements RasterServer
527 651
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
528 652

  
529
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.
653
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``.
530 654

  
531 655
* getRasterAsByteBuffer(AVList params) : ByteBuffer
532 656

  
......
539 663
DefaulDataRasterReaderFactory extends BasicDataRasterReaderFactory
540 664
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
541 665

  
542
Factoría que permite la creación de nuestra implementación DefaultDataReaderRasterReader a partir de un objeto de tipo DataStore.
666
Factoría que permite la creación de nuestra implementación ``DefaultDataReaderRasterReader`` a partir de un objeto de tipo ``DataStore``.
543 667

  
544 668
* findReaderFor(Object source, AVList params) : DataRasterReader
545 669

  
546
  Obtiene la instancia de DataRasterReader apropiada para la lectura de la fuente de datos.
670
  Obtiene la instancia de ``DataRasterReader`` apropiada para la lectura de la fuente de datos.
547 671

  
548 672
DefaultDataRasterReader extends AbstractDataRasterReader
549 673
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
550 674

  
551
Permite saber si se puede leer y obtener objetos DataRaster a partir de DataStore validando lo parámetros y metadatos del almacén.
675
Permite saber si se puede leer y obtener objetos ``DataRaster`` a partir de DataStore validando lo parámetros y metadatos del almacén.
552 676

  
553 677
* canRead(Object source, AVList params) : boolean
554 678

  
555
  Obtiene si este DataRasterReader es capaz de leer la fuente de datos y crear objetos DataRaster.
679
  Obtiene si este DataRasterReader es capaz de leer la fuente de datos y crear objetos ``DataRaster``.
556 680

  
557 681
* read(Object source, AVList params) throws java.io.IOException : DataRaster[]
558 682

  
559
  Lee de la fuente de datos y crea objetos DataRaster
683
  Lee de la fuente de datos y crea objetos ``DataRaster``.
560 684

  
561 685
* readMetadata(Object source, AVList params) throws java.io.IOException : AVList
562 686

  
563
  Obtiene los metadatos asociados a las fuente de datos. Los metadatos varían en función de la fuente y el DataRasterReader.
687
  Obtiene los metadatos asociados a las fuente de datos. Los metadatos varían en función de la fuente y el ``DataRasterReader``.
564 688

  
565 689
* isImageryRaster(Object source, AVList params) : boolean
566 690

  
......
686 810
Preferencias 3D de vista
687 811
________________________
688 812

  
813
La preferencias de vista solo afectan a los visores enlazados a esa vista. Estas preferencias serán accesibles desde las propiedades de vista del gestor de documentos. Para añadir una nueva pestaña a las propiedades de vista se debe seguir el siguiente post:
689 814

  
815
 http://blog.gvsig.org/2015/02/16/anadir-una-pagina-de-propiedades-al-dialogo-de-propiedades-de-la-vista-en-gvsig-2-1/
690 816

  
817
La clase que representa el panel se creará dentro de `Plugin common`_ y usará como modelo la clase `MapControlProperties3D`_. A continuación se muestra un mockup del panel de propiedades.
691 818

  
819
.. image:: images/mapcontrol3d-properties.jpg
692 820

  
821
Mockup3: panel de preferencias 3D de vista
822
Explicación de los parámetros:
823

  
824
* Exageración vertical visor esférico: muestra la exageración vertical actual del visor esférico. Permite cambiar el valor.
825
* Exageración vertical visor plano: muestra la exageración vertical actual del visor plano. Permite cambiar el valor. 
826
* Sincronización automática de enfoques: permite activar o desactivar la sincronización de enfoques automática.
827
* Sincronización automática de capas: permite activar o desactivas la sincronización de capas cuando se active un visor de forma automática.
828
* Mostrar capa BlueMarble: permite mostrar u ocultar la capa BlueMarble.
829
* Mostrar capa NASA Landsat: permite mostrar u ocultar la capa NASA Landsat.
830
* Mostrar elevación global: permite activar o desactivar la elevación por defecto global.
831

  
832
Preferencias 3D de aplicación
833
_____________________________
834

  
835
La preferencias de aplicación afectan al plugin 3D en general. Estas preferencias serán accesible desde la preferencias de aplicación de gvSIG. Para añadir un nuevo panel a las preferencias general seguir el siguiente post:
836

  
837
 http://blog.gvsig.org/2015/02/05/como-gestionar-las-preferencias-de-un-plugin-en-gvsig-2-1/
838

  
839
La clase que representa el panel se creará dentro de `Plugin common`_ y usuará como modelo la clase `ViewProperties3D`_. A continuación se muestra un mockup del panel de propiedades.
840

  
841
.. image:: images/view3d-properties.jpg
842

  
843
Mockup4: panel de preferencias 3D generales.
844
Explicación de los parámetros:
845

  
846
* Tamaño por defecto: tamaño por defecto del visor 3D cuando se crea.
847
* Mostrar atmósfera: permite mostrar u ocultar la atmósfera.
848
* Mostrar indicator del norte: permite mostrar u ocultar el indicador del norte.
849
* Mostrar minimapa: permite mostrar u ocultar el minimapa.
850
* Mostrar fondo de estrellas: permite mostrar u ocultar el fondo de estrellas.
851
* Mostrar escala: permite mostrar u ocultar la escala.
852
* Ruta de la caché: muestra la ruta de la cache. Permite modificar la ruta.
853
* Borrar caché: permite borra la caché de tiles. Borra la cache de la ruta espeficidada en el momento de accionar el botón.
854
 
855

  
693 856
Persistencia
694 857
~~~~~~~~~~~~~~~~~~~~~~
695 858

  

Also available in: Unified diff