Empezar con WorldWind

De ChuWiki

WorldWind es una librería, desarrollada por la NASA, opensource y gratuita en java con código nativo que nos permite desarrollar fácilmente aplicaciones estilo Google Earth. Veamos aquí como hacer un "Hola Mundo" con esta librería.


Descarga de WorldWind[editar]

Lo primero, por supuesto, es descargarse WorldWind. Podemos hacerlo desde aquí http://worldwind.arc.nasa.gov/java/ desde el enlace "WorldWind Java SDK 2.0" (que es la versión más moderna en el momento de escribir este tutorial). Nos lleva a una página de licencia que debemos aceptar. Una vez hecho, obtenemos el zip que debemos descargar en cualquier lugar de nuestro gusto.

En este zip viene los jar, las librerías nativas necesarias y los fuentes tanto de la librería como el código de los ejemplos que pueden verse en http://goworldwind.org/demos/


Proyecto eclipse[editar]

En eclipse (o nuestro IDE favorito), creamos un proyecto java normal. Ahora sólo debemos añadir los jar de worldwind a nuestro proyecto eclipse. Los jar que debemos añadir se encuentran en el directorio principal de WorldWind y son los siguientes:

  • gdal.jar
  • gluegen-rt.jar
  • jogl.jar
  • worldwind.jar
  • worldwindx.jar

El siguiente paso, es opcional, puede ser necesario si intentamos leer ficheros de mapas que tengamos en nuestro PC. De momento, para este ejemplo, te lo puedes saltar.

Si queremos leer ficheros de mapas que tengamos en nuestro PC, es posible que necesitemos las librerías nativas (.dll) de GDAL. GDAL es una librería también gratuita que permite leer muchísimos formatos de mapa, y convertir unos a otros. La librería GDAL viene incluida con WorldWind, por lo que no es necesario descargarla. El directorio donde están estas librerías es en PATH_DE_WORLDWIND\lib-external\gdal . Si necesitamos incluirlas, en nuestro main() que vamos a hacer podemos poner lo siguiente

System.setProperty("java.library.path", "PATH_DE_WORLDWIND/lib-external/gdal");

o bien como una opción -D en el arranque de nuestra máquina virtual.

java -Djava.library.path=PATH_DE_WORLDWIND/lib-external/gdal ....

esto último, en eclipse, se hace en "Run" -> "Run Configurations ...", buscamos la configuración de arranque de nuestra clase con main (que sólo estará si hemos arrancado al menos una vez nuestro main) y rellenamos como en la siguiente imagen

El main mínimo[editar]

El código mínimo que necesitamos hacer para ver nuestro mapa es el siguiente (extraído de http://ifgi.uni-muenster.de/worldwind-tutorial/?page_id=7)

package com.chuidiang.ejemplos.worldwind;

import gov.nasa.worldwind.BasicModel;
import gov.nasa.worldwind.awt.WorldWindowGLCanvas;

import javax.swing.JFrame;

public class MainMinimo extends JFrame {

   public MainMinimo() {
      WorldWindowGLCanvas wwd = new WorldWindowGLCanvas();
      wwd.setPreferredSize(new java.awt.Dimension(1000, 800));
      this.getContentPane().add(wwd, java.awt.BorderLayout.CENTER);
      wwd.setModel(new BasicModel());
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            JFrame frame = new MainMinimo();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
         }
      });
   }
}

y el resultado es la siguiente pantalla

El mapa se maneja con los controles que tenemos por costumbre en google earth

  • Un click en una posición gira la bola del mundo para centrarnos en esa posición
  • Arrastrando con el ratón podemos girar la bola del mundo.
  • Arrastrando con el botón derecho del ratón podemos cambiar el punto de vista.
  • Con la rueda del ratón hacemos zoom.

Veamos el código[editar]

Veamos alguna explicación del código.

WorldWindowGLCanvas es un componente visual de SWT que podemos manejar como cualquier otro componente Swing de java (botones, cajas de texto, etc), es decir, lo podemos añadir en cualquier panel o ventana que queramos como un componente más. Este WorldWindowGLCanvas es el gráfico del mapa y el que tiene toda la "magia". Le damos un tamaño preferido como a cualquier otro componente swing por medio de su método setPreferredSize().

A WorldWindowGLCanvas debemos indicarle qué mapas mostrar. Eso se hace por medio de la llamada wwd.setModel(new BasicModel()). El modelo puede ser lo que queramos siempre que implemente la interfaz Model. World Wind nos ofrece un modelo ya hecho llamado BasicModel y que nos muestra un montón de posibles capas de mapa. Entre ellas, las visibles, son las de satélite que la NASA tiene públicos. El modelo básico tiene muchas capas con mapas distintos (nasa, open street map, etc), pero no todas son visibles. Veamos como añadir un panel que nos permita ver estas capas

Panel con las capas disponibles[editar]

Si detrás de la línea setModel() añadimos lo siguiente

...
      wwd.setModel(new BasicModel());
      
      LayerPanel panelCapas = new LayerPanel(wwd);
      this.getContentPane().add(panelCapas, BorderLayout.WEST);
...

Sólo hemos creado una instancia de LayerPanel (otra clase de World Wind) pasándole en el constructor nuestro componente mapa wwd. El resultado será un panel con "checks" en el lado izquierdo, con cada una de las capas disponibles, como se muestra en la siguiente figura.