Librería SIGI FRAMEWORK JAVA 2.1 LIBRERÍA SIGI Versión 3.0 AGOSTO 2006 Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 1 Librería SIGI FRAMEWORK JAVA 2.1 1 2 3 4 Introducción................................................................................................. 3 Ejemplo de mapas ...................................................................................... 4 Obtención de coordenadas XY ................................................................... 6 Mapa callejero............................................................................................. 7 4.1 Capas base.......................................................................................... 8 4.2 Capas extendidas o tablas externas .................................................... 9 4.3 Capa entidades resaltadas ................................................................ 10 4.4 Capa entidades rotuladas .................................................................. 10 4.5 Obtención de las capas de un mapa callejero ................................... 13 4.6 Generación de un mapa a partir de los nombres de municipio y calle. 14 4.7 Generación de un mapa a partir de las coordenadas del mapa......... 15 4.8 Generación de una vista de un municipio. ......................................... 15 4.9 Tamaño de los mapas........................................................................ 15 4.10 Ejemplo de creación de un mapa a partir de unas coordenadas X e Y 17 4.11 Ejemplo de creación de un mapa a partir de una dirección ............... 18 4.12 Ejemplo de creación de un mapa de un municipio............................. 19 4.13 Página JSP. ....................................................................................... 20 5 Funciones auxiliares................................................................................ 23 5.1. obtenerRangoPuntos ............................................................................. 23 5.2. obtenerCapas ........................................................................................ 23 5.1. mueveMapa ........................................................................................... 24 6 Mapa Guia................................................................................................. 25 7 Mapa Fit .................................................................................................... 26 8 Mapa temático........................................................................................... 26 9 Código para generar un mapa temático .................................................... 27 9.1 Definición de los datos a representar................................................. 28 9.2 Rango automático a partir de un color inicial y color final .................. 29 9.3 Rango definido por la amplitud de los tramos .................................... 29 9.4 Rango definido por el nº de tramos.................................................... 30 9.5 Definición del area del mapa.............................................................. 30 9.6 Rango en el que se detallan cada uno de los tramos ........................ 31 10 Fichero de configuración ....................................................................... 35 Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 2 Librería SIGI FRAMEWORK JAVA 2.1 1 Introducción Para generar mapas de Geomedia se ha creado un webservice que accede al servicio de Geomedia para solicitar los mapas. Nota importante: determinadas funcionalidades de la versión 2.0 de la librería funcionará únicamente con la nueva versión del webservice. En concreto, únicamente se pueden incluir clausulas where en las capas base con la última versión del webservice (ver sección 4.1). En las aplicaciones que necesiten crear mapas se va a utilizar un módulo en Java que accede al webservice y se conecta a él para solicitar el mapa. La comunicación entre Java y el webservice va a ser mediante mensajes xml. Si la aplicación está desarrollada en forms accederá al módulo Java llamando a la Url correspondiente y pasándole mediante un GET los parámetros que necesite. El siguiente diagrama muestra los distintos componentes que participan en la comunicación para la creación de mapas. Forms Java xml WebServiceSI GI Servicio Geomedia SIGI Van a existir distintos webservices que se parametrizarán para cada Consejería o incluso Dirección General y en cada uno de estos webservices se configuran las capas que se pueden tratar. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 3 Librería SIGI FRAMEWORK JAVA 2.1 Se ha creado una librería para la obtención de mapas del SIGI. Esta librería se llama SIGI y facilita la creación de los distintos ficheros xml y la conexión con el webservice. Actualmente se puede descargar desde la web de soporte una nueva versión con diversas mejoras, entre las cuales se incluyen un conjunto de etiquetas jsp para evitar escribir código repetitivo, así como el uso de la técnica de Remote Scripting para mejorar el funcionamiento de la librería. Mediante esta librería se pueden obtener distintos tipos de mapas desde la programación Java. Los tipos de mapas que se pueden obtener son: Mapa callejero A partir de una posición X e Y o de los datos de una dirección: municipio + calle + portal se obtiene un mapa Mapa guía o índice Mapa general de la Comunidad de Madrid en el que se sitúa destacada la zona del mapa en la que estamos. Mapa fit Mapa general de la Comunidad de Madrid que nos permite ir profundizando en él hasta acceder a la información que nos interese Mapa temático Mapa de municipios en los que los valores de un dato de cada municipio se representan mediante colores 2 Ejemplo de mapas Se ha incluido en la web de soporte java un ejemplo de aplicación con mapas. El ejemplo se llama ejemplo_mapas y se puede acceder a él como http://icmweb01.icm.es/ejemplo_mapas. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 4 Librería SIGI FRAMEWORK JAVA 2.1 Así mismo en la web de soporte java se puede descargar el código y la web del ejemplo en http://icmweb01.icm.es/soja/framework2_0/ejemplos.htm. La última versión de la librería http://icmweb01/soja/librerias.htm. SIGI Para más documentación http://icmaplic01.icm.es:8081/SoporteSIGI. se puede descargar sobre Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras en mapas: Página: 5 Librería SIGI FRAMEWORK JAVA 2.1 3 Obtención de coordenadas XY Alguno de los mapas necesitan información de la coordenadas X e Y del elemento que se desea visualizar. Para obtener esta información se va a partir de los datos de una dirección según los códigos que se encuentran en las tablas de SUCA. Para la obtención de las coordenadas de una calle se han creado dos Paquetes en Base de Datos, un Paquete Local (B.DD. desarrollo) y otro Remoto (B.DD. Sigi) al cual accedemos mediante Databaselink desde las BB.DD locales. El Paquete Local se llama SIS_PAQ_GEO y consta de dos Procedures que están ‘sobrecargadas’, es decir, dos Procedures con el mismo nombre (Obtener_Coordenadas) pero con número de Parámetros diferentes. En el Paquete Remoto es donde se realiza la Query para obtener las coordenadas de la calle solicitada, hay que tener en cuenta que si le pasamos un Portal que no existe, la Query está construida para que recoja las coordenadas del Portal anterior. Desde las diferentes Aplicaciones se hará una llamada al Paquete Local, ésta llamada se puede realizar de dos maneras diferentes dependiendo de si conocemos o no el campo dscalificador de la calle, este campo dscalificador lo encontramos en calles que tienen Portales con un mismo número y letras (por ejemplo Princesa 3, Princesa 3A). * Si NO conocemos el valor del Parámetro dscalificador, la llamada se realizará con los siguientes Parámetros: Parámetros de entrada (in): - Código de Municipio (suca_vial.cdmuni). - Código del Vial (suca_vial.cdvial). - Portal de la calle. Parámetros de salida (out): - xx (coordenadas x). - yy (coordenadas y). Quedando la llamada al Paquete de la siguiente manera: SIS_PAQ_GEO.Obtener_Coordenadas (:CDMUNI, :CDVIAL, :PORTAL, xx, yy); * Si conocemos el valor del campo dscalificador, realizaremos la llamada con los siguientes Parámetros: Parámetros de entrada (in): - Código de Municipio (suca_vial.cdmuni). Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 6 Librería SIGI - FRAMEWORK JAVA 2.1 Código del Vial (suca_vial.cdvial). Portal de la calle. Valor dscalificador. Parámetros de salida (out): - xx (coordenadas x). - yy (coordenadas y). Llamando al Paquete como se detalla a continuación: SIS_PAQ_GEO.Obtener_Coordenadas(:CDMUNI, :CDVIAL, :PORTAL, dscalificador, xx, yy); Cualquiera de las dos llamadas nos debería devolver las coordenadas xx e yy de la calle solicitada, si los valores que devuelven son nulos es porque no se han encontrado dichos valores. 4 Mapa callejero Este tipo de mapa se puede obtener a partir de una posición X e Y o de los datos de una dirección: municipio + calle + portal. (Información de SUCA) El mapa obtenido es en formato CGM y para poder visualizarlo hace falta un ActiveX. Las aplicaciones Java deben incluir el ActiveX para que se descargue automáticamente cuando no está presente. En la librería esta incluída una etiqueta JSP que contiene el código necesario para incluir ese ActiveX en la página. En el ejemplo en la página JSP se han incluido unos botones de navegación que nos permiten modificar la visualización del mapa. Estos controles se pueden incluir utilizando una etiqueta JSP para cada uno de ellos: Permite realizar un acercamiento sobre el mapa sobre el punto central del mapa presentado. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 7 Librería SIGI FRAMEWORK JAVA 2.1 Permite realizar un alejamiento sobre el mapa sobre el punto central del mapa presentado. Permite acercar la vista en función de un área definida por dos puntos marcados por el usuario sobre el mapa Ajusta el mapa a una visualización completa de toda la Comunidad Pulsando uno de estos botones el mapa se desplaza en la dirección señalada según una distancia definida fija. Estos controles están incluídos en la etiqueta que también dibuja el mapa, por lo que si se diseña una página para realizar búsquedas por calle, que no permite la utilización de esta etiqueta, se deben incluir directamente en la página. Estos botones no es obligatorio ponerlos en las aplicaciones, se ponen como ejemplo de lo que se puede hacer. Como se ha comentado anteriormente van a existir varios webservices parametrizados para cada Consejería o Dirección General. A continuación se muestran las distintas capas que se han definido en el webservice del ejemplo: 4.1 Capas base En este tipo de mapas se pueden reflejar las siguientes capas base: o o o o o o o o o o o o o MUNICIPIOS FONDOS MANZANAS PARCELAS EDIFICIOS CALLEJERO PORTALES ORTOIRS2002 ORTOFOTO ROTULO RIOS CANALES EMBALSES Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 8 Librería SIGI FRAMEWORK JAVA 2.1 o ARROYOS Estas capas bases se pueden definir en el fichero de configuración de la aplicación en la variable: sigi.capa.base = MUNICIPIOS,FONDOS,MANZANAS,EDIFICIOS,CALLEJERO,PORTALES También se pueden definir las capas base a través de código de la aplicación; para eso, se define una lista de objetos sigi.bean.CapaBean que tienen los siguientes campos: Nombre Where Reglas Atributos Nombre de la capa. Condición opcional que, en caso de incluirla, debe cumplirse para que se muestre la capa. Condición opcional. Hace referencia al fichero de texto donde va definida la regla que ha de aplicarse para dibujar la capa. Ver documento explicativo. Condición opcional. Indicar el atributo para el que se aplicará la/s regla/s (si es contorno, color de relleno etc…). Ver documento explicativo. Se pueden añadir capas base con reglas de manera automática si en el fichero de configuración se incluyen en la entrada sigi.capa.base.dinamicas. La estructura es: sigi.capa.base.dinamicas=CAPA1:regla1,regla2,..,reglan:atributo1,atributo2,..,atributon;CAPA2:regla1,regla2,..,reglan:atributo1,atributo2,..,atributonn;.......;CAPAn:regla1,regla2,..,reglan:atributo1,atributo2,..,atributo-n Ej: sigi.capa.base.dinamicas=PORTALES:colorPortales,simbPortales:fillcolor,symbolname 4.2 Capas extendidas o tablas externas Una capa extendida nos permite dibujar elementos propios de la aplicación dentro del mapa. Por ejemplo podríamos pintar un símbolo en las coordenadas de los ayuntamientos, colegios, etc. En el ejemplo se ha incluido una capa extendida para los Ayuntamientos. Al incluir esta capa se incluye un símbolo en el mapa para los ayuntamientos y en las direcciones en las que aparezcan un ayuntamiento aparecerá ese símbolo. (En este caso un círculo verde) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 9 Librería SIGI FRAMEWORK JAVA 2.1 La elección de las capas extendidas se va a definir en el fichero de configuración de la aplicación en la variable: sigi.capa.extendida= Pruebas de Farmacias,Casas Consistoriales (Mostraría situación de farmacias y ayuntamientos) Para crear una capa extendida es necesario crear una tabla externa en la que se tengan al menos los siguientes campos: CD_ELEMENTO: Código del elemento. Ha de ser una clave única que identifique al elemento. DS_ELEMENTO: Descripción del elemento que puede ser usado al pasar por encima del mapa. COORDX Coordenada x del elemento. COORDY Coordenada y del elemento. Los nombres de los campos pueden variar de unos webservices a otros. A la capa extendida le vamos a dar un nombre lógico para que desde nuestra aplicación podamos hacer referencia a ella, le tendremos que asignar un símbolo y podemos poner una url a la que se va a llamar cuando se pulse encima el elemento. 4.3 Capa entidades resaltadas Una entidad resaltada es una entidad base que aparece con un color diferente en el mapa para diferenciarla de las otras. Por ejemplo si queremos resaltar el portal de la dirección que hemos buscado, en este caso la entidad resaltada es PORTALES. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 10 Librería SIGI FRAMEWORK JAVA 2.1 Las entidades resaltadas que se quieren se especifican a través de código utilizando una serie de beans. Para ilustrarlo se muestra un ejemplo de cómo hacerlo: /* Se almacena una lista con las capas */ CdidBean bean = new CdidBean(); bean.setNombre("cdid"); bean.setValor("981406"); CdidBean bean2 = new CdidBean(); bean2.setNombre("cdid"); bean2.setValor("981357"); CdidBean bean3 = new CdidBean(); bean3.setNombre("cdid"); bean3.setValor("981356"); EntidadResaltadaBean ent_res = new EntidadResaltadaBean(); ent_res.setNombreCapa("PARCELAS"); ent_res.addCdid(bean); ent_res.addCdid(bean2); ent_res.addCdid(bean3); LinkedList lis = new LinkedList(); lis.add(ent_res); /* Otra lista de capas */ EntidadResaltadaBean ent_res2 = new EntidadResaltadaBean(); ent_res2.setNombreCapa("PARCELAS2"); ent_res2.setWhere("cdmunicipio=180"); lis.add(ent_res2); request.setAttribute("ListaEntidadesResaltadas",lis); Las entidades resaltadas se pueden especificar de dos maneras: Indicando el tipo de elemento y el código (en este caso cdid y el valor del cdid), así como el nombre de la capa. Se pueden indicar tantos elementos como se quiera. Indicando el nombre de la capa y una condición where en la que se indica qué deben cumplir las entidades resaltadas para que aparezcan en el mapa. Como puede verse, en ambos casos se almacenan objetos del tipo EntidadResaltadaBean. Se pueden incluir en la petición tantos objetos de este tipo como se quiera. En este ejemplo, se esta utilizando una etiqueta para pintar el mapa, por lo que se almacena la lista de objetos EntidadResaltadaBean en el objeto request. En caso de no utilizar etiquetas, se almacena la lista en el objeto PeticionBean: for (int k = 0;k < lista_resaltadas.size();k++) { peticion.addEntidadResaltada((EntidadResaltadaBean)lista_resaltadas.get(k)); } En el siguiente mapa se muestra resaltado el portal: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 11 Librería SIGI FRAMEWORK JAVA 2.1 4.4 Capa entidades rotuladas Una entidad rotulada es una entidad base a la que se le añade como rótulo uno o varios campos de la entidad. Las entidades rotuladas que se quieren se especifican a través de código utilizando una serie de beans. Para ilustrarlo se muestra un ejemplo de cómo hacerlo: String entRot=Config.get("sigi.entidadRotulada.nombre"); String where=Config.get("sigi.entidadRotulada.where"); if (entRot != null ){ EntidadRotuladaBean entRotBean = new EntidadRotuladaBean(); entRotBean.setNombreCapa(entRot); entRotBean.setModo("gtp"); entRotBean.setWhere(where); peticion.addEntidadRotulada(entRotBean); } mmBean = m_mapa.construye_mapa(peticion, con); Las entidades rotuladas se especifican indicando el nombre de la capa y una condición where en la que se indica qué deben cumplir las entidades resaltadas para que aparezcan en el mapa. Se pueden incluir en la petición tantos objetos de tipo EntidadRotuladaBean como se quiera. En el siguiente mapa se muestra rotuladas la entidad viales: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 12 Librería SIGI FRAMEWORK JAVA 2.1 4.5 Obtención de las capas de un mapa callejero Se puede obtener las capas que aparecerán en un determinado mapa; estas capas dependerán del area cubierta por el mapa1. Para ello, existen dos métodos en la librería: obtenerCapas(x1,x2) y obtenerCapas(distancia). La diferencia entre ambos esta en los parámetros de entrada: en el primero llegan las dos coordenadas X del mapa, mientras que en el segundo llega el tamaño. Ambos retornan una lista de objetos sigi.bean.CapaBean, que únicamente tiene dos atributos: el id de la capa y el nombre de la capa. 1 El area cubierta por un mapa es función de la distancia del observador al mapa y del tamaño del propio mapa. Esta distancia del observador al mapa (que no es otra cosa que la altura) determina qué capas son visibles; dicho de otro modo, cada capa es visible desde una determinada franja de altura. Por ejemplo, puede ser que la ortofoto sea visible desde los 300 a los 1000 metros de altura. Las capas obtenidas en este método son las capas visibles para una determinada altura, que puede venir definida bien por el propio valor de la altura o bien por las coordenadas X1 y X2 del mapa. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 13 Librería SIGI FRAMEWORK JAVA 2.1 Código para la generación del mapa callejero 4.6 Generación de un mapa a partir de los nombres de municipio y calle. Para generar un mapa a partir de los nombres del municipio y la calle, necesitamos crear un objeto PeticionBean que contiene los datos de la petición. El objeto PeticionBean tiene las siguientes propiedades: Básicas de la consulta: Metros Distancia en metros a la que se observa el mapa. capaBase Lista de beans del tipo sigi.beans.CapaBean. Cada capa puede tener una clausula where en la que se indica una condición a cumplir para que aparezca la capa en el mapa. Si no viene se obtiene del fichero de configuración del parámetro sigi.capa.base capaExtendida Nombre de la capa extendida. En el caso de que haya varias estas irán separadas por comas. Si no viene se obtiene del fichero de configuración del parámetro sigi.capa.extendida capaResaltada Nombre de la capa resaltada. En el caso de que haya varias estas irán separadas por comas. Si no viene se obtiene del fichero de configuración del parámetro sigi.capa.entidad_resaltada lista_entidades_resaltadas Lista de elementos resaltados que se van a mostrar en el mapa. lista_entidades_rotuladas Lista de elementos que se van a rotular en el mapa. tipoMapa Tipo del mapa generado. Si no se indica, se toma del parámetro sigi.tipomapa Para incluir la dirección: Municipio TipoVia Via Numero Municipio sobre el que se hace una consulta de una dirección. Tipo de vía. Nombre de la vía en SUCA. Número del portal. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 14 Librería SIGI FRAMEWORK JAVA 2.1 Para especificar el tamaño del mapa en pantalla: ancho_mapa Ancho del mapa mostrado en pantalla, en píxels alto_mapa Alto del mapa mostrado en pantalla, en píxels. Si se desea generar un fichero con la leyenda: leyenda Extensión y nombre del fichero de leyenda 4.7 Generación de un mapa a partir de las coordenadas del mapa. En caso de que se quiera solicitar un mapa a partir de las coordenadas del mapa, ya sea utilizando las coordenadas de 1 punto y el tamaño o las coordenadas de dos esquinas del mapa, se utiliza una etiqueta JSP en la que se pueden definir varios parámetros (explicados más adelante) por lo que no es necesario crear ninguna instancia del objeto PeticionBean, aunque sería posible generar un mapa a partir de las coordenadas utilizando el objeto PeticionBean. Posteriormente se puede ver un ejemplo de creación de mapas utilizando exclusivamente etiquetas JSP. 4.8 Generación de una vista de un municipio. Si se quiere crear una vista de todo un municipio, se puede utilizar el método construye_mapaMunicipio. Este método tiene como parámetros un objeto del tipo PeticionBean y la conexión a base de datos. El objeto PeticionBean debe tener el campo Municipio o el campo CdMunicipio (o los dos, aunque esto no es necesario), así como el tamaño del mapa. Se retorna un bean MapaBean con los datos del mapa, del mismo modo que cualquier otro mapa generado. 4.9 Tamaño de los mapas. El tamaño del mapa que aparecerá en pantalla esta indicado tanto por los parámetros especificados en el bean (o bien por los del fichero de configuración, si no se indica tamaño) y por el tamaño del objeto visor en la página JSP. El tamaño del visor se indica en la etiqueta OBJECT del JSP: <OBJECT id="AXCGM" classid="clsid:F5D98C43-DB16-11CF-8ECA0000C0FD59C7" codebase="ACGM/acgm.cab#version=7,0,5,0" width="200" height="200"> o si se utiliza la etiqueta JSP incluída en la librería, se indica en la propia etiqueta: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 15 Librería SIGI FRAMEWORK JAVA 2.1 <sigi:crearMapaCalles ancho="400" alto="300" /> Si el mapa solicitado es mayor que el visor, éste ajustará el tamaño para poder visualizar el mapa entero en el visor; si ambos tamaños son iguales, el mapa aparece tal y como se ha solicitado. Y si el mapa es menor, nuevamente el visor ajusta el mapa a su propio tamaño: Este mapa esta solicitado con un tamaño de 300 píxels de alto y 200 de ancho, mientras que el visor tiene un tamaño de 400 píxels de ancho por 300 de alto. A continuación, se muestra el mismo mapa haciendo coincidir el ancho y alto tanto del mapa como del visor (que además generalmente es la situación ideal): Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 16 Librería SIGI FRAMEWORK JAVA 2.1 4.10 Ejemplo de creación de un mapa a partir de unas coordenadas X e Y En este caso hay dos posibilidades. Una de ellas es poner parámetros en la etiqueta para indicar el mapa que se quiere crear: <sigi:crearMapaCalles ancho="400" alto="300" x= "435010" y="4353434" metros="100"/> La otra posibilidad es crear una acción en la que se almacenen los datos en el request y después revolver la página, teniendo en cuenta que en este caso la etiqueta no llevaría parámetros: String x,y; String NOMBRE_VISTA = "muestra_mapa"; sigi.beans.MapaBean bean_sesion = null; bean_sesion = (sigi.beans.MapaBean)request.getSession().getAttribute("muestra_mapa_Bean"); String fuerza_recarga = request.getParameter("fuerzaRecarga") String metros = null; if (request.getParameter("metros") != null) Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 17 Librería SIGI FRAMEWORK JAVA 2.1 metros = request.getParameter("metros"); else metros = Config.get("sigi.distancia"); request.setAttribute("X",request.getParameter("X1")); request.setAttribute("Y",request.getParameter("Y1")); request.setAttribute("X2",request.getParameter("X2")); request.setAttribute("Y2",request.getParameter("Y2")); request.setAttribute("FUERZA_RECARGA",fuerza_recarga); request.setAttribute("MTS",metros); return NOMBRE_VISTA; Entonces, la etiqueta sería: <sigi:crearMapaCalles /> 4.11 Ejemplo de creación de un mapa a partir de una dirección La creación de mapas a partir de una dirección no es posible realizarla utilizando la etiqueta JSP, por lo que es necesario utilizar la librería del siguiente modo: PeticionBean peticion = new PeticionBean(); //se establecen los datos de la dirección a visualizar en el mapa peticion.setMunicipio(ds_municipio); peticion.setVia(ds_calle); peticion.setNumero(numero); peticion.setTipoVia(tipo_via); peticion.setMetros(metros); sigi.MapaSigi m_mapa = new sigi.MapaSigi(); sigi.beans.MapaBean mmBean = new sigi.beans.MapaBean(); //Dependiendo de si se ha definido el portal o no se llama a un método //distinto. Es necesario pasar la conexión con la base de datos por //que accede a SUCA para obtener el código del vial if(numero != null && !numero.equals("null") && !numero.equals("")){ mmBean = m_mapa.construye_mapa_portal(peticion, con); }else{ mmBean = m_mapa.construye_mapa(peticion, con); } if (mmBean.getMensajeError() != null) { Trazas.impLog(“ERROR::: “ + mmBean.getMensajeError()); } El javabean que devuelven los métodos construye_mapa es de la clase MapaBean. Esta clase tiene las siguientes propiedades: String url_mapa Url donde se ha generado el mapa Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 18 Librería SIGI FRAMEWORK JAVA 2.1 String x1 Coordena x1 del area reflejada en el mapa String x2 Coordena x2 del area reflejada en el mapa String y1 Coordena y1 del area reflejada en el mapa String y2 Coordena y2 del area reflejada en el mapa String zoom_in Parámetro usado si se desea hacer zoom de un punto en concreto del mapa. Para hacer este tipo de zoom existe un javascript String zoom_out Parámetro usado si se desea hacer zoom de un punto en concreto del mapa. Para hacer este tipo de zoom existe un javascript List Lista de elementos resaltados que se van lista_entidades_resaltadas a mostrar en el mapa. Este va a ser usado por las páginas jsp por lo tanto hay que dejarlo en el ámbito adecuado para que las páginas puedan verlo. El siguiente código muestra como dejar el javabean en el request. request.getSession().setAttribute("muestra_mapa_Bean",mmBean); Con el código anterior tenemos disponible en la sesión un atributo llamado muestra_mapa_bean que será usado por la página jsp. Los mapas generados tienen formato cgm y para poder visualizarlos en necesario tener en el navegador instalado el correspondiente ActiveX. En este caso el ActiveX se llama acgm.cab y se debe incluir en la web de la aplicación en el directorio ocx para que cuando alguien se conecte sin tener el ActiveX se le instale automaticamente. 4.12 Ejemplo de creación de un mapa de un municipio. La creación se hace de modo parecido a la mostrada en el punto anterior: PeticionBean peticion = new PeticionBean(); peticion.setMunicipio(des_mun); peticion.setCdMunicipio(cod_mun); peticion.setMetros(metros); peticion.setAltoMapa("300"); peticion.setAnchoMapa("400"); mmBean = m_mapa.construye_mapaMunicipio(peticion,con); if (mmBean.getMensajeError() != null) { Trazas.impLog(“ERROR::: “ + mmBean.getMensajeError()); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 19 Librería SIGI FRAMEWORK JAVA 2.1 } Se devuelve un bean exactamente igual al explicado en el punto anterior. 4.13 Página JSP. Se deben incluir las siguientes librerías javascript: <SCRIPT TYPE="text/javascript" SRC="../../javascript/MeasureFunc.js"></script> <SCRIPT LANGUAGE="JavaScript" SRC="../../javascript/jsrsClient.js"></SCRIPT> <SCRIPT LANGUAGE="JavaScript" SRC="../../javascript/Visor.js"></SCRIPT> Existen dos posibilidades a la hora de escribir la página JSP. Una de ellas sería escribir el código de la JSP directamente. A continuación se muestra la parte de la página jsp que llama al activex que visualiza el mapa: <jsp:useBean id="muestra_mapa_Bean" scope="session" class="sigi.beans.MapaBean" /> . . . <OBJECT id="AXCGM" classid="clsid:F5D98C43-DB16-11CF-8ECA-0000C0FD59C7" codebase="ocx/acgm.cab#version=7,0,5,0" width="400" height="300"> <param name="FileName" value="<%=muestra_mapa_Bean.getUrl_mapa()%>"> </OBJECT> Otra posibilidad, únicamente útil para cuando se crea el mapa a partir de coordenadas, sería utilizar las etiquetas JSP incluídas en la librería. Se pueden utilizar las siguientes etiquetas: <sigi:crearMapaCalles /> <sigi:zoomMas /> <sigi:zoomMenos /> <sigi:vistaDosPuntos /> <sigi:vistaMapaFit /> <sigi:localizarPunto /> <sigi:distanciaPuntos /> La primera de las etiquetas dibuja el mapa, sustituyendo por tanto la etiqueta object y las etiquetas que implementan las flechas de movimiento. Esta es la única etiqueta que acepta parámetros, en concreto los siguientes (todos son opcionales): x : coordenada X del mapa. y : coordenada Y del mapa. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 20 Librería SIGI FRAMEWORK JAVA 2.1 metros : tamaño en metros del mapa. fuerzarecarga : indica si se quiere obligar a la recarga del mapa. Normalmente, al acceder a un mapa si este mapa no ha cambiado, entonces no se recarga el fichero sino que se lee el que ya había; si se indica el valor ‘SI’ en este parámetro, entonces el mapa se recarga siempre. ancho : medida del mapa en pixels. alto : medida del mapa en pixels. El resto de etiquetas implementan los siguientes controles, sin tener ningún parámetro de entrada: sigi:zoomMas : pinta la lupa para acercar la vista. sigi:zoomMenos : pinta la lupa para alejar la vista. sigi:vistaDosPuntos : pinta un control que permite seleccionar un rectángulo del mapa para visualizarlo. sigi:vistaMapaFit : pinta un control que hace lo siguiente: pone el mapa a tal distancia que la vista se ajusta a la comunidad completa. sigi:localizarPunto : pinta un control que permite conocer las coordenadas de un determinado punto. sigi:distanciaPuntos : permite calcular la distancia entre dos o más puntos. La siguiente imagen muestra el ejemplo que se ha implementado pero no hay que poner todos estos componentes alrededor de la imagen. Por ejemplo debajo de la imagen aparecen dos cajas de texto que utilizando el botón nos rellena con la x y la y del punto seleccionado en el mapa. Esto se pone a nivel de ejemplo. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 21 Librería SIGI FRAMEWORK JAVA 2.1 Por defecto, hasta ahora se ha mostrado código para generar mapas de calles en formato cgm. Este debería ser el formato elegido en la mayoría de los casos; sin embargo, es posible que se necesite generar mapas en svg. Si es así, esto se puede indicar en el fichero de configuración, con el parámetro sigi.tipomapa=svg. Si se utilizan mapas en formato svg, la referencia al mapa en la página jsp se debe realizar del siguiente modo: <embed src="<<url del mapa>>" width="400" height="300" pluginspage="http://www.adobe.com/svg/viewer/install/auto" /> Sin embargo, es importante tener en cuenta que se han detectado problemas con este formato gráfico al trabajar en local, achacables al visor de gráficos SVG. Estos problemas no se han detectado en entornos de desarrollo. Si se utilizan etiquetas JSP, se debe almacenar en el request el atributo formato con valor cgm o svg; si no se indica nada, se toma por defecto cgm. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 22 Librería SIGI 5 FRAMEWORK JAVA 2.1 Funciones auxiliares En la librería se pueden encontrar una serie de funciones auxiliares que pueden facilitar el desarrollo de aplicaciones: 5.1. obtenerRangoPuntos Esta función obtiene las coordenadas de un mapa que engloba una serie de objetos. Para realizar la petición se utiliza un objeto de tipo sigi.beans.PeticionRangoPuntosBean. Este objeto tiene dos propiedades: entidad : indica el nombre de la capa donde se encuentran los objetos a mostrar. where : se trata de una condición que indica algun criterio para seleccionar los elementos que se quieren mostrar. Por ejemplo, cdmunicipio='079' and cdzona in('012','013','016','021','022','023','024','025','026','027') Al invocar esta función, se obtiene un objeto sigi.beans.MapaBean que contiene las coordenadas del mapa mínimo que contiene los elementos. A continuación se muestra un ejemplo de invocación de esta función: PeticionRangoPuntosBean pbean = new PeticionRangoPuntosBean(); pbean.setEntidad("dba_sigi.SIGI_EDU_ZEPUBSEC_05"); pbean.setWhere("cdmunicipio='079' and cdzona in('012','013','016','021','022','023','024','025','026','027')"); try { MapaBean mb = m_mapa.obtenerRangoPuntos(pbean); Trazas.impLog(mb.getX1() + "," + mb.getY1() + "," + mb.getX2() + "," + mb.getY2()); } catch (Exception e) { Trazas.imprimeErrorExtendido(e); } 5.2. obtenerCapas En la librería podemos encontrar dos métodos con el nombre obtenerCapas que reciben distintos parámetros. Estos dos métodos permiten obtener una lista de capas incluídas en un determinado mapa. Se puede obtener de dos maneras: enviando como parámetro el valor del atributo ‘distancia’ del mapa. utilizando los valores X1 y X2 del mapa. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 23 Librería SIGI FRAMEWORK JAVA 2.1 Estos métodos devuelven una lista de objetos de la clase sigi.beans.CapaBean, que contienen un código y un identificador de cada una de las capas incluídas en el mapa. A continuación se muestra un ejemplo de invocación de esta función: try { java.util.List listacapas = m_mapa.obtenerCapas(mmBean.getX1(),mmBean.getX2()); for (int k=0;k<listacapas.size();k++) { CapaBean capa = (CapaBean)listacapas.get(k); Trazas.impLog(">>>>>>>>>>>>> " + capa.getId() + " >>>>>> " + capa.getNombre()); } } catch (Exception e) { Trazas.imprimeErrorExtendido(e); } 5.1. mueveMapa Este método permite obtener las coordenadas de un mapa resultante de mover el mapa actual en alguna de las direcciones, o bien al acercar o alejar el mapa sobre el punto central del mismo. Hay dos versiones de esta función: public void mueveMapa(MapaBean mmBean, String sentido, String factor_zoom) public void mueveMapa(MapaBean mmBean, String sentido) En la primera de ellas se puede indicar el factor de escala del mapa; esto, al hacer zoom, indica por cuanto se multiplica la distancia a la que se observa el mapa. Por ejemplo, un factor de 2 asociado a un sentido Z- indica que el observador se aleja a una distancia doble, mientras que un factor de 0,5 asociado a un sentido Z+ indica que el el observador se hacerca a la mitad de distancia. En la segunda llamada este factor de escala se toma del fichero de configuración. Los posibles valores del sentido son: N NE NO O E SO SE S Z+ Z- - Norte - NorEste - NorOeste - Oeste - Este - SurOeste - SurEste - Sur - Acercar - Alejar Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 24 Librería SIGI FRAMEWORK JAVA 2.1 A continuación se muestra el código que invoca esta función: MapaSigi map = new MapaSigi(); map.mueveMapa(bean,sentido); 6 Mapa Guia A partir de un mapa de los anteriores podemos solicitar un mapa guía que nos sitúa la posición actual dentro del mapa de toda la Comunidad de Madrid. Para obtener el Mapa Guía se necesitan las coordenadas X e Y del punto a situar en el mapa guía. El siguiente código muestra como obtener el mapa guía: PeticionBean peticion = new sigi.beans.PeticionBean(); peticion.setX1(x); peticion.setY1(y); peticion.setMetros(metros); sigi.MapaSigi m_mapa = new sigi.MapaSigi(); sigi.beans.MapaBean mmBean = new sigi.beans.MapaBean(); mmBean = m_mapa.construye_mapa_guia(peticion); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 25 Librería SIGI FRAMEWORK JAVA 2.1 7 Mapa Fit Es un mapa de la Comunidad de Madrid que nos permite ir haciendo zoom hasta acceder al elemento que nos interesa. Para obtener el mapa fit tenemos el siguiente código: PeticionBean peticion = new PeticionBean(); peticion.setX1(valor_x1); peticion.setX2(valor_x2); peticion.setY1(valor_y1); peticion.setY2(valor_y2); mmBean = m_mapa.construye_mapa_fit(peticion); 8 Mapa temático Mapa de entidades en los que los valores de un dato de cada entidad se representan mediante colores. Por ejemplo si la entidad es municipios los distintos municipios se van coloreando dependiendo de los valores de los datos que se representen. La forma de colorear el mapa depende de unos rangos que es necesario definir. Existen varios tipos de rangos: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 26 Librería SIGI FRAMEWORK JAVA 2.1 Rango único: Se define un color inicial y un color final y el webservice crea los tramos que necesita. Rango por nº: Se define un color inicial y un color final y el nº de tramos que se desean Rango por amplitud: Se define un color inicial y un color final y la amplitud del tramo (nº de valores de cada tramo) Rango detallado: Se define para cada uno de los tramos el color y los valores que forman parte del tramo Para cada entidad se debe indicar cual es el valor del dato a representar que se le asigna a esa entidad. Por ejemplo: Si se va a reflejar población para cada municipio hay que indicar cual es su población. Existen muchas posibilidades de salida del mapa temático y dependiendo del tipo de salida nos va a hacer falta un visor o no. Tipo de formato cgm svg svg_ svg_t svg_d jpg jpg_c jpg_t jpg_3d html_ vrml vrmld vrmlt Visor Active X CGM Plug-in SVG Plug-in SVG Plug-in SVG Plug-in SVG HTML HTML HTML HTML HTML Visor VRML Visor VRML Visor VRML 9 Código para generar un mapa temático Para generar un mapa temático necesitamos crear un objeto MapaTematico que contiene los datos de la petición de un mapa temático El objeto MapaTematico tiene las siguientes propiedades: Básicas de la consulta: String formato String tabla Formato de salida del mapa Indica el nombre de la entidad/tabla de la Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 27 Librería SIGI FRAMEWORK JAVA 2.1 String campo Rango rango ListadoValores TipoMapa base de datos con la cartografía base. Si no se indica se coge la especificada en el fichero de configuración en el parámetro sigi.tematico.tabla Indica el nombre de la columna de la tabla que se usará como índice en la lista de valores. Si no se indica se coge la especificada en el fichero de configuración en el parámetro sigi.tematico.campo Definición del rango o tipo de temático que se va a generar. Los rangos pueden ser de varios tipos, posteriormente se detallará la forma de definir cada uno de ellos. Datos para la generación del temático. En ellos se especifica, para cada elemento que se quiere añadir al temático el código del campo y el valor que se utiliza. Se puede generar un mapa que abarca toda la comunidad de Madrid, o bien un mapa con los distritos de madrid. Los valores de entrada posibles son sigi.tematicos.MapaTematico.DISTRITOS o sigi.tematicos.MapaTematico.MUNICIPIOS; también puede no rellenarse. 9.1 Definición de los datos a representar Para definir en el mapa temático los datos tenemos la clase ListadoValores y dentro de esta clase los métodos: addValor(String codigo, String valor) Añade un código y valor a representar en el mapa Nota: Si el valor contiene decimales deben ir separador por el separador ‘.’ (punto). Ejemplo de cómo definir los valores del mapa /* Primero se leen los datos de la base de datos */ ListadoValores lista_val = new ListadoValores(); PorcentajeDAO porc = new PorcentajeDAO(); List lista_porc = null; try { lista_porc = porc.busqueda(con, null); }catch (Exception e) { throw new sistemas.framework.excepciones.AccionException(e); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 28 Librería SIGI FRAMEWORK JAVA 2.1 } /* Se rellena la lista de valores del mapa */ for (int i = 0;i < lista_porc.size();i++) { if (lista_porc.get(i) != null) { String val = (String) lista_porc.get(i); val = val.replace(',', '.'); lista_val.addValor( (i + 1) + "", val); } else lista_val.addValor((i+1) + "","0"); } } 9.2 Rango automático a partir de un color inicial y color final La clase a utilizar es RangoU cuyos métodos son: setColorInicial setColorFinal setTipo Establece el color inicial Establece el color final “U” A continuación se muestra un ejemplo de definición de este tipo de rangos: String color_inicial = request.getParameter("C_INICIAL"); String color_final = request.getParameter("C_FINAL"); String tipo_mapa = request.getParameter("TIPO_MAPA"); Color colo1 = new Color(color_inicial); Color colo2 = new Color(color_final); RangoU rango = new RangoU(); rango.setColorInicial(colo1); rango.setColorFinal(colo2); rango.setTipo("U"); 9.3 Rango definido por la amplitud de los tramos La clase a utilizar es RangoA cuyos métodos son: setColorInicial setColorFinal setTipo setAmplitud Establece el color inicial Establece el color final “RA” Amplitud de rango A continuación se muestra un ejemplo de definición de este tipo de rango: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 29 Librería SIGI FRAMEWORK JAVA 2.1 Color colo1 = new Color(color_inicial); Color colo2 = new Color(color_final); RangoA rango = new RangoA(); rango.setColorInicial(colo1); rango.setColorFinal(colo2); rango.setTipo("RA"); rango.setAmplitud(Integer.parseInt(amplitud)); 9.4 Rango definido por el nº de tramos La clase a utilizar es RangoN cuyos métodos son: setColorInicial setColorFinal setTipo setNumTramos Establece el color inicial Establece el color final “RN” Nº de tramos A continuación se muestra un ejemplo de definición de este tipo de rango: Color colo1 = new Color(color_inicial); Color colo2 = new Color(color_final); RangoN rango = new RangoN(); rango.setColorInicial(colo1); rango.setColorFinal(colo2); rango.setTipo("RN"); rango.setNumTramos(Integer.parseInt(num_tramos)); 9.5 Definición del area del mapa Si se quiere crear un mapa de entidades que no estén contempladas (actualmente, distritos y municipios), se debe definir el area geográfica del mapa y la tabla y campo de la que leer los datos. Para ello, se utilizan los siguientes métodos de la clase sigi.tematicos.MapaTematico, que se deben definir antes de realizar la llamada al método de la librería que genera mapas temáticos: setX1 setY1 setX2 Coordenada X de la esquina superior izquierda Coordenada Y de la esquina superior izquierda Coordenada X de la esquina Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 30 Librería SIGI FRAMEWORK JAVA 2.1 setY2 setTabla setCampo inferior derecha Coordenada Y de la esquina inferior derecha Indica el nombre de la tabla de donde se leen los datos de la entidad Se indica el nombre del campo dentro de la tabla de donde se leen los datos de la entidad 9.6 Rango en el que se detallan cada uno de los tramos La clase a utilizar es RangoD cuyos métodos son: addDetalleRango Establece el detalle de un rango en particular setTipo “RD” Para cada rango se va a crear un DetalleRango que se crea a partir de los siguientes datos: Color color int inicioRango int finalRango Establece el detalle de un rango en particular Valor inicial del rango Valor final del rango A continuación se muestra un ejemplo de definición de este tipo de rango: RangoD rango = new RangoD(); rango.setTipo("RD"); DetalleRango Color col1 = Color col2 = Color col3 = det new new new = null; Color(“rojo”); Color(“azul”); Color(“verde” det = new DetalleRango(col1, 0, 1000); rango.addDetalleRango(det); det = new DetalleRango(col2, 1001, 2000); rango.addDetalleRango(det); det = new DetalleRango(col3, 2001, 3000); rango.addDetalleRango(det); Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 31 Librería SIGI FRAMEWORK JAVA 2.1 A continuación se incluye el código completo para generar un mapa temático de rango único MapaSigi m_mapa = new MapaSigi(); sigi.beans.MapaBean mmBean = new sigi.beans.MapaBean(); /* Se recogen los parámetros */ String color_inicial = request.getParameter("C_INICIAL"); String color_final = request.getParameter("C_FINAL"); String tipo_mapa = request.getParameter("TIPO_MAPA"); String ventana_separada = request.getParameter("VENTANA_NUEVA"); /* Se leen los datos a reflejar en el mapa*/ ListadoValores lista_val = new ListadoValores(); PorcentajeDAO porc = new PorcentajeDAO(); List lista_porc = null; try { lista_porc = porc.busqueda(con, null); } catch (Exception e) { throw new sistemas.framework.excepciones.AccionException(e); } /* Se rellena la lista de valores del mapa */ for (int i = 0;i < lista_porc.size();i++) { if (lista_porc.get(i) != null) { String val = (String) lista_porc.get(i); val = val.replace(',', '.'); lista_val.addValor( (i + 1) + "", val); } else lista_val.addValor((i+1) + "","0"); } /* Después, se define la clase con el rango */ Color colo1 = new Color(color_inicial); Color colo2 = new Color(color_final); RangoU rango = new RangoU(); rango.setColorInicial(colo1); rango.setColorFinal(colo2); rango.setTipo("U"); /* Finalmente, se genera la clase mapatemático */ MapaTematico mapa = new MapaTematico(); mapa.setListadoValores(lista_val); mapa.setFormato(tipo_mapa); mapa.setRango(rango); /* Le indicamos que va a trabajar con municipios; si se quiere indicar que trabaje con distritos, se debería poner sigi.tematicos.MapaTematico.DISTRITOS */ mapa. setTipoMapa(sigi.tematicos.MapaTematico.MUNICIPIOS); try { Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 32 Librería SIGI FRAMEWORK JAVA 2.1 mmBean = m_mapa.construye_mapa_tematico(mapa); } catch (SIGIException sigiex) { throw new AccionException(sigiex.getMessage()); } Una vez generado el mapa hay que dejar el javabean en la sesión para que sea visualizado por la página jsp. El siguiente código muestra como dejar el javabean en la sesión: request.getSession().setAttribute("muestra_mapa_Bean",mmBean); Este javabean es un objeto de la clase MapaBean comentada anteriormente. Dependiendo del formato de salida de mapa temático se va a visualizar en una página jsp distinta ya que el plug-in de visualización va a ser distinto. El siguiente código muestra la elección del destino: if ((tipo_mapa.indexOf("svg") != -1) || tipo_mapa.indexOf("vrml") != -1 || tipo_mapa.indexOf("htm") != -1){ NOMBRE_VISTA = "muestra_mapa_url"; } else if (tipo_mapa.indexOf("cgm") != -1){ NOMBRE_VISTA = "muestra_mapa_cgm"; } else { NOMBRE_VISTA = "muestra_mapa_simple"; } En el ejemplo en el apartado download se incluyen los distintos plug-in necesarios para la visualización de todos los formatos de los mapas temáticos. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 33 Librería SIGI FRAMEWORK JAVA 2.1 Ejemplo de un mapa de formato vrml Ejemplo de un mapa con formato svg Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 34 Librería SIGI FRAMEWORK JAVA 2.1 10 Fichero de configuración A continuación se muestran todas las variables del fichero de configuración relacionadas con los mapas. sigi.ancho : Indica el ancho que tendrá la imagen que devuelve el servicio web tras nuestra solicitud. Ej: sigi.ancho = 400 sigi.alto : Indica el alto que tendrá la imagen que devuelve el servicio web tras nuestra solicitud. Ej: sigi.alto = 300 sigi.tipomapa : Indica el tipo de mapa de calles que se genera si no se indica el tipo. Ej: sigi.tipomapa = cgm sigi.urlservicio : Es la url en la que se encuentra el servicio web escuchando las peticiones. Esta url depende del webservice que se vaya a usar. Ej: Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 35 Librería SIGI FRAMEWORK JAVA 2.1 sigi.urlservicio = http://nticmint11.madrid.org/webservice_SIGI2/cgibin/Servicioweb.exe/soap/IInterfazServicioMapas sigi.distancia : Tamaño en metros del mapa que se toma por defecto. Ej: sigi.distancia = 100 sigi.factorzoomin : Es la relación entre la superficie cubierta por un mapa y la que cubre después de hacer zoom in. En el ejemplo se indicaría que al hacer zoom se cubre la mitad de superficie. Ej: sigi.factorzoomin = 0.5 sigi.factorzoomout : Similar al anterior, salvo para alejar la vista. Por tanto, en el ejemplo se indica que al hacer zoom se vería un 50% más de superficie. Ej: sigi.factorzoomout = 1.5 sigi.etiqueta_no_encontrado : Indica qué etiqueta del XML de respuesta indica que la dirección no existe. Si no se pone, lo que pasa es que cuando una dirección no existe salta una excepción genérica en vez de una específica, con lo que no es posible detectar que el problema es que la dirección no existe (y se confunde con un error). Ej: sigi.etiqueta_no_encontrado=no_encontrado sigi.capa.base : Son las distintas capas base que se van a mostrar en el mapa. Ej: sigi.capa.base = MUNICIPIOS,FONDOS,MANZANAS,EDIFICIOS,CALLEJERO,PORTALES sigi.capa.extendida : Son las distintas capas extendidas que se van a mostrar en el mapa. Ej: sigi.capa.extendida= Pruebas de Farmacias,Casas Consistoriales (Mostraría situación de farmacias y ayuntamientos) sigi.entidad_resaltada : Indica el nombre de la capa que se va a resaltar en el mapa. Ej: sigi.entidad_resaltada=PORTALES (resaltaría el portal) sigi.host_remoto : Indica el nombre de la máquina desde la cual se descarga los mapas generados. Ej: sigi.host_remoto=NTICMNT11 Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 36 Librería SIGI FRAMEWORK JAVA 2.1 sigi.directorio_remoto : Indica el directorio en la máquina remota, en el que se generan los mapas. Ej: Sigi.directorio_remoto =c:/GWMCache sigi.puerto_remoto : Puerto de escucha del servidor remoto de ficheros. Ej: sigi.puerto _remoto = 8004 sigi.hint : Formato de la etiqueta que acompaña a los mapas temáticos. Aparecerá en pantalla lo que se ponga en esta variable, sustituyendo [$codigo$] por el código del municipio, y [$valor$] por el valor en el mapa temático. Ej: sigi.puerto _remoto = sigi.hint=Código : [$codigo$] -- Valor : [$valor$] sigi.url_dtd : Indica la URL donde esta accesible la dtd necesaria para validar los mapas en formato svg_d. Ej: sigi.url_dtd=http://icmweb01/ejemplo_mapas/dtd/svg_d.dtd aplicacion.directorio.temporal: Indica el directorio de la máquina de la aplicación en el que se almacenan los mapas descargados. Ej para local: aplicacion.directorio.temporal= D:/Producto/oc4j9.0.4/j2ee/home8080/icm/ejemplo_mapas/ejemplo_mapas/pdf/temp Ej para Unix: aplicacion.directorio.temporal= /usr/aplic_ICM/prod/web/temp/pdf aplicacion.download : Url para la descarga de los mapas. Ej para local: aplicacion.download=http://pc244735:8080/ejemplo_mapas/pdf/temp Ej para Unix: aplicacion.download= http://icmweb01.icm.es/download webservice.timeout : Tiempo máximo en milisegundos que se concede a la generación del mapa; un cero indica que no hay tiempo límite. Ej para local: aplicacion.download=0 Ej para Unix: aplicacion.download= 60000 Además, se deben incluir las siguientes entradas en el fichero de configuración, para defirnir tres acciones comunes: AccionMueveMapa=sigi.acciones AccionMuestraMapaXXYY=sigi.acciones Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 37 Librería SIGI FRAMEWORK JAVA 2.1 AccionMuestraMapaFit=sigi.acciones Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 38