Interfaz WEB de GeoGranada: "simmapXML.exe"
SimMapXML.exe es la interfaz Web de la infraestructura espacial de datos GeoGranada implementada como un CGI.
SIMMAPXML.EXE está diseñado para la obtención de información geográfica del Servicio Municipal de Mapas en formato XML. Dispone de una serie de comandos que permite acceder a la funcionalidad geográfica:
- establecimiento de una sesión de usuario que permita mantener una conexión con estado (las peticiones CGI son sin estado)
- el dibujo de un mapa en formato PNG o JPG de acuerdo a las características actuales de la sesión
- la obtención y modificación de las características del mapa de la sesión actual
- la obtención de las entidades geográficas que cumplan determinadas condiciones de ubicación espacial o de nominación toponímica.
La funcionalidad está publicada como una lista de comandos que se invocan mediante URLs en cuyo query se determinan las características de la acción a ejecutar mediante pares "parámetro=valor"
Con SIMMAPXML.EXE es posible desarrollar una aplicación interactiva utilizando la técnica de desarrollo AJAX (Asynchronous JavaScript And XML). Un ejemplo de aplicación es el Visor WEB GeoGranada.
Los comando tienen parámetros obligatorios (indicados entre signos de menor y mayor "<obligatorio>") y opcionales (indicados entre llaves "{opcional}"). Vea un ejemplo respuesta en XML de una petición o pulse sobre el mapa para obtener un ejemplo de respuesta en PNG
1.- Invocación del Servicio WEB
1.- Invocación del Servicio WEB
El servicio SIMMAPXML.EXE se invoca con la dirección URL:
http://geoweb.granada.org/cgi-bin/produccion/simmapXML.exe/COMANDO
El servicio SIMMAPXML.EXE funciona como un servidor con estado en el que tras iniciar una sesión, el cliente hace peticiones reenviando al servidor su identificador de sesión para que este reconozca las propiedades del mapa (o estado) que posee el cliente.
El servicio SIMMAPXML.EXE tiene varios comandos que se describen a continuación. Todos los comandos requieren al menos de la introducción de un parámetro (el idmapasesion o identificador de sesión) pues su no introducción devolverá el resultado parametro=none que es el resultado por defecto de los comandos cuando no existe conexión activa o cuando no se ha podido responder a la petición.
Si el servicio SIMMAPXML.EXE se invocara sin comando o un comando desconocido devolverá esta página de explicación del servicio WEB.
http://geoweb.granada.org/cgi-bin/produccion/simmapXML.exe/COMANDODESCONOCIDO
<?xml version="1.0" encoding="ISO-8859-1" ?>
<respuesta tipo="COMANDODESCONOCIDO">
<error>El comando no es válido.</error>
<comandos descripcion="lista de comandos válidos">
<comando>ABRESESIONMAPA</comando>
<comando>GETLISTACAPAS</comando>
<comando>SETMONITOR</comando>
<comando>SETMAPABORDE</comando>
<comando>GETULTIMOMAPA</comando>
<comando>GETMAPAESTATICO</comando>
<comando>GETMAPAAAVV</comando>
<comando>GETMAPACALLE</comando>
<comando>GETMAPAPORTAL</comando>
<comando>GETZOOMESTADO</comando>
<comando>ZOOMTODO</comando>
<comando>ZOOM</comando>
<comando>ZOOMANTERIOR</comando>
<comando>ZOOMSIGUIENTE</comando>
<comando>PANNORTE</comando>
<comando>PANSUR</comando>
<comando>PANOESTE</comando>
<comando>PANESTE</comando>
<comando>GETCAPASDEBUSQUEDA</comando>
<comando>BUSCARTOPONIMOSPORVALOR</comando>
<comando>BUSCARTOPONIMOPORXY</comando>
<comando>BUSCARENTIDADPORTOPONIMO</comando>
<comando>BUSCARMAPAPORTOPONIMO</comando>
<comando>BUSCARMAPAPORXY</comando>
<comando>BUSCARENTIDADESPORXY</comando>
<comando>COMPROBARENTIDADESPORXY</comando>
<comando>ENVIARMENSAJE</comando>
</comandos>
</respuesta>
Las sesiones permanecen abiertas mientras no haya transcurrido más de un cierto tiempo entre la última petición de mapa y la actual. Inicialmente el timeout es de 59 min. Pero puede alterarse configurándose en el fichero INI del Gestor de Sesiones.
[SERVICIO DE MAPAS]
TIEMPO_DESCONEXION_EN_MINUTOS=59
2.- Parámetros de las peticiones al Servicio WEB
Parámetros de las peticiones al Servicio WEB
El servicio SIMMAPXML.EXE cuando recibe una petición busca los parámetros de la misma en el QUERY de una URL como pares de Parámetro=Valor separados por el carácter ampersand ‘&’
./simmapxml.exe/COMANDO?parametro1=valor1¶metro2=valor2¶metro3=valor3&…
En las peticiones, los parámetros y valores son independientes de que se invoquen con minúsculas o mayúsculas. En la evaluación de los parámetros el Servicio WEB hace una conversión a mayúsculas para hacer la petición al Gestor de Sesiones.
Cuando valor sea una lista, los elementos de la lista se encuentran separados por el carácter ‘$’ (dólar). Ejemplo:
[listatemas=001- Callejero$002- Parcelario$003- Seccionado Censal$004- Planeamiento$...]
equivale a:
listatemas= 001- Callejero (elemento 0 de la lista)
002- Parcelario (elemento 1 de la lista)
003- Seccionado Censal (elemento 2 de la lista)
004- Planeamiento (elemento 3 de la lista)
. . .
Caracteres Especiales en las Peticiones
En las peticiones y respuestas se utilizan los siguientes caracteres especiales:
‘$’ carácter dólar: cuando el valor de un parámetro es una lista, el carácter ‘$’ separa los elementos de la lista.
‘.’ carácter punto: cuando el valor de una coordenada en UTM posee el carácter ‘.’ separa la parte entera de la decimal. En las respuestas, las coordenadas se formatean con éste carácter.
‘,’ carácter coma: cuando el valor de una coordenada en UTM posee el carácter ‘,’ separa la parte entera de la decimal.
3.- Respuestas del Servicio WEB
Respuestas del Servicio WEB
Los comandos del servicio SIMMAPXML responden dos tipos de información:
1.- La tipo texto: en la CONTENT de la petición REQUEST
2.- La tipo mapa: como Imagen PNG o JPG
Respuestas tipo Texto:
Todos los comandos de SIMMAPXML.EXE excepto los de tipo mapa (el comando GETULTIMOMAPA, GETMAPACALLE, GETMAPAAAVV, y el resto que comienzan por C'GETMAPA...') devuelven la información tipo texto en la CONTENT de la petición (ContentType='text/xml; charset=ISO-8859-1'):
<?xml version="1.0" encoding="ISO-8859-1" ?>
<respuesta tipo="COMANDO INVOCADO">
<error>none</error>
<parámetro1>valor1</parámetro1>
<parámetro2>valor2</parámetro2>
. . .
<parámetroN>valorN</parámetroN>
</respuesta>
El primer parámetro que se recibe siempre es el parámetro error. Cuando la respuesta es correcta la etiqueta de <error></error> se rellena con el valor none. En cambio, cuando la petición no se ha podido responder adecuadamente el resultado es:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<respuesta tipo="COMANDO INVOCADO">
<error>código de error</error>
</respuesta>
Por ejemplo, el comando GETZOOMESTADO devuelve la CONTENT:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<respuesta tipo="GETZOOMESTADO">
<error>none</error>
<zoomcurrent left="445643.23" right="445723.765" top="4117984" bottom="4117743.65" />
<zoomestado>
<zoomextent activo="True" />
<zoomin activo="True" />
<zoomout activo="False" />
<pantop activo="True" />
<panbottom activo="True" />
<panleft activo="True" />
<panright activo="True" />
<zoomprevious activo="True" />
<zoomnext activo="False" />
</zoomestado>
<escala>1:1.243</escala>
</respuesta>
En caso de error, devuelve la CONTENT:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<respuesta tipo="GETZOOMESTADO">
<error>código de error</error>
</respuesta>
El tratamiento de las listas en XML se realiza en forma de TAGs anidados que son descritos en cada comando concreto del servicio WEB. En las respuestas, los nombres de los TAGs se devuelven en minúsculas, y los valores se devuelven manteniendo el ‘case sensitive’ del Servicio de Mapas GeoGranada. Ejemplos de listas son:
<temas>
<tema>Callejero Municipal</tema>
<tema>001- Callejero</tema>
<tema>002- Parcelario</tema>
</temas>
<zoomcurrent left="446889.72" right="447180.27" top="4115401.77" bottom="4115111.22" />
Respuestas tipo Mapa:
Las respuestas tipo Mapa es una imagen PNG con el mapa (o JPG cuando se especifica el parámetro {formato=JPG}) y funcionan asociando un fichero de imagen a la CONTENT (ContentType='image/png' o ContentType='image/jpeg') de la petición REQUEST.
Las respuestas de mapa se agrupan en mapas con estado, porque se puede repreguntar al mapa sus metadatos (o características descriptivas del mismo como la extensión espacial, el tema, las capas visualizadas, la historia de encuadres -zooms y pans-) y mapas sin estado.
Los mapas con estado se construyen mediante el mecanismo de crear una sesión (ABRESESIONMAPA) y mantener el número de sesión en todas las preguntas. Una vez obeLa respuesta tipo mapa siempre va precedida de una petición con respuesta tipo texto que demanda al Servicio WEB generar la imagen de mapa que se solicitará posteriormente con el comando GETULTIMOMAPA. Cuando la petición que demanda la construcción del mapa recibe un resultado sin error (<error>none</error>) el mapa se ha generado correctamente para la sesión actual y puede solicitarse con el comando GETULTIMOMAPA.
Los comandos que generan mapa son los siguientes:
o ZOOMTODO
o ZOOM
o ZOOMANTERIOR
o ZOOMSIGUIENTE
o PANNORTE
o PANSUR
o PANOESTE
o PANESTE
o BUSCARMAPAPORVALOR
o INFORMAPAPORVALOR
-------------------------------------- 0 --------------------------------------
Secuenciación de las peticiones al Servicio WEB ligadas a una sesión
El Servicio WEB permite múltiples peticiones asíncronas sobre una misma sesión de trabajo. Cuando la petición solicitada requiera generar un nuevo mapa (comandos ZOOMTODO, ZOOM, ZOOMANTERIOR, ZOOMSIGUIENTE, PANNORTE, PANSUR, PANOESTE, PANESTE, BUSCARMAPAPORVALOR, INFORMAPAPORVALOR) se debe esperar a recibir la respuesta de texto antes de invocar una nueva petición ya que el Gestor de Sesiones guarda la información ligada al mapa anterior.
La respuesta de peticiones al Gestor de Sesiones que no requieran realizar a su vez peticiones al Servicio de Mapas GeoGranada requiere de tiempos de proceso del orden de centésimas de segundo y la generación de mapas tiempos del orden de segundos. Debido a los diferentes tiempos de proceso y por no estar serializado el acceso a una sesión, si realizamos múltiples peticiones asíncronas a la misma sesión hay que tener en cuenta que es posible que el Gestor de Sesiones nos devuelva información sobre el mapa antiguo (información que ya posee la sesión y su respuesta es del orden de centésimas de segundo) y no del nuevo mapa que está generando otra petición asíncrona (tiempo de respuesta del orden de segundos).
-------------------------------------- 0 --------------------------------------
Ejemplo de secuencias ligadas a una sesión
Los comandos ABRESESIONMAPA, GETLISTACAPAS, ZOOMTODO, etc. deben iniciarse con el path: << http://geoweb.granada.org/cgi-bin/produccion/simmapxml.exe/ >>
1.- Iniciamos una sesión. El "IDmapasesion" lo arrastraremos a todos los comandos de simmapXML.exe que mantienen el estado.
<< path >> ABRESESIONMAPA
<?xml version="1.0" encoding="ISO-8859-1"?>
<respuesta tipo="ABRESESIONMAPA">
<error>none</error>
<idmapasesion>1506151143449315AMZC273059ML</idmapasesion>
<width>450</width>
<height>450</height>
<temas defecto="Callejero Municipal">
<tema nombre="Callejero Municipal">Callejero Oficial del Municipio de Granada</tema>
<tema nombre="Mapa De Ruidos">Mapa de Ruidos del año 2007 del Municipio de Granada</tema>
</temas>
<paneles desplegado="CALLEJERO">
<panel id="CAPAS">Capas: Activar/Desactivar</panel>
<panel id="CALLEJERO">Buscador de Calles</panel>
<panel id="PROPIEDADES">Resultado de la Localización</panel>
<panel id="MEDIDAS">Herramientas de Medida</panel>
</paneles>
</respuesta>
2.- Pedimos crear un mapa a la sesión de
"IDmapasesion" obtenida anteriormente.
<< path >> ZOOMTODO?idmapasesion=1506151143449315AMZC273059ML
<?xml version="1.0" encoding="ISO-8859-1"?>
<respuesta tipo="ZOOMTODO">
<error>none</error>
<zoomcurrent bottom="4106232" top="4124281" right="456059.5" left="438010.5"/>
<zoomestado>
<zoomextent activo="False"/>
<zoomin activo="True"/>
<zoomout activo="False"/>
<pantop activo="False"/>
<panbottom activo="False"/>
<panleft activo="True"/>
<panright activo="True"/>
<zoomprevious activo="False"/>
<zoomnext activo="False"/>
</zoomestado>
<escala>none</escala>
</respuesta>
3.- Solicitamos el último mapa creado en la sesión
"IDmapasesion"
<< path >> GETULTIMOMAPA?idmapasesion=1506151143449315AMZC273059ML
4.- Preguntamos las capas a las que podemos preguntar datos.
<< path >> GETLISTACAPAS?idmapasesion=1506151143449315AMZC273059ML
<?xml version="1.0" encoding="ISO-8859-1"?>
<respuesta tipo="GETLISTACAPAS">
<error>none</error>
<capas>
<capa nombre="CALLES" cartografia="False" visible="True"/>
<capa nombre="PORTALES" cartografia="False" visible="True"/>
<capa nombre="EDIFICIOS" cartografia="False" visible="True"/>
<capa nombre="ASOCIACION_VECINOS" cartografia="False" visible="True"/>
<capa nombre="JUNTA_MUNICIPAL_DISTRITO" cartografia="False" visible="True"/>
<capa nombre="Cartografia" cartografia="True" visible="True"/>
<capa nombre="Foto Aerea" cartografia="True" visible="False"/>
</capas>
</respuesta>
5.- Demandamos las "CALLES" que tienen en su nombre los valores "PERIODISTA FERNANDO"
<< path >> BUSCARTOPONIMOSPORVALOR?idmapasesion=1506151143449315AMZC273059ML&capa=CALLES&valor=PERIODISTA FERNANDO
<?xml version="1.0" encoding="ISO-8859-1"?>
<respuesta tipo="BUSCARTOPONIMOSPORVALOR">
<error>none</error>
<toponimos maximo="none">
<toponimo vusuario="C/ Periodista Fernando Gomez de Castilla" valor="CALLE PERIODISTA FERNANDO GOMEZ DE CASTILLA" capa="CALLES"/>
<toponimo vusuario="C/ Periodista Fernando Gomez de la Cruz" valor="CALLE PERIODISTA FERNANDO GOMEZ DE LA CRUZ" capa="CALLES"/>
</toponimos>
</respuesta>
6.- Demandamos las propiedades de la entidad de la capa "CALLES" y valor "CALLE PERIODISTA FERNANDO GOMEZ DE LA CRUZ"
<< path >> BUSCARENTIDADPOTTOPONIMO?idmapasesion=1506151143449315AMZC273059ML&capa=CALLES&valor=CALLE PERIODISTA FERNANDO GOMEZ DE LA CRUZ
<?xml version="1.0" encoding="ISO-8859-1"?>
<respuesta tipo="BUSCARENTIDADPORTOPONIMO">
<error>none</error>
<entidad tipo="LINEA">
<extension ymax="4117453.57" xmax="445069.96" ymin="4116667.97" xmin="444694.95"/>
<elementos>
<elemento>
<centroide y="4117251.73876518" x="444788.66979882"/>
<punto y="4117453.57" x="444694.95"/>
<punto y="4117357.58" x="444740.17"/>
<punto y="4117254.7" x="444787.35"/>
<punto y="4117164.75" x="444827.44"/>
<punto y="4117048.48" x="444879.26"/>
</elemento>
<elemento>
<centroide y="4116819.28510349" x="445002.014379523"/>
<punto y="4116667.97" x="445069.96"/>
<punto y="4116715.5" x="445048.62"/>
<punto y="4116790.93" x="445014.75"/>
<punto y="4116823.77" x="445000"/>
<punto y="4116840.11" x="444992.87"/>
<punto y="4116892.24" x="444970.11"/>
<punto y="4116932.46" x="444952.69"/>
<punto y="4116941.07" x="444948.96"/>
<punto y="4116971.59" x="444936.33"/>
</elemento>
</elementos>
<atributos>
<atributo nombre="CÓDIGO DE VÍA" valor="10930"/>
<atributo nombre="TIPO DE VÍA" valor="CALLE"/>
<atributo nombre="PARTÍCULA" valor=""/>
<atributo nombre="NOMBRE DE CALLE" valor="PERIODISTA FERNANDO GOMEZ DE LA CRUZ"/>
<atributo nombre="ENTIDAD POBLACIÓN" valor="GRANADA"/>
<atributo nombre="JUNTA MUNICIPAL DISTRITO" valor="CHANA"/>
<atributo nombre="ASOCIACION VECINOS" valor="CERRILLO DE MARACENA"/>
<atributo nombre="LONGITUD" valor="776,80 m"/>
</atributos>
</entidad>
</respuesta>
7.- Hacemos un mapa ajustado a la extensión de la calle "CALLE PERIODISTA FERNANDO GOMEZ DE LA CRUZ"
<< path >> ZOOM?idmapasesion=1506151143449315AMZC273059ML&x1=444694&y1=4116667&x2=445070&y2=4117454
<?xml version="1.0" encoding="ISO-8859-1"?>
<respuesta tipo="ZOOM">
<error>none</error>
<zoomcurrent bottom="4116667" top="4117454" right="445275.5" left="444488.5"/>
<zoomestado>
<zoomextent activo="True"/>
<zoomin activo="True"/>
<zoomout activo="True"/>
<pantop activo="True"/>
<panbottom activo="True"/>
<panleft activo="True"/>
<panright activo="True"/>
<zoomprevious activo="True"/>
<zoomnext activo="False"/>
</zoomestado>
<escala>none</escala>
</respuesta>
8.- Solicitamos el último mapa creado en la sesión
"IDmapasesion"
<< path >> GETULTIMOMAPA?idmapasesion=1506151143449315AMZC273059ML