WMSCWRAPPER. IMPLEMENTACIÓN WMS-C OPENSOURCE PARA SERVICIOS WMS TESELADOS Ricardo García Martín IDELab - Universidad de Valladolid IV Jornadas SIG Libre, Girona 11 de Marzo de 2010 CONTENIDOS Introducción Proxies Web Motivación WMSCwrapper Componentes Configuración Servicios ofertados Rendimiento CONFIGURACIONES PROXY WEB CACHE Servidor Servidores Proxies Internet Internet Clientes LAN Clientes Proxy Cliente Proxy Petición Petición Objeto Cliente Servidor Objeto pedido no está en caché (miss) Objeto Proxy Petición Objeto Objeto pedido está en caché (hit) SERVICIO WEB DE MAPAS (WMS) VERSION REQUEST LAYERS STYLES BBOX SRS WIDTH HEIGHT FORMAT … Muy flexible Poco escalable SISTEMAS TESELADOS División de la imagen en otras de menor tamaño (“teselas”) Mayor sensación de continuidad del mapa SISTEMAS TESELADOS WMS TILE CACHING (WMS-C) Dos peticiones diferentes de una misma tesela WMS-C deben formar la misma petición HTTP GET 1. Cadena de argumentos mínima (sin argumentos opcionales) 2. Ordenación de argumentos y capitalización de los caracteres fija 3. Rango fijo de posibles bounding boxes, calculados según el perfil WMS-C 4. Precisión fija en los valores de bounding box 5. Tamaño fijo de las teselas medido en pixels 6. Nombres de capas y/o ordenación de los nombres de las capas fijos 7. Estilos fijos 8. Formato de salida fijo IMPLEMENTACIÓN WMSCWRAPPER Software Libre 100% compatible con WMS-C Implementación Java J2EE ~20.000 líneas de código Modular Sobre cualquier servidor de aplicaciones J2EE Con cualquier WMS estándar: Mapserver, Deegree, Geoserver… MOTIVACIÓN Fines académicos y de investigación. No alineado con otros desarrollos como TileCache y GeoWebCache. Experimentación con algoritmos heurísticos y predictivos de gestión de la caché para entornos con recursos escasos o con conjunto de datos dinámicos. ALMACENAMIENTO DE LAS TESELAS raíz/layer/resolución/x/y.<extension> CACHÉ CON ÍNDICE ESPACIAL Registro espacial en tiempo real de la actividad de la caché Índice QuadTree permite realizar búsquedas espaciales de gran eficacia Dada la naturaleza exponencial de la estructura de la pirámide se trunca el índice a un nivel concreto Aproximación a la probabilidad de acceso a las zonas geográficas representadas por las teselas CAPA DE ESTADÍSTICAS Las estadísticas recogidas en el índice espacial pueden mostrarse mediante un tileset, como una capa más de la caché. Ofrece información visual al administrador para la toma de decisiones. METATILING Petición de mayor tamaño que la tesela a cachear Reduce el número de peticiones al WMS remoto Tesela pedida por el cliente Metatile 3x3 pedido al servidor WMS METATILING Petición de mayor tamaño que la tesela a cachear Reduce el número de peticiones al WMS remoto Reduce el problema del etiquetado redundante METATILING Petición de mayor tamaño que la tesela a cachear Reduce el número de peticiones al WMS remoto Reduce el problema del etiquetado redundante METATILING Petición de mayor tamaño que la tesela a cachear Reduce el número de peticiones al WMS remoto Reduce el problema del etiquetado redundante Estrategia de mínima correlación con la caché CONFIGURACIÓN DE LA CACHÉ <?xml version="1.0" encoding="UTF-8"?> <WMSCacheConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <KMLService> PASARELA <ServiceType>KML</ServiceType> KML <Name>KML gateway IDELab</Name> <Title>Pasarela KML</Title> <Abstract>Descripcion del servicio experimental</Abstract> <OnlineResource>http://itastserver.tel.uva.es/WMS_C_wrapper</OnlineResource> </KMLService> <WMSCService> <ServiceType>WMS-C</ServiceType> <Name>WMS-C IDELab</Name> <Title>Titulo del servidor</Title> <Abstract>Descripcion del servicio experimental</Abstract> <OnlineResource>http://itastserver.tel.uva.es/WMS_C_wrapper/wms</OnlineResource> </WMSCService> CONFIGURACIÓN DE LA CACHÉ <?xml version="1.0" encoding="UTF-8"?> <WMSCacheConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <KMLService> <ServiceType>KML</ServiceType> <Name>KML gateway IDELab</Name> <Title>Pasarela KML</Title> <Abstract>Descripcion del servicio experimental</Abstract> <OnlineResource>http://itastserver.tel.uva.es/WMS_C_wrapper</OnlineResource> </KMLService> <WMSCService> <ServiceType>WMS-C</ServiceType> SERVICIO <Name>WMS-C IDELab</Name> WMS-C <Title>Titulo del servidor</Title> <Abstract>Descripcion del servicio experimental</Abstract> <OnlineResource>http://itastserver.tel.uva.es/WMS_C_wrapper/wms</OnlineResource> </WMSCService> CONFIGURACIÓN DE LA CACHÉ (I) <TileSet name="IDE" type="WMS"> URL servicio <url><![CDATA[http://www.idee.es/wms/IDEE-Base/IDEE-Base?]]></url> WMS remoto <SRS>EPSG:4326</SRS> <BoundingBox SRS="EPSG:4326" minx="-37.474148" miny="2.7077813" maxx="22.74257" maxy="57.752808" /> <profile type="global" levels="20" maxResolution="0.703125"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Resolutions levels="20"> 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> <Height>256</Height> </profile> <Format>png</Format> <Layers>Todas</Layers> <Styles /> CONFIGURACIÓN DE LA CACHÉ (I) <TileSet name="IDE" type="WMS"> <url><![CDATA[http://www.idee.es/wms/IDEE-Base/IDEE-Base?]]></url> Proyección <SRS>EPSG:4326</SRS> <BoundingBox SRS="EPSG:4326" minx="-37.474148" miny="2.7077813" maxx="22.74257" maxy="57.752808" /> <profile type="global" levels="20" maxResolution="0.703125"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Resolutions levels="20"> 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> <Height>256</Height> </profile> <Format>png</Format> <Layers>Todas</Layers> <Styles /> CONFIGURACIÓN DE LA CACHÉ (I) <TileSet name="IDE" type="WMS"> <url><![CDATA[http://www.idee.es/wms/IDEE-Base/IDEE-Base?]]></url> <SRS>EPSG:4326</SRS> Límites de la capa <BoundingBox SRS="EPSG:4326" minx="-37.474148" miny="2.7077813" maxx="22.74257" maxy="57.752808" /> <profile type="global" levels="20" maxResolution="0.703125"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Resolutions levels="20"> 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> <Height>256</Height> </profile> <Format>png</Format> <Layers>Todas</Layers> <Styles /> CONFIGURACIÓN DE LA CACHÉ (I) <TileSet name="IDE" type="WMS"> <url><![CDATA[http://www.idee.es/wms/IDEE-Base/IDEE-Base?]]></url> <SRS>EPSG:4326</SRS> <BoundingBox SRS="EPSG:4326" minx="-37.474148" miny="2.7077813" maxx="22.74257" maxy="57.752808" /> <profile type="global" levels="20" maxResolution="0.703125"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> Resoluciones <Resolutions levels="20"> 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> <Height>256</Height> </profile> <Format>png</Format> <Layers>Todas</Layers> <Styles /> CONFIGURACIÓN DE LA CACHÉ (I) <TileSet name="IDE" type="WMS"> <url><![CDATA[http://www.idee.es/wms/IDEE-Base/IDEE-Base?]]></url> <SRS>EPSG:4326</SRS> <BoundingBox SRS="EPSG:4326" minx="-37.474148" miny="2.7077813" maxx="22.74257" maxy="57.752808" /> <profile type="global" levels="20" maxResolution="0.703125"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Resolutions levels="20"> 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> Tamaño imagen <Height>256</Height> </profile> <Format>png</Format> <Layers>Todas</Layers> <Styles /> CONFIGURACIÓN DE LA CACHÉ (I) <TileSet name="IDE" type="WMS"> <url><![CDATA[http://www.idee.es/wms/IDEE-Base/IDEE-Base?]]></url> <SRS>EPSG:4326</SRS> <BoundingBox SRS="EPSG:4326" minx="-37.474148" miny="2.7077813" maxx="22.74257" maxy="57.752808" /> <profile type="global" levels="20" maxResolution="0.703125"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Resolutions levels="20"> 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> <Height>256</Height> </profile> Formato imagen <Format>png</Format> <Layers>Todas</Layers> <Styles /> CONFIGURACIÓN DE LA CACHÉ (I) <TileSet name="IDE" type="WMS"> <url><![CDATA[http://www.idee.es/wms/IDEE-Base/IDEE-Base?]]></url> <SRS>EPSG:4326</SRS> <BoundingBox SRS="EPSG:4326" minx="-37.474148" miny="2.7077813" maxx="22.74257" maxy="57.752808" /> <profile type="global" levels="20" maxResolution="0.703125"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Resolutions levels="20"> 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> <Height>256</Height> </profile> <Format>png</Format> <Layers>Todas</Layers> Capas WMS <Styles /> CONFIGURACIÓN DE LA CACHÉ (II) <cacheconfig method="SpatialCache" debug="false" implementationClass="org.jp.cache.HeuristicalSpatialCacheManager"> <MaxCacheSize>260M</MaxCacheSize> <CachePath>/var/cache/cartociudad</CachePath> Gestor de caché <MinimumTimeout>-1</MinimumTimeout> <MinimumTimeout resIndex="10,11,12,13,14,15,16,17,18,19,20,21,22,23">9000000</MinimumTimeout> <MinimumTimeout SRS="EPSG:4326" minx="-4.85287" miny="41.568" maxx="-4.61426" maxy="41.72710" resIndex="1,2,3,4,5,6,7,8,9">60000</MinimumTimeout> <task name="CacheCleaner IDEE" implementationClass="org.jp.task.tasks.FullCacheCleaner"></task> <task name="Seeder for IDEE" implementationClass="org.jp.task.tasks.SeederJob"> <Seeder> <SeederBoundingBox resIndex="5,6,7,8,9,10,11,12,13,14" SRS="EPSG:4326" minx="-4.85287 miny="41.568" maxx="-4.61426" maxy="41.72710"> </SeederBoundingBox> <SeederBoundingBox resIndex="0,1,2,3,4" SRS="EPSG:4326" minx="-180" miny="-90" maxx="-180" maxy="90"> </SeederBoundingBox> </Seeder> </task> </cacheconfig> CONFIGURACIÓN DE LA CACHÉ (II) <cacheconfig method="SpatialCache" debug="false" implementationClass="org.jp.cache.HeuristicalSpatialCacheManager"> Tamaño <MaxCacheSize>260M</MaxCacheSize> máx caché <CachePath>/var/cache/cartociudad</CachePath> <MinimumTimeout>-1</MinimumTimeout> <MinimumTimeout resIndex="10,11,12,13,14,15,16,17,18,19,20,21,22,23">9000000</MinimumTimeout> <MinimumTimeout SRS="EPSG:4326" minx="-4.85287" miny="41.568" maxx="-4.61426" maxy="41.72710" resIndex="1,2,3,4,5,6,7,8,9">60000</MinimumTimeout> <task name="CacheCleaner IDEE" implementationClass="org.jp.task.tasks.FullCacheCleaner"></task> <task name="Seeder for IDEE" implementationClass="org.jp.task.tasks.SeederJob"> <Seeder> <SeederBoundingBox resIndex="5,6,7,8,9,10,11,12,13,14" SRS="EPSG:4326" minx="-4.85287 miny="41.568" maxx="-4.61426" maxy="41.72710"> </SeederBoundingBox> <SeederBoundingBox resIndex="0,1,2,3,4" SRS="EPSG:4326" minx="-180" miny="-90" maxx="-180" maxy="90"> </SeederBoundingBox> </Seeder> </task> </cacheconfig> CONFIGURACIÓN DE LA CACHÉ (II) <cacheconfig method="SpatialCache" debug="false" implementationClass="org.jp.cache.HeuristicalSpatialCacheManager"> <MaxCacheSize>260M</MaxCacheSize> <CachePath>/var/cache/cartociudad</CachePath> Directorio caché <MinimumTimeout>-1</MinimumTimeout> <MinimumTimeout resIndex="10,11,12,13,14,15,16,17,18,19,20,21,22,23">9000000</MinimumTimeout> <MinimumTimeout SRS="EPSG:4326" minx="-4.85287" miny="41.568" maxx="-4.61426" maxy="41.72710" resIndex="1,2,3,4,5,6,7,8,9">60000</MinimumTimeout> <task name="CacheCleaner IDEE" implementationClass="org.jp.task.tasks.FullCacheCleaner"></task> <task name="Seeder for IDEE" implementationClass="org.jp.task.tasks.SeederJob"> <Seeder> <SeederBoundingBox resIndex="5,6,7,8,9,10,11,12,13,14" SRS="EPSG:4326" minx="-4.85287 miny="41.568" maxx="-4.61426" maxy="41.72710"> </SeederBoundingBox> <SeederBoundingBox resIndex="0,1,2,3,4" SRS="EPSG:4326" minx="-180" miny="-90" maxx="-180" maxy="90"> </SeederBoundingBox> </Seeder> </task> </cacheconfig> CONFIGURACIÓN DE LA CACHÉ (II) <cacheconfig method="SpatialCache" debug="false" implementationClass="org.jp.cache.HeuristicalSpatialCacheManager"> <MaxCacheSize>260M</MaxCacheSize> <CachePath>/var/cache/cartociudad</CachePath> Temporizadores <MinimumTimeout>-1</MinimumTimeout> <MinimumTimeout resIndex="10,11,12,13,14,15,16,17,18,19,20,21,22,23">9000000</MinimumTimeout> <MinimumTimeout SRS="EPSG:4326" minx="-4.85287" miny="41.568" maxx="-4.61426" maxy="41.72710" resIndex="1,2,3,4,5,6,7,8,9">60000</MinimumTimeout> <task name="CacheCleaner IDEE" implementationClass="org.jp.task.tasks.FullCacheCleaner"></task> <task name="Seeder for IDEE" implementationClass="org.jp.task.tasks.SeederJob"> <Seeder> <SeederBoundingBox resIndex="5,6,7,8,9,10,11,12,13,14" SRS="EPSG:4326" minx="-4.85287 miny="41.568" maxx="-4.61426" maxy="41.72710"> </SeederBoundingBox> <SeederBoundingBox resIndex="0,1,2,3,4" SRS="EPSG:4326" minx="-180" miny="-90" maxx="-180" maxy="90"> </SeederBoundingBox> </Seeder> </task> </cacheconfig> CONFIGURACIÓN DE LA CACHÉ (II) <cacheconfig method="SpatialCache" debug="false" implementationClass="org.jp.cache.HeuristicalSpatialCacheManager"> <MaxCacheSize>260M</MaxCacheSize> <CachePath>/var/cache/cartociudad</CachePath> <MinimumTimeout>-1</MinimumTimeout> <MinimumTimeout resIndex="10,11,12,13,14,15,16,17,18,19,20,21,22,23">9000000</MinimumTimeout> <MinimumTimeout SRS="EPSG:4326" minx="-4.85287" miny="41.568" maxx="-4.61426" maxy="41.72710" resIndex="1,2,3,4,5,6,7,8,9">60000</MinimumTimeout> Cleaner de la caché <task name="CacheCleaner IDEE" implementationClass="org.jp.task.tasks.FullCacheCleaner"></task> <task name="Seeder for IDEE" implementationClass="org.jp.task.tasks.SeederJob"> <Seeder> <SeederBoundingBox resIndex="5,6,7,8,9,10,11,12,13,14" SRS="EPSG:4326" minx="-4.85287 miny="41.568" maxx="-4.61426" maxy="41.72710"> </SeederBoundingBox> <SeederBoundingBox resIndex="0,1,2,3,4" SRS="EPSG:4326" minx="-180" miny="-90" maxx="-180" maxy="90"> </SeederBoundingBox> </Seeder> </task> </cacheconfig> CONFIGURACIÓN DE LA CACHÉ (II) <cacheconfig method="SpatialCache" debug="false" implementationClass="org.jp.cache.HeuristicalSpatialCacheManager"> <MaxCacheSize>260M</MaxCacheSize> <CachePath>/var/cache/cartociudad</CachePath> <MinimumTimeout>-1</MinimumTimeout> <MinimumTimeout resIndex="10,11,12,13,14,15,16,17,18,19,20,21,22,23">9000000</MinimumTimeout> <MinimumTimeout SRS="EPSG:4326" minx="-4.85287" miny="41.568" maxx="-4.61426" maxy="41.72710" resIndex="1,2,3,4,5,6,7,8,9">60000</MinimumTimeout> <task name="CacheCleaner IDEE" implementationClass="org.jp.task.tasks.FullCacheCleaner"></task> <task name="Seeder for IDEE" implementationClass="org.jp.task.tasks.SeederJob"> Seeder <Seeder> <SeederBoundingBox resIndex="5,6,7,8,9,10,11,12,13,14" SRS="EPSG:4326" minx="-4.85287 miny="41.568" maxx="-4.61426" maxy="41.72710"> </SeederBoundingBox> <SeederBoundingBox resIndex="0,1,2,3,4" SRS="EPSG:4326" minx="-180" miny="-90" maxx="-180" maxy="90"> </SeederBoundingBox> </Seeder> </task> </cacheconfig> CONFIGURACIÓN DE LA CACHÉ (III) <TileSet name="STATS" type="Stat"> Capa de <LayersetRef>IDE</LayersetRef> estadísticas <SRS>EPSG:4326</SRS> <BoundingBox SRS="EPSG:4326" minx="-23.0132795" miny="27.636523" maxx="9.1810205" maxy="43.793673" /> <profile type="specific" levels="25" maxResolution="1.40625"> <!-- global|specific --> <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Resolutions levels="20">0.703125 0.494384765625 0.3515625 0.17578125 0.087890625 0.0439453125 0.0219726563 0.010986328125</Resolutions> <Width>256</Width> <Height>256</Height> </profile> <Format>png</Format> <Layers>stats</Layers> <Styles /> RENDIMIENTO DE LA CACHÉ Tasa de transmisión con caché inicialmente llena Throughput (peticiones/seg) 1200 1000 800 600 WMSCWrapper GeoWebCache 400 TileCache 200 0 1 2 3 4 5 6 7 8 9 10 # Usuarios simultáneos 15 20 40 80 100 PASARELA KML PARA GOOGLE EARTH GOOGLE MAPS var tilelayer = new GTileLayer(<copyrights>, <minResolution>, <maxResolution>, { tileUrlTemplate: 'http://<host>:<port>/WMS_C_wrapper/gm? layers=<layer_name>&zoom={Z}&x={X}&y={Y}&format=<format>', isPng:<{true/false}>, opacity:<opacity> } ); Proyección EPSG:900913 (“GOOGLE”) MICROSOFT BING MAPS var map = new VEMap('myMap'); var tileSourceSpec = new VETileSourceSpecification( 'TITLE_OF_LAYER','http://<host>:<port>/WMS_C_wrapper/ve? quadkey=%4&format=image/png&layers=<layer>' ); tileSourceSpec.Opacity = 0.5; map.AddTileLayer(tileSourceSpec, true); ... <body onload="GetMap();"> EN QUÉ SE PARECE WMSCWRAPPER Y … EN QUÉ SE PARECE WMSCWRAPPER Y … EN QUÉ SE PARECE WMSCWRAPPER Y … Es rápido EN QUÉ SE PARECE WMSCWRAPPER Y … Es rápido EN QUÉ SE PARECE WMSCWRAPPER Y … Es inteligente Es rápido EN QUÉ SE PARECE WMSCWRAPPER Y … Es inteligente Es rápido EN QUÉ SE PARECE WMSCWRAPPER Y … Es inteligente Es rápido Es libre!! EN QUÉ SE PARECE WMSCWRAPPER Y … EN QUÉ SE PARECE WMSCWRAPPER Y … Es rápido y es inteligente UNETÉ A LA COMUNIDAD!! I WANT YOU TO JOIN WMSCWrapper COMMUNITY WMSCWRAPPER. IMPLEMENTACIÓN WMS-C OPENSOURCE PARA SERVICIOS WMS TESELADOS Muchas gracias por vuestra atención http://idelab.uva.es/