Dibujar iconos con WorldWind

De ChuWiki
Saltar a: navegación, buscar

Vamos a pintar unos iconos sobre nuestro mapa World Wind. Los iconos que aparecen en las fotos y a los que referencia el código los he bajado de http://www.iconarchive.com/tag/weather-forecast

Añadir tooltip al mapa

Además de dibujar los iconos, vamos a hacer que aparezca un pequeño texto (tooltip) cuando paseamos por encima de ellos el ratón. Para esto, a nuestro canvas de dibujo de mapa (WorldWindowGLCanvas) debemos añadirle un "controlador" de tooltips. Worldwind nos ofrece uno y añadirlo es tan fácil como poner la siguiente línea de código

new ToolTipController(wwd, AVKey.DISPLAY_NAME, null);

siendo wwd la instancia de nuestro WorldWindowGLCanvas y ni siquiera es necesario guardarnos la instancia de ToolTipController en ningún sitio.

Añadir los iconos

Para añadir iconos al mapa, necesitamos una capa de iconos. Esta capa es la clase IconLayer. Sólo tenemos que instanciarla y añadirla de nuestra forma habitual al canvas del mapa

      IconLayer capa = new IconLayer();
      capa.setName("Iconos");
      ApplicationTemplate.insertBeforeCompass(wwd, capa);
      panelCapas.update(wwd);

Hemos hecho el new. Le hemos puesto un nombre con setName(), que será visible en el panel de capas disponibles del mapa. Hemos insertado la capa en el mapa con el método ApplicationTemplate.insertBeforeCompass(), tal cual explicamos en Pintar poligonos en WorldWind y finalmente, actualizamos el panel que muestra las capas (instancia de LayerPanel) llamando a su método update().

Los iconos son la clase UserFacingIcon. Nos basta hacerle un new indicando la fuente de la imagen (en este caso será un path de fichero png) y una posición en el mapa, que puede incluir altura en metros además de latitud y longitud

UserFacingIcon userIcon = new UserFacingIcon("files/forecast/Status-weather-clear-icon.png",
   Position.fromDegrees(latitud, longitud, altura));

Podemos además hacer que tenga un tamaño independiente del tamaño de la imagen llamando a setSize()

userIcon.setSize(new Dimension(64, 64));

Habíamos dicho que íbamos a ponerle un tooltip al icono. Eso se hace llamando al método setValue() del icono, que admite como parámetros una clave y un valor. La clave para el tooltip es AVKey.DISPLAY_Name y el tooltip debe ser un texto.

userIcon.setValue(AVKey.DISPLAY_NAME, "el tiempo");

Este método setValue() no sólo lo tienen los iconos y no sólo sirve para poner tooltip. Lo tienen todas las entidades que se puede dibujar en el mapa (como polígonos y otras formas geométricas, además de iconos) y admite cualquier pareja clave (un String) y valor (un Object), por lo que nos sirve para guardar cualquier atributo que queramos en el icono. Únicamente saber que hay determinadas claves (como AVKey.DISPLAY_NAME que es un String de valor "gov.nasa.worldwind.avkey.DisplayName") que WorldWind tiene en cuenta y puede hacer cosas con ellas, como usarlas para tooltip en este caso concreto.

Finalmente sólo nos queda añadir el icono a la capa correspondiente y decirle al mapa que se repinte

capa.addIcon(userIcon);
wwd.redraw();

En la siguiente imagen tienes el resultado, aunque en el código real en vez de dibujar un solo icono, hemos dibujado cinco iconos distintos de previsión del tiempo en posiciones aleatorias. Puedes ver el código completo en CapaIconos.java

Worldwind-iconos.png