5. Adquisición de información geográfica y tratamiento para su uso
5.2 Transformación de la información de texto a imagen
Cuando hablamos de nuestro proyecto no podemos pasar por alto una de las partes más importantes de nuestra aplicación, la cual tiene que ver con la obtención del archivo XML (Extensible Markup Language, lenguaje de marcas en castellano), para poder ser tratado por el algoritmo de nuestra la aplicación, y el archivo PNG (Portable Network Graphics, gráficos de red portables en castellano), que correspondería con la imagen del mapa referenciada por el archivo XML anteriormente citado.
En el principio del estudio de las medidas a tomar para poder llegar a conseguir dichos objetivos teníamos bastante claro que la obtención del archivo XML debía ser a través del completo API que nos ofrecía OpenStreetMap ya que, como hemos comentado anteriormente, tienen puesto a disposición de los internautas un sencillo tutorial en su página web que facilita la comprensión del mismo.
Para ello sólo nos hacía falta conectarnos con la página web que hace referencia el API de OpenStreetMap introduciendo los valores de las coordenadas superiores e inferiores que delimitan al XML del terreno del cual se quiere obtener la información.
www.openstreetmap.com/api/0.5/map?bbox=left,bottom,right,top
Sabiendo que los valores que debemos introducir son left (es la longitud más al oeste del mapa), bottom (es la latitud más al sur del mapa), right (es la longitud de más al este del mapa) y top (es la latitud más al norte del mapa).
Tenemos que dejar claro que la petición al API debe ser razonable sino queremos que su respuesta sea errónea, es decir, los datos de la petición deben ser coherentes y siempre dentro de unas normas, por ejemplo, no podemos seleccionar un archivo XML
correspondiente a un mapa cuya latitud máxima y mínima sea la misma porque de ese modo no se podría mostrar el mapa, sería una petición un tanto absurda.
Con ello obtendremos directamente el contenido del archivo XML que utilizaremos como posteriormente comentaremos en la memoria.
Por otro lado, la obtención de la imagen del mapa (PNG) correspondiente al archivo XML quedaba menos clara y se abrieron desde el principio dos claras vías de trabajo para conseguirlo.
La primera alternativa de cómo obtener el archivo imagen del mapa era descargarlo directamente a través de la red por medio de algún servidor de mapas. Esta idea surgió al ver la forma de trabajar del programa JOSM, ofrecido por la iniciativa OpenStreetMap, que es el cauce para la creación y modificación de los mapas almacenados en la base de datos de la iniciativa por parte de los colaboradores anónimos de la red. Para ello se pasó a la fase de adquisición de información sobre los servidores de mapas disponibles en la red, pensando siempre en la compatibilidad de los mismos con la idea de nuestro proyecto. La mayoría de las propuestas encontradas a través de la red fueron finalmente rechazadas por sus grandes diferencias con lo que verdaderamente nosotros queríamos para nuestro proyecto. Por un lado, había candidatos que nos ofrecían mapas con gran cantidad de información que nuestra aplicación no necesitaba y cargaba enormemente el tráfico de nuestra aplicación con Internet o por el contrario escaseaban de esta. En muchas ocasiones nuestro problema fue que alguno de los servidores de mapas hallada por la red no dispensaba de forma gratuita estos, estos se rechazaron directamente.
La segunda alternativa, la que finalmente se ha implementado, nació gracias a la búsqueda en las páginas de consulta para desarrolladores de la iniciativa OpenStreetMap. En esta página aconsejaban este método y explicaban el mismo, con alguna otra alternativa según el sistema operativo o los programas a utilizar, paso a paso para poder llevarlo a buen fin.
En nuestra aplicación se desarrolla una de estas versiones explicada en la página de desarrolladores de OpenStreetMap que consiste de forma global en la obtención del archivo imagen, PNG, a partir del archivo XML correspondiente al mismo utilizando para ello hojas de estilo y un programa ofrecido por la iniciativa.
Una vez obtenido el archivo XML a través del API, como se ha comentado a lo largo de esta explicación, se procede a crear un archivo de tipo SVG (Scalable Vector Graphics) que sirva de nexo entre el archivo XML y el archivo PNG, para ello se procede a utilizar el programa XML Startel proporcionado por la página de desarrolladores. Este programa crea un archivo SVG a partir del ya obtenido archivo XML con la ayuda de una hoja de estilo (osmarender.xsl) y un archivo que contiene unas reglas propias de OpenStreetMap (osm-map-features-z17.xml). Estas reglas observan la forma del archivo XML y según esta dan un formato u otro al archivo resultante. Se quiere obtener este tipo de fichero ya que en su esencia es un vector de gráficos, una imagen.
Después de haber utilizado el programa citado para conseguir el archivo SVG, como paso final, transformamos el archivo SVG a PNG. El motivo de este paso es poder pasar el fichero a un tipo de archivo compatible con nuestra aplicación y de este modo poder
hacer uso de él. Este proceso se realiza mediante la aplicación aconsejada por OpenStreetMap, Inkscape, estando especializada en dichas actuaciones. Dado que el applet de nuestro proyecto tiene unas dimensiones características a la vez de la transformación anterior se procede a modificar su tamaño, dejando este en 580x530 pixeles. Este dato es muy importante de cara al calibrado de las coordenadas UTM dentro del marco de los pixeles.
A continuación un pequeño esquema de este proceso.
Todo este proceso se encuentra implementado dentro de nuestro proyecto en forma de web service dentro de nuestro gran módulo de la aplicación servidor, que como se ha comentado anteriormente, es una aplicación colgada en una web que resuelve peticiones y ofrece diversos servicios a un cliente dado.
El servicio web que se encuentra diseñado en nuestro proyecto oferta dos tipos de servicios: uno que obtiene un archivo XML desde la web y otro que busca un nuevo archivo XML en la web y convierte este en una imagen apta para utilizarla.
El primero recibe una petición del cliente junto con una cadena de caracteres. Esta cadena de caracteres representa un lugar arbitrario elegido por la conciencia del usuario. Al recibir esta petición, nuestro servicio web contacta con una página web propiedad de OpenStreetMap consiguiendo en un archivo XML un listado de los posibles lugares, con las coordenadas UTM de su localización, que coinciden con la cadena de caracteres introducida. Una vez realizado este proceso, el servicio web devuelve el listado de los posibles coincidencias con la cadena de caracteres introducida. Expresaremos lo explicado con un ejemplo.
osmarender.xsl osm-map-features.xml SVG PNG XML Inkscape XML Startel
El segundo servicio que oferta nuestro web service es el que recibe la elección de una de las coincidencias devuelta por el servicio web y ejecuta el proceso que anteriormente se ha explicado, es decir, se comunica con OpenStreetMap para conseguir el archivo XML del lugar exacto requerido por el usuario, transforma este a un archivo SVG y finalmente convierte este último en un PNG.
Todo este proceso se realiza dentro de nuestra aplicación Java utilizando la clase Process, la cual es un hilo que ejecuta programas externos a Java. Es necesario el uso de hilos en este proceso al ser necesaria la sincronización dado que el orden de ejecución de los mismos está directamente relacionado con la terminación exitosa del proceso.
Madrid
Madrid Listado coincidencias Listado coincidencias
-Madrid Capital España-Las rozas de Madrid
Para que resulte más visual, se ilustrará mediante un dibujo esquemático el proceso aquí descrito.