Oct 28

Geoserver, PostGIS y OpenLayers

mapa de geoserverÚltimamente estoy jugando con el tema de pintar mapas en web (aparte de la API de google maps). Buscando herramientas me he encontrado con el conjunto Geoserver, PostGIS y OpenLayers. Son herramientas independientes, pero que encajan muy bien las unas con las otras, facilitando mucho el hacer mapas en web.

PostGIS es un añadido a una base de datos Postgresql que permite almacenar información de mapas y cosas para dibujar en los mapas en un formato bastante estándar y que entienden muchas herramientas. En ella podemos crear nuestras tablas a medida, pero de forma que determinadas columnas, las que nosotros queramos, representen la información geográfica en un formato determinado. Por ejemplo, podemos hacer nuestra tabla de aviones con todos sus datos y en una columna poner su posición y altura en un formato específico de PostGIS. En otra tabla geometry_columns, específica de PostGIS, sólo debemos hacer una entrada indicando el nombre de nuestra tabla aviones, cual es la columna con las coordenadas y el tipo de figura que hay ahí (en este caso, punto en 3D, aunque podríamos tener polígonos, líneas y otras formas geométricas).

GeoServer es un servidor web de mapas, que puede arrancarse aislado o bien sobre un Tomcat o similar. GeoServer tiene una interfaz de administración web en la que podemos definir capas de datos, por ejemplo, una imagen de mapa de fondo cogido de un fichero, o un mapa vectorial cogido de algún fichero o de una base de datos, o una capa de aviones cogida de la base de datos PostGIS. En este último caso, simplemente dando los parámetros de conexión con la base de datos, GeoServer consultará la tabla geometry_columns para identificar qué tablas de base de datos tiene datos georreferenciados y nos las mostrará, para que elijamos que queramos. Para cada capa podemos definir estilos de presentación, tipos de líneas, de marcas.

OpenLayers es una librería javascript que es capaz de conectarse con GeoServer (o con otras fuentes de mapas, como google maps), para presentar en nuestro navegador las capas que elijamos de nuestro servidor de mapas/datos. En cuatro líneas podemos presentar el mapa, tenemos zoom, arrastrar, click sobre las entidades que aparezcan en el mapa, etc, etc. Puedes ver ejemplos en http://openlayers.org/dev/examples/

El problema el de siempre, o lees un montón de documentación, o empiezas con copìa ejemplo, pega ejemplo, ensayo y error. La documentación de GeoServer se basa mucho en ejemplos. Así que las cosas van saliendo, pero también tienes pequeños tropezones que te pueden hacer echar la tarde entera para resolver algo que luego es una chorrada. Hoy, por ejemplo, he echado la tarde intentando que se vean dos capas simultáneamente, una de fondo con un mapa y otra encima con puntos. El problema es que la una tapaba a la otra y no sabes si la transparencia de la de encima debes conseguirla en GeoServer o en OpenLayers. Al final fue pasándole desde OpenLayers un parámetro a GeoServer cuando se pide la capa….

Oct 20

Jugando con Proguard

Candado de código ofuscado Estos días estoy jugando con Proguard, una herramienta que coge nuestro jar en java y realiza básicamente tres tareas: ofuscarlo, optimizarlo y eliminar sobrantes. Por supuesto, estas tareas son independientes y podemos realizar unas sí y otras no a nuestro gusto. Tiene plugin para maven, por lo que si usamos maven, podemos realizar cualquiera de estas tres tareas automáticamente al generar nuestro jar.

Ofuscado

La parte de ofuscado es sencilla, símplemente coge los paquetes, las clases y los métodos y les cambia el nombre por a, b, c, etc. Así, en vez de persona.setId(7), si descompilamos veríamos a.b(7). Es decir, se puede seguir descompilando pero el código es mucho menos claro.

Tiene opciones para decirle qué clases o métodos no debe ofuscar. Son candidatos claros a no ofuscar el método main() de la clase principal e incluso el nombre de esa clase, para que luego la máquina virtual java sepa qué debe ejecutar. Los métodos write() y read(9 de serialización, etc. También, en el caso de que estemos intentando ofuscar una librería, se deben no ofuscar las clases que se usen desde el programa principal.

Curiosamente, proguard es bastante inteligente y tiene en cuenta la relexión de java. Si ve que usamos cosas como Class.forname(), o Class.getDeclaredMethod()…., nos avisa con un error si intentamos ofuscar las clases a las que hace referencia esa reflexión.

Optimizado

Con esto no me he metido a fondo, porque no hay muchas posibilidades de ver qué es lo que hace. Entiendo que limpia nuestro código ineficiente, borrando variables locales no usadas o arreglando cualquier cosa que tenga que ver con la efectividad de nuestro código.

Eliminar sobrantes

Esta es la funcionalidad que no esperaba de la herramienta y que más me ha llamado la atención. Elimina de nuestro jar todas las clases que no usamos y borra todos los métodos que no se usan en el resto de clases. ¿Y cómo sabe si lo usamos o no?. Pues por la clase que le hemos dicho que contiene el main(). Empieza a tirar de ahí y borra todo lo que no se use. El resultado es que en muchas ocasiones obtendremos un jar mucho más pequeño si llevamos tiempo trabajando en el proyecto y somos reacios a borrar clases y métodos que no se usan "por si acaso me hacen falta más adelante".

Y ya lo máximo, al integralo en maven, el proceso queda totalmente automático, por lo que una vez configurado en nuestro pom.xml, podemos olvidarnos de que usamos esa herramienta y seguir con nuestros comandos de maven típico mvn package, mvn install, mvn deploy, etc. Eso sí, ojo al hacer el javadoc.